cssimage: Add is_computed vfunc
authorTimm Bäder <mail@baedert.org>
Sat, 11 Jan 2020 13:38:49 +0000 (14:38 +0100)
committerTimm Bäder <mail@baedert.org>
Sat, 18 Jan 2020 07:49:51 +0000 (08:49 +0100)
Same semantics as the is_computed field of GtkCssValue

gtk/gtkcssimage.c
gtk/gtkcssimagecrossfade.c
gtk/gtkcssimagefallback.c
gtk/gtkcssimagelinear.c
gtk/gtkcssimageprivate.h
gtk/gtkcssimageradial.c
gtk/gtkcssimagevalue.c

index 91507c0af4bed9d811338cf1066d33e987b8b8b4..4b9c781d807851e805247375a58d177e389b44c5 100644 (file)
@@ -115,6 +115,12 @@ gtk_css_image_real_get_dynamic_image (GtkCssImage *image,
   return g_object_ref (image);
 }
 
+static gboolean
+gtk_css_image_real_is_computed (GtkCssImage *image)
+{
+  return FALSE;
+}
+
 static void
 _gtk_css_image_class_init (GtkCssImageClass *klass)
 {
@@ -127,6 +133,7 @@ _gtk_css_image_class_init (GtkCssImageClass *klass)
   klass->is_invalid = gtk_css_image_real_is_invalid;
   klass->is_dynamic = gtk_css_image_real_is_dynamic;
   klass->get_dynamic_image = gtk_css_image_real_get_dynamic_image;
+  klass->is_computed = gtk_css_image_real_is_computed;
 }
 
 static void
@@ -565,3 +572,10 @@ _gtk_css_image_new_parse (GtkCssParser *parser)
   return image;
 }
 
+gboolean
+gtk_css_image_is_computed (GtkCssImage *image)
+{
+  GtkCssImageClass *klass = GTK_CSS_IMAGE_GET_CLASS (image);
+
+  return klass->is_computed (image);
+}
index 57bc96d38699ea4b5d2beb7e6f99ed432d783069..2d281b26cc94dba57d23d86db687c2231b465291 100644 (file)
@@ -414,6 +414,22 @@ gtk_css_image_cross_fade_dispose (GObject *object)
   G_OBJECT_CLASS (gtk_css_image_cross_fade_parent_class)->dispose (object);
 }
 
+static gboolean
+gtk_css_image_cross_fade_is_computed (GtkCssImage *image)
+{
+  GtkCssImageCrossFade *cross_fade = GTK_CSS_IMAGE_CROSS_FADE (image);
+  guint i;
+
+  for (i = 0; i < cross_fade->images->len; i++)
+    {
+      const CrossFadeEntry *entry = &g_array_index (cross_fade->images, CrossFadeEntry, i);
+      if (!gtk_css_image_is_computed (entry->image))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
 static void
 gtk_css_image_cross_fade_class_init (GtkCssImageCrossFadeClass *klass)
 {
@@ -429,6 +445,7 @@ gtk_css_image_cross_fade_class_init (GtkCssImageCrossFadeClass *klass)
   image_class->get_dynamic_image = gtk_css_image_cross_fade_get_dynamic_image;
   image_class->parse = gtk_css_image_cross_fade_parse;
   image_class->print = gtk_css_image_cross_fade_print;
+  image_class->is_computed = gtk_css_image_cross_fade_is_computed;
 
   object_class->dispose = gtk_css_image_cross_fade_dispose;
 }
index 879703b0d976ceb46e3d1cedd2a3933ff7a82d8f..d922da942ba5a1615dc3397d18009759748ce6cc 100644 (file)
@@ -270,6 +270,30 @@ gtk_css_image_fallback_equal (GtkCssImage *image1,
                                fallback2->images[fallback2->used]);
 }
 
+static gboolean
+gtk_css_image_fallback_is_computed (GtkCssImage *image)
+{
+  GtkCssImageFallback *fallback = GTK_CSS_IMAGE_FALLBACK (image);
+
+  if (fallback->used < 0)
+    {
+      guint i;
+
+      if (fallback->color && !fallback->images)
+        return gtk_css_value_is_computed (fallback->color);
+
+      for (i = 0; i < fallback->n_images; i++)
+        {
+          if (!gtk_css_image_is_computed (fallback->images[i]))
+            {
+              return FALSE;
+            }
+        }
+    }
+
+  return TRUE;
+}
+
 static void
 _gtk_css_image_fallback_class_init (GtkCssImageFallbackClass *klass)
 {
@@ -284,6 +308,7 @@ _gtk_css_image_fallback_class_init (GtkCssImageFallbackClass *klass)
   image_class->compute = gtk_css_image_fallback_compute;
   image_class->print = gtk_css_image_fallback_print;
   image_class->equal = gtk_css_image_fallback_equal;
+  image_class->is_computed = gtk_css_image_fallback_is_computed;
 
   object_class->dispose = gtk_css_image_fallback_dispose;
 }
index 52e9a33e2a25167a7fb19107a84d753554ad74df..13f848d945b0086ae0b71efbc1ff84a1df788dbe 100644 (file)
@@ -662,6 +662,35 @@ gtk_css_image_linear_dispose (GObject *object)
   G_OBJECT_CLASS (_gtk_css_image_linear_parent_class)->dispose (object);
 }
 
