[gtk+/wip/matthiasc/caret-color: 1/4] Support 'auto' for color values



commit 66af817f226e03a8e18b680a6d1ecc9f6d679723
Author: Matthias Clasen <mclasen redhat com>
Date:   Wed Jan 6 22:01:45 2016 -0500

    Support 'auto' for color values
    
    CSS3 defines a caret-color property here:
    http://www.w3.org/TR/css3-ui/#caret-color which has 'auto'
    as one of its possible values. Implement support for this in
    GtkCssColorValue.
    
    The computed value for 'auto' is 'auto', color expressions involving
    'auto' always resolve to 'auto', and transitions involving 'auto'
    as one of the colors always yield 'auto'.
    
    Note that we don't make _gtk_css_color_value_parse does accept 'auto',
    since most callers don't accept this value.

 gtk/gtkcsscolorvalue.c        |   78 +++++++++++++++++++++++++++++++++++++----
 gtk/gtkcsscolorvalueprivate.h |    2 +
 2 files changed, 73 insertions(+), 7 deletions(-)
---
diff --git a/gtk/gtkcsscolorvalue.c b/gtk/gtkcsscolorvalue.c
index 6cd0cf0..2073ad9 100644
--- a/gtk/gtkcsscolorvalue.c
+++ b/gtk/gtkcsscolorvalue.c
@@ -34,7 +34,8 @@ typedef enum {
   COLOR_TYPE_ALPHA,
   COLOR_TYPE_MIX,
   COLOR_TYPE_WIN32,
-  COLOR_TYPE_CURRENT_COLOR
+  COLOR_TYPE_CURRENT_COLOR,
+  COLOR_TYPE_AUTO
 } ColorType;
 
 struct _GtkCssValue
@@ -79,19 +80,24 @@ gtk_css_value_color_free (GtkCssValue *color)
     case COLOR_TYPE_NAME:
       g_free (color->sym_col.name);
       break;
+
     case COLOR_TYPE_SHADE:
       _gtk_css_value_unref (color->sym_col.shade.color);
       break;
+
     case COLOR_TYPE_ALPHA:
       _gtk_css_value_unref (color->sym_col.alpha.color);
       break;
+
     case COLOR_TYPE_MIX:
       _gtk_css_value_unref (color->sym_col.mix.color1);
       _gtk_css_value_unref (color->sym_col.mix.color2);
       break;
+
     case COLOR_TYPE_WIN32:
       g_free (color->sym_col.win32.theme_class);
       break;
+
     default:
       break;
     }
