nodeparser: Support color states for box shadows

Just switch from parse_color to parse_color2, and apply the
corresponding changes to serialization too.

Test included.
This commit is contained in:
Matthias Clasen 2024-08-02 09:46:21 -04:00
parent d3b9eb7fc8
commit ea28dc8cff
4 changed files with 38 additions and 15 deletions

View File

@ -1878,20 +1878,25 @@ parse_inset_shadow_node (GtkCssParser *parser,
Context *context)
{
GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 50, 50);
GdkRGBA color = GDK_RGBA("000000");
GdkColor color = GDK_COLOR_SRGB (0, 0, 0, 1);
double dx = 1, dy = 1, blur = 0, spread = 0;
const Declaration declarations[] = {
{ "outline", parse_rounded_rect, NULL, &outline },
{ "color", parse_color, NULL, &color },
{ "color", parse_color2, NULL, &color },
{ "dx", parse_double, NULL, &dx },
{ "dy", parse_double, NULL, &dy },
{ "spread", parse_double, NULL, &spread },
{ "blur", parse_positive_double, NULL, &blur }
};
GskRenderNode *node;
parse_declarations (parser, context, declarations, G_N_ELEMENTS (declarations));
return gsk_inset_shadow_node_new (&outline, &color, dx, dy, spread, blur);
node = gsk_inset_shadow_node_new2 (&outline, &color, dx, dy, spread, blur);
gdk_color_finish (&color);
return node;
}
G_GNUC_BEGIN_IGNORE_DEPRECATIONS
@ -2287,20 +2292,25 @@ parse_outset_shadow_node (GtkCssParser *parser,
Context *context)
{
GskRoundedRect outline = GSK_ROUNDED_RECT_INIT (0, 0, 50, 50);
GdkRGBA color = GDK_RGBA("000000");
GdkColor color = GDK_COLOR_SRGB (0, 0, 0, 1);
double dx = 1, dy = 1, blur = 0, spread = 0;
const Declaration declarations[] = {
{ "outline", parse_rounded_rect, NULL, &outline },
{ "color", parse_color, NULL, &color },
{ "color", parse_color2, NULL, &color },
{ "dx", parse_double, NULL, &dx },
{ "dy", parse_double, NULL, &dy },
{ "spread", parse_double, NULL, &spread },
{ "blur", parse_positive_double, NULL, &blur }
};
GskRenderNode *node;
parse_declarations (parser, context, declarations, G_N_ELEMENTS (declarations));
return gsk_outset_shadow_node_new (&outline, &color, dx, dy, spread, blur);
node = gsk_outset_shadow_node_new2 (&outline, &color, dx, dy, spread, blur);
gdk_color_finish (&color);
return node;
}
static GskRenderNode *
@ -3324,14 +3334,20 @@ printer_init_duplicates_for_node (Printer *printer,
}
break;
case GSK_INSET_SHADOW_NODE:
printer_init_check_color_state (printer, gsk_inset_shadow_node_get_color2 (node)->color_state);
break;
case GSK_OUTSET_SHADOW_NODE:
printer_init_check_color_state (printer, gsk_outset_shadow_node_get_color2 (node)->color_state);
break;
case GSK_CAIRO_NODE:
case GSK_LINEAR_GRADIENT_NODE:
case GSK_REPEATING_LINEAR_GRADIENT_NODE:
case GSK_RADIAL_GRADIENT_NODE:
case GSK_REPEATING_RADIAL_GRADIENT_NODE:
case GSK_CONIC_GRADIENT_NODE:
case GSK_INSET_SHADOW_NODE:
case GSK_OUTSET_SHADOW_NODE:
/* no children */
break;
@ -4334,13 +4350,11 @@ render_node_print (Printer *p,
case GSK_OUTSET_SHADOW_NODE:
{
const GdkRGBA *color = gsk_outset_shadow_node_get_color (node);
start_node (p, "outset-shadow", node_name);
append_float_param (p, "blur", gsk_outset_shadow_node_get_blur_radius (node), 0.0f);
if (!gdk_rgba_equal (color, &GDK_RGBA("000")))
append_rgba_param (p, "color", color);
if (!gdk_color_equal (gsk_inset_shadow_node_get_color2 (node), &GDK_COLOR_SRGB (0, 0, 0, 1)))
append_color_param (p, "color", gsk_outset_shadow_node_get_color2 (node));
append_float_param (p, "dx", gsk_outset_shadow_node_get_dx (node), 1.0f);
append_float_param (p, "dy", gsk_outset_shadow_node_get_dy (node), 1.0f);
append_rounded_rect_param (p, "outline", gsk_outset_shadow_node_get_outline (node));
@ -4539,12 +4553,11 @@ render_node_print (Printer *p,
case GSK_INSET_SHADOW_NODE:
{
const GdkRGBA *color = gsk_inset_shadow_node_get_color (node);
start_node (p, "inset-shadow", node_name);
append_float_param (p, "blur", gsk_inset_shadow_node_get_blur_radius (node), 0.0f);
if (!gdk_rgba_equal (color, &GDK_RGBA("000")))
append_rgba_param (p, "color", color);
if (!gdk_color_equal (gsk_inset_shadow_node_get_color2 (node), &GDK_COLOR_SRGB (0, 0, 0, 1)))
append_color_param (p, "color", gsk_inset_shadow_node_get_color2 (node));
append_float_param (p, "dx", gsk_inset_shadow_node_get_dx (node), 1.0f);
append_float_param (p, "dy", gsk_inset_shadow_node_get_dy (node), 1.0f);
append_rounded_rect_param (p, "outline", gsk_inset_shadow_node_get_outline (node));

View File

@ -324,6 +324,7 @@ node_parser_tests = [
'blend-unknown-mode.node',
'blend-unknown-mode.ref.node',
'border.node',
'box-shadow.node',
'color.node',
'color2.node',
'color3.node',

View File

@ -0,0 +1,4 @@
outset-shadow {
blur: 2;
color: color(rec2100-pq 1 0.5 0 / 0.75);
}

View File

@ -0,0 +1,5 @@
outset-shadow {
blur: 2;
color: color(rec2100-pq 1 0.5 0 / 0.75);
outline: 0 0 50 50;
}