+static gboolean
+gtk_css_image_linear_is_computed (GtkCssImage *image)
+{
+  GtkCssImageLinear *linear = GTK_CSS_IMAGE_LINEAR (image);
+  guint i;
+  gboolean computed = TRUE;
+
+  computed = !linear->angle || gtk_css_value_is_computed (linear->angle);
+
+  for (i = 0; i < linear->n_stops; i ++)
+    {
+      const GtkCssImageLinearColorStop *stop = &linear->color_stops[i];
+
+      if (stop->offset && !gtk_css_value_is_computed (stop->offset))
+        {
+          computed = FALSE;
+          break;
+        }
+
+      if (!gtk_css_value_is_computed (stop->color))
+        {
+          computed = FALSE;
+          break;
+        }
+    }
+
+  return computed;
+}
+
 static void
 _gtk_css_image_linear_class_init (GtkCssImageLinearClass *klass)
 {
@@ -674,6 +703,7 @@ _gtk_css_image_linear_class_init (GtkCssImageLinearClass *klass)
   image_class->compute = gtk_css_image_linear_compute;
   image_class->equal = gtk_css_image_linear_equal;
   image_class->transition = gtk_css_image_linear_transition;
+  image_class->is_computed = gtk_css_image_linear_is_computed;
 
   object_class->dispose = gtk_css_image_linear_dispose;
 }
index f39d73ae8d286d8696285e7bc73a0cf9a98b5b6b..b467112e6e4e469b20ba2e1181555ac9b0d7b46c 100644 (file)
@@ -89,6 +89,7 @@ struct _GtkCssImageClass
   /* print to CSS */
   void         (* print)                           (GtkCssImage                *image,
                                                     GString                    *string);
+  gboolean     (* is_computed)                     (GtkCssImage                *image);
 };
 
 GType          _gtk_css_image_get_type             (void) G_GNUC_CONST;
@@ -139,6 +140,8 @@ cairo_surface_t *
                                                     cairo_surface_t            *target,
                                                     int                         surface_width,
                                                     int                         surface_height);
+gboolean       gtk_css_image_is_computed           (GtkCssImage                *image);
+
 
 G_END_DECLS
 
index 7a7b50c685ed34dfbcb48d8fce2ed06fb24b25e0..46e6da158469028b724d83a898cf763ac7ad7795 100644 (file)
@@ -710,6 +710,37 @@ gtk_css_image_radial_dispose (GObject *object)
   G_OBJECT_CLASS (_gtk_css_image_radial_parent_class)->dispose (object);
 }
 
+static gboolean
+gtk_css_image_radial_is_computed (GtkCssImage *image)
+{
+  GtkCssImageRadial *radial = GTK_CSS_IMAGE_RADIAL (image);
+  guint i;
+  gboolean computed = TRUE;
+
+  computed = computed && (!radial->position || gtk_css_value_is_computed (radial->position));
+  computed = computed && (!radial->sizes[0] || gtk_css_value_is_computed (radial->sizes[0]));
+  computed = computed && (!radial->sizes[1] || gtk_css_value_is_computed (radial->sizes[1]));
+
+  if (computed)
+    for (i = 0; i < radial->n_stops; i ++)
+      {
+        const GtkCssImageRadialColorStop *stop = &radial->color_stops[i];
+
+        if (stop->offset && !gtk_css_value_is_computed (stop->offset))
+          {
+            computed = FALSE;
+            break;
+          }
+
+        if (!gtk_css_value_is_computed (stop->color))
+          {
+            computed = FALSE;
+            break;
+          }
+      }
+
+  return computed;
+}
 static void
 _gtk_css_image_radial_class_init (GtkCssImageRadialClass *klass)
 {
@@ -722,6 +753,7 @@ _gtk_css_image_radial_class_init (GtkCssImageRadialClass *klass)
   image_class->compute = gtk_css_image_radial_compute;
   image_class->transition = gtk_css_image_radial_transition;
   image_class->equal = gtk_css_image_radial_equal;
+  image_class->is_computed = gtk_css_image_radial_is_computed;
 
   object_class->dispose = gtk_css_image_radial_dispose;
 }
index addbe928be7d281d631794b01f9a066098cbb508..ceeba6cafc41f7b23bf066e62541da816af8eb69 100644 (file)
@@ -144,6 +144,7 @@ _gtk_css_image_value_new (GtkCssImage *image)
 
   value = _gtk_css_value_new (GtkCssValue, &GTK_CSS_VALUE_IMAGE);
   value->image = image;
+  value->is_computed = gtk_css_image_is_computed (image);
 
   return value;
 }