@@ -115,6 +121,7 @@ gtk_css_value_color_get_fallback (guint                    property_id,
       case GTK_CSS_PROPERTY_ICON_SHADOW:
       case GTK_CSS_PROPERTY_BOX_SHADOW:
         return _gtk_css_rgba_value_new_from_rgba (&transparent);
+
       case GTK_CSS_PROPERTY_COLOR:
       case GTK_CSS_PROPERTY_BACKGROUND_COLOR:
       case GTK_CSS_PROPERTY_BORDER_TOP_COLOR:
@@ -122,11 +129,14 @@ gtk_css_value_color_get_fallback (guint                    property_id,
       case GTK_CSS_PROPERTY_BORDER_BOTTOM_COLOR:
       case GTK_CSS_PROPERTY_BORDER_LEFT_COLOR:
       case GTK_CSS_PROPERTY_OUTLINE_COLOR:
+      case GTK_CSS_PROPERTY_CARET_COLOR:
+      case GTK_CSS_PROPERTY_SECONDARY_CARET_COLOR:
         return _gtk_css_value_compute (_gtk_css_style_property_get_initial_value 
(_gtk_css_style_property_lookup_by_id (property_id)),
                                        property_id,
                                        provider,
                                        style,
                                        parent_style);
+
       case GTK_CSS_PROPERTY_ICON_PALETTE:
         return _gtk_css_value_ref (gtk_css_style_get_value (style, GTK_CSS_PROPERTY_COLOR));
       default:
@@ -152,6 +162,7 @@ _gtk_css_color_value_resolve (GtkCssValue             *color,
     {
     case COLOR_TYPE_LITERAL:
       return _gtk_css_value_ref (color->last_value);
+
     case COLOR_TYPE_NAME:
       {
        GtkCssValue *named;
@@ -170,8 +181,8 @@ _gtk_css_color_value_resolve (GtkCssValue             *color,
        if (value == NULL)
          return NULL;
       }
-
       break;
+
     case COLOR_TYPE_SHADE:
       {
        GtkCssValue *val;
@@ -182,6 +193,9 @@ _gtk_css_color_value_resolve (GtkCssValue             *color,
        if (val == NULL)
          return NULL;
 
+        if (val->type == COLOR_TYPE_AUTO)
+          return val;
+
         _gtk_hsla_init_from_rgba (&hsla, _gtk_css_rgba_value_get_rgba (val));
         _gtk_hsla_shade (&hsla, &hsla, color->sym_col.shade.factor);
 
@@ -191,8 +205,8 @@ _gtk_css_color_value_resolve (GtkCssValue             *color,
 
        value = _gtk_css_rgba_value_new_from_rgba (&shade);
       }
-
       break;
+
     case COLOR_TYPE_ALPHA:
       {
        GtkCssValue *val;
@@ -202,6 +216,9 @@ _gtk_css_color_value_resolve (GtkCssValue             *color,
        if (val == NULL)
          return NULL;
 
+        if (val->type == COLOR_TYPE_AUTO)
+          return val;
+
        alpha = *_gtk_css_rgba_value_get_rgba (val);
        alpha.alpha = CLAMP (alpha.alpha * color->sym_col.alpha.factor, 0, 1);
 
@@ -219,12 +236,18 @@ _gtk_css_color_value_resolve (GtkCssValue             *color,
        val = _gtk_css_color_value_resolve (color->sym_col.mix.color1, provider, current, cycle_list);
        if (val == NULL)
          return NULL;
+        if (val->type == COLOR_TYPE_AUTO)
+          return val;
+
        color1 = *_gtk_css_rgba_value_get_rgba (val);
        _gtk_css_value_unref (val);
 
        val = _gtk_css_color_value_resolve (color->sym_col.mix.color2, provider, current, cycle_list);
        if (val == NULL)
          return NULL;
+        if (val->type == COLOR_TYPE_AUTO)
+          return val;
+
        color2 = *_gtk_css_rgba_value_get_rgba (val);
        _gtk_css_value_unref (val);
 
@@ -235,8 +258,8 @@ _gtk_css_color_value_resolve (GtkCssValue             *color,
 
        value =_gtk_css_rgba_value_new_from_rgba (&res);
       }
-
       break;
+
     case COLOR_TYPE_WIN32:
       {
        GdkRGBA res;
@@ -248,8 +271,8 @@ _gtk_css_color_value_resolve (GtkCssValue             *color,
 
        value = _gtk_css_rgba_value_new_from_rgba (&res);
       }
-
       break;
+
     case COLOR_TYPE_CURRENT_COLOR:
       if (current)
         {
@@ -263,6 +286,10 @@ _gtk_css_color_value_resolve (GtkCssValue             *color,
                                                cycle_list);
         }
       break;
+
+    case COLOR_TYPE_AUTO:
+      return _gtk_css_value_ref (color);
+
     default:
       value = NULL;
       g_assert_not_reached ();
@@ -331,27 +358,35 @@ gtk_css_value_color_equal (const GtkCssValue *value1,
     {
     case COLOR_TYPE_LITERAL:
       return _gtk_css_value_equal (value1->last_value, value2->last_value);
+
     case COLOR_TYPE_NAME:
       return g_str_equal (value1->sym_col.name, value2->sym_col.name);
+
     case COLOR_TYPE_SHADE:
       return value1->sym_col.shade.factor == value2->sym_col.shade.factor &&
              _gtk_css_value_equal (value1->sym_col.shade.color,
                                    value2->sym_col.shade.color);
+
     case COLOR_TYPE_ALPHA:
       return value1->sym_col.alpha.factor == value2->sym_col.alpha.factor &&
              _gtk_css_value_equal (value1->sym_col.alpha.color,
                                    value2->sym_col.alpha.color);
+
     case COLOR_TYPE_MIX:
       return value1->sym_col.mix.factor == value2->sym_col.mix.factor &&
              _gtk_css_value_equal (value1->sym_col.mix.color1,
                                    value2->sym_col.mix.color1) &&
              _gtk_css_value_equal (value1->sym_col.mix.color2,
                                    value2->sym_col.mix.color2);
+
     case COLOR_TYPE_WIN32:
       return g_str_equal (value1->sym_col.win32.theme_class, value2->sym_col.win32.theme_class) &&
              value1->sym_col.win32.id == value2->sym_col.win32.id;
+
     case COLOR_TYPE_CURRENT_COLOR:
+    case COLOR_TYPE_AUTO:
       return TRUE;
+
     default:
       g_assert_not_reached ();
       return FALSE;
@@ -364,7 +399,10 @@ gtk_css_value_color_transition (GtkCssValue *start,
                                 guint        property_id,
                                 double       progress)
 {
-  return _gtk_css_color_value_new_mix (start, end, progress);
+  if (start->type == COLOR_TYPE_AUTO || end->type == COLOR_TYPE_AUTO)
+    return _gtk_css_color_value_new_auto ();
+  else
+    return _gtk_css_color_value_new_mix (start, end, progress);
 }
 
 static void
@@ -376,10 +414,12 @@ gtk_css_value_color_print (const GtkCssValue *value,
     case COLOR_TYPE_LITERAL:
       _gtk_css_value_print (value->last_value, string);
       break;
+
     case COLOR_TYPE_NAME:
       g_string_append (string, "@");
       g_string_append (string, value->sym_col.name);
       break;
+
     case COLOR_TYPE_SHADE:
       {
         char factor[G_ASCII_DTOSTR_BUF_SIZE];
@@ -392,6 +432,7 @@ gtk_css_value_color_print (const GtkCssValue *value,
         g_string_append (string, ")");
       }
       break;
+
     case COLOR_TYPE_ALPHA:
       {
         char factor[G_ASCII_DTOSTR_BUF_SIZE];
@@ -404,6 +445,7 @@ gtk_css_value_color_print (const GtkCssValue *value,
         g_string_append (string, ")");
       }
       break;
+
     case COLOR_TYPE_MIX:
       {
         char factor[G_ASCII_DTOSTR_BUF_SIZE];
@@ -418,15 +460,22 @@ gtk_css_value_color_print (const GtkCssValue *value,
         g_string_append (string, ")");
       }
       break;
+
     case COLOR_TYPE_WIN32:
       {
         g_string_append_printf (string, GTK_WIN32_THEME_SYMBOLIC_COLOR_NAME"(%s, %d)", 
                                value->sym_col.win32.theme_class, value->sym_col.win32.id);
       }
       break;
+
     case COLOR_TYPE_CURRENT_COLOR:
       g_string_append (string, "currentColor");
       break;
+
+    case COLOR_TYPE_AUTO:
+      g_string_append (string, "auto");
+      break;
+
     default:
       g_assert_not_reached ();
     }
@@ -554,6 +603,21 @@ _gtk_css_color_value_new_current_color (void)
   return _gtk_css_value_ref (&current_color);
 }
 
+GtkCssValue *
+_gtk_css_color_value_new_auto (void)
+{
+  static GtkCssValue auto_singleton = { &GTK_CSS_VALUE_COLOR, 1, COLOR_TYPE_AUTO, NULL, };
+
+  return _gtk_css_value_ref (&auto_singleton);
+}
+
+gboolean
+_gtk_css_color_value_is_auto (GtkCssValue *color)
+{
+  return color->class == &GTK_CSS_VALUE_COLOR &&
+         color->type == COLOR_TYPE_AUTO;
+}
+
 typedef enum {
   COLOR_RGBA,
   COLOR_RGB,
@@ -771,7 +835,7 @@ _gtk_css_color_value_parse (GtkCssParser *parser)
   if (_gtk_css_parser_try (parser, "transparent", TRUE))
     {
       GdkRGBA transparent = { 0, 0, 0, 0 };
-      
+
       return _gtk_css_color_value_new_literal (&transparent);
     }
 
diff --git a/gtk/gtkcsscolorvalueprivate.h b/gtk/gtkcsscolorvalueprivate.h
index b80d521..4de1167 100644
--- a/gtk/gtkcsscolorvalueprivate.h
+++ b/gtk/gtkcsscolorvalueprivate.h
@@ -40,6 +40,8 @@ GtkCssValue *   _gtk_css_color_value_new_mix            (GtkCssValue    *color1,
 GtkCssValue *   _gtk_css_color_value_new_win32          (const gchar    *theme_class,
                                                          gint            id);
 GtkCssValue *   _gtk_css_color_value_new_current_color  (void);
+GtkCssValue *   _gtk_css_color_value_new_auto           (void);
+gboolean        _gtk_css_color_value_is_auto            (GtkCssValue    *color);
 
 GtkCssValue *   _gtk_css_color_value_parse              (GtkCssParser   *parser);
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]