X-Git-Url: http://pileus.org/git/?a=blobdiff_plain;f=gtk%2Fgtkcssimage.c;h=167af64a9117b02624ab0cfcef6d88bd49651ccb;hb=56bcb1933f6de613e5d8689e23420d47b65425c3;hp=b8eda5fa118872022b6cd89a5e06b25080ad2420;hpb=811e848832c140b21fe711a0f377248aef040550;p=~andy%2Fgtk diff --git a/gtk/gtkcssimage.c b/gtk/gtkcssimage.c index b8eda5fa1..167af64a9 100644 --- a/gtk/gtkcssimage.c +++ b/gtk/gtkcssimage.c @@ -12,8 +12,7 @@ * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public - * License along with this library; if not, write to the Free Software - * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + * License along with this library. If not, see . * * Authors: Benjamin Otte */ @@ -22,7 +21,10 @@ #include "gtkcssimageprivate.h" +#include "gtkcsscomputedvaluesprivate.h" + /* for the types only */ +#include "gtk/gtkcssimagecrossfadeprivate.h" #include "gtk/gtkcssimagegradientprivate.h" #include "gtk/gtkcssimagelinearprivate.h" #include "gtk/gtkcssimageurlprivate.h" @@ -57,12 +59,37 @@ gtk_css_image_real_get_aspect_ratio (GtkCssImage *image) } static GtkCssImage * -gtk_css_image_real_compute (GtkCssImage *image, - 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) { @@ -70,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 @@ -114,17 +143,80 @@ _gtk_css_image_get_aspect_ratio (GtkCssImage *image) } GtkCssImage * -_gtk_css_image_compute (GtkCssImage *image, - 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, 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 @@ -137,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); @@ -314,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 { @@ -325,7 +419,8 @@ gtk_css_image_get_parser_type (GtkCssParser *parser) { "-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 }, - { "repeating-linear-gradient", _gtk_css_image_linear_get_type } + { "repeating-linear-gradient", _gtk_css_image_linear_get_type }, + { "cross-fade", _gtk_css_image_cross_fade_get_type } }; guint i; @@ -356,15 +451,13 @@ _gtk_css_image_can_parse (GtkCssParser *parser) } GtkCssImage * -_gtk_css_image_new_parse (GtkCssParser *parser, - GFile *base) +_gtk_css_image_new_parse (GtkCssParser *parser) { GtkCssImageClass *klass; GtkCssImage *image; GType image_type; g_return_val_if_fail (parser != NULL, NULL); - g_return_val_if_fail (G_IS_FILE (base), NULL); image_type = gtk_css_image_get_parser_type (parser); if (image_type == G_TYPE_INVALID) @@ -376,7 +469,7 @@ _gtk_css_image_new_parse (GtkCssParser *parser, image = g_object_new (image_type, NULL); klass = GTK_CSS_IMAGE_GET_CLASS (image); - if (!klass->parse (image, parser, base)) + if (!klass->parse (image, parser)) { g_object_unref (image); return NULL;