]> Pileus Git - ~andy/gtk/commitdiff
css: Implement repeating linear gradients
authorBenjamin Otte <otte@redhat.com>
Tue, 17 Jan 2012 10:44:07 +0000 (11:44 +0100)
committerBenjamin Otte <otte@redhat.com>
Thu, 2 Feb 2012 02:14:00 +0000 (03:14 +0100)
gtk/gtkcssimage.c
gtk/gtkcssimagelinear.c
gtk/gtkcssimagelinearprivate.h

index 11f3a80e7285ec4d8a3d5381163a81c5698839bb..b8eda5fa118872022b6cd89a5e06b25080ad2420 100644 (file)
@@ -324,7 +324,8 @@ gtk_css_image_get_parser_type (GtkCssParser *parser)
     { "url", _gtk_css_image_url_get_type },
     { "-gtk-gradient", _gtk_css_image_gradient_get_type },
     { "-gtk-win32-theme-part", _gtk_css_image_win32_get_type },
-    { "linear-gradient", _gtk_css_image_linear_get_type }
+    { "linear-gradient", _gtk_css_image_linear_get_type },
+    { "repeating-linear-gradient", _gtk_css_image_linear_get_type }
   };
   guint i;
 
index 890465c4546d7dac5e9ba586871885ea3a83ccc9..130f9d9963b65ac8f36375ce8966694d2d05d249 100644 (file)
@@ -168,7 +168,10 @@ gtk_css_image_linear_draw (GtkCssImage        *image,
   gtk_css_image_linear_get_start_end (linear, length, &start, &end);
   pattern = cairo_pattern_create_linear (x * (start - 0.5), y * (start - 0.5),
                                          x * (end - 0.5),   y * (end - 0.5));
-  cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
+  if (linear->repeating)
+    cairo_pattern_set_extend (pattern, CAIRO_EXTEND_REPEAT);
+  else
+    cairo_pattern_set_extend (pattern, CAIRO_EXTEND_PAD);
 
   offset = start;
   last = -1;
@@ -230,7 +233,11 @@ gtk_css_image_linear_parse (GtkCssImage  *image,
   GtkCssImageLinear *linear = GTK_CSS_IMAGE_LINEAR (image);
   guint i;
 
-  if (!_gtk_css_parser_try (parser, "linear-gradient(", TRUE))
+  if (_gtk_css_parser_try (parser, "repeating-linear-gradient(", TRUE))
+    linear->repeating = TRUE;
+  else if (_gtk_css_parser_try (parser, "linear-gradient(", TRUE))
+    linear->repeating = FALSE;
+  else
     {
       _gtk_css_parser_error (parser, "Not a linear gradient");
       return FALSE;
@@ -356,7 +363,11 @@ gtk_css_image_linear_print (GtkCssImage *image,
   /* XXX: Do these need to be prinatable? */
   g_return_if_fail (!linear->is_computed);
 
-  g_string_append (string, "linear-gradient(");
+  if (linear->repeating)
+    g_string_append (string, "repeating-linear-gradient(");
+  else
+    g_string_append (string, "linear-gradient(");
+
   if (linear->angle.unit == GTK_CSS_NUMBER)
     {
       guint side = linear->angle.value;
@@ -421,6 +432,7 @@ gtk_css_image_linear_compute (GtkCssImage     *image,
 
   copy = g_object_new (GTK_TYPE_CSS_IMAGE_LINEAR, NULL);
   copy->is_computed = TRUE;
+  copy->repeating = linear->repeating;
 
   _gtk_css_number_compute (&copy->angle, &linear->angle, context);
   
index 67191b1e14515b41bdeac1a1dfee949ed679fda8..f664c5be5e7e984086a03493955bf2dedd3243be 100644 (file)
@@ -51,6 +51,7 @@ struct _GtkCssImageLinear
   GtkCssNumber angle; /* warning: We use GTK_CSS_NUMBER as an enum for the corners */
   GArray *stops;
   guint is_computed :1;
+  guint repeating :1;
 };
 
 struct _GtkCssImageLinearClass