summaryrefslogtreecommitdiff
path: root/gtk/gtkcssimagelinear.c
diff options
context:
space:
mode:
authorBenjamin Otte <otte@redhat.com>2012-10-02 19:30:02 +0200
committerBenjamin Otte <otte@redhat.com>2012-10-02 19:32:52 +0200
commit03f5ff20de21737d3438c0fcde309a94165f4c9d (patch)
tree365e6b220a0e14664f7ad8f04e0f2cdcc4908491 /gtk/gtkcssimagelinear.c
parentdd9957769196f138262a7bad1a525ff174cc1df4 (diff)
downloadgtk+-03f5ff20de21737d3438c0fcde309a94165f4c9d.tar.gz
cssimage: Add transition code for linear-gradient()
This ensures feature-parity with the CSS spec and the -gtk-gradient() notation.
Diffstat (limited to 'gtk/gtkcssimagelinear.c')
-rw-r--r--gtk/gtkcssimagelinear.c75
1 files changed, 75 insertions, 0 deletions
diff --git a/gtk/gtkcssimagelinear.c b/gtk/gtkcssimagelinear.c
index 39b6b3e781..bd80d5f835 100644
--- a/gtk/gtkcssimagelinear.c
+++ b/gtk/gtkcssimagelinear.c
@@ -451,6 +451,80 @@ gtk_css_image_linear_compute (GtkCssImage *image,
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 void
gtk_css_image_linear_dispose (GObject *object)
{
@@ -481,6 +555,7 @@ _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->transition = gtk_css_image_linear_transition;
object_class->dispose = gtk_css_image_linear_dispose;
}