css: Make some corner values static
authorMatthias Clasen <mclasen@redhat.com>
Fri, 12 May 2023 18:48:45 +0000 (14:48 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Fri, 12 May 2023 19:00:13 +0000 (15:00 -0400)
Provide static value for uniform corners
with lengths from 0 to 8px. This covers
the majority of corners in widget-factory.

gtk/gtkcsscornervalue.c

index c5dbf51c161f407f4a947b64183803c6a2b7a0c1..0986d77eebbfc2e87ad8ef310600271c8c1e52d1 100644 (file)
@@ -88,7 +88,7 @@ gtk_css_value_corner_transition (GtkCssValue *start,
 
 static void
 gtk_css_value_corner_print (const GtkCssValue *corner,
-                           GString           *string)
+                            GString           *string)
 {
   _gtk_css_value_print (corner->x, string);
   if (!_gtk_css_value_equal (corner->x, corner->y))
@@ -109,12 +109,57 @@ static const GtkCssValueClass GTK_CSS_VALUE_CORNER = {
   gtk_css_value_corner_print
 };
 
+static GtkCssValue corner_singletons[] = {
+  { &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL },
+  { &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL },
+  { &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL },
+  { &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL },
+  { &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL },
+  { &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL },
+  { &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL },
+  { &GTK_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL },
+};
+
+static inline void
+initialize_corner_singletons (void)
+{
+  static gboolean initialized = FALSE;
+
+  if (initialized)
+    return;
+
+  for (unsigned int i = 0; i < G_N_ELEMENTS (corner_singletons); i++)
+    {
+      corner_singletons[i].x = gtk_css_dimension_value_new (i, GTK_CSS_PX);
+      corner_singletons[i].y = gtk_css_value_ref (corner_singletons[i].x);
+    }
+
+  initialized = TRUE;
+}
+
 GtkCssValue *
 _gtk_css_corner_value_new (GtkCssValue *x,
                            GtkCssValue *y)
 {
   GtkCssValue *result;
 
+  if (x == y &&
+      gtk_css_number_value_get_dimension (x) == GTK_CSS_DIMENSION_LENGTH)
+    {
+      initialize_corner_singletons ();
+
+      for (unsigned int i = 0; i < G_N_ELEMENTS (corner_singletons); i++)
+        {
+          if (corner_singletons[i].x == x)
+            {
+              gtk_css_value_unref (x);
+              gtk_css_value_unref (y);
+
+              return gtk_css_value_ref (&corner_singletons[i]);
+            }
+        }
+    }
+
   result = _gtk_css_value_new (GtkCssValue, &GTK_CSS_VALUE_CORNER);
   result->x = x;
   result->y = y;