X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcssimage.c;h=167af64a9117b02624ab0cfcef6d88bd49651ccb;hb=cc75ebec15d8fddbd0485e1b82a3c6c9e71f8a64;hp=e10de72d0368ff5299eb4676c27f3b5cf139f559;hpb=9b4ed662181cabde506248cf8b344420a0300a3e;p=~andy%2Fgtk diff --git a/gtk/gtkcssimage.c b/gtk/gtkcssimage.c index e10de72d0..167af64a9 100644 --- a/gtk/gtkcssimage.c +++ b/gtk/gtkcssimage.c @@ -21,6 +21,8 @@ #include "gtkcssimageprivate.h" +#include "gtkcsscomputedvaluesprivate.h" + /* for the types only */ #include "gtk/gtkcssimagecrossfadeprivate.h" #include "gtk/gtkcssimagegradientprivate.h" @@ -57,13 +59,37 @@ gtk_css_image_real_get_aspect_ratio (GtkCssImage *image) } static GtkCssImage * -gtk_css_image_real_compute (GtkCssImage *image, - guint property_id, - GtkStyleContext *context) +gtk_css_image_real_compute (GtkCssImage *image, + guint property_id, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GtkCssDependencies *dependencies) { return g_object_ref (image); } +static gboolean +gtk_css_image_real_equal (GtkCssImage *image1, + GtkCssImage *image2) +{ + return FALSE; +} + +static GtkCssImage * +gtk_css_image_real_transition (GtkCssImage *start, + GtkCssImage *end, + guint property_id, + double progress) +{ + if (progress <= 0.0) + return g_object_ref (start); + else if (progress >= 1.0) + return end ? g_object_ref (end) : NULL; + else + return _gtk_css_image_cross_fade_new (start, end, progress); +} + static void _gtk_css_image_class_init (GtkCssImageClass *klass) { @@ -71,6 +97,8 @@ _gtk_css_image_class_init (GtkCssImageClass *klass) klass->get_height = gtk_css_image_real_get_height; klass->get_aspect_ratio = gtk_css_image_real_get_aspect_ratio; klass->compute = gtk_css_image_real_compute; + klass->equal = gtk_css_image_real_equal; + klass->transition = gtk_css_image_real_transition; } static void @@ -115,18 +143,80 @@ _gtk_css_image_get_aspect_ratio (GtkCssImage *image) } GtkCssImage * -_gtk_css_image_compute (GtkCssImage *image, - guint property_id, - GtkStyleContext *context) +_gtk_css_image_compute (GtkCssImage *image, + guint property_id, + GtkStyleProviderPrivate *provider, + GtkCssComputedValues *values, + GtkCssComputedValues *parent_values, + GtkCssDependencies *dependencies) { + GtkCssDependencies unused; GtkCssImageClass *klass; g_return_val_if_fail (GTK_IS_CSS_IMAGE (image), NULL); - g_return_val_if_fail (GTK_IS_STYLE_CONTEXT (context), NULL); + g_return_val_if_fail (GTK_IS_CSS_COMPUTED_VALUES (values), NULL); + g_return_val_if_fail (parent_values == NULL || GTK_IS_CSS_COMPUTED_VALUES (parent_values), NULL); + + if (dependencies == NULL) + dependencies = &unused; + *dependencies = 0; klass = GTK_CSS_IMAGE_GET_CLASS (image); - return klass->compute (image, property_id, context); + return klass->compute (image, property_id, provider, values, parent_values, dependencies); +} + +GtkCssImage * +_gtk_css_image_transition (GtkCssImage *start, + GtkCssImage *end, + guint property_id, + double progress) +{ + GtkCssImageClass *klass; + + g_return_val_if_fail (start == NULL || GTK_IS_CSS_IMAGE (start), NULL); + g_return_val_if_fail (end == NULL || GTK_IS_CSS_IMAGE (end), NULL); + + progress = CLAMP (progress, 0.0, 1.0); + + if (start == NULL) + { + if (end == NULL) + return NULL; + else + { + start = end; + end = NULL; + progress = 1.0 - progress; + } + } + + klass = GTK_CSS_IMAGE_GET_CLASS (start); + + return klass->transition (start, end, property_id, progress); +} + +gboolean +_gtk_css_image_equal (GtkCssImage *image1, + GtkCssImage *image2) +{ + GtkCssImageClass *klass; + + g_return_val_if_fail (image1 == NULL || GTK_IS_CSS_IMAGE (image1), FALSE); + g_return_val_if_fail (image2 == NULL || GTK_IS_CSS_IMAGE (image2), FALSE); + + if (image1 == image2) + return TRUE; + + if (image1 == NULL || image2 == NULL) + return FALSE; + + if (G_OBJECT_TYPE (image1) != G_OBJECT_TYPE (image2)) + return FALSE; + + klass = GTK_CSS_IMAGE_GET_CLASS (image1); + + return klass->equal (image1, image2); } void @@ -139,6 +229,8 @@ _gtk_css_image_draw (GtkCssImage *image, g_return_if_fail (GTK_IS_CSS_IMAGE (image)); g_return_if_fail (cr != NULL); + g_return_if_fail (width > 0); + g_return_if_fail (height > 0); cairo_save (cr); @@ -316,7 +408,7 @@ _gtk_css_image_get_surface (GtkCssImage *image, return result; } -GType +static GType gtk_css_image_get_parser_type (GtkCssParser *parser) { static const struct {