]> Pileus Git - ~andy/gtk/blobdiff - gtk/gtkcssimagelinear.c
Really keep GtkBubbleWindow private
[~andy/gtk] / gtk / gtkcssimagelinear.c
index 6cc88e49a350328dc714c94eadb4e9ad4dc15b53..0bf89e7d8b13e620b07c11b0bc39b978a806d0e4 100644 (file)
 
 #include <math.h>
 
+#include "gtkcsscolorvalueprivate.h"
 #include "gtkcssnumbervalueprivate.h"
 #include "gtkcssrgbavalueprivate.h"
 #include "gtkcssprovider.h"
-#include "gtksymboliccolorprivate.h"
 
 G_DEFINE_TYPE (GtkCssImageLinear, _gtk_css_image_linear, GTK_TYPE_CSS_IMAGE)
 
@@ -40,28 +40,36 @@ gtk_css_image_linear_get_start_end (GtkCssImageLinear *linear,
   double pos;
   guint i;
       
-  stop = &g_array_index (linear->stops, GtkCssImageLinearColorStop, 0);
-  if (stop->offset == NULL)
-    *start = 0;
-  else
-    *start = _gtk_css_number_value_get (stop->offset, length) / length;
-
-  *end = *start;
-
-  for (i = 0; i < linear->stops->len; i++)
+  if (linear->repeating)
     {
-      stop = &g_array_index (linear->stops, GtkCssImageLinearColorStop, i);
-      
+      stop = &g_array_index (linear->stops, GtkCssImageLinearColorStop, 0);
       if (stop->offset == NULL)
-        continue;
+        *start = 0;
+      else
+        *start = _gtk_css_number_value_get (stop->offset, length) / length;
 
-      pos = _gtk_css_number_value_get (stop->offset, length) / length;
+      *end = *start;
 
-      *end = MAX (pos, *end);
+      for (i = 0; i < linear->stops->len; i++)
+        {
+          stop = &g_array_index (linear->stops, GtkCssImageLinearColorStop, i);
+          
+          if (stop->offset == NULL)
+            continue;
+
+          pos = _gtk_css_number_value_get (stop->offset, length) / length;
+
+          *end = MAX (pos, *end);
+        }
+      
+      if (stop->offset == NULL)
+        *end = MAX (*end, 1.0);
+    }
+  else
+    {
+      *start = 0;
+      *end = 1;
     }
-  
-  if (stop->offset == NULL)
-    *end = MAX (*end, 1.0);
 }
 
 static void
@@ -222,8 +230,7 @@ gtk_css_image_linear_draw (GtkCssImage        *image,
 
 static gboolean
 gtk_css_image_linear_parse (GtkCssImage  *image,
-                            GtkCssParser *parser,
-                            GFile        *base)
+                            GtkCssParser *parser)
 {
   GtkCssImageLinear *linear = GTK_CSS_IMAGE_LINEAR (image);
   guint i;
@@ -315,10 +322,9 @@ gtk_css_image_linear_parse (GtkCssImage  *image,
 
   do {
     GtkCssImageLinearColorStop stop;
-    GtkSymbolicColor *symbolic;
 
-    symbolic = _gtk_css_parser_read_symbolic_color (parser);
-    if (symbolic == NULL)
+    stop.color = _gtk_css_color_value_parse (parser);
+    if (stop.color == NULL)
       return FALSE;
 
     if (_gtk_css_parser_has_number (parser))
@@ -328,7 +334,7 @@ gtk_css_image_linear_parse (GtkCssImage  *image,
                                                    | GTK_CSS_PARSE_LENGTH);
         if (stop.offset == NULL)
           {
-            gtk_symbolic_color_unref (symbolic);
+            _gtk_css_value_unref (stop.color);
             return FALSE;
           }
       }
@@ -337,7 +343,6 @@ gtk_css_image_linear_parse (GtkCssImage  *image,
         stop.offset = NULL;
       }
 
-    stop.color = _gtk_css_value_new_take_symbolic_color (symbolic);
     g_array_append_val (linear->stops, stop);
 
   } while (_gtk_css_parser_try (parser, ",", TRUE));
@@ -412,45 +417,150 @@ gtk_css_image_linear_print (GtkCssImage *image,
 }
 
 static GtkCssImage *
-gtk_css_image_linear_compute (GtkCssImage     *image,
-                              GtkStyleContext *context)
+gtk_css_image_linear_compute (GtkCssImage             *image,
+                              guint                    property_id,
+                              GtkStyleProviderPrivate *provider,
+                              GtkCssComputedValues    *values,
+                              GtkCssComputedValues    *parent_values,
+                              GtkCssDependencies      *dependencies)
 {
-  static const GdkRGBA transparent = { 0, 0, 0, 0 };
   GtkCssImageLinear *linear = GTK_CSS_IMAGE_LINEAR (image);
   GtkCssImageLinear *copy;
-  GtkCssValue *fallback;
   guint i;
 
   copy = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL);
   copy->repeating = linear->repeating;
 
-  copy->angle = _gtk_css_number_value_compute (linear->angle, context);
+  copy->angle = _gtk_css_value_compute (linear->angle, property_id, provider, values, parent_values, dependencies);
   
-  fallback = _gtk_css_value_new_take_symbolic_color (gtk_symbolic_color_new_literal (&transparent));
   g_array_set_size (copy->stops, linear->stops->len);
   for (i = 0; i < linear->stops->len; i++)
     {
       GtkCssImageLinearColorStop *stop, *scopy;
+      GtkCssDependencies child_deps;
 
       stop = &g_array_index (linear->stops, GtkCssImageLinearColorStop, i);
       scopy = &g_array_index (copy->stops, GtkCssImageLinearColorStop, i);
               
-      scopy->color = _gtk_css_rgba_value_compute_from_symbolic (stop->color,
-                                                                fallback,
-                                                                context,
-                                                                FALSE);
+      scopy->color = _gtk_css_value_compute (stop->color, property_id, provider, values, parent_values, &child_deps);
+      *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
       
       if (stop->offset)
-        scopy->offset = _gtk_css_number_value_compute (stop->offset, context);
+        {
+          scopy->offset = _gtk_css_value_compute (stop->offset, property_id, provider, values, parent_values, &child_deps);
+          *dependencies = _gtk_css_dependencies_union (*dependencies, child_deps);
+        }
       else
-        scopy->offset = NULL;
+        {
+          scopy->offset = NULL;
+        }
     }
 
-  _gtk_css_value_unref (fallback);
-
   return GTK_CSS_IMAGE (copy);
 }
 
