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 0000000000..c4dd21a0a1 Binary files /dev/null and b/testsuite/gsk/compare/offscreen-forced-downscale.png differ 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',