X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcssimage.c;h=167af64a9117b02624ab0cfcef6d88bd49651ccb;hb=05386b44e04bc23e6cd68b74dd9047b874a2020b;hp=d990fc79fe4724b6166b0ae7375980c5cb703073;hpb=e1a1432bd36cdb3ce4cc4364c9aa098c354e6246;p=~andy%2Fgtk diff --git a/gtk/gtkcssimage.c b/gtk/gtkcssimage.c index d990fc79f..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,14 +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, - GtkCssDependencies *dependencies) +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) { @@ -72,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 @@ -116,16 +143,19 @@ _gtk_css_image_get_aspect_ratio (GtkCssImage *image) } GtkCssImage * -_gtk_css_image_compute (GtkCssImage *image, - guint property_id, - GtkStyleContext *context, - GtkCssDependencies *dependencies) +_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; @@ -133,7 +163,60 @@ _gtk_css_image_compute (GtkCssImage *image, klass = GTK_CSS_IMAGE_GET_CLASS (image); - return klass->compute (image, property_id, context, dependencies); + 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 @@ -146,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); @@ -323,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 {