summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTimm Bäder <mail@baedert.org>2019-08-17 19:53:32 +0200
committerTimm Bäder <mail@baedert.org>2019-09-09 17:36:23 +0200
commitad1340cab44a1c70b6045b115e7852f9e625867d (patch)
tree76c46ed44ea0b8b254aff6e43730c3cbaedcf489
parent3a3a59c1882296aec8f37e21c78f71e82a127e30 (diff)
downloadgtk+-ad1340cab44a1c70b6045b115e7852f9e625867d.tar.gz
cssrgbavalue: Add a singleton for transparent colors
The most common background color is no background color.
-rw-r--r--gtk/gtkcsscolorvalue.c6
-rw-r--r--gtk/gtkcssrgbavalue.c22
-rw-r--r--gtk/gtkcssrgbavalueprivate.h3
-rw-r--r--gtk/gtkcssshadowvalue.c4
-rw-r--r--gtk/gtkcssstylepropertyimpl.c2
5 files changed, 28 insertions, 9 deletions
diff --git a/gtk/gtkcsscolorvalue.c b/gtk/gtkcsscolorvalue.c
index 617f92bdc1..091cb07c85 100644
--- a/gtk/gtkcsscolorvalue.c
+++ b/gtk/gtkcsscolorvalue.c
@@ -97,8 +97,6 @@ gtk_css_value_color_get_fallback (guint property_id,
GtkCssStyle *style,
GtkCssStyle *parent_style)
{
- static const GdkRGBA transparent = { 0, 0, 0, 0 };
-
switch (property_id)
{
case GTK_CSS_PROPERTY_BACKGROUND_IMAGE:
@@ -106,7 +104,7 @@ gtk_css_value_color_get_fallback (guint property_id,
case GTK_CSS_PROPERTY_TEXT_SHADOW:
case GTK_CSS_PROPERTY_ICON_SHADOW:
case GTK_CSS_PROPERTY_BOX_SHADOW:
- return _gtk_css_rgba_value_new_from_rgba (&transparent);
+ return _gtk_css_rgba_value_new_transparent ();
case GTK_CSS_PROPERTY_COLOR:
case GTK_CSS_PROPERTY_BACKGROUND_COLOR:
case GTK_CSS_PROPERTY_BORDER_TOP_COLOR:
@@ -127,7 +125,7 @@ gtk_css_value_color_get_fallback (guint property_id,
if (property_id < GTK_CSS_PROPERTY_N_PROPERTIES)
g_warning ("No fallback color defined for property '%s'",
_gtk_style_property_get_name (GTK_STYLE_PROPERTY (_gtk_css_style_property_lookup_by_id (property_id))));
- return _gtk_css_rgba_value_new_from_rgba (&transparent);
+ return _gtk_css_rgba_value_new_transparent ();
}
}
diff --git a/gtk/gtkcssrgbavalue.c b/gtk/gtkcssrgbavalue.c
index a7134ef465..f840160bde 100644
--- a/gtk/gtkcssrgbavalue.c
+++ b/gtk/gtkcssrgbavalue.c
@@ -107,6 +107,9 @@ static const GtkCssValueClass GTK_CSS_VALUE_RGBA = {
gtk_css_value_rgba_print
};
+static GtkCssValue transparent_black_singleton = (GtkCssValue) { &GTK_CSS_VALUE_RGBA, 1, { 0, 0, 0, 0 }};
+static GtkCssValue transparent_white_singleton = (GtkCssValue) { &GTK_CSS_VALUE_RGBA, 1, { 1, 1, 1, 0 }};
+
GtkCssValue *
_gtk_css_rgba_value_new_from_rgba (const GdkRGBA *rgba)
{
@@ -114,12 +117,31 @@ _gtk_css_rgba_value_new_from_rgba (const GdkRGBA *rgba)
g_return_val_if_fail (rgba != NULL, NULL);
+ if (gdk_rgba_is_clear (rgba))
+ {
+ if (rgba->red == 1 &&
+ rgba->green == 1 &&
+ rgba->blue == 1)
+ return _gtk_css_value_ref (&transparent_white_singleton);
+
+ if (rgba->red == 0 &&
+ rgba->green == 0 &&
+ rgba->blue == 0)
+ return _gtk_css_value_ref (&transparent_black_singleton);
+ }
+
value = _gtk_css_value_new (GtkCssValue, &GTK_CSS_VALUE_RGBA);
value->rgba = *rgba;
return value;
}
+GtkCssValue *
+_gtk_css_rgba_value_new_transparent (void)
+{
+ return _gtk_css_value_ref (&transparent_black_singleton);
+}
+
const GdkRGBA *
_gtk_css_rgba_value_get_rgba (const GtkCssValue *rgba)
{
diff --git a/gtk/gtkcssrgbavalueprivate.h b/gtk/gtkcssrgbavalueprivate.h
index 60a0cffd6f..56760c275e 100644
--- a/gtk/gtkcssrgbavalueprivate.h
+++ b/gtk/gtkcssrgbavalueprivate.h
@@ -26,7 +26,8 @@
G_BEGIN_DECLS
-GtkCssValue * _gtk_css_rgba_value_new_from_rgba (const GdkRGBA *rgba);
+GtkCssValue * _gtk_css_rgba_value_new_from_rgba (const GdkRGBA *rgba);
+GtkCssValue * _gtk_css_rgba_value_new_transparent (void);
const GdkRGBA * _gtk_css_rgba_value_get_rgba (const GtkCssValue *rgba) G_GNUC_PURE;
diff --git a/gtk/gtkcssshadowvalue.c b/gtk/gtkcssshadowvalue.c
index f0b2fc243d..d2febe7522 100644
--- a/gtk/gtkcssshadowvalue.c
+++ b/gtk/gtkcssshadowvalue.c
@@ -189,8 +189,6 @@ gtk_css_shadow_value_new (GtkCssValue *hoffset,
GtkCssValue *
_gtk_css_shadow_value_new_for_transition (GtkCssValue *target)
{
- GdkRGBA transparent = { 0, 0, 0, 0 };
-
g_return_val_if_fail (target->class == &GTK_CSS_VALUE_SHADOW, NULL);
return gtk_css_shadow_value_new (_gtk_css_number_value_new (0, GTK_CSS_PX),
@@ -198,7 +196,7 @@ _gtk_css_shadow_value_new_for_transition (GtkCssValue *target)
_gtk_css_number_value_new (0, GTK_CSS_PX),
_gtk_css_number_value_new (0, GTK_CSS_PX),
target->inset,
- _gtk_css_rgba_value_new_from_rgba (&transparent));
+ _gtk_css_rgba_value_new_transparent ());
}
enum {
diff --git a/gtk/gtkcssstylepropertyimpl.c b/gtk/gtkcssstylepropertyimpl.c
index a1987b751a..af2869121b 100644
--- a/gtk/gtkcssstylepropertyimpl.c
+++ b/gtk/gtkcssstylepropertyimpl.c
@@ -991,7 +991,7 @@ _gtk_css_style_property_init_properties (void)
GTK_CSS_AFFECTS_BACKGROUND,
color_parse,
color_query,
- _gtk_css_color_value_new_rgba (0, 0, 0, 0));
+ _gtk_css_rgba_value_new_transparent ());
gtk_css_style_property_register ("font-family",
GTK_CSS_PROPERTY_FONT_FAMILY,