summaryrefslogtreecommitdiff
path: root/src/helpers/Region.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/helpers/Region.cpp')
-rw-r--r--src/helpers/Region.cpp93
1 files changed, 93 insertions, 0 deletions
diff --git a/src/helpers/Region.cpp b/src/helpers/Region.cpp
new file mode 100644
index 00000000..3a210d06
--- /dev/null
+++ b/src/helpers/Region.cpp
@@ -0,0 +1,93 @@
+#include "Region.hpp"
+#include <wlr/util/box.h>
+
+CRegion::CRegion() {
+ pixman_region32_init(&m_rRegion);
+}
+
+CRegion::CRegion(pixman_region32_t* ref) {
+ pixman_region32_init(&m_rRegion);
+ pixman_region32_copy(&m_rRegion, ref);
+}
+
+CRegion::CRegion(double x, double y, double w, double h) {
+ pixman_region32_init_rect(&m_rRegion, x, y, w, h);
+}
+
+CRegion::CRegion(wlr_box* box) {
+ pixman_region32_init_rect(&m_rRegion, box->x, box->y, box->width, box->height);
+}
+
+CRegion::CRegion(const CRegion& other) {
+ pixman_region32_init(&m_rRegion);
+ pixman_region32_copy(&m_rRegion, const_cast<CRegion*>(&other)->pixman());
+}
+
+CRegion::CRegion(CRegion&& other) {
+ pixman_region32_init(&m_rRegion);
+ pixman_region32_copy(&m_rRegion, other.pixman());
+}
+
+CRegion::~CRegion() {
+ pixman_region32_fini(&m_rRegion);
+}
+
+CRegion& CRegion::clear() {
+ pixman_region32_clear(&m_rRegion);
+ return *this;
+}
+
+CRegion& CRegion::set(const CRegion& other) {
+ pixman_region32_copy(&m_rRegion, const_cast<CRegion*>(&other)->pixman());
+ return *this;
+}
+
+CRegion& CRegion::add(const CRegion& other) {
+ pixman_region32_union(&m_rRegion, &m_rRegion, const_cast<CRegion*>(&other)->pixman());
+ return *this;
+}
+
+CRegion& CRegion::add(double x, double y, double w, double h) {
+ pixman_region32_union_rect(&m_rRegion, &m_rRegion, x, y, w, h);
+ return *this;
+}
+
+CRegion& CRegion::subtract(const CRegion& other) {
+ pixman_region32_subtract(&m_rRegion, &m_rRegion, const_cast<CRegion*>(&other)->pixman());
+ return *this;
+}
+
+CRegion& CRegion::intersect(const CRegion& other) {
+ pixman_region32_intersect(&m_rRegion, &m_rRegion, const_cast<CRegion*>(&other)->pixman());
+ return *this;
+}
+
+CRegion& CRegion::intersect(double x, double y, double w, double h) {
+ pixman_region32_intersect_rect(&m_rRegion, &m_rRegion, x, y, w, h);
+ return *this;
+}
+
+CRegion& CRegion::invert(pixman_box32_t* box) {
+ pixman_region32_inverse(&m_rRegion, &m_rRegion, box);
+ return *this;
+}
+
+CRegion& CRegion::translate(const Vector2D& vec) {
+ pixman_region32_translate(&m_rRegion, vec.x, vec.y);
+ return *this;
+}
+
+std::vector<pixman_box32_t> CRegion::getRects() const {
+ std::vector<pixman_box32_t> result;
+
+ int rectsNum = 0;
+ const auto RECTSARR = pixman_region32_rectangles(&m_rRegion, &rectsNum);
+
+ result.assign(RECTSARR, RECTSARR + rectsNum);
+
+ return result;
+}
+
+bool CRegion::empty() {
+ return !pixman_region32_not_empty(&m_rRegion);
+}