region-utils: Add API to crop and scale an integer region

https://gitlab.gnome.org/GNOME/mutter/merge_requests/323
This commit is contained in:
Robert Mader 2019-01-05 16:41:35 +01:00 committed by Jonas Ådahl
parent d574cf59f1
commit 07e65a6ef2
2 changed files with 53 additions and 0 deletions

View File

@ -408,3 +408,51 @@ meta_region_transform (cairo_region_t *region,
return transformed_region; return transformed_region;
} }
cairo_region_t *
meta_region_crop_and_scale (cairo_region_t *region,
ClutterRect *src_rect,
int dst_width,
int dst_height)
{
int n_rects, i;
cairo_rectangle_int_t *rects;
cairo_region_t *viewport_region;
if (src_rect->size.width == dst_width &&
src_rect->size.height == dst_height &&
roundf (src_rect->origin.x) == src_rect->origin.x &&
roundf (src_rect->origin.y) == src_rect->origin.y)
{
viewport_region = cairo_region_copy (region);
if (src_rect->origin.x != 0 || src_rect->origin.y != 0)
{
cairo_region_translate (viewport_region,
(int) src_rect->origin.x,
(int) src_rect->origin.y);
}
return viewport_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_region_get_rectangle (region, i, &rects[i]);
meta_rectangle_crop_and_scale (&rects[i],
src_rect,
dst_width,
dst_height,
&rects[i]);
}
viewport_region = cairo_region_create_rectangles (rects, n_rects);
g_free (rects);
return viewport_region;
}

View File

@ -111,4 +111,9 @@ cairo_region_t * meta_region_transform (cairo_region_t *region,
int width, int width,
int height); int height);
cairo_region_t * meta_region_crop_and_scale (cairo_region_t *region,
ClutterRect *src_rect,
int dst_width,
int dst_height);
#endif /* __META_REGION_UTILS_H__ */ #endif /* __META_REGION_UTILS_H__ */