nodeparser: Fix parsing of color-matrix node
authorBenjamin Otte <otte@redhat.com>
Wed, 18 May 2022 19:16:33 +0000 (21:16 +0200)
committerBenjamin Otte <otte@redhat.com>
Wed, 18 May 2022 19:16:33 +0000 (21:16 +0200)
Negative offsets in the color matrix were inverted because it used the
rect parser.

gsk/gskrendernodeparser.c
testsuite/gsk/compare/color-matrix-parsing.node [new file with mode: 0644]
testsuite/gsk/compare/color-matrix-parsing.png [new file with mode: 0644]
testsuite/gsk/meson.build

index b5f703bd79e88a26473afd86f33293a29c4b8cd8..7e5a74db0c671f5acba49494cdd576eb0c2afe64 100644 (file)
@@ -68,6 +68,23 @@ parse_rect (GtkCssParser    *parser,
   return TRUE;
 }
 
+static gboolean
+parse_vec4 (GtkCssParser    *parser,
+            gpointer         out_vec4)
+{
+  double numbers[4];
+
+  if (!gtk_css_parser_consume_number (parser, &numbers[0]) ||
+      !gtk_css_parser_consume_number (parser, &numbers[1]) ||
+      !gtk_css_parser_consume_number (parser, &numbers[2]) ||
+      !gtk_css_parser_consume_number (parser, &numbers[3]))
+    return FALSE;
+
+  graphene_vec4_init (out_vec4, numbers[0], numbers[1], numbers[2], numbers[3]);
+
+  return TRUE;
+}
+
 static gboolean
 parse_texture (GtkCssParser *parser,
                gpointer      out_data)
@@ -1490,23 +1507,20 @@ parse_color_matrix_node (GtkCssParser *parser)
   GskRenderNode *child = NULL;
   graphene_matrix_t matrix;
   GskTransform *transform = NULL;
-  graphene_rect_t offset_rect = GRAPHENE_RECT_INIT (0, 0, 0, 0);
   graphene_vec4_t offset;
   const Declaration declarations[] = {
     { "matrix", parse_transform, clear_transform, &transform },
-    { "offset", parse_rect, NULL, &offset_rect },
+    { "offset", parse_vec4, NULL, &offset },
     { "child", parse_node, clear_node, &child }
   };
   GskRenderNode *result;
 
+  graphene_vec4_init (&offset, 0, 0, 0, 0);
+
   parse_declarations (parser, declarations, G_N_ELEMENTS(declarations));
   if (child == NULL)
     child = create_default_render_node ();
 
-  graphene_vec4_init (&offset,
-                      offset_rect.origin.x, offset_rect.origin.y,
-                      offset_rect.size.width, offset_rect.size.height);
-
   gsk_transform_to_matrix (transform, &matrix);
 
   result = gsk_color_matrix_node_new (child, &matrix, &offset);
diff --git a/testsuite/gsk/compare/color-matrix-parsing.node b/testsuite/gsk/compare/color-matrix-parsing.node
new file mode 100644 (file)
index 0000000..57cdc77
--- /dev/null
@@ -0,0 +1,10 @@
+color-matrix {\r
+  matrix: matrix3d(255, 0, 0, 0,\r
+                   0, 255, 0, 0,\r
+                   0, 0, 255, 0,\r
+                   0, 0, 0, 1);\r
+  offset: -127 -127 -127 0;\r
+  child: color {
+    color: #80007f;
+  }\r
+}
\ No newline at end of file
diff --git a/testsuite/gsk/compare/color-matrix-parsing.png b/testsuite/gsk/compare/color-matrix-parsing.png
new file mode 100644 (file)
index 0000000..9a5764a
Binary files /dev/null and b/testsuite/gsk/compare/color-matrix-parsing.png differ
index 2fb02087d30ae5e839e20e4919417e8f8c9c2a86..317f6a667037a3c42c919c8f18835a59e7669e85 100644 (file)
@@ -36,6 +36,7 @@ compare_render_tests = [
   'clip-nested1',
   'color-blur0',
   'color-matrix-identity',
+  'color-matrix-parsing',
   'cross-fade-in-opacity',
   'css-background',
   'empty-blend',