From 77a2cd4d8dbf108ac36b9866b50257fbb057b719 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Mon, 4 Mar 2024 14:49:01 -0500 Subject: [PATCH] gsk: Fix mis-scaled text rendering This was happening when rotated text was partially redrawn. A test that failed before this change is included. Fixes: #6504 --- gsk/gpu/gskgpunodeprocessor.c | 11 +++++++---- .../compare/offscreen-forced-downscale.node | 17 +++++++++++++++++ .../gsk/compare/offscreen-forced-downscale.png | Bin 0 -> 391 bytes testsuite/gsk/meson.build | 1 + 4 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 testsuite/gsk/compare/offscreen-forced-downscale.node create mode 100644 testsuite/gsk/compare/offscreen-forced-downscale.png diff --git a/gsk/gpu/gskgpunodeprocessor.c b/gsk/gpu/gskgpunodeprocessor.c index b4be4ac605..793842ebe6 100644 --- a/gsk/gpu/gskgpunodeprocessor.c +++ b/gsk/gpu/gskgpunodeprocessor.c @@ -1649,10 +1649,13 @@ gsk_gpu_node_processor_add_transform_node (GskGpuNodeProcessor *self, extract_scale_from_transform (self->modelview, &scale_x, &scale_y); - old_pixels = graphene_vec2_get_x (&old_scale) * graphene_vec2_get_y (&old_scale) * - old_clip.rect.bounds.size.width * old_clip.rect.bounds.size.height; - new_pixels = scale_x * scale_y * self->clip.rect.bounds.size.width * self->clip.rect.bounds.size.height; - if (new_pixels > 2 * old_pixels) + old_pixels = MAX (graphene_vec2_get_x (&old_scale) * old_clip.rect.bounds.size.width, + graphene_vec2_get_y (&old_scale) * old_clip.rect.bounds.size.height); + new_pixels = MAX (scale_x * self->clip.rect.bounds.size.width, + scale_y * self->clip.rect.bounds.size.height); + + /* Check that our offscreen doesn't get too big. 1.5 ~ sqrt(2) */ + if (new_pixels > 1.5 * old_pixels) { float forced_downscale = 2 * old_pixels / new_pixels; scale_x *= forced_downscale; diff --git a/testsuite/gsk/compare/offscreen-forced-downscale.node b/testsuite/gsk/compare/offscreen-forced-downscale.node new file mode 100644 index 0000000000..bc62728c9c --- /dev/null +++ b/testsuite/gsk/compare/offscreen-forced-downscale.node @@ -0,0 +1,17 @@ +color { + bounds: -10 -10 20 120; + color: rgb(255,255,255); +} +transform { + transform: rotate(45); + child: transform { + transform: rotate(45); + child: shadow { + shadows: rgb(0,0,0) 0 1; + child: color { + bounds: 0 0 100 1; + color: rgb(255,0,0); + } + } + } +} diff --git a/testsuite/gsk/compare/offscreen-forced-downscale.png b/testsuite/gsk/compare/offscreen-forced-downscale.png new file mode 100644 index 0000000000000000000000000000000000000000..c4dd21a0a156fce067d167a4cb41eb1c94c911c4 GIT binary patch literal 391 zcmeAS@N?(olHy`uVBq!ia0vp^X+T`T!3HE5nA^=ah2#JL literal 0 HcmV?d00001 diff --git a/testsuite/gsk/meson.build b/testsuite/gsk/meson.build index 400824aad4..5377cbec23 100644 --- a/testsuite/gsk/meson.build +++ b/testsuite/gsk/meson.build @@ -104,6 +104,7 @@ compare_render_tests = [ 'mask-texture-color-alpha', 'mipmap-generation-later', 'nested-rounded-clips', + 'offscreen-forced-downscale', 'offscreen-fractional-translate-nogl', 'offscreen-pixel-alignment-nogl-nocairo', 'offscreen-pixel-alignment2',