[mutter] region-utils: Add API to transform an integer region



commit 452ef4d5bb898682bc327a817f31248d84e91905
Author: Robert Mader <robert mader posteo de>
Date:   Mon Nov 26 18:26:47 2018 +0100

    region-utils: Add API to transform an integer region
    
    The added API requires additional width and height arguments
    to calculate transformed coordinates.

 src/compositor/region-utils.c | 72 +++++++++++++++++++++++++++++++++++++++++++
 src/compositor/region-utils.h |  6 ++++
 2 files changed, 78 insertions(+)
---
diff --git a/src/compositor/region-utils.c b/src/compositor/region-utils.c
index b268fd346..1c1bd2664 100644
--- a/src/compositor/region-utils.c
+++ b/src/compositor/region-utils.c
@@ -385,3 +385,75 @@ meta_make_border_region (cairo_region_t *region,
 
   return border_region;
 }
+
+cairo_region_t *
+meta_region_transform (cairo_region_t       *region,
+                       MetaMonitorTransform  transform,
+                       int                   width,
+                       int                   height)
+{
+  int n_rects, i;
+  cairo_rectangle_int_t *rects;
+  cairo_region_t *transformed_region;
+
+  if (transform == META_MONITOR_TRANSFORM_NORMAL)
+    return cairo_region_copy (region);
+
+  n_rects = cairo_region_num_rectangles (region);
+
+  rects = g_new0 (cairo_rectangle_int_t, n_rects);
+  for (i = 0; i < n_rects; i++)
+    {
+      cairo_rectangle_int_t rect;
+
+      cairo_region_get_rectangle (region, i, &rects[i]);
+
+      rect = rects[i];
+
+      switch (transform)
+        {
+        case META_MONITOR_TRANSFORM_90:
+          rects[i].x = width - (rect.y + rect.height);
+          rects[i].y = rect.x;
+          rects[i].width = rect.height;
+          rects[i].height = rect.width;
+          break;
+        case META_MONITOR_TRANSFORM_180:
+          rects[i].x = width - (rect.x + rect.width);
+          rects[i].y = height - (rect.y + rect.height);
+          break;
+        case META_MONITOR_TRANSFORM_270:
+          rects[i].x = rect.y;
+          rects[i].y = height - (rect.x + rect.width);
+          rects[i].width = rect.height;
+          rects[i].height = rect.width;
+          break;
+        case META_MONITOR_TRANSFORM_FLIPPED:
+          rects[i].x = width - (rect.x + rect.width);
+          break;
+        case META_MONITOR_TRANSFORM_FLIPPED_90:
+          rects[i].x = width - (rect.y + rect.height);
+          rects[i].y = height - (rect.x + rect.width);
+          rects[i].width = rect.height;
+          rects[i].height = rect.width;
+          break;
+        case META_MONITOR_TRANSFORM_FLIPPED_180:
+          rects[i].y = height - (rect.y + rect.height);
+          break;
+        case META_MONITOR_TRANSFORM_FLIPPED_270:
+          rects[i].x = rect.y;
+          rects[i].y = rect.x;
+          rects[i].width = rect.height;
+          rects[i].height = rect.width;
+          break;
+        case META_MONITOR_TRANSFORM_NORMAL:
+          g_assert_not_reached ();
+        }
+    }
+
+  transformed_region = cairo_region_create_rectangles (rects, n_rects);
+
+  g_free (rects);
+
+  return transformed_region;
+}
diff --git a/src/compositor/region-utils.h b/src/compositor/region-utils.h
index 6286c6edf..4a9dd8170 100644
--- a/src/compositor/region-utils.h
+++ b/src/compositor/region-utils.h
@@ -24,6 +24,7 @@
 #include <cairo.h>
 #include <glib.h>
 
+#include "backends/meta-backend-types.h"
 #include "clutter/clutter.h"
 
 typedef enum _MetaRoundingStrategy
@@ -110,4 +111,9 @@ cairo_region_t * meta_make_border_region (cairo_region_t *region,
                                           int             y_amount,
                                           gboolean        flip);
 
+cairo_region_t * meta_region_transform (cairo_region_t       *region,
+                                        MetaMonitorTransform  transform,
+                                        int                   width,
+                                        int                   height);
+
 #endif /* __META_REGION_UTILS_H__ */


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]