From 452ef4d5bb898682bc327a817f31248d84e91905 Mon Sep 17 00:00:00 2001 From: Robert Mader Date: Mon, 26 Nov 2018 18:26:47 +0100 Subject: [PATCH] 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 #include +#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__ */