From 97f889d96cf364fe05ea3338750c96ff3d35bb13 Mon Sep 17 00:00:00 2001 From: Matthias Clasen Date: Fri, 12 May 2023 14:48:45 -0400 Subject: [PATCH] css: Make some corner values static Provide static value for uniform corners with lengths from 0 to 8px. This covers the majority of corners in widget-factory. --- gtk/gtkcsscornervalue.c | 47 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 46 insertions(+), 1 deletion(-) diff --git a/gtk/gtkcsscornervalue.c b/gtk/gtkcsscornervalue.c index ee54c84905..09d6b9db32 100644 --- a/gtk/gtkcsscornervalue.c +++ b/gtk/gtkcsscornervalue.c @@ -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[] = { + { >K_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, + { >K_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, + { >K_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, + { >K_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, + { >K_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, + { >K_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, + { >K_CSS_VALUE_CORNER, 1, TRUE, NULL, NULL }, + { >K_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, >K_CSS_VALUE_CORNER); result->x = x; result->y = y; -- 2.30.2