From de24b4f91b26627e01bb0c458cc5a229e85e2e51 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 5 Feb 2021 21:36:22 -0500 Subject: [PATCH 01/11] cssshadowvalue: Add a parsing function Add a variant of the parse function that parses just a single (non-box) shadow, as required for the drop-shadow filter. --- gtk/gtkcssshadowvalue.c | 31 +++++++++++++++++++++++++++++++ gtk/gtkcssshadowvalueprivate.h | 2 ++ 2 files changed, 33 insertions(+) diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index 126e9af8f2..b7b409ca72 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -326,6 +326,21 @@ gtk_css_shadow_value_new (ShadowValue *shadows, return retval; } +GtkCssValue * +gtk_css_shadow_value_new_filter (void) +{ + ShadowValue value; + + value.inset = FALSE; + value.hoffset = _gtk_css_number_value_new (0, GTK_CSS_NUMBER); + value.voffset = _gtk_css_number_value_new (0, GTK_CSS_NUMBER); + value.radius = _gtk_css_number_value_new (0, GTK_CSS_NUMBER); + value.spread = _gtk_css_number_value_new (0, GTK_CSS_NUMBER); + value.color = _gtk_css_color_value_new_current_color (); + + return gtk_css_shadow_value_new (&value, 1); +} + enum { HOFFSET, VOFFSET, @@ -497,6 +512,22 @@ fail: return NULL; } +GtkCssValue * +_gtk_css_shadow_value_parse_filter (GtkCssParser *parser) +{ + GtkCssValue *result; + + result = _gtk_css_shadow_value_parse (parser, FALSE); + + if (result && result->n_shadows != 1) + { + gtk_css_parser_error_syntax (parser, "A single shadow is required"); + g_clear_pointer (&result, gtk_css_value_unref); + } + + return result; +} + void gtk_css_shadow_value_get_extents (const GtkCssValue *value, GtkBorder *border) diff --git a/gtk/gtkcssshadowvalueprivate.h b/gtk/gtkcssshadowvalueprivate.h index 5784dfa516..3f49963b5b 100644 --- a/gtk/gtkcssshadowvalueprivate.h +++ b/gtk/gtkcssshadowvalueprivate.h @@ -35,9 +35,11 @@ G_BEGIN_DECLS GtkCssValue * gtk_css_shadow_value_new_none (void); +GtkCssValue * gtk_css_shadow_value_new_filter (void); GtkCssValue * _gtk_css_shadow_value_parse (GtkCssParser *parser, gboolean box_shadow_mode); +GtkCssValue * _gtk_css_shadow_value_parse_filter (GtkCssParser *parser); void gtk_css_shadow_value_get_extents (const GtkCssValue *shadow, GtkBorder *border); From 9770872d1299ef1b073b2bdf4d0caab8d018059d Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 5 Feb 2021 21:37:14 -0500 Subject: [PATCH 02/11] css: Implement the drop-shadow filter We have all the pieces, so this is surprisingly easy. --- gtk/gtkcssfiltervalue.c | 72 +++++++++++++++++++++++++++++++++-------- 1 file changed, 58 insertions(+), 14 deletions(-) diff --git a/gtk/gtkcssfiltervalue.c b/gtk/gtkcssfiltervalue.c index 3269368c69..b1d1359f52 100644 --- a/gtk/gtkcssfiltervalue.c +++ b/gtk/gtkcssfiltervalue.c @@ -24,6 +24,7 @@ #include "gtkcssfiltervalueprivate.h" #include "gtkcssnumbervalueprivate.h" +#include "gtkcssshadowvalueprivate.h" typedef union _GtkCssFilter GtkCssFilter; @@ -46,7 +47,7 @@ union _GtkCssFilter { struct { GtkCssFilterType type; GtkCssValue *value; - } brightness, contrast, grayscale, hue_rotate, invert, opacity, saturate, sepia, blur; + } blur, brightness, contrast, drop_shadow, grayscale, hue_rotate, invert, opacity, saturate, sepia; }; struct _GtkCssValue { @@ -90,8 +91,10 @@ gtk_css_filter_clear (GtkCssFilter *filter) case GTK_CSS_FILTER_BLUR: _gtk_css_value_unref (filter->blur.value); break; - case GTK_CSS_FILTER_NONE: case GTK_CSS_FILTER_DROP_SHADOW: + _gtk_css_value_unref (filter->drop_shadow.value); + break; + case GTK_CSS_FILTER_NONE: default: g_assert_not_reached (); break; @@ -131,8 +134,10 @@ gtk_css_filter_init_identity (GtkCssFilter *filter, case GTK_CSS_FILTER_BLUR: filter->blur.value = _gtk_css_number_value_new (0, GTK_CSS_PX); break; - case GTK_CSS_FILTER_NONE: case GTK_CSS_FILTER_DROP_SHADOW: + filter->drop_shadow.value = gtk_css_shadow_value_new_filter (); + break; + case GTK_CSS_FILTER_NONE: default: g_assert_not_reached (); break; @@ -347,8 +352,11 @@ gtk_css_filter_compute (GtkCssFilter *dest, dest->blur.value = _gtk_css_value_compute (src->blur.value, property_id, provider, style, parent_style); return dest->blur.value == src->blur.value; - case GTK_CSS_FILTER_NONE: case GTK_CSS_FILTER_DROP_SHADOW: + dest->drop_shadow.value = _gtk_css_value_compute (src->drop_shadow.value, property_id, provider, style, parent_style); + return dest->drop_shadow.value == src->drop_shadow.value; + + case GTK_CSS_FILTER_NONE: default: g_assert_not_reached (); return FALSE; @@ -428,8 +436,10 @@ gtk_css_filter_equal (const GtkCssFilter *filter1, case GTK_CSS_FILTER_BLUR: return _gtk_css_value_equal (filter1->blur.value, filter2->blur.value); - case GTK_CSS_FILTER_NONE: case GTK_CSS_FILTER_DROP_SHADOW: + return _gtk_css_value_equal (filter1->drop_shadow.value, filter2->drop_shadow.value); + + case GTK_CSS_FILTER_NONE: default: g_assert_not_reached (); return FALSE; @@ -517,8 +527,11 @@ gtk_css_filter_transition (GtkCssFilter *result, result->blur.value = _gtk_css_value_transition (start->blur.value, end->blur.value, property_id, progress); break; - case GTK_CSS_FILTER_NONE: case GTK_CSS_FILTER_DROP_SHADOW: + result->drop_shadow.value = _gtk_css_value_transition (start->drop_shadow.value, end->drop_shadow.value, property_id, progress); + break; + + case GTK_CSS_FILTER_NONE: default: g_assert_not_reached (); break; @@ -663,8 +676,13 @@ gtk_css_filter_print (const GtkCssFilter *filter, g_string_append (string, ")"); break; - case GTK_CSS_FILTER_NONE: case GTK_CSS_FILTER_DROP_SHADOW: + g_string_append (string, "drop_shadow("); + _gtk_css_value_print (filter->drop_shadow.value, string); + g_string_append (string, ")"); + break; + + case GTK_CSS_FILTER_NONE: default: g_assert_not_reached (); break; @@ -709,12 +727,12 @@ static GtkCssValue * gtk_css_filter_value_alloc (guint n_filters) { GtkCssValue *result; - + g_return_val_if_fail (n_filters > 0, NULL); - + result = _gtk_css_value_alloc (>K_CSS_VALUE_FILTER, sizeof (GtkCssValue) + sizeof (GtkCssFilter) * (n_filters - 1)); result->n_filters = n_filters; - + return result; } @@ -772,6 +790,20 @@ gtk_css_filter_parse_angle (GtkCssParser *parser, return 1; } +static guint +gtk_css_filter_parse_shadow (GtkCssParser *parser, + guint n, + gpointer data) +{ + GtkCssValue **values = data; + + values[n] = _gtk_css_shadow_value_parse_filter (parser); + if (values[n] == NULL) + return 0; + + return 1; +} + GtkCssValue * gtk_css_filter_value_parse (GtkCssParser *parser) { @@ -861,6 +893,14 @@ gtk_css_filter_value_parse (GtkCssParser *parser) filter.type = GTK_CSS_FILTER_SEPIA; computed = computed && gtk_css_value_is_computed (filter.sepia.value); } + else if (gtk_css_parser_has_function (parser, "drop-shadow")) + { + if (!gtk_css_parser_consume_function (parser, 1, 1, gtk_css_filter_parse_shadow, &filter.drop_shadow.value)) + goto fail; + + filter.type = GTK_CSS_FILTER_DROP_SHADOW; + computed = computed && gtk_css_value_is_computed (filter.drop_shadow.value); + } else { break; @@ -909,9 +949,7 @@ gtk_css_filter_value_push_snapshot (const GtkCssValue *filter, { j = gtk_css_filter_value_compute_matrix (filter, i, &matrix, &offset); if (i < j) - gtk_snapshot_push_color_matrix (snapshot, - &matrix, - &offset); + gtk_snapshot_push_color_matrix (snapshot, &matrix, &offset); if (j < filter->n_filters) { @@ -920,6 +958,11 @@ gtk_css_filter_value_push_snapshot (const GtkCssValue *filter, radius = _gtk_css_number_value_get (filter->filters[j].blur.value, 100.0); gtk_snapshot_push_blur (snapshot, radius); } + else if (filter->filters[j].type == GTK_CSS_FILTER_DROP_SHADOW) + { + if (!gtk_css_shadow_value_push_snapshot (filter->filters[j].drop_shadow.value, snapshot)) + gtk_snapshot_push_debug (snapshot, "Shadow Filter omitted"); + } else g_warning ("Don't know how to handle filter type %d", filter->filters[j].type); } @@ -942,7 +985,8 @@ gtk_css_filter_value_pop_snapshot (const GtkCssValue *filter, { for (j = i; j < filter->n_filters; j++) { - if (filter->filters[j].type == GTK_CSS_FILTER_BLUR) + if (filter->filters[j].type == GTK_CSS_FILTER_BLUR || + filter->filters[j].type == GTK_CSS_FILTER_DROP_SHADOW) break; } From a1f7073ff5f4960b240f60486959fe00e0931389 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 5 Feb 2021 21:37:47 -0500 Subject: [PATCH 03/11] Add tests for the css filter property Test that we can parse filters. --- testsuite/css/parser/filter.css | 23 +++++++++++++++++++++++ testsuite/css/parser/filter.ref.css | 23 +++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 testsuite/css/parser/filter.css create mode 100644 testsuite/css/parser/filter.ref.css diff --git a/testsuite/css/parser/filter.css b/testsuite/css/parser/filter.css new file mode 100644 index 0000000000..8a114e590a --- /dev/null +++ b/testsuite/css/parser/filter.css @@ -0,0 +1,23 @@ +a { + filter: initial; +} + +b { + filter: inherit; +} + +c { + filter: unset; +} + +d { + filter: none; +} + +e { + filter: blur(2px) brightness(20%) contrast(120%) grayscale(100%) hue-rotate(45deg) invert(50%) opacity(25%) saturate(90%) sepia(100%); +} + +f { + filter: drop-shadow(rgb(255,0,0) 1px 2px); +} diff --git a/testsuite/css/parser/filter.ref.css b/testsuite/css/parser/filter.ref.css new file mode 100644 index 0000000000..70b733b325 --- /dev/null +++ b/testsuite/css/parser/filter.ref.css @@ -0,0 +1,23 @@ +a { + filter: initial; +} + +b { + filter: inherit; +} + +c { + filter: unset; +} + +d { + filter: none; +} + +e { + filter: blur(2px) brightness(20%) contrast(120%) grayscale(100%) hue-rotate(45deg) invert(50%) opacity(25%) saturate(90%) sepia(100%); +} + +f { + filter: drop_shadow(1px 2px rgb(255,0,0)); +} From 4e27de7df9b2925ca3d56fc01dc5360c95557ed0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 6 Feb 2021 15:37:04 -0500 Subject: [PATCH 04/11] cssshadowvalue: Drop the underscore Rename _gtk_css_shadow_value_parse to drop the underscore. It was the only underscore-prefixed function in this file. --- gtk/gtkcssshadowvalue.c | 12 ++++++------ gtk/gtkcssshadowvalueprivate.h | 2 +- gtk/gtkcssstylepropertyimpl.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index b7b409ca72..a691d157e2 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -431,9 +431,9 @@ parse_color (GtkCssParser *parser, } static gboolean -_gtk_css_shadow_value_parse_one (GtkCssParser *parser, - gboolean box_shadow_mode, - ShadowValue *result) +gtk_css_shadow_value_parse_one (GtkCssParser *parser, + gboolean box_shadow_mode, + ShadowValue *result) { GtkCssValue *values[N_VALUES] = { NULL, }; GtkCssValue *color = NULL; @@ -479,8 +479,8 @@ fail: #define MAX_SHADOWS 64 GtkCssValue * -_gtk_css_shadow_value_parse (GtkCssParser *parser, - gboolean box_shadow_mode) +gtk_css_shadow_value_parse (GtkCssParser *parser, + gboolean box_shadow_mode) { ShadowValue shadows[MAX_SHADOWS]; int n_shadows = 0; @@ -490,7 +490,7 @@ _gtk_css_shadow_value_parse (GtkCssParser *parser, return gtk_css_shadow_value_new_none (); do { - if (_gtk_css_shadow_value_parse_one (parser, box_shadow_mode, &shadows[n_shadows])) + if (gtk_css_shadow_value_parse_one (parser, box_shadow_mode, &shadows[n_shadows])) n_shadows++; if (n_shadows > MAX_SHADOWS) diff --git a/gtk/gtkcssshadowvalueprivate.h b/gtk/gtkcssshadowvalueprivate.h index 3f49963b5b..fa2050e080 100644 --- a/gtk/gtkcssshadowvalueprivate.h +++ b/gtk/gtkcssshadowvalueprivate.h @@ -37,7 +37,7 @@ G_BEGIN_DECLS GtkCssValue * gtk_css_shadow_value_new_none (void); GtkCssValue * gtk_css_shadow_value_new_filter (void); -GtkCssValue * _gtk_css_shadow_value_parse (GtkCssParser *parser, +GtkCssValue * gtk_css_shadow_value_parse (GtkCssParser *parser, gboolean box_shadow_mode); GtkCssValue * _gtk_css_shadow_value_parse_filter (GtkCssParser *parser); diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c index 8e5d4bf796..6df32116a8 100644 --- a/gtk/gtkcssstylepropertyimpl.c +++ b/gtk/gtkcssstylepropertyimpl.c @@ -512,14 +512,14 @@ static GtkCssValue * box_shadow_value_parse (GtkCssStyleProperty *property, GtkCssParser *parser) { - return _gtk_css_shadow_value_parse (parser, TRUE); + return gtk_css_shadow_value_parse (parser, TRUE); } static GtkCssValue * shadow_value_parse (GtkCssStyleProperty *property, GtkCssParser *parser) { - return _gtk_css_shadow_value_parse (parser, FALSE); + return gtk_css_shadow_value_parse (parser, FALSE); } static GtkCssValue * From 5b8896f1db5a4ffa57634b66ab2f916a981135a8 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 6 Feb 2021 09:00:32 -0500 Subject: [PATCH 05/11] cssshadowvalue: Add gtk_css_shadow_value_pop_snapshot This is the counterpart ot gtk_css_shadow_value_push_snapshot. To make this easy, move the determination whether we need a shadow out of the push function and save it. --- gtk/gtkcssshadowvalue.c | 24 +++++++++++++++++++++++- gtk/gtkcssshadowvalueprivate.h | 6 ++++-- 2 files changed, 27 insertions(+), 3 deletions(-) diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index a691d157e2..f4d60c9bcd 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -308,6 +308,7 @@ gtk_css_shadow_value_new (ShadowValue *shadows, memcpy (retval->shadows, shadows, sizeof (ShadowValue) * n_shadows); retval->is_computed = TRUE; + for (i = 0; i < n_shadows; i++) { const ShadowValue *shadow = &retval->shadows[i]; @@ -706,7 +707,6 @@ gtk_css_shadow_value_push_snapshot (const GtkCssValue *value, gboolean need_shadow = FALSE; guint i; - /* TODO: We can save this as a flag once and then reuse it */ for (i = 0; i < value->n_shadows; i++) { const ShadowValue *shadow = &value->shadows[i]; @@ -737,3 +737,25 @@ gtk_css_shadow_value_push_snapshot (const GtkCssValue *value, return need_shadow; } + +void +gtk_css_shadow_value_pop_snapshot (const GtkCssValue *value, + GtkSnapshot *snapshot) +{ + gboolean need_shadow = FALSE; + guint i; + + for (i = 0; i < value->n_shadows; i++) + { + const ShadowValue *shadow = &value->shadows[i]; + + if (!gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color))) + { + need_shadow = TRUE; + break; + } + } + + if (need_shadow) + gtk_snapshot_pop (snapshot); +} diff --git a/gtk/gtkcssshadowvalueprivate.h b/gtk/gtkcssshadowvalueprivate.h index fa2050e080..21efac1908 100644 --- a/gtk/gtkcssshadowvalueprivate.h +++ b/gtk/gtkcssshadowvalueprivate.h @@ -34,12 +34,12 @@ G_BEGIN_DECLS -GtkCssValue * gtk_css_shadow_value_new_none (void); +GtkCssValue * gtk_css_shadow_value_new_none (void); GtkCssValue * gtk_css_shadow_value_new_filter (void); GtkCssValue * gtk_css_shadow_value_parse (GtkCssParser *parser, gboolean box_shadow_mode); -GtkCssValue * _gtk_css_shadow_value_parse_filter (GtkCssParser *parser); +GtkCssValue * gtk_css_shadow_value_parse_filter (GtkCssParser *parser); void gtk_css_shadow_value_get_extents (const GtkCssValue *shadow, GtkBorder *border); @@ -55,6 +55,8 @@ gboolean gtk_css_shadow_value_is_none (const GtkCssValue gboolean gtk_css_shadow_value_push_snapshot (const GtkCssValue *value, GtkSnapshot *snapshot); +void gtk_css_shadow_value_pop_snapshot (const GtkCssValue *value, + GtkSnapshot *snapshot); G_END_DECLS From be3f352b593e59cf5f784fb3929acacf09f4d9c0 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 5 Feb 2021 21:36:22 -0500 Subject: [PATCH 06/11] cssshadowvalue: Add a parsing function Add a variant of the parse function that parses just a single (non-box) shadow, as required for the drop-shadow filter. --- gtk/gtkcssshadowvalue.c | 17 ++++++----------- 1 file changed, 6 insertions(+), 11 deletions(-) diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index f4d60c9bcd..3afc9592a0 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -514,19 +514,14 @@ fail: } GtkCssValue * -_gtk_css_shadow_value_parse_filter (GtkCssParser *parser) +gtk_css_shadow_value_parse_filter (GtkCssParser *parser) { - GtkCssValue *result; + ShadowValue shadow; - result = _gtk_css_shadow_value_parse (parser, FALSE); - - if (result && result->n_shadows != 1) - { - gtk_css_parser_error_syntax (parser, "A single shadow is required"); - g_clear_pointer (&result, gtk_css_value_unref); - } - - return result; + if (gtk_css_shadow_value_parse_one (parser, FALSE, &shadow)) + return gtk_css_shadow_value_new (&shadow, 1); + else + return NULL; } void From 429dfcf483701b9b4073170c91adc04b7e7ffdee Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Sat, 6 Feb 2021 09:44:16 -0500 Subject: [PATCH 07/11] cssshadowvalue: Add a 'filter mode' Shadow values created by gtk_css_shadow_value_new_filter or gtk_css_shadow_value_parse_filter interpret their radius value as standard deviation. Add a flag for this mode, and use it where necessary. --- gtk/gtkcssshadowvalue.c | 53 ++++++++++++++++++++++++++--------------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c index 3afc9592a0..86dfcafdfb 100644 --- a/gtk/gtkcssshadowvalue.c +++ b/gtk/gtkcssshadowvalue.c @@ -44,12 +44,14 @@ typedef struct { struct _GtkCssValue { GTK_CSS_VALUE_BASE + guint is_filter : 1; /* values stored in radius are std_dev, for drop-shadow */ guint n_shadows; ShadowValue shadows[1]; }; static GtkCssValue * gtk_css_shadow_value_new (ShadowValue *shadows, - guint n_shadows); + guint n_shadows, + gboolean is_filter); static void shadow_value_for_transition (ShadowValue *result, @@ -133,7 +135,7 @@ gtk_css_value_shadow_compute (GtkCssValue *value, shadows[i].inset = shadow->inset; } - return gtk_css_shadow_value_new (shadows, value->n_shadows); + return gtk_css_shadow_value_new (shadows, value->n_shadows, value->is_filter); } static gboolean @@ -227,7 +229,7 @@ gtk_css_value_shadow_transition (GtkCssValue *start, } } - return gtk_css_shadow_value_new (shadows, len); + return gtk_css_shadow_value_new (shadows, len, start->is_filter); } static void @@ -284,7 +286,7 @@ static const GtkCssValueClass GTK_CSS_VALUE_SHADOW = { gtk_css_value_shadow_print }; -static GtkCssValue shadow_none_singleton = { >K_CSS_VALUE_SHADOW, 1, TRUE, 0 }; +static GtkCssValue shadow_none_singleton = { >K_CSS_VALUE_SHADOW, 1, TRUE, FALSE, 0 }; GtkCssValue * gtk_css_shadow_value_new_none (void) @@ -294,7 +296,8 @@ gtk_css_shadow_value_new_none (void) static GtkCssValue * gtk_css_shadow_value_new (ShadowValue *shadows, - guint n_shadows) + guint n_shadows, + gboolean is_filter) { GtkCssValue *retval; guint i; @@ -304,11 +307,11 @@ gtk_css_shadow_value_new (ShadowValue *shadows, retval = _gtk_css_value_alloc (>K_CSS_VALUE_SHADOW, sizeof (GtkCssValue) + sizeof (ShadowValue) * (n_shadows - 1)); retval->n_shadows = n_shadows; + retval->is_filter = is_filter; memcpy (retval->shadows, shadows, sizeof (ShadowValue) * n_shadows); retval->is_computed = TRUE; - for (i = 0; i < n_shadows; i++) { const ShadowValue *shadow = &retval->shadows[i]; @@ -339,7 +342,7 @@ gtk_css_shadow_value_new_filter (void) value.spread = _gtk_css_number_value_new (0, GTK_CSS_NUMBER); value.color = _gtk_css_color_value_new_current_color (); - return gtk_css_shadow_value_new (&value, 1); + return gtk_css_shadow_value_new (&value, 1, TRUE); } enum { @@ -501,7 +504,7 @@ gtk_css_shadow_value_parse (GtkCssParser *parser, } } while (gtk_css_parser_try_token (parser, GTK_CSS_TOKEN_COMMA)); - return gtk_css_shadow_value_new (shadows, n_shadows); + return gtk_css_shadow_value_new (shadows, n_shadows, FALSE); fail: for (i = 0; i < n_shadows; i++) @@ -519,7 +522,7 @@ gtk_css_shadow_value_parse_filter (GtkCssParser *parser) ShadowValue shadow; if (gtk_css_shadow_value_parse_one (parser, FALSE, &shadow)) - return gtk_css_shadow_value_new (&shadow, 1); + return gtk_css_shadow_value_new (&shadow, 1, TRUE); else return NULL; } @@ -539,6 +542,8 @@ gtk_css_shadow_value_get_extents (const GtkCssValue *value, spread = _gtk_css_number_value_get (shadow->spread, 0); radius = _gtk_css_number_value_get (shadow->radius, 0); + if (value->is_filter) + radius = radius * 2; clip_radius = gsk_cairo_blur_compute_pixels (radius); hoffset = _gtk_css_number_value_get (shadow->hoffset, 0); voffset = _gtk_css_number_value_get (shadow->voffset, 0); @@ -556,6 +561,8 @@ gtk_css_shadow_value_snapshot_outset (const GtkCssValue *value, const GskRoundedRect *border_box) { guint i; + double dx, dy, spread, radius; + const GdkRGBA *color; g_return_if_fail (value->class == >K_CSS_VALUE_SHADOW); @@ -566,17 +573,20 @@ gtk_css_shadow_value_snapshot_outset (const GtkCssValue *value, if (shadow->inset) continue; + color = gtk_css_color_value_get_rgba (shadow->color); + /* We don't need to draw invisible shadows */ - if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color))) + if (gdk_rgba_is_clear (color)) continue; - gtk_snapshot_append_outset_shadow (snapshot, - border_box, - gtk_css_color_value_get_rgba (shadow->color), - _gtk_css_number_value_get (shadow->hoffset, 0), - _gtk_css_number_value_get (shadow->voffset, 0), - _gtk_css_number_value_get (shadow->spread, 0), - _gtk_css_number_value_get (shadow->radius, 0)); + dx = _gtk_css_number_value_get (shadow->hoffset, 0); + dy = _gtk_css_number_value_get (shadow->voffset, 0); + spread = _gtk_css_number_value_get (shadow->spread, 0); + radius = _gtk_css_number_value_get (shadow->radius, 0); + if (value->is_filter) + radius = 2 * radius; + + gtk_snapshot_append_outset_shadow (snapshot, border_box, color, dx, dy, spread, radius); } } @@ -598,15 +608,18 @@ gtk_css_shadow_value_snapshot_inset (const GtkCssValue *value, if (!shadow->inset) continue; + color = gtk_css_color_value_get_rgba (shadow->color); + /* We don't need to draw invisible shadows */ - if (gdk_rgba_is_clear (gtk_css_color_value_get_rgba (shadow->color))) + if (gdk_rgba_is_clear (color)) continue; dx = _gtk_css_number_value_get (shadow->hoffset, 0); dy = _gtk_css_number_value_get (shadow->voffset, 0); spread = _gtk_css_number_value_get (shadow->spread, 0); radius = _gtk_css_number_value_get (shadow->radius, 0); - color = gtk_css_color_value_get_rgba (shadow->color); + if (value->is_filter) + radius = 2 * radius; /* These are trivial to do with a color node */ if (spread == 0 && radius == 0 && @@ -725,6 +738,8 @@ gtk_css_shadow_value_push_snapshot (const GtkCssValue *value, shadows[i].dy = _gtk_css_number_value_get (shadow->voffset, 0); shadows[i].color = *gtk_css_color_value_get_rgba (shadow->color); shadows[i].radius = _gtk_css_number_value_get (shadow->radius, 0); + if (value->is_filter) + shadows[i].radius *= 2; } gtk_snapshot_push_shadow (snapshot, shadows, value->n_shadows); From ea7185bdb1ba423495340a9b880e619a861064fd Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 5 Feb 2021 21:37:14 -0500 Subject: [PATCH 08/11] cssfiltervalue: Implement drop-shadows We have all the pieces, so this is surprisingly easy. --- docs/reference/gtk/css-properties.md | 2 +- gtk/gtkcssfiltervalue.c | 11 ++++++----- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/reference/gtk/css-properties.md b/docs/reference/gtk/css-properties.md index 809669dd90..8fa9819fc7 100644 --- a/docs/reference/gtk/css-properties.md +++ b/docs/reference/gtk/css-properties.md @@ -129,7 +129,7 @@ done with |:-----------|:----------|:------| |color | [CSS Color Level 3](https://www.w3.org/TR/css3-color/#foreground) | | |opacity | [CSS Color Level 3](https://www.w3.org/TR/css3-color/#opacity) | | -|filter | [CSS Filter Effect Level 1](https://drafts.fxtf.org/filters/#FilterProperty) | CSS allows drop-shadow | +|filter | [CSS Filter Effect Level 1](https://drafts.fxtf.org/filters/#FilterProperty) | | |font-family | [CSS Fonts Level 3](https://www.w3.org/TR/css3-fonts/#font-family-prop) | defaults to gtk-font-name setting | |font-size | [CSS Fonts Level 3](https://www.w3.org/TR/css3-fonts/#font-size-prop) | defaults to gtk-font-name setting | |font-style | [CSS Fonts Level 3](https://www.w3.org/TR/css3-fonts/#font-style-prop) | | diff --git a/gtk/gtkcssfiltervalue.c b/gtk/gtkcssfiltervalue.c index b1d1359f52..ecc225a925 100644 --- a/gtk/gtkcssfiltervalue.c +++ b/gtk/gtkcssfiltervalue.c @@ -677,7 +677,7 @@ gtk_css_filter_print (const GtkCssFilter *filter, break; case GTK_CSS_FILTER_DROP_SHADOW: - g_string_append (string, "drop_shadow("); + g_string_append (string, "drop-shadow("); _gtk_css_value_print (filter->drop_shadow.value, string); g_string_append (string, ")"); break; @@ -797,7 +797,7 @@ gtk_css_filter_parse_shadow (GtkCssParser *parser, { GtkCssValue **values = data; - values[n] = _gtk_css_shadow_value_parse_filter (parser); + values[n] = gtk_css_shadow_value_parse_filter (parser); if (values[n] == NULL) return 0; @@ -960,8 +960,7 @@ gtk_css_filter_value_push_snapshot (const GtkCssValue *filter, } else if (filter->filters[j].type == GTK_CSS_FILTER_DROP_SHADOW) { - if (!gtk_css_shadow_value_push_snapshot (filter->filters[j].drop_shadow.value, snapshot)) - gtk_snapshot_push_debug (snapshot, "Shadow Filter omitted"); + gtk_css_shadow_value_push_snapshot (filter->filters[j].drop_shadow.value, snapshot); } else g_warning ("Don't know how to handle filter type %d", filter->filters[j].type); @@ -993,8 +992,10 @@ gtk_css_filter_value_pop_snapshot (const GtkCssValue *filter, if (i < j) gtk_snapshot_pop (snapshot); - if (j < filter->n_filters) + if (filter->filters[j].type == GTK_CSS_FILTER_BLUR) gtk_snapshot_pop (snapshot); + else if (filter->filters[j].type == GTK_CSS_FILTER_DROP_SHADOW) + gtk_css_shadow_value_pop_snapshot (filter->filters[j].drop_shadow.value, snapshot); i = j + 1; } From cc6fcbfc093d17b6df8a9f23131d776c7a7bb89a Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 5 Feb 2021 22:06:56 -0500 Subject: [PATCH 09/11] cssfiltervalue: Fix blur filter interpretation According to https://www.w3.org/TR/filter-effects-1/, the length passed to blur() is the standard deviation, and according to https://www.w3.org/TR/css-backgrounds-3/#shadow-blur the blur radius is twice the standard deviation. --- gtk/gtkcssfiltervalue.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/gtk/gtkcssfiltervalue.c b/gtk/gtkcssfiltervalue.c index ecc225a925..eaf11c16b5 100644 --- a/gtk/gtkcssfiltervalue.c +++ b/gtk/gtkcssfiltervalue.c @@ -939,7 +939,6 @@ gtk_css_filter_value_push_snapshot (const GtkCssValue *filter, graphene_matrix_t matrix; graphene_vec4_t offset; int i, j; - double radius; if (gtk_css_filter_value_is_none (filter)) return; @@ -955,8 +954,8 @@ gtk_css_filter_value_push_snapshot (const GtkCssValue *filter, { if (filter->filters[j].type == GTK_CSS_FILTER_BLUR) { - radius = _gtk_css_number_value_get (filter->filters[j].blur.value, 100.0); - gtk_snapshot_push_blur (snapshot, radius); + double std_dev = _gtk_css_number_value_get (filter->filters[j].blur.value, 100.0); + gtk_snapshot_push_blur (snapshot, 2 * std_dev); } else if (filter->filters[j].type == GTK_CSS_FILTER_DROP_SHADOW) { From 5f48764ac8082219de029f59f405b8b483b14aaa Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 5 Feb 2021 22:59:20 -0500 Subject: [PATCH 10/11] cssfiltervalue: Reject invalid filters The Filter Effects Spec doesn't allow negative values for most of the filter parameters. --- gtk/gtkcssfiltervalue.c | 4 ++-- testsuite/css/parser/invalid-filter1.css | 3 +++ testsuite/css/parser/invalid-filter1.errors | 1 + testsuite/css/parser/invalid-filter1.ref.css | 0 4 files changed, 6 insertions(+), 2 deletions(-) create mode 100644 testsuite/css/parser/invalid-filter1.css create mode 100644 testsuite/css/parser/invalid-filter1.errors create mode 100644 testsuite/css/parser/invalid-filter1.ref.css diff --git a/gtk/gtkcssfiltervalue.c b/gtk/gtkcssfiltervalue.c index eaf11c16b5..c1c281c1e2 100644 --- a/gtk/gtkcssfiltervalue.c +++ b/gtk/gtkcssfiltervalue.c @@ -755,7 +755,7 @@ gtk_css_filter_parse_number (GtkCssParser *parser, { GtkCssValue **values = data; - values[n] = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_PARSE_PERCENT); + values[n] = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_NUMBER | GTK_CSS_PARSE_PERCENT | GTK_CSS_POSITIVE_ONLY); if (values[n] == NULL) return 0; @@ -769,7 +769,7 @@ gtk_css_filter_parse_length (GtkCssParser *parser, { GtkCssValue **values = data; - values[n] = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH); + values[n] = _gtk_css_number_value_parse (parser, GTK_CSS_PARSE_LENGTH | GTK_CSS_POSITIVE_ONLY); if (values[n] == NULL) return 0; diff --git a/testsuite/css/parser/invalid-filter1.css b/testsuite/css/parser/invalid-filter1.css new file mode 100644 index 0000000000..52580b853e --- /dev/null +++ b/testsuite/css/parser/invalid-filter1.css @@ -0,0 +1,3 @@ +a { + filter: blur(-1px); +} diff --git a/testsuite/css/parser/invalid-filter1.errors b/testsuite/css/parser/invalid-filter1.errors new file mode 100644 index 0000000000..b91e500d69 --- /dev/null +++ b/testsuite/css/parser/invalid-filter1.errors @@ -0,0 +1 @@ +invalid-filter1.css:2:20-21: error: GTK_CSS_PARSER_ERROR_SYNTAX diff --git a/testsuite/css/parser/invalid-filter1.ref.css b/testsuite/css/parser/invalid-filter1.ref.css new file mode 100644 index 0000000000..e69de29bb2 From bfc80c32eae23b7e0cbd86c79cb7fc19bb89e66c Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 5 Feb 2021 21:37:47 -0500 Subject: [PATCH 11/11] Add tests for the css filter property Test that we can parse filters and that we don't accept invalid filters. --- ...nvalid-filter1.css => filter-invalid1.css} | 0 testsuite/css/parser/filter-invalid1.errors | 1 + ...ilter1.ref.css => filter-invalid1.ref.css} | 0 testsuite/css/parser/filter-invalid2.css | 3 ++ testsuite/css/parser/filter-invalid2.errors | 1 + testsuite/css/parser/filter-invalid2.ref.css | 0 testsuite/css/parser/filter-invalid3.css | 3 ++ testsuite/css/parser/filter-invalid3.errors | 1 + testsuite/css/parser/filter-invalid3.ref.css | 0 testsuite/css/parser/filter-invalid4.css | 3 ++ testsuite/css/parser/filter-invalid4.errors | 1 + testsuite/css/parser/filter-invalid4.ref.css | 0 testsuite/css/parser/filter-invalid5.css | 3 ++ testsuite/css/parser/filter-invalid5.errors | 1 + testsuite/css/parser/filter-invalid5.ref.css | 0 testsuite/css/parser/filter-invalid6.css | 3 ++ testsuite/css/parser/filter-invalid6.errors | 1 + testsuite/css/parser/filter-invalid6.ref.css | 0 testsuite/css/parser/filter-invalid7.css | 3 ++ testsuite/css/parser/filter-invalid7.errors | 1 + testsuite/css/parser/filter-invalid7.ref.css | 0 testsuite/css/parser/filter-invalid8.css | 3 ++ testsuite/css/parser/filter-invalid8.errors | 1 + testsuite/css/parser/filter-invalid8.ref.css | 0 testsuite/css/parser/filter-invalid9.css | 3 ++ testsuite/css/parser/filter-invalid9.errors | 1 + testsuite/css/parser/filter-invalid9.ref.css | 0 testsuite/css/parser/filter.ref.css | 2 +- testsuite/css/parser/invalid-filter1.errors | 1 - testsuite/css/parser/meson.build | 29 +++++++++++++++++++ 30 files changed, 63 insertions(+), 2 deletions(-) rename testsuite/css/parser/{invalid-filter1.css => filter-invalid1.css} (100%) create mode 100644 testsuite/css/parser/filter-invalid1.errors rename testsuite/css/parser/{invalid-filter1.ref.css => filter-invalid1.ref.css} (100%) create mode 100644 testsuite/css/parser/filter-invalid2.css create mode 100644 testsuite/css/parser/filter-invalid2.errors create mode 100644 testsuite/css/parser/filter-invalid2.ref.css create mode 100644 testsuite/css/parser/filter-invalid3.css create mode 100644 testsuite/css/parser/filter-invalid3.errors create mode 100644 testsuite/css/parser/filter-invalid3.ref.css create mode 100644 testsuite/css/parser/filter-invalid4.css create mode 100644 testsuite/css/parser/filter-invalid4.errors create mode 100644 testsuite/css/parser/filter-invalid4.ref.css create mode 100644 testsuite/css/parser/filter-invalid5.css create mode 100644 testsuite/css/parser/filter-invalid5.errors create mode 100644 testsuite/css/parser/filter-invalid5.ref.css create mode 100644 testsuite/css/parser/filter-invalid6.css create mode 100644 testsuite/css/parser/filter-invalid6.errors create mode 100644 testsuite/css/parser/filter-invalid6.ref.css create mode 100644 testsuite/css/parser/filter-invalid7.css create mode 100644 testsuite/css/parser/filter-invalid7.errors create mode 100644 testsuite/css/parser/filter-invalid7.ref.css create mode 100644 testsuite/css/parser/filter-invalid8.css create mode 100644 testsuite/css/parser/filter-invalid8.errors create mode 100644 testsuite/css/parser/filter-invalid8.ref.css create mode 100644 testsuite/css/parser/filter-invalid9.css create mode 100644 testsuite/css/parser/filter-invalid9.errors create mode 100644 testsuite/css/parser/filter-invalid9.ref.css delete mode 100644 testsuite/css/parser/invalid-filter1.errors diff --git a/testsuite/css/parser/invalid-filter1.css b/testsuite/css/parser/filter-invalid1.css similarity index 100% rename from testsuite/css/parser/invalid-filter1.css rename to testsuite/css/parser/filter-invalid1.css diff --git a/testsuite/css/parser/filter-invalid1.errors b/testsuite/css/parser/filter-invalid1.errors new file mode 100644 index 0000000000..abed7c492d --- /dev/null +++ b/testsuite/css/parser/filter-invalid1.errors @@ -0,0 +1 @@ +filter-invalid1.css:2:16-20: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE diff --git a/testsuite/css/parser/invalid-filter1.ref.css b/testsuite/css/parser/filter-invalid1.ref.css similarity index 100% rename from testsuite/css/parser/invalid-filter1.ref.css rename to testsuite/css/parser/filter-invalid1.ref.css diff --git a/testsuite/css/parser/filter-invalid2.css b/testsuite/css/parser/filter-invalid2.css new file mode 100644 index 0000000000..3d83236fb0 --- /dev/null +++ b/testsuite/css/parser/filter-invalid2.css @@ -0,0 +1,3 @@ +a { + filter: brightness(-100%); +} diff --git a/testsuite/css/parser/filter-invalid2.errors b/testsuite/css/parser/filter-invalid2.errors new file mode 100644 index 0000000000..7f6e672933 --- /dev/null +++ b/testsuite/css/parser/filter-invalid2.errors @@ -0,0 +1 @@ +filter-invalid2.css:2:22-27: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE diff --git a/testsuite/css/parser/filter-invalid2.ref.css b/testsuite/css/parser/filter-invalid2.ref.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/css/parser/filter-invalid3.css b/testsuite/css/parser/filter-invalid3.css new file mode 100644 index 0000000000..49640bf7fe --- /dev/null +++ b/testsuite/css/parser/filter-invalid3.css @@ -0,0 +1,3 @@ +a { + filter: contrast(-100%); +} diff --git a/testsuite/css/parser/filter-invalid3.errors b/testsuite/css/parser/filter-invalid3.errors new file mode 100644 index 0000000000..974ad14139 --- /dev/null +++ b/testsuite/css/parser/filter-invalid3.errors @@ -0,0 +1 @@ +filter-invalid3.css:2:20-25: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE diff --git a/testsuite/css/parser/filter-invalid3.ref.css b/testsuite/css/parser/filter-invalid3.ref.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/css/parser/filter-invalid4.css b/testsuite/css/parser/filter-invalid4.css new file mode 100644 index 0000000000..0cd2ab68b2 --- /dev/null +++ b/testsuite/css/parser/filter-invalid4.css @@ -0,0 +1,3 @@ +a { + filter: grayscale(-100%); +} diff --git a/testsuite/css/parser/filter-invalid4.errors b/testsuite/css/parser/filter-invalid4.errors new file mode 100644 index 0000000000..93544a8c1c --- /dev/null +++ b/testsuite/css/parser/filter-invalid4.errors @@ -0,0 +1 @@ +filter-invalid4.css:2:21-26: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE diff --git a/testsuite/css/parser/filter-invalid4.ref.css b/testsuite/css/parser/filter-invalid4.ref.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/css/parser/filter-invalid5.css b/testsuite/css/parser/filter-invalid5.css new file mode 100644 index 0000000000..ccdc682b8e --- /dev/null +++ b/testsuite/css/parser/filter-invalid5.css @@ -0,0 +1,3 @@ +a { + filter: invert(-100%); +} diff --git a/testsuite/css/parser/filter-invalid5.errors b/testsuite/css/parser/filter-invalid5.errors new file mode 100644 index 0000000000..5d385e479a --- /dev/null +++ b/testsuite/css/parser/filter-invalid5.errors @@ -0,0 +1 @@ +filter-invalid5.css:2:18-23: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE diff --git a/testsuite/css/parser/filter-invalid5.ref.css b/testsuite/css/parser/filter-invalid5.ref.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/css/parser/filter-invalid6.css b/testsuite/css/parser/filter-invalid6.css new file mode 100644 index 0000000000..3aa37e0e51 --- /dev/null +++ b/testsuite/css/parser/filter-invalid6.css @@ -0,0 +1,3 @@ +a { + filter: opacity(-100%); +} diff --git a/testsuite/css/parser/filter-invalid6.errors b/testsuite/css/parser/filter-invalid6.errors new file mode 100644 index 0000000000..4b2f261867 --- /dev/null +++ b/testsuite/css/parser/filter-invalid6.errors @@ -0,0 +1 @@ +filter-invalid6.css:2:19-24: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE diff --git a/testsuite/css/parser/filter-invalid6.ref.css b/testsuite/css/parser/filter-invalid6.ref.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/css/parser/filter-invalid7.css b/testsuite/css/parser/filter-invalid7.css new file mode 100644 index 0000000000..7e0e7a3835 --- /dev/null +++ b/testsuite/css/parser/filter-invalid7.css @@ -0,0 +1,3 @@ +a { + filter: saturate(-100%); +} diff --git a/testsuite/css/parser/filter-invalid7.errors b/testsuite/css/parser/filter-invalid7.errors new file mode 100644 index 0000000000..615c191e9c --- /dev/null +++ b/testsuite/css/parser/filter-invalid7.errors @@ -0,0 +1 @@ +filter-invalid7.css:2:20-25: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE diff --git a/testsuite/css/parser/filter-invalid7.ref.css b/testsuite/css/parser/filter-invalid7.ref.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/css/parser/filter-invalid8.css b/testsuite/css/parser/filter-invalid8.css new file mode 100644 index 0000000000..c5d000c349 --- /dev/null +++ b/testsuite/css/parser/filter-invalid8.css @@ -0,0 +1,3 @@ +a { + filter: sepia(-100%); +} diff --git a/testsuite/css/parser/filter-invalid8.errors b/testsuite/css/parser/filter-invalid8.errors new file mode 100644 index 0000000000..5dde01fad0 --- /dev/null +++ b/testsuite/css/parser/filter-invalid8.errors @@ -0,0 +1 @@ +filter-invalid8.css:2:17-22: error: GTK_CSS_PARSER_ERROR_UNKNOWN_VALUE diff --git a/testsuite/css/parser/filter-invalid8.ref.css b/testsuite/css/parser/filter-invalid8.ref.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/css/parser/filter-invalid9.css b/testsuite/css/parser/filter-invalid9.css new file mode 100644 index 0000000000..beaf0b2ef3 --- /dev/null +++ b/testsuite/css/parser/filter-invalid9.css @@ -0,0 +1,3 @@ +a { + filter: drop-shadow(none); +} diff --git a/testsuite/css/parser/filter-invalid9.errors b/testsuite/css/parser/filter-invalid9.errors new file mode 100644 index 0000000000..47893d496e --- /dev/null +++ b/testsuite/css/parser/filter-invalid9.errors @@ -0,0 +1 @@ +filter-invalid9.css:2:23-27: error: GTK_CSS_PARSER_ERROR_SYNTAX diff --git a/testsuite/css/parser/filter-invalid9.ref.css b/testsuite/css/parser/filter-invalid9.ref.css new file mode 100644 index 0000000000..e69de29bb2 diff --git a/testsuite/css/parser/filter.ref.css b/testsuite/css/parser/filter.ref.css index 70b733b325..6e9c6ca6ac 100644 --- a/testsuite/css/parser/filter.ref.css +++ b/testsuite/css/parser/filter.ref.css @@ -19,5 +19,5 @@ e { } f { - filter: drop_shadow(1px 2px rgb(255,0,0)); + filter: drop-shadow(1px 2px rgb(255,0,0)); } diff --git a/testsuite/css/parser/invalid-filter1.errors b/testsuite/css/parser/invalid-filter1.errors deleted file mode 100644 index b91e500d69..0000000000 --- a/testsuite/css/parser/invalid-filter1.errors +++ /dev/null @@ -1 +0,0 @@ -invalid-filter1.css:2:20-21: error: GTK_CSS_PARSER_ERROR_SYNTAX diff --git a/testsuite/css/parser/meson.build b/testsuite/css/parser/meson.build index b398251450..2d476f018d 100644 --- a/testsuite/css/parser/meson.build +++ b/testsuite/css/parser/meson.build @@ -311,6 +311,35 @@ test_data = [ 'doubled.css', 'doubled.ref.css', 'empty.css', + 'filter.css', + 'filter.ref.css', + 'filter-invalid1.css', + 'filter-invalid1.errors', + 'filter-invalid1.ref.css', + 'filter-invalid2.css', + 'filter-invalid2.errors', + 'filter-invalid2.ref.css', + 'filter-invalid3.css', + 'filter-invalid3.errors', + 'filter-invalid3.ref.css', + 'filter-invalid4.css', + 'filter-invalid4.errors', + 'filter-invalid4.ref.css', + 'filter-invalid5.css', + 'filter-invalid5.errors', + 'filter-invalid5.ref.css', + 'filter-invalid6.css', + 'filter-invalid6.errors', + 'filter-invalid6.ref.css', + 'filter-invalid7.css', + 'filter-invalid7.errors', + 'filter-invalid7.ref.css', + 'filter-invalid8.css', + 'filter-invalid8.errors', + 'filter-invalid8.ref.css', + 'filter-invalid9.css', + 'filter-invalid9.errors', + 'filter-invalid9.ref.css', 'font-family.css', 'font-family.ref.css', 'font-size.css',