| 3208 int delay; |
3208 int delay; |
| 3209 |
3209 |
| 3210 im_image = data; |
3210 im_image = data; |
| 3211 |
3211 |
| 3212 /* Update the pointer to this GdkPixbuf frame of the animation */ |
3212 /* Update the pointer to this GdkPixbuf frame of the animation */ |
| 3213 if (gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL)) { |
3213 g_object_unref(G_OBJECT(im_image->pixbuf)); |
| 3214 GdkPixbuf *pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); |
3214 gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL); |
| 3215 g_object_unref(G_OBJECT(im_image->pixbuf)); |
3215 im_image->pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); |
| 3216 im_image->pixbuf = gdk_pixbuf_copy(pb); |
3216 g_object_ref(G_OBJECT(im_image->pixbuf)); |
| 3217 |
3217 |
| 3218 /* Update the displayed GtkImage */ |
3218 /* Update the displayed GtkImage */ |
| 3219 width = gdk_pixbuf_get_width(gtk_image_get_pixbuf(im_image->image)); |
3219 width = gdk_pixbuf_get_width(gtk_image_get_pixbuf(im_image->image)); |
| 3220 height = gdk_pixbuf_get_height(gtk_image_get_pixbuf(im_image->image)); |
3220 height = gdk_pixbuf_get_height(gtk_image_get_pixbuf(im_image->image)); |
| 3221 if (width > 0 && height > 0) |
3221 if (width > 0 && height > 0) |
| 3222 { |
3222 { |
| 3223 /* Need to scale the new frame to the same size as the old frame */ |
3223 /* Need to scale the new frame to the same size as the old frame */ |
| 3224 GdkPixbuf *tmp; |
3224 GdkPixbuf *tmp; |
| 3225 tmp = gdk_pixbuf_scale_simple(im_image->pixbuf, width, height, GDK_INTERP_BILINEAR); |
3225 tmp = gdk_pixbuf_scale_simple(im_image->pixbuf, width, height, GDK_INTERP_BILINEAR); |
| 3226 gtk_image_set_from_pixbuf(im_image->image, tmp); |
3226 gtk_image_set_from_pixbuf(im_image->image, tmp); |
| 3227 g_object_unref(G_OBJECT(tmp)); |
3227 g_object_unref(G_OBJECT(tmp)); |
| 3228 } else { |
3228 } else { |
| 3229 /* Display at full-size */ |
3229 /* Display at full-size */ |
| 3230 gtk_image_set_from_pixbuf(im_image->image, im_image->pixbuf); |
3230 gtk_image_set_from_pixbuf(im_image->image, im_image->pixbuf); |
| 3231 } |
|
| 3232 } |
3231 } |
| 3233 |
3232 |
| 3234 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); |
3233 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); |
| 3235 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); |
3234 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); |
| 3236 |
3235 |
| 3247 |
3246 |
| 3248 GTK_IMHTML_ANIMATION(im_image)->anim = anim; |
3247 GTK_IMHTML_ANIMATION(im_image)->anim = anim; |
| 3249 if (gdk_pixbuf_animation_is_static_image(anim)) { |
3248 if (gdk_pixbuf_animation_is_static_image(anim)) { |
| 3250 GTK_IMHTML_ANIMATION(im_image)->iter = NULL; |
3249 GTK_IMHTML_ANIMATION(im_image)->iter = NULL; |
| 3251 im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim); |
3250 im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim); |
| 3252 g_object_ref(im_image->pixbuf); |
|
| 3253 GTK_IMHTML_ANIMATION(im_image)->timer = 0; |
3251 GTK_IMHTML_ANIMATION(im_image)->timer = 0; |
| 3254 } else { |
3252 } else { |
| 3255 int delay; |
3253 int delay; |
| 3256 GdkPixbuf *pb; |
|
| 3257 GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL); |
3254 GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL); |
| 3258 pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); |
3255 im_image->pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); |
| 3259 im_image->pixbuf = gdk_pixbuf_copy(pb); |
|
| 3260 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); |
3256 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); |
| 3261 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); |
3257 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); |
| 3262 } |
3258 } |
| 3263 im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf)); |
3259 im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf)); |
| 3264 im_image->width = gdk_pixbuf_animation_get_width(anim); |
3260 im_image->width = gdk_pixbuf_animation_get_width(anim); |
| 3267 im_image->filename = g_strdup(filename); |
3263 im_image->filename = g_strdup(filename); |
| 3268 im_image->id = id; |
3264 im_image->id = id; |
| 3269 im_image->filesel = NULL; |
3265 im_image->filesel = NULL; |
| 3270 |
3266 |
| 3271 g_object_ref(anim); |
3267 g_object_ref(anim); |
| |
3268 g_object_ref(im_image->pixbuf); |
| 3272 |
3269 |
| 3273 return GTK_IMHTML_SCALABLE(im_image); |
3270 return GTK_IMHTML_SCALABLE(im_image); |
| 3274 } |
3271 } |
| 3275 |
3272 |
| 3276 void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height) |
3273 void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height) |
| 4606 } else { |
4603 } else { |
| 4607 icon = gtk_image_new_from_animation(annipixbuf); |
4604 icon = gtk_image_new_from_animation(annipixbuf); |
| 4608 if (imhtml->num_animations == 20) { |
4605 if (imhtml->num_animations == 20) { |
| 4609 GtkImage *image = GTK_IMAGE(g_queue_pop_head(imhtml->animations)); |
4606 GtkImage *image = GTK_IMAGE(g_queue_pop_head(imhtml->animations)); |
| 4610 GdkPixbufAnimation *anim = gtk_image_get_animation(image); |
4607 GdkPixbufAnimation *anim = gtk_image_get_animation(image); |
| 4611 g_signal_handlers_disconnect_matched(G_OBJECT(image), G_SIGNAL_MATCH_FUNC, |
|
| 4612 0, 0, NULL, G_CALLBACK(animated_smiley_destroy_cb), NULL); |
|
| 4613 if (anim) { |
4608 if (anim) { |
| 4614 GdkPixbuf *pb = gdk_pixbuf_animation_get_static_image(anim); |
4609 GdkPixbuf *pb = gdk_pixbuf_animation_get_static_image(anim); |
| 4615 if (pb != NULL) { |
4610 gtk_image_set_from_pixbuf(image, pb); |
| 4616 GdkPixbuf *copy = gdk_pixbuf_copy(pb); |
4611 g_object_unref(G_OBJECT(pb)); |
| 4617 gtk_image_set_from_pixbuf(image, copy); |
|
| 4618 g_object_unref(G_OBJECT(copy)); |
|
| 4619 } |
|
| 4620 } |
4612 } |
| 4621 } else { |
4613 } else { |
| 4622 imhtml->num_animations++; |
4614 imhtml->num_animations++; |
| 4623 } |
4615 } |
| 4624 g_signal_connect(G_OBJECT(icon), "destroy", G_CALLBACK(animated_smiley_destroy_cb), imhtml); |
4616 g_signal_connect(G_OBJECT(icon), "destroy", G_CALLBACK(animated_smiley_destroy_cb), imhtml); |