diff options
author | Benjamin Otte <otte@redhat.com> | 2023-04-28 04:28:23 +0200 |
---|---|---|
committer | Benjamin Otte <otte@redhat.com> | 2023-04-29 05:10:51 +0200 |
commit | 31983301883d2a17bc5c43819102dec659298265 (patch) | |
tree | f0dbf6ef0bf917a4c6c2ed8182c6bc4c965d0aac | |
parent | 11aaa29a6917458b40266bf72ecbc4ecb8295bee (diff) | |
download | gtk+-31983301883d2a17bc5c43819102dec659298265.tar.gz |
rendernode: Add diffing for affine transforms
This will be needed most importantly for inverted textures,
like in GLArea.
-rw-r--r-- | gsk/gskrendernodeimpl.c | 33 |
1 files changed, 32 insertions, 1 deletions
diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index bde92c1edc..ef31f459c7 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -32,6 +32,7 @@ #include "gdk/gdktextureprivate.h" #include "gdk/gdkmemoryformatprivate.h" #include "gdk/gdkprivate.h" +#include "gdk/gdkrectangleprivate.h" #include <cairo.h> #ifdef CAIRO_HAS_SVG_SURFACE @@ -74,6 +75,25 @@ _graphene_rect_init_from_clip_extents (graphene_rect_t *rect, graphene_rect_init (rect, x1c, y1c, x2c - x1c, y2c - y1c); } +static void +region_union_region_affine (cairo_region_t *region, + const cairo_region_t *sub, + float scale_x, + float scale_y, + float offset_x, + float offset_y) +{ + cairo_rectangle_int_t rect; + int i; + + for (i = 0; i < cairo_region_num_rectangles (sub); i++) + { + cairo_region_get_rectangle (sub, i, &rect); + gdk_rectangle_transform_affine (&rect, scale_x, scale_y, offset_x, offset_y, &rect); + cairo_region_union_rectangle (region, &rect); + } +} + /* {{{ GSK_COLOR_NODE */ /** @@ -3354,11 +3374,22 @@ gsk_transform_node_diff (GskRenderNode *node1, } break; + case GSK_TRANSFORM_CATEGORY_2D_AFFINE: + { + cairo_region_t *sub; + float scale_x, scale_y, dx, dy; + gsk_transform_to_affine (self1->transform, &scale_x, &scale_y, &dx, &dy); + sub = cairo_region_create (); + gsk_render_node_diff (self1->child, self2->child, sub); + region_union_region_affine (region, sub, scale_x, scale_y, dx, dy); + cairo_region_destroy (sub); + } + break; + case GSK_TRANSFORM_CATEGORY_UNKNOWN: case GSK_TRANSFORM_CATEGORY_ANY: case GSK_TRANSFORM_CATEGORY_3D: case GSK_TRANSFORM_CATEGORY_2D: - case GSK_TRANSFORM_CATEGORY_2D_AFFINE: default: gsk_render_node_diff_impossible (node1, node2, region); break; |