+static GtkCssImage *
+gtk_css_image_linear_transition (GtkCssImage *start_image,
+                                 GtkCssImage *end_image,
+                                 guint        property_id,
+                                 double       progress)
+{
+  GtkCssImageLinear *start, *end, *result;
+  guint i;
+
+  start = GTK_CSS_IMAGE_LINEAR (start_image);
+
+  if (end_image == NULL)
+
+  if (!GTK_IS_CSS_IMAGE_LINEAR (end_image))
+    return GTK_CSS_IMAGE_CLASS (_gtk_css_image_linear_parent_class)->transition (start_image, end_image, property_id, progress);
+
+  end = GTK_CSS_IMAGE_LINEAR (end_image);
+
+  if ((start->repeating != end->repeating)
+      || (start->stops->len != end->stops->len))
+    return GTK_CSS_IMAGE_CLASS (_gtk_css_image_linear_parent_class)->transition (start_image, end_image, property_id, progress);
+
+  result = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL);
+  result->repeating = start->repeating;
+
+  result->angle = _gtk_css_value_transition (start->angle, end->angle, property_id, progress);
+  if (result->angle == NULL)
+    goto fail;
+  
+  for (i = 0; i < start->stops->len; i++)
+    {
+      GtkCssImageLinearColorStop stop, *start_stop, *end_stop;
+
+      start_stop = &g_array_index (start->stops, GtkCssImageLinearColorStop, i);
+      end_stop = &g_array_index (end->stops, GtkCssImageLinearColorStop, i);
+
+      if ((start_stop->offset != NULL) != (end_stop->offset != NULL))
+        goto fail;
+
+      if (start_stop->offset == NULL)
+        {
+          stop.offset = NULL;
+        }
+      else
+        {
+          stop.offset = _gtk_css_value_transition (start_stop->offset,
+                                                   end_stop->offset,
+                                                   property_id,
+                                                   progress);
+          if (stop.offset == NULL)
+            goto fail;
+        }
+
+      stop.color = _gtk_css_value_transition (start_stop->color,
+                                              end_stop->color,
+                                              property_id,
+                                              progress);
+      if (stop.color == NULL)
+        {
+          if (stop.offset)
+            _gtk_css_value_unref (stop.offset);
+          goto fail;
+        }
+
+      g_array_append_val (result->stops, stop);
+    }
+
+  return GTK_CSS_IMAGE (result);
+
+fail:
+  g_object_unref (result);
+  return GTK_CSS_IMAGE_CLASS (_gtk_css_image_linear_parent_class)->transition (start_image, end_image, property_id, progress);
+}
+
+static gboolean
+gtk_css_image_linear_equal (GtkCssImage *image1,
+                            GtkCssImage *image2)
+{
+  GtkCssImageLinear *linear1 = GTK_CSS_IMAGE_LINEAR (image1);
+  GtkCssImageLinear *linear2 = GTK_CSS_IMAGE_LINEAR (image2);
+  guint i;
+
+  if (linear1->repeating != linear2->repeating ||
+      !_gtk_css_value_equal (linear1->angle, linear2->angle) ||
+      linear1->stops->len != linear2->stops->len)
+    return FALSE;
+
+  for (i = 0; i < linear1->stops->len; i++)
+    {
+      GtkCssImageLinearColorStop *stop1, *stop2;
+
+      stop1 = &g_array_index (linear1->stops, GtkCssImageLinearColorStop, i);
+      stop2 = &g_array_index (linear2->stops, GtkCssImageLinearColorStop, i);
+
+      if (!_gtk_css_value_equal0 (stop1->offset, stop2->offset) ||
+          !_gtk_css_value_equal (stop1->color, stop2->color))
+        return FALSE;
+    }
+
+  return TRUE;
+}
+
 static void
 gtk_css_image_linear_dispose (GObject *object)
 {
@@ -481,6 +591,8 @@ _gtk_css_image_linear_class_init (GtkCssImageLinearClass *klass)
   image_class->parse = gtk_css_image_linear_parse;
   image_class->print = gtk_css_image_linear_print;
   image_class->compute = gtk_css_image_linear_compute;
+  image_class->equal = gtk_css_image_linear_equal;
+  image_class->transition = gtk_css_image_linear_transition;
 
   object_class->dispose = gtk_css_image_linear_dispose;
 }