From b49b05518358852452f88b123ca3b6c031a595c0 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 28 Jan 2024 03:21:52 +0100 Subject: [PATCH 1/4] rendernode: Implement diff() for repeat nodes If the children have an empty diff and the repeat nodes' sizes are equal, the diff is empty. --- gsk/gskrendernodeimpl.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/gsk/gskrendernodeimpl.c b/gsk/gskrendernodeimpl.c index 01c1b53716..ec91dc8f79 100644 --- a/gsk/gskrendernodeimpl.c +++ b/gsk/gskrendernodeimpl.c @@ -4224,6 +4224,32 @@ gsk_repeat_node_draw (GskRenderNode *node, } } +static void +gsk_repeat_node_diff (GskRenderNode *node1, + GskRenderNode *node2, + GskDiffData *data) +{ + GskRepeatNode *self1 = (GskRepeatNode *) node1; + GskRepeatNode *self2 = (GskRepeatNode *) node2; + + if (gsk_rect_equal (&node1->bounds, &node2->bounds) && + gsk_rect_equal (&self1->child_bounds, &self2->child_bounds)) + { + cairo_region_t *sub; + + sub = cairo_region_create(); + gsk_render_node_data_diff (self1->child, self2->child, &(GskDiffData) {sub, data->offload }); + if (cairo_region_is_empty (sub)) + { + cairo_region_destroy (sub); + return; + } + cairo_region_destroy (sub); + } + + gsk_render_node_diff_impossible (node1, node2, data); +} + static void gsk_repeat_node_class_init (gpointer g_class, gpointer class_data) @@ -4234,6 +4260,7 @@ gsk_repeat_node_class_init (gpointer g_class, node_class->finalize = gsk_repeat_node_finalize; node_class->draw = gsk_repeat_node_draw; + node_class->diff = gsk_repeat_node_diff; } /** From 88bed27f8546c5b86bcd6b4ecd3bbf115e862778 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Tue, 30 Jan 2024 15:18:12 +0100 Subject: [PATCH 2/4] blurop: Print the blur radius --- gsk/gpu/gskgpublurop.c | 1 + 1 file changed, 1 insertion(+) diff --git a/gsk/gpu/gskgpublurop.c b/gsk/gpu/gskgpublurop.c index ed188eee4b..1c86a72192 100644 --- a/gsk/gpu/gskgpublurop.c +++ b/gsk/gpu/gskgpublurop.c @@ -31,6 +31,7 @@ gsk_gpu_blur_op_print (GskGpuOp *op, instance = (GskGpuBlurInstance *) gsk_gpu_frame_get_vertex_data (frame, shader->vertex_offset); gsk_gpu_print_op (string, indent, "blur"); + g_string_append_printf (string, "%g,%g ", instance->blur_direction[0], instance->blur_direction[1]); gsk_gpu_print_rect (string, instance->rect); gsk_gpu_print_image_descriptor (string, shader->desc, instance->tex_id); gsk_gpu_print_newline (string); From 2a3a5753c154054048006b2a9e96d48e3b58ee94 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 4 Feb 2024 21:52:05 +0100 Subject: [PATCH 3/4] gpu: Don't optimize too much The rect clip can only be ignored if the scissor rect is contained in the clip. But sometimes it isn't. Fixes #6389 --- gsk/gpu/gskgpunodeprocessor.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/gsk/gpu/gskgpunodeprocessor.c b/gsk/gpu/gskgpunodeprocessor.c index da50c8706e..1ac1efa36a 100644 --- a/gsk/gpu/gskgpunodeprocessor.c +++ b/gsk/gpu/gskgpunodeprocessor.c @@ -1318,7 +1318,8 @@ gsk_gpu_node_processor_add_node_clipped (GskGpuNodeProcessor *self, gsk_gpu_clip_init_copy (&self->clip, &old_clip); return; } - else if (self->clip.type == GSK_GPU_CLIP_RECT) + else if (self->clip.type == GSK_GPU_CLIP_RECT && + gsk_rect_contains_rect (&self->clip.rect.bounds, &clip)) { self->clip.type = GSK_GPU_CLIP_NONE; } From 2e669099a64f1c79fb9841626b181ed4a55cf403 Mon Sep 17 00:00:00 2001 From: Benjamin Otte Date: Sun, 4 Feb 2024 21:56:15 +0100 Subject: [PATCH 4/4] testsuite: Add a test for previous commit Related: #6389 --- .../compare/clip-in-smaller-rounded-clip.node | 17 +++++++++++++++++ .../compare/clip-in-smaller-rounded-clip.png | Bin 0 -> 169 bytes testsuite/gsk/meson.build | 1 + 3 files changed, 18 insertions(+) create mode 100644 testsuite/gsk/compare/clip-in-smaller-rounded-clip.node create mode 100644 testsuite/gsk/compare/clip-in-smaller-rounded-clip.png diff --git a/testsuite/gsk/compare/clip-in-smaller-rounded-clip.node b/testsuite/gsk/compare/clip-in-smaller-rounded-clip.node new file mode 100644 index 0000000000..e198530662 --- /dev/null +++ b/testsuite/gsk/compare/clip-in-smaller-rounded-clip.node @@ -0,0 +1,17 @@ +/* make image larger so overdraw gets visible */ +border { + outline: 0 0 50 50; +} + +/* do a non-scissorable clip */ +rounded-clip { + clip: 0 10 50 30 / 10; + /* do a scissorable clip that is larger + than the clip before */ + child: clip { + clip: 10 0 30 50; + child: color { + color: blue; + } + } +} \ No newline at end of file diff --git a/testsuite/gsk/compare/clip-in-smaller-rounded-clip.png b/testsuite/gsk/compare/clip-in-smaller-rounded-clip.png new file mode 100644 index 0000000000000000000000000000000000000000..984d5300454486dc599111d8b64a6fb4cf9839af GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^Mj*_=1|;R|J2nET0#6smkc`H+H#hPgFyJ|IAbi5# z@UXA~!2?H{*M$C9;MA&qa@i8L6L#C