gsk: Avoid a crash with negative scales
authorMatthias Clasen <mclasen@redhat.com>
Sun, 20 Nov 2022 03:24:20 +0000 (22:24 -0500)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 20 Nov 2022 17:13:02 +0000 (12:13 -0500)
Don't crash when both scale_x and scale_y are -1.

A test is included.

gsk/gl/gskglrenderjob.c
testsuite/gsk/compare/upside-down-label-3d.node [new file with mode: 0644]
testsuite/gsk/compare/upside-down-label-3d.png [new file with mode: 0644]
testsuite/gsk/meson.build

index e0c87cadf0c580ad9c2204fc5475d3161fce66bf..e30a1e13414788763f39eac598781ed463a7cecb 100644 (file)
@@ -2938,7 +2938,7 @@ gsk_gl_render_job_visit_text_node (GskGLRenderJob      *job,
   const PangoFont *font = gsk_text_node_get_font (node);
   const PangoGlyphInfo *glyphs = gsk_text_node_get_glyphs (node, NULL);
   const graphene_point_t *offset = gsk_text_node_get_offset (node);
-  float text_scale = MAX (job->scale_x, job->scale_y); /* TODO: Fix for uneven scales? */
+  float text_scale = MAX (fabs (job->scale_x), fabs (job->scale_y)); /* TODO: Fix for uneven scales? */
   guint num_glyphs = gsk_text_node_get_num_glyphs (node);
   float x = offset->x + job->offset_x;
   float y = offset->y + job->offset_y;
diff --git a/testsuite/gsk/compare/upside-down-label-3d.node b/testsuite/gsk/compare/upside-down-label-3d.node
new file mode 100644 (file)
index 0000000..af64725
--- /dev/null
@@ -0,0 +1,8 @@
+transform {
+  transform: scale(-1, -1) translate(-100, -100);
+  child: text {
+    font:"Cantarell 20";
+    glyphs:"ABC";
+    offset: 0 0;
+  }
+}
diff --git a/testsuite/gsk/compare/upside-down-label-3d.png b/testsuite/gsk/compare/upside-down-label-3d.png
new file mode 100644 (file)
index 0000000..0cbbadb
Binary files /dev/null and b/testsuite/gsk/compare/upside-down-label-3d.png differ
index 82fe0d5dfcf4082dc3b6e28d8907f4f371c16809..3c90dd632e1776da26e3e47692a2b7df86a130ff 100644 (file)
@@ -85,6 +85,7 @@ compare_render_tests = [
   'transform-in-transform',
   'transform-in-transform-in-transform',
   'unaligned-offscreen',
+  'upside-down-label-3d', # not really 3d, but cairo fails it
   'rounded-clip-in-clip-3d', # not really 3d, but cairo fails it
 ]