css: Don't transition to currentColor
authorBenjamin Otte <otte@redhat.com>
Tue, 2 May 2023 17:48:54 +0000 (19:48 +0200)
committerBenjamin Otte <otte@redhat.com>
Tue, 2 May 2023 17:50:31 +0000 (19:50 +0200)
Transition to the color that is in use instead.

Fixes crashes because currentColor is not an RGBA color and
therefor could not be queried later.

Fixes #5798

gtk/gtkcssfiltervalue.c
gtk/gtkcssshadowvalue.c
gtk/gtkcssshadowvalueprivate.h

index 1178a7f2ce8c59c8ebc4eccfe919d8b029d90bf9..4ec7c1b7f40cc00d1b20c32417a0f580600327cb 100644 (file)
@@ -102,10 +102,10 @@ gtk_css_filter_clear (GtkCssFilter *filter)
 }
 
 static void
-gtk_css_filter_init_identity (GtkCssFilter     *filter,
-                              GtkCssFilterType  type)
+gtk_css_filter_init_identity (GtkCssFilter       *filter,
+                              const GtkCssFilter *other)
 {
-  switch (type)
+  switch (other->type)
     {
     case GTK_CSS_FILTER_BRIGHTNESS:
       filter->brightness.value = _gtk_css_number_value_new (1, GTK_CSS_NUMBER);
@@ -135,7 +135,7 @@ gtk_css_filter_init_identity (GtkCssFilter     *filter,
       filter->blur.value = _gtk_css_number_value_new (0, GTK_CSS_PX);
       break;
     case GTK_CSS_FILTER_DROP_SHADOW:
-      filter->drop_shadow.value = gtk_css_shadow_value_new_filter ();
+      filter->drop_shadow.value = gtk_css_shadow_value_new_filter (other->drop_shadow.value);
       break;
     case GTK_CSS_FILTER_NONE:
     default:
@@ -143,7 +143,7 @@ gtk_css_filter_init_identity (GtkCssFilter     *filter,
       break;
     }
 
-  filter->type = type;
+  filter->type = other->type;
 }
 
 #define R 0.2126
@@ -464,7 +464,7 @@ gtk_css_value_filter_equal (const GtkCssValue *value1,
     {
       GtkCssFilter filter;
 
-      gtk_css_filter_init_identity (&filter, larger->filters[i].type);
+      gtk_css_filter_init_identity (&filter, &larger->filters[i]);
 
       if (!gtk_css_filter_equal (&larger->filters[i], &filter))
         {
@@ -588,7 +588,7 @@ gtk_css_value_filter_transition (GtkCssValue *start,
     {
       GtkCssFilter filter;
 
-      gtk_css_filter_init_identity (&filter, start->filters[i].type);
+      gtk_css_filter_init_identity (&filter, &start->filters[i]);
       gtk_css_filter_transition (&result->filters[i],
                                  &start->filters[i],
                                  &filter,
@@ -600,7 +600,7 @@ gtk_css_value_filter_transition (GtkCssValue *start,
     {
       GtkCssFilter filter;
 
-      gtk_css_filter_init_identity (&filter, end->filters[i].type);
+      gtk_css_filter_init_identity (&filter, &end->filters[i]);
       gtk_css_filter_transition (&result->filters[i],
                                  &filter,
                                  &end->filters[i],
index e67035655042c71fa9ad38716790c696c0fa94da..6cc52c6bc16fc4b3fdc04aac6fe7d67933ecc72b 100644 (file)
@@ -331,7 +331,7 @@ gtk_css_shadow_value_new (ShadowValue *shadows,
 }
 
 GtkCssValue *
-gtk_css_shadow_value_new_filter (void)
+gtk_css_shadow_value_new_filter (const GtkCssValue *other)
 {
   ShadowValue value;
 
@@ -340,7 +340,7 @@ gtk_css_shadow_value_new_filter (void)
   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 ();
+  value.color = gtk_css_value_ref (other->shadows[0].color);
 
   return gtk_css_shadow_value_new (&value, 1, TRUE);
 }
index c84ee7cd95539c2c4400eb3b7379fe91af61a910..ddd7f672e3c7d8536483a2fd2c718dbce36507ae 100644 (file)
@@ -34,7 +34,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_new_filter       (const GtkCssValue        *other);
 
 GtkCssValue *   gtk_css_shadow_value_parse            (GtkCssParser             *parser,
                                                        gboolean                  box_shadow_mode);