| 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 g_object_unref(G_OBJECT(im_image->pixbuf)); |
3213 if (gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL)) { |
| 3214 gdk_pixbuf_animation_iter_advance(GTK_IMHTML_ANIMATION(im_image)->iter, NULL); |
3214 GdkPixbuf *pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); |
| 3215 im_image->pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); |
3215 g_object_unref(G_OBJECT(im_image->pixbuf)); |
| 3216 g_object_ref(G_OBJECT(im_image->pixbuf)); |
3216 im_image->pixbuf = gdk_pixbuf_copy(pb); |
| 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 } |
| 3231 } |
3232 } |
| 3232 |
3233 |
| 3233 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); |
3234 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); |
| 3234 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); |
3235 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); |
| 3235 |
3236 |
| 3246 |
3247 |
| 3247 GTK_IMHTML_ANIMATION(im_image)->anim = anim; |
3248 GTK_IMHTML_ANIMATION(im_image)->anim = anim; |
| 3248 if (gdk_pixbuf_animation_is_static_image(anim)) { |
3249 if (gdk_pixbuf_animation_is_static_image(anim)) { |
| 3249 GTK_IMHTML_ANIMATION(im_image)->iter = NULL; |
3250 GTK_IMHTML_ANIMATION(im_image)->iter = NULL; |
| 3250 im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim); |
3251 im_image->pixbuf = gdk_pixbuf_animation_get_static_image(anim); |
| |
3252 g_object_ref(im_image->pixbuf); |
| 3251 GTK_IMHTML_ANIMATION(im_image)->timer = 0; |
3253 GTK_IMHTML_ANIMATION(im_image)->timer = 0; |
| 3252 } else { |
3254 } else { |
| 3253 int delay; |
3255 int delay; |
| |
3256 GdkPixbuf *pb; |
| 3254 GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL); |
3257 GTK_IMHTML_ANIMATION(im_image)->iter = gdk_pixbuf_animation_get_iter(anim, NULL); |
| 3255 im_image->pixbuf = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); |
3258 pb = gdk_pixbuf_animation_iter_get_pixbuf(GTK_IMHTML_ANIMATION(im_image)->iter); |
| |
3259 im_image->pixbuf = gdk_pixbuf_copy(pb); |
| 3256 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); |
3260 delay = MIN(gdk_pixbuf_animation_iter_get_delay_time(GTK_IMHTML_ANIMATION(im_image)->iter), 100); |
| 3257 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); |
3261 GTK_IMHTML_ANIMATION(im_image)->timer = g_timeout_add(delay, animate_image_cb, im_image); |
| 3258 } |
3262 } |
| 3259 im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf)); |
3263 im_image->image = GTK_IMAGE(gtk_image_new_from_pixbuf(im_image->pixbuf)); |
| 3260 im_image->width = gdk_pixbuf_animation_get_width(anim); |
3264 im_image->width = gdk_pixbuf_animation_get_width(anim); |
| 3263 im_image->filename = g_strdup(filename); |
3267 im_image->filename = g_strdup(filename); |
| 3264 im_image->id = id; |
3268 im_image->id = id; |
| 3265 im_image->filesel = NULL; |
3269 im_image->filesel = NULL; |
| 3266 |
3270 |
| 3267 g_object_ref(anim); |
3271 g_object_ref(anim); |
| 3268 g_object_ref(im_image->pixbuf); |
|
| 3269 |
3272 |
| 3270 return GTK_IMHTML_SCALABLE(im_image); |
3273 return GTK_IMHTML_SCALABLE(im_image); |
| 3271 } |
3274 } |
| 3272 |
3275 |
| 3273 void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height) |
3276 void gtk_imhtml_image_scale(GtkIMHtmlScalable *scale, int width, int height) |
| 4603 } else { |
4606 } else { |
| 4604 icon = gtk_image_new_from_animation(annipixbuf); |
4607 icon = gtk_image_new_from_animation(annipixbuf); |
| 4605 if (imhtml->num_animations == 20) { |
4608 if (imhtml->num_animations == 20) { |
| 4606 GtkImage *image = GTK_IMAGE(g_queue_pop_head(imhtml->animations)); |
4609 GtkImage *image = GTK_IMAGE(g_queue_pop_head(imhtml->animations)); |
| 4607 GdkPixbufAnimation *anim = gtk_image_get_animation(image); |
4610 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); |
| 4608 if (anim) { |
4613 if (anim) { |
| 4609 GdkPixbuf *pb = gdk_pixbuf_animation_get_static_image(anim); |
4614 GdkPixbuf *pb = gdk_pixbuf_animation_get_static_image(anim); |
| 4610 gtk_image_set_from_pixbuf(image, pb); |
4615 if (pb != NULL) { |
| 4611 g_object_unref(G_OBJECT(pb)); |
4616 GdkPixbuf *copy = gdk_pixbuf_copy(pb); |
| |
4617 gtk_image_set_from_pixbuf(image, copy); |
| |
4618 g_object_unref(G_OBJECT(copy)); |
| |
4619 } |
| 4612 } |
4620 } |
| 4613 } else { |
4621 } else { |
| 4614 imhtml->num_animations++; |
4622 imhtml->num_animations++; |
| 4615 } |
4623 } |
| 4616 g_signal_connect(G_OBJECT(icon), "destroy", G_CALLBACK(animated_smiley_destroy_cb), imhtml); |
4624 g_signal_connect(G_OBJECT(icon), "destroy", G_CALLBACK(animated_smiley_destroy_cb), imhtml); |