[mutter] region-utils: Add API to transform an integer region
- From: Jonas Ådahl <jadahl src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter] region-utils: Add API to transform an integer region
- Date: Tue, 4 Dec 2018 10:17:01 +0000 (UTC)
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]