diff options
author | Matthias Clasen <mclasen@redhat.com> | 2011-12-16 13:47:36 -0500 |
---|---|---|
committer | Matthias Clasen <mclasen@redhat.com> | 2011-12-16 13:47:36 -0500 |
commit | d11ca485bf2799f02bdd5516280eeb6db29187b3 (patch) | |
tree | 89a62bfcbc3673e2172409bafb101c22bcb6b153 | |
parent | ee81d3fc611a0e64dc55c4f2a2fda73932de2fe6 (diff) | |
download | gdk-pixbuf-d11ca485bf2799f02bdd5516280eeb6db29187b3.tar.gz |
Convert animation implementation to G_DEFINE_TYPE
This has the nice side-effect of giving us thread-safe get_type
functions, which might fix a few thumbnailing-related gnome-shell
segfaults that have been accumulating in bugzilla. See e.g.
https://bugzilla.redhat.com/show_bug.cgi?id=756343
-rw-r--r-- | gdk-pixbuf/io-ani-animation.c | 100 | ||||
-rw-r--r-- | gdk-pixbuf/io-gdip-animation.c | 122 | ||||
-rw-r--r-- | gdk-pixbuf/io-gif-animation.c | 160 |
3 files changed, 114 insertions, 268 deletions
diff --git a/gdk-pixbuf/io-ani-animation.c b/gdk-pixbuf/io-ani-animation.c index c352fd54a..c6b28cced 100644 --- a/gdk-pixbuf/io-ani-animation.c +++ b/gdk-pixbuf/io-ani-animation.c @@ -26,7 +26,6 @@ #include "gdk-pixbuf-private.h" #include "io-ani-animation.h" -static void gdk_pixbuf_ani_anim_class_init (GdkPixbufAniAnimClass *klass); static void gdk_pixbuf_ani_anim_finalize (GObject *object); static gboolean gdk_pixbuf_ani_anim_is_static_image (GdkPixbufAnimation *animation); @@ -40,32 +39,11 @@ static GdkPixbufAnimationIter* gdk_pixbuf_ani_anim_get_iter (GdkPixbufAnimation -static gpointer parent_class; +G_DEFINE_TYPE (GdkPixbufAniAnim, gdk_pixbuf_ani_anim, GDK_TYPE_PIXBUF_ANIMATION) -GType -gdk_pixbuf_ani_anim_get_type (void) +static void +gdk_pixbuf_ani_anim_init (GdkPixbufAniAnim *anim) { - static GType object_type = 0; - - if (!object_type) { - const GTypeInfo object_info = { - sizeof (GdkPixbufAniAnimClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) gdk_pixbuf_ani_anim_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GdkPixbufAniAnim), - 0, /* n_preallocs */ - (GInstanceInitFunc) NULL, - }; - - object_type = g_type_register_static (GDK_TYPE_PIXBUF_ANIMATION, - g_intern_static_string ("GdkPixbufAniAnim"), - &object_info, 0); - } - - return object_type; } static void @@ -73,9 +51,7 @@ gdk_pixbuf_ani_anim_class_init (GdkPixbufAniAnimClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GdkPixbufAnimationClass *anim_class = GDK_PIXBUF_ANIMATION_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - + object_class->finalize = gdk_pixbuf_ani_anim_finalize; anim_class->is_static_image = gdk_pixbuf_ani_anim_is_static_image; @@ -97,12 +73,12 @@ gdk_pixbuf_ani_anim_finalize (GObject *object) g_free (ani_anim->pixbufs); g_free (ani_anim->sequence); g_free (ani_anim->delay); - - G_OBJECT_CLASS (parent_class)->finalize (object); + + G_OBJECT_CLASS (gdk_pixbuf_ani_anim_parent_class)->finalize (object); } static gboolean -gdk_pixbuf_ani_anim_is_static_image (GdkPixbufAnimation *animation) +gdk_pixbuf_ani_anim_is_static_image (GdkPixbufAnimation *animation) { GdkPixbufAniAnim *ani_anim; @@ -121,7 +97,7 @@ gdk_pixbuf_ani_anim_get_static_image (GdkPixbufAnimation *animation) if (ani_anim->pixbufs == NULL) return NULL; else - return ani_anim->pixbufs[0]; + return ani_anim->pixbufs[0]; } static void @@ -144,7 +120,7 @@ gdk_pixbuf_ani_anim_get_size (GdkPixbufAnimation *anim, static void iter_restart (GdkPixbufAniAnimIter *iter) { - iter->current_frame = 0; + iter->current_frame = 0; iter->position = 0; iter->elapsed = 0; } @@ -160,18 +136,17 @@ gdk_pixbuf_ani_anim_get_iter (GdkPixbufAnimation *anim, iter->ani_anim = GDK_PIXBUF_ANI_ANIM (anim); g_object_ref (iter->ani_anim); - + iter_restart (iter); iter->start_time = *start_time; iter->current_time = *start_time; - + return GDK_PIXBUF_ANIMATION_ITER (iter); } -static void gdk_pixbuf_ani_anim_iter_class_init (GdkPixbufAniAnimIterClass *klass); static void gdk_pixbuf_ani_anim_iter_finalize (GObject *object); static int gdk_pixbuf_ani_anim_iter_get_delay_time (GdkPixbufAnimationIter *iter); @@ -182,32 +157,11 @@ static gboolean gdk_pixbuf_ani_anim_iter_advance (GdkPixbuf -static gpointer iter_parent_class; +G_DEFINE_TYPE (GdkPixbufAniAnimIter, gdk_pixbuf_ani_anim_iter, GDK_TYPE_PIXBUF_ANIMATION_ITER); -GType -gdk_pixbuf_ani_anim_iter_get_type (void) +static void +gdk_pixbuf_ani_anim_iter_init (GdkPixbufAniAnimIter *anim) { - static GType object_type = 0; - - if (!object_type) { - const GTypeInfo object_info = { - sizeof (GdkPixbufAniAnimIterClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) gdk_pixbuf_ani_anim_iter_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GdkPixbufAniAnimIter), - 0, /* n_preallocs */ - (GInstanceInitFunc) NULL, - }; - - object_type = g_type_register_static (GDK_TYPE_PIXBUF_ANIMATION_ITER, - g_intern_static_string ("GdkPixbufAniAnimIter"), - &object_info, 0); - } - - return object_type; } static void @@ -216,9 +170,7 @@ gdk_pixbuf_ani_anim_iter_class_init (GdkPixbufAniAnimIterClass *klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); GdkPixbufAnimationIterClass *anim_iter_class = GDK_PIXBUF_ANIMATION_ITER_CLASS (klass); - - iter_parent_class = g_type_class_peek_parent (klass); - + object_class->finalize = gdk_pixbuf_ani_anim_iter_finalize; anim_iter_class->get_delay_time = gdk_pixbuf_ani_anim_iter_get_delay_time; @@ -233,8 +185,8 @@ gdk_pixbuf_ani_anim_iter_finalize (GObject *object) GdkPixbufAniAnimIter *iter = GDK_PIXBUF_ANI_ANIM_ITER (object); g_object_unref (iter->ani_anim); - - G_OBJECT_CLASS (iter_parent_class)->finalize (object); + + G_OBJECT_CLASS (gdk_pixbuf_ani_anim_iter_parent_class)->finalize (object); } static gboolean @@ -247,7 +199,7 @@ gdk_pixbuf_ani_anim_iter_advance (GdkPixbufAnimationIter *anim_iter, gint old; iter = GDK_PIXBUF_ANI_ANIM_ITER (anim_iter); - + iter->current_time = *current_time; /* We use milliseconds for all times */ @@ -264,16 +216,16 @@ gdk_pixbuf_ani_anim_iter_advance (GdkPixbufAnimationIter *anim_iter, } g_assert (iter->ani_anim->total_time > 0); - + /* See how many times we've already played the full animation, * and subtract time for that. */ elapsed = elapsed % iter->ani_anim->total_time; iter->position = elapsed; - + /* Now move to the proper frame */ - + iter->elapsed = 0; for (tmp = 0; tmp < iter->ani_anim->n_frames; tmp++) { if (iter->position >= iter->elapsed && @@ -283,7 +235,7 @@ gdk_pixbuf_ani_anim_iter_advance (GdkPixbufAnimationIter *anim_iter, } old = iter->current_frame; - + iter->current_frame = tmp; return iter->current_frame != old; @@ -293,7 +245,7 @@ int gdk_pixbuf_ani_anim_iter_get_delay_time (GdkPixbufAnimationIter *anim_iter) { GdkPixbufAniAnimIter *iter; - + iter = GDK_PIXBUF_ANI_ANIM_ITER (anim_iter); return iter->ani_anim->delay[iter->current_frame] - (iter->position - iter->elapsed); @@ -323,13 +275,13 @@ gdk_pixbuf_ani_anim_iter_on_currently_loading_frame (GdkPixbufAnimationIter *ani gint frame; iter = GDK_PIXBUF_ANI_ANIM_ITER (anim_iter); - + if (iter->current_frame >= iter->ani_anim->n_frames - 1) return TRUE; - + frame = iter->ani_anim->sequence[iter->current_frame + 1]; - if (!iter->ani_anim->pixbufs[frame]) + if (!iter->ani_anim->pixbufs[frame]) return TRUE; return FALSE; diff --git a/gdk-pixbuf/io-gdip-animation.c b/gdk-pixbuf/io-gdip-animation.c index 7281b6d11..ade614791 100644 --- a/gdk-pixbuf/io-gdip-animation.c +++ b/gdk-pixbuf/io-gdip-animation.c @@ -26,7 +26,6 @@ #include "io-gdip-native.h" #include "io-gdip-animation.h" -static void gdk_pixbuf_gdip_anim_class_init (GdkPixbufGdipAnimClass *klass); static void gdk_pixbuf_gdip_anim_finalize (GObject *object); static gboolean gdk_pixbuf_gdip_anim_is_static_image (GdkPixbufAnimation *animation); @@ -38,35 +37,12 @@ static void gdk_pixbuf_gdip_anim_get_size (GdkPixbufAnimation static GdkPixbufAnimationIter* gdk_pixbuf_gdip_anim_get_iter (GdkPixbufAnimation *anim, const GTimeVal *start_time); -static gpointer parent_class; -GType -gdk_pixbuf_gdip_anim_get_type (void) +G_DEFINE_TYPE (GdkPixbufGdipAnim, gdk_pixbuf_gdip_anim, GDK_TYPE_PIXBUF_ANIMATION); + +static void +gdk_pixbuf_gdip_anim_init (GdkPixbufGdipAnim *anim) { - static GType object_type = 0; - - if (!object_type) { - const GTypeInfo object_info = { - sizeof (GdkPixbufGdipAnimClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) gdk_pixbuf_gdip_anim_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GdkPixbufGdipAnim), - 0, /* n_preallocs */ - (GInstanceInitFunc) NULL, - }; - - object_type = g_type_from_name ("GdkPixbufGdipAnim"); - if (object_type == 0) { - object_type = g_type_register_static (GDK_TYPE_PIXBUF_ANIMATION, - g_intern_static_string ("GdkPixbufGdipAnim"), - &object_info, 0); - } - } - - return object_type; } static void @@ -74,9 +50,7 @@ gdk_pixbuf_gdip_anim_class_init (GdkPixbufGdipAnimClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GdkPixbufAnimationClass *anim_class = GDK_PIXBUF_ANIMATION_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - + object_class->finalize = gdk_pixbuf_gdip_anim_finalize; anim_class->is_static_image = gdk_pixbuf_gdip_anim_is_static_image; @@ -92,16 +66,16 @@ gdk_pixbuf_gdip_anim_finalize (GObject *object) GList *l; GdkPixbufFrame *frame; - + for (l = gdip_anim->frames; l; l = l->next) { frame = l->data; g_object_unref (frame->pixbuf); g_free (frame); } - + g_list_free (gdip_anim->frames); - - G_OBJECT_CLASS (parent_class)->finalize (object); + + G_OBJECT_CLASS (gdk_pixbuf_gdip_anim_parent_class)->finalize (object); } static gboolean @@ -125,7 +99,7 @@ gdk_pixbuf_gdip_anim_get_static_image (GdkPixbufAnimation *animation) if (gdip_anim->frames == NULL) return NULL; else - return GDK_PIXBUF (((GdkPixbufFrame*)gdip_anim->frames->data)->pixbuf); + return GDK_PIXBUF (((GdkPixbufFrame*)gdip_anim->frames->data)->pixbuf); } static void @@ -155,7 +129,7 @@ static void iter_restart (GdkPixbufGdipAnimIter *iter) { iter_clear (iter); - + iter->current_frame = iter->gdip_anim->frames; } @@ -170,17 +144,16 @@ gdk_pixbuf_gdip_anim_get_iter (GdkPixbufAnimation *anim, iter->gdip_anim = GDK_PIXBUF_GDIP_ANIM (anim); g_object_ref (iter->gdip_anim); - + iter_restart (iter); iter->start_time = *start_time; iter->current_time = *start_time; iter->first_loop_slowness = 0; - + return GDK_PIXBUF_ANIMATION_ITER (iter); } -static void gdk_pixbuf_gdip_anim_iter_class_init (GdkPixbufGdipAnimIterClass *klass); static void gdk_pixbuf_gdip_anim_iter_finalize (GObject *object); static int gdk_pixbuf_gdip_anim_iter_get_delay_time (GdkPixbufAnimationIter *iter); @@ -189,36 +162,7 @@ static gboolean gdk_pixbuf_gdip_anim_iter_on_currently_loading_frame (GdkPixbu static gboolean gdk_pixbuf_gdip_anim_iter_advance (GdkPixbufAnimationIter *iter, const GTimeVal *current_time); -static gpointer iter_parent_class; - -GType -gdk_pixbuf_gdip_anim_iter_get_type (void) -{ - static GType object_type = 0; - - if (!object_type) { - const GTypeInfo object_info = { - sizeof (GdkPixbufGdipAnimIterClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) gdk_pixbuf_gdip_anim_iter_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GdkPixbufGdipAnimIter), - 0, /* n_preallocs */ - (GInstanceInitFunc) NULL, - }; - - object_type = g_type_from_name ("GdkPixbufGdipAnimIter"); - if (object_type == 0) { - object_type = g_type_register_static (GDK_TYPE_PIXBUF_ANIMATION_ITER, - g_intern_static_string ("GdkPixbufGdipAnimIter"), - &object_info, 0); - } - } - - return object_type; -} +G_DEFINE_TYPE (GdkPixbufGdipAnimIter, gdk_pixbuf_gdip_anim_iter, GDK_TYPE_PIXBUF_ANIMATION_ITER); static void gdk_pixbuf_gdip_anim_iter_class_init (GdkPixbufGdipAnimIterClass *klass) @@ -226,9 +170,7 @@ gdk_pixbuf_gdip_anim_iter_class_init (GdkPixbufGdipAnimIterClass *klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); GdkPixbufAnimationIterClass *anim_iter_class = GDK_PIXBUF_ANIMATION_ITER_CLASS (klass); - - iter_parent_class = g_type_class_peek_parent (klass); - + object_class->finalize = gdk_pixbuf_gdip_anim_iter_finalize; anim_iter_class->get_delay_time = gdk_pixbuf_gdip_anim_iter_get_delay_time; @@ -245,8 +187,8 @@ gdk_pixbuf_gdip_anim_iter_finalize (GObject *object) iter_clear (iter); g_object_unref (iter->gdip_anim); - - G_OBJECT_CLASS (iter_parent_class)->finalize (object); + + G_OBJECT_CLASS (gdk_pixbuf_gdip_anim_iter_parent_class)->finalize (object); } static gboolean @@ -258,9 +200,9 @@ gdk_pixbuf_gdip_anim_iter_advance (GdkPixbufAnimationIter *anim_iter, gint loop; GList *tmp; GList *old; - + iter = GDK_PIXBUF_GDIP_ANIM_ITER (anim_iter); - + iter->current_time = *current_time; /* We use milliseconds for all times */ @@ -277,7 +219,7 @@ gdk_pixbuf_gdip_anim_iter_advance (GdkPixbufAnimationIter *anim_iter, } g_assert (iter->gdip_anim->total_time > 0); - + /* See how many times we've already played the full animation, * and subtract time for that. */ @@ -301,22 +243,22 @@ gdk_pixbuf_gdip_anim_iter_advance (GdkPixbufAnimationIter *anim_iter, iter->position = elapsed; /* Now move to the proper frame */ - if (iter->gdip_anim->loop == 0 || loop < iter->gdip_anim->loop) + if (iter->gdip_anim->loop == 0 || loop < iter->gdip_anim->loop) tmp = iter->gdip_anim->frames; - else + else tmp = NULL; while (tmp != NULL) { GdkPixbufFrame *frame = tmp->data; - + if (iter->position >= frame->elapsed && iter->position < (frame->elapsed + frame->delay_time)) break; - + tmp = tmp->next; } old = iter->current_frame; - + iter->current_frame = tmp; return iter->current_frame != old; @@ -327,7 +269,7 @@ gdk_pixbuf_gdip_anim_iter_get_delay_time (GdkPixbufAnimationIter *anim_iter) { GdkPixbufFrame *frame; GdkPixbufGdipAnimIter *iter; - + iter = GDK_PIXBUF_GDIP_ANIM_ITER (anim_iter); if (iter->current_frame) { @@ -340,9 +282,9 @@ gdk_pixbuf_gdip_anim_iter_get_delay_time (GdkPixbufAnimationIter *anim_iter) frame->delay_time, frame->delay_time - (iter->position - frame->elapsed)); #endif - + return frame->delay_time - (iter->position - frame->elapsed); - } else + } else return -1; /* show last frame forever */ } @@ -351,7 +293,7 @@ gdk_pixbuf_gdip_anim_iter_get_pixbuf (GdkPixbufAnimationIter *anim_iter) { GdkPixbufGdipAnimIter *iter; GdkPixbufFrame *frame; - + iter = GDK_PIXBUF_GDIP_ANIM_ITER (anim_iter); frame = iter->current_frame ? iter->current_frame->data : g_list_last (iter->gdip_anim->frames)->data; @@ -365,7 +307,7 @@ gdk_pixbuf_gdip_anim_iter_get_pixbuf (GdkPixbufAnimationIter *anim_iter) gdk_pixbuf_get_width (frame->pixbuf), gdk_pixbuf_get_height (frame->pixbuf)); #endif - + if (frame == NULL) return NULL; @@ -376,8 +318,8 @@ static gboolean gdk_pixbuf_gdip_anim_iter_on_currently_loading_frame (GdkPixbufAnimationIter *anim_iter) { GdkPixbufGdipAnimIter *iter; - + iter = GDK_PIXBUF_GDIP_ANIM_ITER (anim_iter); - return iter->current_frame == NULL || iter->current_frame->next == NULL; + return iter->current_frame == NULL || iter->current_frame->next == NULL; } diff --git a/gdk-pixbuf/io-gif-animation.c b/gdk-pixbuf/io-gif-animation.c index e36f2345f..17e0aa854 100644 --- a/gdk-pixbuf/io-gif-animation.c +++ b/gdk-pixbuf/io-gif-animation.c @@ -28,7 +28,6 @@ #include "gdk-pixbuf-private.h" #include "io-gif-animation.h" -static void gdk_pixbuf_gif_anim_class_init (GdkPixbufGifAnimClass *klass); static void gdk_pixbuf_gif_anim_finalize (GObject *object); static gboolean gdk_pixbuf_gif_anim_is_static_image (GdkPixbufAnimation *animation); @@ -43,32 +42,11 @@ static GdkPixbufAnimationIter* gdk_pixbuf_gif_anim_get_iter (GdkPixbufAnimation -static gpointer parent_class; +G_DEFINE_TYPE (GdkPixbufGifAnim, gdk_pixbuf_gif_anim, GDK_TYPE_PIXBUF_ANIMATION); -GType -gdk_pixbuf_gif_anim_get_type (void) +static void +gdk_pixbuf_gif_anim_init (GdkPixbufGifAnim *anim) { - static GType object_type = 0; - - if (!object_type) { - const GTypeInfo object_info = { - sizeof (GdkPixbufGifAnimClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) gdk_pixbuf_gif_anim_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GdkPixbufGifAnim), - 0, /* n_preallocs */ - (GInstanceInitFunc) NULL, - }; - - object_type = g_type_register_static (GDK_TYPE_PIXBUF_ANIMATION, - g_intern_static_string ("GdkPixbufGifAnim"), - &object_info, 0); - } - - return object_type; } static void @@ -76,9 +54,7 @@ gdk_pixbuf_gif_anim_class_init (GdkPixbufGifAnimClass *klass) { GObjectClass *object_class = G_OBJECT_CLASS (klass); GdkPixbufAnimationClass *anim_class = GDK_PIXBUF_ANIMATION_CLASS (klass); - - parent_class = g_type_class_peek_parent (klass); - + object_class->finalize = gdk_pixbuf_gif_anim_finalize; anim_class->is_static_image = gdk_pixbuf_gif_anim_is_static_image; @@ -94,7 +70,7 @@ gdk_pixbuf_gif_anim_finalize (GObject *object) GList *l; GdkPixbufFrame *frame; - + for (l = gif_anim->frames; l; l = l->next) { frame = l->data; g_object_unref (frame->pixbuf); @@ -104,10 +80,10 @@ gdk_pixbuf_gif_anim_finalize (GObject *object) g_object_unref (frame->revert); g_free (frame); } - + g_list_free (gif_anim->frames); - - G_OBJECT_CLASS (parent_class)->finalize (object); + + G_OBJECT_CLASS (gdk_pixbuf_gif_anim_parent_class)->finalize (object); } static gboolean @@ -131,7 +107,7 @@ gdk_pixbuf_gif_anim_get_static_image (GdkPixbufAnimation *animation) if (gif_anim->frames == NULL) return NULL; else - return GDK_PIXBUF (((GdkPixbufFrame*)gif_anim->frames->data)->pixbuf); + return GDK_PIXBUF (((GdkPixbufFrame*)gif_anim->frames->data)->pixbuf); } static void @@ -161,7 +137,7 @@ static void iter_restart (GdkPixbufGifAnimIter *iter) { iter_clear (iter); - + iter->current_frame = iter->gif_anim->frames; } @@ -176,19 +152,18 @@ gdk_pixbuf_gif_anim_get_iter (GdkPixbufAnimation *anim, iter->gif_anim = GDK_PIXBUF_GIF_ANIM (anim); g_object_ref (iter->gif_anim); - + iter_restart (iter); iter->start_time = *start_time; iter->current_time = *start_time; iter->first_loop_slowness = 0; - + return GDK_PIXBUF_ANIMATION_ITER (iter); } -static void gdk_pixbuf_gif_anim_iter_class_init (GdkPixbufGifAnimIterClass *klass); static void gdk_pixbuf_gif_anim_iter_finalize (GObject *object); static int gdk_pixbuf_gif_anim_iter_get_delay_time (GdkPixbufAnimationIter *iter); @@ -199,32 +174,11 @@ static gboolean gdk_pixbuf_gif_anim_iter_advance (GdkPixbuf -static gpointer iter_parent_class; +G_DEFINE_TYPE (GdkPixbufGifAnimIter, gdk_pixbuf_gif_anim_iter, GDK_TYPE_PIXBUF_ANIMATION_ITER); -GType -gdk_pixbuf_gif_anim_iter_get_type (void) +static void +gdk_pixbuf_gif_anim_iter_init (GdkPixbufGifAnimIter *iter) { - static GType object_type = 0; - - if (!object_type) { - const GTypeInfo object_info = { - sizeof (GdkPixbufGifAnimIterClass), - (GBaseInitFunc) NULL, - (GBaseFinalizeFunc) NULL, - (GClassInitFunc) gdk_pixbuf_gif_anim_iter_class_init, - NULL, /* class_finalize */ - NULL, /* class_data */ - sizeof (GdkPixbufGifAnimIter), - 0, /* n_preallocs */ - (GInstanceInitFunc) NULL, - }; - - object_type = g_type_register_static (GDK_TYPE_PIXBUF_ANIMATION_ITER, - g_intern_static_string ("GdkPixbufGifAnimIter"), - &object_info, 0); - } - - return object_type; } static void @@ -233,9 +187,7 @@ gdk_pixbuf_gif_anim_iter_class_init (GdkPixbufGifAnimIterClass *klass) GObjectClass *object_class = G_OBJECT_CLASS (klass); GdkPixbufAnimationIterClass *anim_iter_class = GDK_PIXBUF_ANIMATION_ITER_CLASS (klass); - - iter_parent_class = g_type_class_peek_parent (klass); - + object_class->finalize = gdk_pixbuf_gif_anim_iter_finalize; anim_iter_class->get_delay_time = gdk_pixbuf_gif_anim_iter_get_delay_time; @@ -252,8 +204,8 @@ gdk_pixbuf_gif_anim_iter_finalize (GObject *object) iter_clear (iter); g_object_unref (iter->gif_anim); - - G_OBJECT_CLASS (iter_parent_class)->finalize (object); + + G_OBJECT_CLASS (gdk_pixbuf_gif_anim_iter_parent_class)->finalize (object); } static gboolean @@ -265,9 +217,9 @@ gdk_pixbuf_gif_anim_iter_advance (GdkPixbufAnimationIter *anim_iter, gint loop; GList *tmp; GList *old; - + iter = GDK_PIXBUF_GIF_ANIM_ITER (anim_iter); - + iter->current_time = *current_time; /* We use milliseconds for all times */ @@ -284,7 +236,7 @@ gdk_pixbuf_gif_anim_iter_advance (GdkPixbufAnimationIter *anim_iter, } g_assert (iter->gif_anim->total_time > 0); - + /* See how many times we've already played the full animation, * and subtract time for that. */ @@ -308,22 +260,22 @@ gdk_pixbuf_gif_anim_iter_advance (GdkPixbufAnimationIter *anim_iter, iter->position = elapsed; /* Now move to the proper frame */ - if (iter->gif_anim->loop == 0 || loop < iter->gif_anim->loop) + if (iter->gif_anim->loop == 0 || loop < iter->gif_anim->loop) tmp = iter->gif_anim->frames; - else + else tmp = NULL; while (tmp != NULL) { GdkPixbufFrame *frame = tmp->data; - + if (iter->position >= frame->elapsed && iter->position < (frame->elapsed + frame->delay_time)) break; - + tmp = tmp->next; } old = iter->current_frame; - + iter->current_frame = tmp; return iter->current_frame != old; @@ -334,7 +286,7 @@ gdk_pixbuf_gif_anim_iter_get_delay_time (GdkPixbufAnimationIter *anim_iter) { GdkPixbufFrame *frame; GdkPixbufGifAnimIter *iter; - + iter = GDK_PIXBUF_GIF_ANIM_ITER (anim_iter); if (iter->current_frame) { @@ -347,21 +299,21 @@ gdk_pixbuf_gif_anim_iter_get_delay_time (GdkPixbufAnimationIter *anim_iter) frame->delay_time, frame->delay_time - (iter->position - frame->elapsed)); #endif - + return frame->delay_time - (iter->position - frame->elapsed); - } else + } else return -1; /* show last frame forever */ } void gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, GdkPixbufFrame *frame) -{ +{ GList *link; GList *tmp; - + link = g_list_find (gif_anim->frames, frame); - + if (frame->need_recomposite || frame->composited == NULL) { /* For now, to composite we start with the last * composited frame and composite everything up to @@ -372,7 +324,7 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, tmp = link; while (tmp != NULL) { GdkPixbufFrame *f = tmp->data; - + if (f->need_recomposite) { if (f->composited) { g_object_unref (f->composited); @@ -382,14 +334,14 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, if (f->composited != NULL) break; - + tmp = tmp->prev; } /* Go forward, compositing all frames up to the current frame */ if (tmp == NULL) tmp = gif_anim->frames; - + while (tmp != NULL) { GdkPixbufFrame *f = tmp->data; gint clipped_width, clipped_height; @@ -399,14 +351,14 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, clipped_width = MIN (gif_anim->width - f->x_offset, gdk_pixbuf_get_width (f->pixbuf)); clipped_height = MIN (gif_anim->height - f->y_offset, gdk_pixbuf_get_height (f->pixbuf)); - + if (f->need_recomposite) { if (f->composited) { g_object_unref (f->composited); f->composited = NULL; } } - + if (f->composited != NULL) goto next; @@ -424,7 +376,7 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, return; /* alpha gets dumped if f->composited has no alpha */ - + gdk_pixbuf_fill (f->composited, (gif_anim->bg_red << 24) | (gif_anim->bg_green << 16) | @@ -441,7 +393,7 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, 1.0, 1.0, GDK_INTERP_BILINEAR, 255); - + if (f->action == GDK_PIXBUF_FRAME_REVERT) g_warning ("First frame of GIF has bad dispose mode, GIF loader should not have loaded this image"); @@ -450,7 +402,7 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, GdkPixbufFrame *prev_frame; gint prev_clipped_width; gint prev_clipped_height; - + prev_frame = tmp->prev->data; prev_clipped_width = MIN (gif_anim->width - prev_frame->x_offset, gdk_pixbuf_get_width (prev_frame->pixbuf)); @@ -459,13 +411,13 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, /* Init f->composited with what we should have after the previous * frame */ - + if (prev_frame->action == GDK_PIXBUF_FRAME_RETAIN) { f->composited = gdk_pixbuf_copy (prev_frame->composited); if (f->composited == NULL) return; - + } else if (prev_frame->action == GDK_PIXBUF_FRAME_DISPOSE) { f->composited = gdk_pixbuf_copy (prev_frame->composited); @@ -484,14 +436,14 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, if (area == NULL) return; - + gdk_pixbuf_fill (area, (gif_anim->bg_red << 24) | (gif_anim->bg_green << 16) | (gif_anim->bg_blue << 8)); - + g_object_unref (area); - } + } } else if (prev_frame->action == GDK_PIXBUF_FRAME_REVERT) { f->composited = gdk_pixbuf_copy (prev_frame->composited); @@ -518,16 +470,16 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, if (clipped_width > 0 && clipped_height > 0) { /* We need to save the contents before compositing */ GdkPixbuf *area; - + area = gdk_pixbuf_new_subpixbuf (f->composited, f->x_offset, f->y_offset, clipped_width, clipped_height); - + if (area == NULL) return; - + f->revert = gdk_pixbuf_copy (area); g_object_unref (area); @@ -551,14 +503,14 @@ gdk_pixbuf_gif_anim_frame_composite (GdkPixbufGifAnim *gif_anim, GDK_INTERP_NEAREST, 255); } - + f->need_recomposite = FALSE; } - + next: if (tmp == link) break; - + tmp = tmp->next; } } @@ -569,7 +521,7 @@ gdk_pixbuf_gif_anim_iter_get_pixbuf (GdkPixbufAnimationIter *anim_iter) { GdkPixbufGifAnimIter *iter; GdkPixbufFrame *frame; - + iter = GDK_PIXBUF_GIF_ANIM_ITER (anim_iter); frame = iter->current_frame ? iter->current_frame->data : g_list_last (iter->gif_anim->frames)->data; @@ -583,12 +535,12 @@ gdk_pixbuf_gif_anim_iter_get_pixbuf (GdkPixbufAnimationIter *anim_iter) gdk_pixbuf_get_width (frame->pixbuf), gdk_pixbuf_get_height (frame->pixbuf)); #endif - + if (frame == NULL) return NULL; gdk_pixbuf_gif_anim_frame_composite (iter->gif_anim, frame); - + return frame->composited; } @@ -596,8 +548,8 @@ static gboolean gdk_pixbuf_gif_anim_iter_on_currently_loading_frame (GdkPixbufAnimationIter *anim_iter) { GdkPixbufGifAnimIter *iter; - + iter = GDK_PIXBUF_GIF_ANIM_ITER (anim_iter); - return iter->current_frame == NULL || iter->current_frame->next == NULL; + return iter->current_frame == NULL || iter->current_frame->next == NULL; } |