nodeparser: Fix parsing of color-matrix node

Negative offsets in the color matrix were inverted because it used the
rect parser.
This commit is contained in:
Benjamin Otte 2022-05-18 21:16:33 +02:00
parent e8eb96ae0c
commit 0410125f20
4 changed files with 31 additions and 6 deletions

View File

@ -68,6 +68,23 @@ parse_rect (GtkCssParser *parser,
return TRUE; 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 static gboolean
parse_texture (GtkCssParser *parser, parse_texture (GtkCssParser *parser,
gpointer out_data) gpointer out_data)
@ -1490,23 +1507,20 @@ parse_color_matrix_node (GtkCssParser *parser)
GskRenderNode *child = NULL; GskRenderNode *child = NULL;
graphene_matrix_t matrix; graphene_matrix_t matrix;
GskTransform *transform = NULL; GskTransform *transform = NULL;
graphene_rect_t offset_rect = GRAPHENE_RECT_INIT (0, 0, 0, 0);
graphene_vec4_t offset; graphene_vec4_t offset;
const Declaration declarations[] = { const Declaration declarations[] = {
{ "matrix", parse_transform, clear_transform, &transform }, { "matrix", parse_transform, clear_transform, &transform },
{ "offset", parse_rect, NULL, &offset_rect }, { "offset", parse_vec4, NULL, &offset },
{ "child", parse_node, clear_node, &child } { "child", parse_node, clear_node, &child }
}; };
GskRenderNode *result; GskRenderNode *result;
graphene_vec4_init (&offset, 0, 0, 0, 0);
parse_declarations (parser, declarations, G_N_ELEMENTS(declarations)); parse_declarations (parser, declarations, G_N_ELEMENTS(declarations));
if (child == NULL) if (child == NULL)
child = create_default_render_node (); 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); gsk_transform_to_matrix (transform, &matrix);
result = gsk_color_matrix_node_new (child, &matrix, &offset); result = gsk_color_matrix_node_new (child, &matrix, &offset);

View File

@ -0,0 +1,10 @@
color-matrix {
matrix: matrix3d(255, 0, 0, 0,
0, 255, 0, 0,
0, 0, 255, 0,
0, 0, 0, 1);
offset: -127 -127 -127 0;
child: color {
color: #80007f;
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 144 B

View File

@ -36,6 +36,7 @@ compare_render_tests = [
'clip-nested1', 'clip-nested1',
'color-blur0', 'color-blur0',
'color-matrix-identity', 'color-matrix-identity',
'color-matrix-parsing',
'cross-fade-in-opacity', 'cross-fade-in-opacity',
'css-background', 'css-background',
'empty-blend', 'empty-blend',