From 36b46af92f77a28053ce330f1173cf2143870514 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonas=20=C3=85dahl?= Date: Thu, 20 Dec 2018 16:58:03 +0100 Subject: [PATCH] boxes: Add helper to scale rectangles by a double And change the similar region scaling helper to use this one. https://gitlab.gnome.org/GNOME/mutter/merge_requests/362 --- src/compositor/region-utils.c | 17 ++--------------- src/compositor/region-utils.h | 7 +------ src/core/boxes-private.h | 11 +++++++++++ src/core/boxes.c | 27 +++++++++++++++++++++++++++ 4 files changed, 41 insertions(+), 21 deletions(-) diff --git a/src/compositor/region-utils.c b/src/compositor/region-utils.c index 1c1bd2664..4d2ae1df0 100644 --- a/src/compositor/region-utils.c +++ b/src/compositor/region-utils.c @@ -195,21 +195,8 @@ meta_region_scale_double (cairo_region_t *region, { cairo_region_get_rectangle (region, i, &rects[i]); - switch (rounding_strategy) - { - case META_ROUNDING_STRATEGY_SHRINK: - rects[i].x = (int) ceil (rects[i].x * scale); - rects[i].y = (int) ceil (rects[i].y * scale); - rects[i].width = (int) floor (rects[i].width * scale); - rects[i].height = (int) floor (rects[i].height * scale); - break; - case META_ROUNDING_STRATEGY_GROW: - rects[i].x = (int) floor (rects[i].x * scale); - rects[i].y = (int) floor (rects[i].y * scale); - rects[i].width = (int) ceil (rects[i].width * scale); - rects[i].height = (int) ceil (rects[i].height * scale); - break; - } + meta_rectangle_scale_double (&rects[i], scale, rounding_strategy, + &rects[i]); } scaled_region = cairo_region_create_rectangles (rects, n_rects); diff --git a/src/compositor/region-utils.h b/src/compositor/region-utils.h index 4a9dd8170..473022b7e 100644 --- a/src/compositor/region-utils.h +++ b/src/compositor/region-utils.h @@ -26,12 +26,7 @@ #include "backends/meta-backend-types.h" #include "clutter/clutter.h" - -typedef enum _MetaRoundingStrategy -{ - META_ROUNDING_STRATEGY_SHRINK, - META_ROUNDING_STRATEGY_GROW, -} MetaRoundingStrategy; +#include "core/boxes-private.h" /** * MetaRegionIterator: diff --git a/src/core/boxes-private.h b/src/core/boxes-private.h index 0fbed2059..4c6fd08ab 100644 --- a/src/core/boxes-private.h +++ b/src/core/boxes-private.h @@ -39,6 +39,12 @@ typedef enum FIXED_DIRECTION_Y = 1 << 1, } FixedDirections; +typedef enum _MetaRoundingStrategy +{ + META_ROUNDING_STRATEGY_SHRINK, + META_ROUNDING_STRATEGY_GROW, +} MetaRoundingStrategy; + /* Output functions -- note that the output buffer had better be big enough: * rect_to_string: RECT_LENGTH * region_to_string: (RECT_LENGTH+strlen(separator_string)) * @@ -219,6 +225,11 @@ GList* meta_rectangle_find_nonintersected_monitor_edges ( gboolean meta_rectangle_is_adjecent_to (MetaRectangle *rect, MetaRectangle *other); +void meta_rectangle_scale_double (const MetaRectangle *rect, + double scale, + MetaRoundingStrategy rounding_strategy, + MetaRectangle *dest); + static inline ClutterRect meta_rectangle_to_clutter_rect (MetaRectangle *rect) { diff --git a/src/core/boxes.c b/src/core/boxes.c index 2725dfcbe..98a8d3586 100644 --- a/src/core/boxes.c +++ b/src/core/boxes.c @@ -2044,3 +2044,30 @@ meta_rectangle_is_adjecent_to (MetaRectangle *rect, else return FALSE; } + +void +meta_rectangle_scale_double (const MetaRectangle *rect, + double scale, + MetaRoundingStrategy rounding_strategy, + MetaRectangle *dest) +{ + switch (rounding_strategy) + { + case META_ROUNDING_STRATEGY_SHRINK: + *dest = (MetaRectangle) { + .x = (int) ceil (rect->x * scale), + .y = (int) ceil (rect->y * scale), + .width = (int) floor (rect->width * scale), + .height = (int) floor (rect->height * scale), + }; + break; + case META_ROUNDING_STRATEGY_GROW: + *dest = (MetaRectangle) { + .x = (int) floor (rect->x * scale), + .y = (int) floor (rect->y * scale), + .width = (int) ceil (rect->width * scale), + .height = (int) ceil (rect->height * scale), + }; + break; + } +}