#include <gdk-pixbuf/gdk-pixbuf.h> #include <gdk-pixbuf/gdk-pixbuf-loader.h> GdkPixbufAnimation *anim = NULL; GdkPixbuf *unanim = NULL; static gboolean redraw_anim(gpointer data) GdkPixmap *pm; GdkBitmap *bm; frames = gdk_pixbuf_animation_get_frames(anim); frame = g_list_nth_data(frames, curframe); switch (gdk_pixbuf_frame_get_action(frame)) { case GDK_PIXBUF_FRAME_RETAIN: buf = gdk_pixbuf_frame_get_pixbuf(frame); gdk_pixbuf_render_pixmap_and_mask(buf, &src, NULL, 0); gtk_pixmap_get(GTK_PIXMAP(pix), &pm, &bm); gdk_draw_pixmap(pm, gc, src, 0, 0, gdk_pixbuf_frame_get_x_offset(frame), gdk_pixbuf_frame_get_y_offset(frame), gtk_pixmap_set(GTK_PIXMAP(pix), pm, bm); gtk_widget_queue_draw(pix); case GDK_PIXBUF_FRAME_DISPOSE: buf = gdk_pixbuf_frame_get_pixbuf(frame); gdk_pixbuf_render_pixmap_and_mask(buf, &pm, &bm, 0); gtk_pixmap_set(GTK_PIXMAP(pix), pm, bm); case GDK_PIXBUF_FRAME_REVERT: buf = gdk_pixbuf_frame_get_pixbuf(frame); gdk_pixbuf_render_pixmap_and_mask(buf, &pm, &bm, 0); gtk_pixmap_set(GTK_PIXMAP(pix), pm, bm); curframe = (curframe + 1) % g_list_length(frames); delay = MAX(gdk_pixbuf_frame_get_delay_time(frame), 13); timer = gtk_timeout_add(delay * 10, redraw_anim, NULL); void des_evt(GtkObject *o, gpointer d) gdk_pixbuf_animation_unref(anim); gdk_pixbuf_unref(unanim); gtk_timeout_remove(timer); int main(int argc, char **argv) f = fopen("picture.id", "r"); length = fread(data, 1, 8192, f); load = gdk_pixbuf_loader_new(); gdk_pixbuf_loader_write(load, data, length); anim = gdk_pixbuf_loader_get_animation(load); frames = gdk_pixbuf_animation_get_frames(anim); buf = gdk_pixbuf_frame_get_pixbuf(frames->data); gdk_pixbuf_render_pixmap_and_mask(buf, &pm, &bm, 0); if (gdk_pixbuf_animation_get_num_frames(anim) > 1) { int delay = MAX(gdk_pixbuf_frame_get_delay_time(frames->data), 13); timer = gtk_timeout_add(delay * 10, redraw_anim, NULL); unanim = gdk_pixbuf_loader_get_pixbuf(load); gdk_pixbuf_loader_close(load); gdk_pixbuf_render_pixmap_and_mask(unanim, &pm, &bm, 0); win = gtk_window_new(GTK_WINDOW_TOPLEVEL); gtk_window_set_policy(GTK_WINDOW(win), TRUE, TRUE, TRUE); gtk_signal_connect(GTK_OBJECT(win), "destroy", GTK_SIGNAL_FUNC(des_evt), NULL); vbox = gtk_hbox_new(FALSE, 0); gtk_container_add(GTK_CONTAINER(win), vbox); hbox = gtk_hbox_new(FALSE, 0); gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0); pix = gtk_pixmap_new(pm, bm); gtk_box_pack_start(GTK_BOX(hbox), pix, FALSE, FALSE, 0); if (anim && (gdk_pixbuf_animation_get_num_frames(anim) > 1)) gtk_widget_set_usize(pix, gdk_pixbuf_animation_get_width(anim), gdk_pixbuf_animation_get_height(anim)); gdk_pixbuf_loader_close(load);