summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMatthias Clasen <mclasen@redhat.com>2011-12-16 13:47:36 -0500
committerMatthias Clasen <mclasen@redhat.com>2011-12-16 13:47:36 -0500
commitd11ca485bf2799f02bdd5516280eeb6db29187b3 (patch)
tree89a62bfcbc3673e2172409bafb101c22bcb6b153
parentee81d3fc611a0e64dc55c4f2a2fda73932de2fe6 (diff)
downloadgdk-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.c100
-rw-r--r--gdk-pixbuf/io-gdip-animation.c122
-rw-r--r--gdk-pixbuf/io-gif-animation.c160
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;
}