[gtk+] symboliccolor: Implement using GtkCssValue
- From: Benjamin Otte <otte src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+] symboliccolor: Implement using GtkCssValue
- Date: Sun, 25 Nov 2012 03:19:49 +0000 (UTC)
commit 08ac1504d2c99d8bfd8ba3fb384f09263dcc66e5
Author: Benjamin Otte <otte redhat com>
Date: Sun Nov 25 01:55:53 2012 +0100
symboliccolor: Implement using GtkCssValue
gtk/gtkcsscolorvalue.c | 32 +-
gtk/gtkcsscolorvalueprivate.h | 6 +
gtk/gtkcssstylefuncs.c | 21 +-
gtk/gtkgradient.c | 11 +-
gtk/gtkstylecontext.c | 11 +-
gtk/gtksymboliccolor.c | 620 +++--------------------------------------
gtk/gtksymboliccolorprivate.h | 10 +-
gtk/gtkwin32theme.c | 37 ---
gtk/gtkwin32themeprivate.h | 1 -
9 files changed, 80 insertions(+), 669 deletions(-)
---
diff --git a/gtk/gtkcsscolorvalue.c b/gtk/gtkcsscolorvalue.c
index 39e1a3c..ab7483f 100644
--- a/gtk/gtkcsscolorvalue.c
+++ b/gtk/gtkcsscolorvalue.c
@@ -136,12 +136,12 @@ gtk_css_value_color_get_fallback (guint property_id,
}
}
-static GtkCssValue *
-gtk_css_color_value_resolve_full (GtkCssValue *color,
- GtkStyleProviderPrivate *provider,
- GtkCssValue *current,
- GtkCssDependencies current_deps,
- GtkCssDependencies *dependencies)
+GtkCssValue *
+_gtk_css_color_value_resolve (GtkCssValue *color,
+ GtkStyleProviderPrivate *provider,
+ GtkCssValue *current,
+ GtkCssDependencies current_deps,
+ GtkCssDependencies *dependencies)
{
GtkCssDependencies unused;
GtkCssValue *value;
@@ -168,7 +168,7 @@ gtk_css_color_value_resolve_full (GtkCssValue *color,
if (!symbolic)
return NULL;
- value = _gtk_symbolic_color_resolve_full (symbolic, provider, current, current_deps, dependencies);
+ value = _gtk_css_color_value_resolve (_gtk_symbolic_color_get_css_value (symbolic), provider, current, current_deps, dependencies);
}
break;
@@ -178,7 +178,7 @@ gtk_css_color_value_resolve_full (GtkCssValue *color,
GtkHSLA hsla;
GdkRGBA shade;
- val = gtk_css_color_value_resolve_full (color->sym_col.shade.color, provider, current, current_deps, dependencies);
+ val = _gtk_css_color_value_resolve (color->sym_col.shade.color, provider, current, current_deps, dependencies);
if (val == NULL)
return NULL;
@@ -205,7 +205,7 @@ gtk_css_color_value_resolve_full (GtkCssValue *color,
GtkCssValue *val;
GdkRGBA alpha;
- val = gtk_css_color_value_resolve_full (color->sym_col.alpha.color, provider, current, current_deps, dependencies);
+ val = _gtk_css_color_value_resolve (color->sym_col.alpha.color, provider, current, current_deps, dependencies);
if (val == NULL)
return NULL;
@@ -225,13 +225,13 @@ gtk_css_color_value_resolve_full (GtkCssValue *color,
GdkRGBA color1, color2, res;
GtkCssDependencies dep1, dep2;
- val = gtk_css_color_value_resolve_full (color->sym_col.mix.color1, provider, current, current_deps, &dep1);
+ val = _gtk_css_color_value_resolve (color->sym_col.mix.color1, provider, current, current_deps, &dep1);
if (val == NULL)
return NULL;
color1 = *_gtk_css_rgba_value_get_rgba (val);
_gtk_css_value_unref (val);
- val = gtk_css_color_value_resolve_full (color->sym_col.mix.color2, provider, current, current_deps, &dep2);
+ val = _gtk_css_color_value_resolve (color->sym_col.mix.color2, provider, current, current_deps, &dep2);
if (val == NULL)
return NULL;
color2 = *_gtk_css_rgba_value_get_rgba (val);
@@ -329,11 +329,11 @@ gtk_css_value_color_compute (GtkCssValue *value,
current_deps = GTK_CSS_DEPENDS_ON_COLOR;
}
- resolved = gtk_css_color_value_resolve_full (value,
- provider,
- current,
- current_deps,
- dependencies);
+ resolved = _gtk_css_color_value_resolve (value,
+ provider,
+ current,
+ current_deps,
+ dependencies);
if (resolved == NULL)
return gtk_css_value_color_get_fallback (property_id, provider, values, parent_values);
diff --git a/gtk/gtkcsscolorvalueprivate.h b/gtk/gtkcsscolorvalueprivate.h
index 492716f..06e6a1c 100644
--- a/gtk/gtkcsscolorvalueprivate.h
+++ b/gtk/gtkcsscolorvalueprivate.h
@@ -43,6 +43,12 @@ GtkCssValue * _gtk_css_color_value_new_current_color (void);
GtkCssValue * _gtk_css_color_value_parse (GtkCssParser *parser);
+GtkCssValue * _gtk_css_color_value_resolve (GtkCssValue *color,
+ GtkStyleProviderPrivate *provider,
+ GtkCssValue *current,
+ GtkCssDependencies current_deps,
+ GtkCssDependencies *dependencies);
+
G_END_DECLS
diff --git a/gtk/gtkcssstylefuncs.c b/gtk/gtkcssstylefuncs.c
index 50ad34a..b19a3e6 100644
--- a/gtk/gtkcssstylefuncs.c
+++ b/gtk/gtkcssstylefuncs.c
@@ -27,6 +27,7 @@
#include <gdk-pixbuf/gdk-pixbuf.h>
#include <cairo-gobject.h>
+#include "gtkcsscolorvalueprivate.h"
#include "gtkcssimagegradientprivate.h"
#include "gtkcssprovider.h"
#include "gtkcssrgbavalueprivate.h"
@@ -225,11 +226,11 @@ rgba_value_compute (GtkStyleProviderPrivate *provider,
GValue new_value = G_VALUE_INIT;
GdkRGBA rgba;
- val = _gtk_symbolic_color_resolve_full (symbolic,
- provider,
- _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
- GTK_CSS_DEPENDS_ON_COLOR,
- dependencies);
+ val = _gtk_css_color_value_resolve (_gtk_symbolic_color_get_css_value (symbolic),
+ provider,
+ _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
+ GTK_CSS_DEPENDS_ON_COLOR,
+ dependencies);
if (val != NULL)
{
rgba = *_gtk_css_rgba_value_get_rgba (val);
@@ -310,11 +311,11 @@ color_value_compute (GtkStyleProviderPrivate *provider,
GValue new_value = G_VALUE_INIT;
GtkCssValue *val;
- val = _gtk_symbolic_color_resolve_full ((GtkSymbolicColor *) g_value_get_boxed (value),
- provider,
- _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
- GTK_CSS_DEPENDS_ON_COLOR,
- dependencies);
+ val = _gtk_css_color_value_resolve (_gtk_symbolic_color_get_css_value (g_value_get_boxed (value)),
+ provider,
+ _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
+ GTK_CSS_DEPENDS_ON_COLOR,
+ dependencies);
if (val != NULL)
{
const GdkRGBA *rgba = _gtk_css_rgba_value_get_rgba (val);
diff --git a/gtk/gtkgradient.c b/gtk/gtkgradient.c
index 83095c9..f810c3b 100644
--- a/gtk/gtkgradient.c
+++ b/gtk/gtkgradient.c
@@ -19,6 +19,7 @@
#include "gtkgradientprivate.h"
+#include "gtkcsscolorvalueprivate.h"
#include "gtkcssrgbavalueprivate.h"
#include "gtkstylecontextprivate.h"
#include "gtkstyleproperties.h"
@@ -318,11 +319,11 @@ _gtk_gradient_resolve_full (GtkGradient *gradient,
stop = &g_array_index (gradient->stops, ColorStop, i);
/* if color resolving fails, assume transparency */
- val = _gtk_symbolic_color_resolve_full (stop->color,
- provider,
- _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
- GTK_CSS_DEPENDS_ON_COLOR,
- &stop_deps);
+ val = _gtk_css_color_value_resolve (_gtk_symbolic_color_get_css_value (stop->color),
+ provider,
+ _gtk_css_computed_values_get_value (values, GTK_CSS_PROPERTY_COLOR),
+ GTK_CSS_DEPENDS_ON_COLOR,
+ &stop_deps);
if (val)
{
rgba = *_gtk_css_rgba_value_get_rgba (val);
diff --git a/gtk/gtkstylecontext.c b/gtk/gtkstylecontext.c
index 312ae15..ef7ecfd 100644
--- a/gtk/gtkstylecontext.c
+++ b/gtk/gtkstylecontext.c
@@ -24,6 +24,7 @@
#include "gtkstylecontextprivate.h"
#include "gtkcontainerprivate.h"
+#include "gtkcsscolorvalueprivate.h"
#include "gtkcssenginevalueprivate.h"
#include "gtkcssnumbervalueprivate.h"
#include "gtkcssrgbavalueprivate.h"
@@ -2713,11 +2714,11 @@ _gtk_style_context_resolve_color (GtkStyleContext *context,
g_return_val_if_fail (color != NULL, FALSE);
g_return_val_if_fail (result != NULL, FALSE);
- val = _gtk_symbolic_color_resolve_full (color,
- GTK_STYLE_PROVIDER_PRIVATE (context->priv->cascade),
- _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR),
- GTK_CSS_DEPENDS_ON_COLOR,
- dependencies);
+ val = _gtk_css_color_value_resolve (_gtk_symbolic_color_get_css_value (color),
+ GTK_STYLE_PROVIDER_PRIVATE (context->priv->cascade),
+ _gtk_style_context_peek_property (context, GTK_CSS_PROPERTY_COLOR),
+ GTK_CSS_DEPENDS_ON_COLOR,
+ dependencies);
if (val == NULL)
return FALSE;
diff --git a/gtk/gtksymboliccolor.c b/gtk/gtksymboliccolor.c
index ca849e1..5952cd7 100644
--- a/gtk/gtksymboliccolor.c
+++ b/gtk/gtksymboliccolor.c
@@ -16,6 +16,7 @@
*/
#include "config.h"
+#include "gtkcsscolorvalueprivate.h"
#include "gtkcssrgbavalueprivate.h"
#include "gtkcssstylepropertyprivate.h"
#include "gtkhslaprivate.h"
@@ -47,54 +48,19 @@
G_DEFINE_BOXED_TYPE (GtkSymbolicColor, gtk_symbolic_color,
gtk_symbolic_color_ref, gtk_symbolic_color_unref)
-/* Symbolic colors */
-typedef enum {
- COLOR_TYPE_LITERAL,
- COLOR_TYPE_NAME,
- COLOR_TYPE_SHADE,
- COLOR_TYPE_ALPHA,
- COLOR_TYPE_MIX,
- COLOR_TYPE_WIN32,
- COLOR_TYPE_CURRENT_COLOR
-} ColorType;
-
struct _GtkSymbolicColor
{
- ColorType type;
+ GtkCssValue *value;
gint ref_count;
- GtkCssValue *last_value;
-
- union
- {
- gchar *name;
-
- struct
- {
- GtkSymbolicColor *color;
- gdouble factor;
- } shade, alpha;
-
- struct
- {
- GtkSymbolicColor *color1;
- GtkSymbolicColor *color2;
- gdouble factor;
- } mix;
-
- struct
- {
- gchar *theme_class;
- gint id;
- } win32;
- } sym_col;
};
static GtkSymbolicColor *
-gtk_symbolic_color_alloc (void)
+gtk_symbolic_color_new (GtkCssValue *value)
{
GtkSymbolicColor *symbolic;
symbolic = g_slice_new0 (GtkSymbolicColor);
+ symbolic->value = value;
symbolic->ref_count = 1;
return symbolic;
@@ -113,15 +79,9 @@ gtk_symbolic_color_alloc (void)
GtkSymbolicColor *
gtk_symbolic_color_new_literal (const GdkRGBA *color)
{
- GtkSymbolicColor *symbolic_color;
-
g_return_val_if_fail (color != NULL, NULL);
- symbolic_color = gtk_symbolic_color_alloc ();
- symbolic_color->type = COLOR_TYPE_LITERAL;
- symbolic_color->last_value = _gtk_css_rgba_value_new_from_rgba (color);
-
- return symbolic_color;
+ return gtk_symbolic_color_new (_gtk_css_color_value_new_literal (color));
}
/**
@@ -139,15 +99,9 @@ gtk_symbolic_color_new_literal (const GdkRGBA *color)
GtkSymbolicColor *
gtk_symbolic_color_new_name (const gchar *name)
{
- GtkSymbolicColor *symbolic_color;
-
g_return_val_if_fail (name != NULL, NULL);
- symbolic_color = gtk_symbolic_color_alloc ();
- symbolic_color->type = COLOR_TYPE_NAME;
- symbolic_color->sym_col.name = g_strdup (name);
-
- return symbolic_color;
+ return gtk_symbolic_color_new (_gtk_css_color_value_new_name (name));
}
/**
@@ -168,16 +122,10 @@ GtkSymbolicColor *
gtk_symbolic_color_new_shade (GtkSymbolicColor *color,
gdouble factor)
{
- GtkSymbolicColor *symbolic_color;
-
g_return_val_if_fail (color != NULL, NULL);
- symbolic_color = gtk_symbolic_color_alloc ();
- symbolic_color->type = COLOR_TYPE_SHADE;
- symbolic_color->sym_col.shade.color = gtk_symbolic_color_ref (color);
- symbolic_color->sym_col.shade.factor = factor;
-
- return symbolic_color;
+ return gtk_symbolic_color_new (_gtk_css_color_value_new_shade (color->value,
+ factor));
}
/**
@@ -198,16 +146,10 @@ GtkSymbolicColor *
gtk_symbolic_color_new_alpha (GtkSymbolicColor *color,
gdouble factor)
{
- GtkSymbolicColor *symbolic_color;
-
g_return_val_if_fail (color != NULL, NULL);
- symbolic_color = gtk_symbolic_color_alloc ();
- symbolic_color->type = COLOR_TYPE_ALPHA;
- symbolic_color->sym_col.alpha.color = gtk_symbolic_color_ref (color);
- symbolic_color->sym_col.alpha.factor = factor;
-
- return symbolic_color;
+ return gtk_symbolic_color_new (_gtk_css_color_value_new_alpha (color->value,
+ factor));
}
/**
@@ -229,18 +171,12 @@ gtk_symbolic_color_new_mix (GtkSymbolicColor *color1,
GtkSymbolicColor *color2,
gdouble factor)
{
- GtkSymbolicColor *symbolic_color;
-
g_return_val_if_fail (color1 != NULL, NULL);
g_return_val_if_fail (color1 != NULL, NULL);
- symbolic_color = gtk_symbolic_color_alloc ();
- symbolic_color->type = COLOR_TYPE_MIX;
- symbolic_color->sym_col.mix.color1 = gtk_symbolic_color_ref (color1);
- symbolic_color->sym_col.mix.color2 = gtk_symbolic_color_ref (color2);
- symbolic_color->sym_col.mix.factor = factor;
-
- return symbolic_color;
+ return gtk_symbolic_color_new (_gtk_css_color_value_new_mix (color1->value,
+ color2->value,
+ factor));
}
/**
@@ -263,39 +199,9 @@ GtkSymbolicColor *
gtk_symbolic_color_new_win32 (const gchar *theme_class,
gint id)
{
- GtkSymbolicColor *symbolic_color;
-
g_return_val_if_fail (theme_class != NULL, NULL);
- symbolic_color = gtk_symbolic_color_alloc ();
- symbolic_color->type = COLOR_TYPE_WIN32;
- symbolic_color->sym_col.win32.theme_class = g_strdup (theme_class);
- symbolic_color->sym_col.win32.id = id;
-
- return symbolic_color;
-}
-
-/**
- * _gtk_symbolic_color_get_current_color:
- *
- * Gets the color representing the CSS 'currentColor' keyword.
- * This color will resolve to the color set for the color property.
- *
- * Returns: (transfer none): The singleton representing the
- * 'currentColor' keyword
- **/
-GtkSymbolicColor *
-_gtk_symbolic_color_get_current_color (void)
-{
- static GtkSymbolicColor *current_color = NULL;
-
- if (G_UNLIKELY (current_color == NULL))
- {
- current_color = gtk_symbolic_color_alloc ();
- current_color->type = COLOR_TYPE_CURRENT_COLOR;
- }
-
- return current_color;
+ return gtk_symbolic_color_new (_gtk_css_color_value_new_win32 (theme_class, id));
}
/**
@@ -335,49 +241,11 @@ gtk_symbolic_color_unref (GtkSymbolicColor *color)
if (--color->ref_count)
return;
- _gtk_css_value_unref (color->last_value);
- switch (color->type)
- {
- case COLOR_TYPE_NAME:
- g_free (color->sym_col.name);
- break;
- case COLOR_TYPE_SHADE:
- gtk_symbolic_color_unref (color->sym_col.shade.color);
- break;
- case COLOR_TYPE_ALPHA:
- gtk_symbolic_color_unref (color->sym_col.alpha.color);
- break;
- case COLOR_TYPE_MIX:
- gtk_symbolic_color_unref (color->sym_col.mix.color1);
- gtk_symbolic_color_unref (color->sym_col.mix.color2);
- break;
- case COLOR_TYPE_WIN32:
- g_free (color->sym_col.win32.theme_class);
- break;
- default:
- break;
- }
+ _gtk_css_value_unref (color->value);
g_slice_free (GtkSymbolicColor, color);
}
-static void
-_shade_color (GdkRGBA *color,
- gdouble factor)
-{
- GtkHSLA hsla;
-
- _gtk_hsla_init_from_rgba (&hsla, color);
-
- hsla.lightness *= factor;
- hsla.lightness = CLAMP (hsla.lightness, 0.0, 1.0);
-
- hsla.saturation *= factor;
- hsla.saturation = CLAMP (hsla.saturation, 0.0, 1.0);
-
- _gdk_rgba_init_from_hsla (color, &hsla);
-}
-
/**
* gtk_symbolic_color_resolve:
* @color: a #GtkSymbolicColor
@@ -411,11 +279,11 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color,
g_return_val_if_fail (props == NULL || GTK_IS_STYLE_PROPERTIES (props), FALSE);
current = _gtk_css_rgba_value_new_from_rgba (&pink);
- v =_gtk_symbolic_color_resolve_full (color,
- GTK_STYLE_PROVIDER_PRIVATE (props),
- current,
- 0,
- NULL);
+ v = _gtk_css_color_value_resolve (color->value,
+ GTK_STYLE_PROVIDER_PRIVATE (props),
+ current,
+ 0,
+ NULL);
_gtk_css_value_unref (current);
if (v == NULL)
return FALSE;
@@ -425,156 +293,6 @@ gtk_symbolic_color_resolve (GtkSymbolicColor *color,
return TRUE;
}
-GtkCssValue *
-_gtk_symbolic_color_resolve_full (GtkSymbolicColor *color,
- GtkStyleProviderPrivate *provider,
- GtkCssValue *current,
- GtkCssDependencies current_deps,
- GtkCssDependencies *dependencies)
-{
- GtkCssDependencies unused;
- GtkCssValue *value;
-
- g_return_val_if_fail (color != NULL, FALSE);
- g_return_val_if_fail (provider == NULL || GTK_IS_STYLE_PROVIDER_PRIVATE (provider), FALSE);
- g_return_val_if_fail (current != NULL, FALSE);
-
- if (dependencies == NULL)
- dependencies = &unused;
- *dependencies = 0;
-
- value = NULL;
- switch (color->type)
- {
- case COLOR_TYPE_LITERAL:
- return _gtk_css_value_ref (color->last_value);
- case COLOR_TYPE_NAME:
- {
- GtkSymbolicColor *named_color;
-
- named_color = _gtk_style_provider_private_get_color (provider, color->sym_col.name);
-
- if (!named_color)
- return NULL;
-
- return _gtk_symbolic_color_resolve_full (named_color, provider, current, current_deps, dependencies);
- }
-
- break;
- case COLOR_TYPE_SHADE:
- {
- GtkCssValue *val;
- GdkRGBA shade;
-
- val = _gtk_symbolic_color_resolve_full (color->sym_col.shade.color, provider, current, current_deps, dependencies);
- if (val == NULL)
- return NULL;
-
- *dependencies = _gtk_css_dependencies_union (*dependencies, 0);
- shade = *_gtk_css_rgba_value_get_rgba (val);
- _shade_color (&shade, color->sym_col.shade.factor);
-
- _gtk_css_value_unref (val);
-
- value = _gtk_css_rgba_value_new_from_rgba (&shade);
- }
-
- break;
- case COLOR_TYPE_ALPHA:
- {
- GtkCssValue *val;
- GdkRGBA alpha;
-
- val = _gtk_symbolic_color_resolve_full (color->sym_col.alpha.color, provider, current, current_deps, dependencies);
- if (val == NULL)
- return NULL;
-
- *dependencies = _gtk_css_dependencies_union (*dependencies, 0);
- alpha = *_gtk_css_rgba_value_get_rgba (val);
- alpha.alpha = CLAMP (alpha.alpha * color->sym_col.alpha.factor, 0, 1);
-
- _gtk_css_value_unref (val);
-
- value = _gtk_css_rgba_value_new_from_rgba (&alpha);
- }
- break;
-
- case COLOR_TYPE_MIX:
- {
- GtkCssValue *val;
- GdkRGBA color1, color2, res;
- GtkCssDependencies dep1, dep2;
-
- val = _gtk_symbolic_color_resolve_full (color->sym_col.mix.color1, provider, current, current_deps, &dep1);
- if (val == NULL)
- return NULL;
- color1 = *_gtk_css_rgba_value_get_rgba (val);
- _gtk_css_value_unref (val);
-
- val = _gtk_symbolic_color_resolve_full (color->sym_col.mix.color2, provider, current, current_deps, &dep2);
- if (val == NULL)
- return NULL;
- color2 = *_gtk_css_rgba_value_get_rgba (val);
- _gtk_css_value_unref (val);
-
- *dependencies = _gtk_css_dependencies_union (dep1, dep2);
- res.red = CLAMP (color1.red + ((color2.red - color1.red) * color->sym_col.mix.factor), 0, 1);
- res.green = CLAMP (color1.green + ((color2.green - color1.green) * color->sym_col.mix.factor), 0, 1);
- res.blue = CLAMP (color1.blue + ((color2.blue - color1.blue) * color->sym_col.mix.factor), 0, 1);
- res.alpha = CLAMP (color1.alpha + ((color2.alpha - color1.alpha) * color->sym_col.mix.factor), 0, 1);
-
- value =_gtk_css_rgba_value_new_from_rgba (&res);
- }
-
- break;
- case COLOR_TYPE_WIN32:
- {
- GdkRGBA res;
-
- if (!_gtk_win32_theme_color_resolve (color->sym_col.win32.theme_class,
- color->sym_col.win32.id,
- &res))
- return NULL;
-
- value = _gtk_css_rgba_value_new_from_rgba (&res);
- }
-
- break;
- case COLOR_TYPE_CURRENT_COLOR:
- if (current)
- {
- *dependencies = current_deps;
- return _gtk_css_value_ref (current);
- }
- else
- {
- return NULL;
- }
- break;
- default:
- g_assert_not_reached ();
- }
-
- if (value != NULL)
- {
- if (color->last_value != NULL &&
- _gtk_css_value_equal (color->last_value, value))
- {
- _gtk_css_value_unref (value);
- value = _gtk_css_value_ref (color->last_value);
- }
- else
- {
- if (color->last_value != NULL)
- _gtk_css_value_unref (color->last_value);
- color->last_value = _gtk_css_value_ref (value);
- }
- }
-
- _gtk_css_rgba_value_get_rgba (value);
- return value;
-}
-
/**
* gtk_symbolic_color_to_string:
* @color: color to convert to a string
@@ -590,298 +308,26 @@ _gtk_symbolic_color_resolve_full (GtkSymbolicColor *color,
char *
gtk_symbolic_color_to_string (GtkSymbolicColor *color)
{
- char *s;
-
g_return_val_if_fail (color != NULL, NULL);
- switch (color->type)
- {
- case COLOR_TYPE_LITERAL:
- s = gdk_rgba_to_string (_gtk_css_rgba_value_get_rgba (color->last_value));
- break;
- case COLOR_TYPE_NAME:
- s = g_strconcat ("@", color->sym_col.name, NULL);
- break;
- case COLOR_TYPE_SHADE:
- {
- char *color_string = gtk_symbolic_color_to_string (color->sym_col.shade.color);
- char factor[G_ASCII_DTOSTR_BUF_SIZE];
-
- g_ascii_dtostr (factor, sizeof (factor), color->sym_col.shade.factor);
- s = g_strdup_printf ("shade(%s, %s)", color_string, factor);
- g_free (color_string);
- }
- break;
- case COLOR_TYPE_ALPHA:
- {
- char *color_string = gtk_symbolic_color_to_string (color->sym_col.shade.color);
- char factor[G_ASCII_DTOSTR_BUF_SIZE];
-
- g_ascii_dtostr (factor, sizeof (factor), color->sym_col.alpha.factor);
- s = g_strdup_printf ("alpha(%s, %s)", color_string, factor);
- g_free (color_string);
- }
- break;
- case COLOR_TYPE_MIX:
- {
- char *color_string1 = gtk_symbolic_color_to_string (color->sym_col.mix.color1);
- char *color_string2 = gtk_symbolic_color_to_string (color->sym_col.mix.color2);
- char factor[G_ASCII_DTOSTR_BUF_SIZE];
-
- g_ascii_dtostr (factor, sizeof (factor), color->sym_col.mix.factor);
- s = g_strdup_printf ("mix(%s, %s, %s)", color_string1, color_string2, factor);
- g_free (color_string1);
- g_free (color_string2);
- }
- break;
- case COLOR_TYPE_WIN32:
- {
- s = g_strdup_printf (GTK_WIN32_THEME_SYMBOLIC_COLOR_NAME"(%s, %d)",
- color->sym_col.win32.theme_class, color->sym_col.win32.id);
- }
- break;
- case COLOR_TYPE_CURRENT_COLOR:
- s = g_strdup ("currentColor");
- break;
- default:
- g_assert_not_reached ();
- }
-
- return s;
+ return _gtk_css_value_to_string (color->value);
}
-typedef enum {
- COLOR_RGBA,
- COLOR_RGB,
- COLOR_LIGHTER,
- COLOR_DARKER,
- COLOR_SHADE,
- COLOR_ALPHA,
- COLOR_MIX,
- COLOR_WIN32
-} ColorParseType;
-
-static GtkSymbolicColor *
-gtk_css_parser_read_symbolic_color_function (GtkCssParser *parser,
- ColorParseType color)
+GtkSymbolicColor *
+_gtk_css_symbolic_value_new (GtkCssParser *parser)
{
- GtkSymbolicColor *symbolic;
- GtkSymbolicColor *child1, *child2;
- double value;
-
- if (!_gtk_css_parser_try (parser, "(", TRUE))
- {
- _gtk_css_parser_error (parser, "Missing opening bracket in color definition");
- return NULL;
- }
-
- if (color == COLOR_RGB || color == COLOR_RGBA)
- {
- GdkRGBA rgba;
- double tmp;
- guint i;
-
- for (i = 0; i < 3; i++)
- {
- if (i > 0 && !_gtk_css_parser_try (parser, ",", TRUE))
- {
- _gtk_css_parser_error (parser, "Expected ',' in color definition");
- return NULL;
- }
-
- if (!_gtk_css_parser_try_double (parser, &tmp))
- {
- _gtk_css_parser_error (parser, "Invalid number for color value");
- return NULL;
- }
- if (_gtk_css_parser_try (parser, "%", TRUE))
- tmp /= 100.0;
- else
- tmp /= 255.0;
- if (i == 0)
- rgba.red = tmp;
- else if (i == 1)
- rgba.green = tmp;
- else if (i == 2)
- rgba.blue = tmp;
- else
- g_assert_not_reached ();
- }
-
- if (color == COLOR_RGBA)
- {
- if (i > 0 && !_gtk_css_parser_try (parser, ",", TRUE))
- {
- _gtk_css_parser_error (parser, "Expected ',' in color definition");
- return NULL;
- }
-
- if (!_gtk_css_parser_try_double (parser, &rgba.alpha))
- {
- _gtk_css_parser_error (parser, "Invalid number for alpha value");
- return NULL;
- }
- }
- else
- rgba.alpha = 1.0;
-
- symbolic = gtk_symbolic_color_new_literal (&rgba);
- }
- else if (color == COLOR_WIN32)
- {
- symbolic = _gtk_win32_theme_color_parse (parser);
- if (symbolic == NULL)
- return NULL;
- }
- else
- {
- child1 = _gtk_css_symbolic_value_new (parser);
- if (child1 == NULL)
- return NULL;
-
- if (color == COLOR_MIX)
- {
- if (!_gtk_css_parser_try (parser, ",", TRUE))
- {
- _gtk_css_parser_error (parser, "Expected ',' in color definition");
- gtk_symbolic_color_unref (child1);
- return NULL;
- }
-
- child2 = _gtk_css_symbolic_value_new (parser);
- if (child2 == NULL)
- {
- gtk_symbolic_color_unref (child1);
- return NULL;
- }
- }
- else
- child2 = NULL;
-
- if (color == COLOR_LIGHTER)
- value = 1.3;
- else if (color == COLOR_DARKER)
- value = 0.7;
- else
- {
- if (!_gtk_css_parser_try (parser, ",", TRUE))
- {
- _gtk_css_parser_error (parser, "Expected ',' in color definition");
- gtk_symbolic_color_unref (child1);
- if (child2)
- gtk_symbolic_color_unref (child2);
- return NULL;
- }
-
- if (!_gtk_css_parser_try_double (parser, &value))
- {
- _gtk_css_parser_error (parser, "Expected number in color definition");
- gtk_symbolic_color_unref (child1);
- if (child2)
- gtk_symbolic_color_unref (child2);
- return NULL;
- }
- }
-
- switch (color)
- {
- case COLOR_LIGHTER:
- case COLOR_DARKER:
- case COLOR_SHADE:
- symbolic = gtk_symbolic_color_new_shade (child1, value);
- break;
- case COLOR_ALPHA:
- symbolic = gtk_symbolic_color_new_alpha (child1, value);
- break;
- case COLOR_MIX:
- symbolic = gtk_symbolic_color_new_mix (child1, child2, value);
- break;
- default:
- g_assert_not_reached ();
- symbolic = NULL;
- }
-
- gtk_symbolic_color_unref (child1);
- if (child2)
- gtk_symbolic_color_unref (child2);
- }
-
- if (!_gtk_css_parser_try (parser, ")", TRUE))
- {
- _gtk_css_parser_error (parser, "Expected ')' in color definition");
- gtk_symbolic_color_unref (symbolic);
- return NULL;
- }
+ GtkCssValue *value;
- return symbolic;
+ value = _gtk_css_color_value_parse (parser);
+ if (value == NULL)
+ return NULL;
+
+ return gtk_symbolic_color_new (value);
}
-GtkSymbolicColor *
-_gtk_css_symbolic_value_new (GtkCssParser *parser)
+GtkCssValue *
+_gtk_symbolic_color_get_css_value (GtkSymbolicColor *symbolic)
{
- GtkSymbolicColor *symbolic;
- GdkRGBA rgba;
- guint color;
- const char *names[] = {"rgba", "rgb", "lighter", "darker", "shade", "alpha", "mix",
- GTK_WIN32_THEME_SYMBOLIC_COLOR_NAME};
- char *name;
-
- if (_gtk_css_parser_try (parser, "currentColor", TRUE))
- return gtk_symbolic_color_ref (_gtk_symbolic_color_get_current_color ());
-
- if (_gtk_css_parser_try (parser, "transparent", TRUE))
- {
- GdkRGBA transparent = { 0, 0, 0, 0 };
-
- return gtk_symbolic_color_new_literal (&transparent);
- }
-
- if (_gtk_css_parser_try (parser, "@", FALSE))
- {
- name = _gtk_css_parser_try_name (parser, TRUE);
-
- if (name)
- {
- symbolic = gtk_symbolic_color_new_name (name);
- }
- else
- {
- _gtk_css_parser_error (parser, "'%s' is not a valid symbolic color name", name);
- symbolic = NULL;
- }
-
- g_free (name);
- return symbolic;
- }
-
- for (color = 0; color < G_N_ELEMENTS (names); color++)
- {
- if (_gtk_css_parser_try (parser, names[color], TRUE))
- break;
- }
-
- if (color < G_N_ELEMENTS (names))
- return gtk_css_parser_read_symbolic_color_function (parser, color);
-
- if (_gtk_css_parser_try_hash_color (parser, &rgba))
- return gtk_symbolic_color_new_literal (&rgba);
-
- name = _gtk_css_parser_try_name (parser, TRUE);
- if (name)
- {
- if (gdk_rgba_parse (&rgba, name))
- {
- symbolic = gtk_symbolic_color_new_literal (&rgba);
- }
- else
- {
- _gtk_css_parser_error (parser, "'%s' is not a valid color name", name);
- symbolic = NULL;
- }
- g_free (name);
- return symbolic;
- }
-
- _gtk_css_parser_error (parser, "Not a color definition");
- return NULL;
+ return symbolic->value;
}
+
diff --git a/gtk/gtksymboliccolorprivate.h b/gtk/gtksymboliccolorprivate.h
index 171c124..154c29f 100644
--- a/gtk/gtksymboliccolorprivate.h
+++ b/gtk/gtksymboliccolorprivate.h
@@ -24,16 +24,10 @@
G_BEGIN_DECLS
-GtkCssValue * _gtk_symbolic_color_resolve_full (GtkSymbolicColor *color,
- GtkStyleProviderPrivate *provider,
- GtkCssValue *current,
- GtkCssDependencies current_deps,
- GtkCssDependencies *dependencies);
-
-GtkSymbolicColor * _gtk_symbolic_color_get_current_color (void);
-
GtkSymbolicColor * _gtk_css_symbolic_value_new (GtkCssParser *parser);
+GtkCssValue * _gtk_symbolic_color_get_css_value (GtkSymbolicColor *symbolic);
+
G_END_DECLS
#endif /* __GTK_SYMBOLIC_COLOR_PRIVATE_H__ */
diff --git a/gtk/gtkwin32theme.c b/gtk/gtkwin32theme.c
index d8b04a6..9b20a76 100644
--- a/gtk/gtkwin32theme.c
+++ b/gtk/gtkwin32theme.c
@@ -23,8 +23,6 @@
#include "gtkwin32themeprivate.h"
-#include <gtksymboliccolor.h>
-
#ifdef G_OS_WIN32
#include <cairo-win32.h>
@@ -383,41 +381,6 @@ _gtk_win32_theme_int_parse (GtkCssParser *parser,
return -1;
}
-GtkSymbolicColor *
-_gtk_win32_theme_color_parse (GtkCssParser *parser)
-{
- GtkSymbolicColor *color;
- char *class;
- int id;
-
- class = _gtk_css_parser_try_name (parser, TRUE);
- if (class == NULL)
- {
- _gtk_css_parser_error (parser,
- "Expected name as first argument to '-gtk-win32-color'");
- return NULL;
- }
-
- if (! _gtk_css_parser_try (parser, ",", TRUE))
- {
- g_free (class);
- _gtk_css_parser_error (parser,
- "Expected ','");
- return NULL;
- }
-
- if (!_gtk_css_parser_try_int (parser, &id))
- {
- g_free (class);
- _gtk_css_parser_error (parser, "Expected a valid integer value");
- return NULL;
- }
-
- color = gtk_symbolic_color_new_win32 (class, id);
- g_free (class);
- return color;
-}
-
gboolean
_gtk_win32_theme_color_resolve (const char *theme_class,
gint id,
diff --git a/gtk/gtkwin32themeprivate.h b/gtk/gtkwin32themeprivate.h
index 88d8660..aa64da5 100644
--- a/gtk/gtkwin32themeprivate.h
+++ b/gtk/gtkwin32themeprivate.h
@@ -50,7 +50,6 @@ cairo_surface_t * _gtk_win32_theme_part_create_surface (HTHEME theme,
int _gtk_win32_theme_int_parse (GtkCssParser *parser,
int *value);
-GtkSymbolicColor *_gtk_win32_theme_color_parse (GtkCssParser *parser);
gboolean _gtk_win32_theme_color_resolve (const char *theme_class,
gint id,
GdkRGBA *color);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]