aboutsummaryrefslogtreecommitdiffstats
path: root/widgets/misc
diff options
context:
space:
mode:
authorSrinivasa Ragavan <sragavan@src.gnome.org>2006-04-22 03:43:24 +0800
committerSrinivasa Ragavan <sragavan@src.gnome.org>2006-04-22 03:43:24 +0800
commit940383d6760233b3c265abcfbc843ed6e036e845 (patch)
tree5a4876976788dc55cf169b4f980abd00a4ec5623 /widgets/misc
parent4900743e0d9b494e26e9c18df1ec4dbcb39b67ac (diff)
downloadgsoc2013-evolution-940383d6760233b3c265abcfbc843ed6e036e845.tar.gz
gsoc2013-evolution-940383d6760233b3c265abcfbc843ed6e036e845.tar.zst
gsoc2013-evolution-940383d6760233b3c265abcfbc843ed6e036e845.zip
Added code to create image attachment's icon in non-gui thread.
svn path=/trunk/; revision=31859
Diffstat (limited to 'widgets/misc')
-rw-r--r--widgets/misc/ChangeLog6
-rw-r--r--widgets/misc/e-attachment-bar.c60
2 files changed, 66 insertions, 0 deletions
diff --git a/widgets/misc/ChangeLog b/widgets/misc/ChangeLog
index 0199f9cad3..3e64e1bbe1 100644
--- a/widgets/misc/ChangeLog
+++ b/widgets/misc/ChangeLog
@@ -1,3 +1,9 @@
+2006-04-22 Srinivasa Ragavan <sragavan@novell.com>
+
+
+ * e-attachment-bar.c: (e_attachment_bar_create_attachment_cache):
+ Added a new function that creates a attachment with a image cache.
+
2006-03-28 Li Yuan <li.yuan@sun.com>
**Fixes bug #335618
diff --git a/widgets/misc/e-attachment-bar.c b/widgets/misc/e-attachment-bar.c
index 7bf8de6844..c6bf9972f3 100644
--- a/widgets/misc/e-attachment-bar.c
+++ b/widgets/misc/e-attachment-bar.c
@@ -233,6 +233,66 @@ calculate_height_width(EAttachmentBar *bar, int *new_width, int *new_height)
return;
}
+void
+e_attachment_bar_create_attachment_cache (EAttachment *attachment)
+{
+
+ CamelContentType *content_type;
+
+ content_type = camel_mime_part_get_content_type (attachment->body);
+
+ if (camel_content_type_is(content_type, "image", "*")) {
+ CamelDataWrapper *wrapper;
+ CamelStreamMem *mstream;
+ GdkPixbufLoader *loader;
+ gboolean error = TRUE;
+ GdkPixbuf *pixbuf;
+
+ wrapper = camel_medium_get_content_object (CAMEL_MEDIUM (attachment->body));
+ mstream = (CamelStreamMem *) camel_stream_mem_new ();
+
+ camel_data_wrapper_decode_to_stream (wrapper, (CamelStream *) mstream);
+
+ /* Stream image into pixbuf loader */
+ loader = gdk_pixbuf_loader_new ();
+ error = !gdk_pixbuf_loader_write (loader, mstream->buffer->data, mstream->buffer->len, NULL);
+ gdk_pixbuf_loader_close (loader, NULL);
+
+ if (!error) {
+ int ratio, width, height;
+
+ /* Shrink pixbuf */
+ pixbuf = gdk_pixbuf_loader_get_pixbuf (loader);
+ width = gdk_pixbuf_get_width (pixbuf);
+ height = gdk_pixbuf_get_height (pixbuf);
+ if (width >= height) {
+ if (width > 48) {
+ ratio = width / 48;
+ width = 48;
+ height = height / ratio;
+ }
+ } else {
+ if (height > 48) {
+ ratio = height / 48;
+ height = 48;
+ width = width / ratio;
+ }
+ }
+
+ attachment->pixbuf_cache = gdk_pixbuf_scale_simple (pixbuf, width,height,GDK_INTERP_BILINEAR);
+ pixbuf = attachment->pixbuf_cache;
+ g_object_ref(pixbuf);
+ } else {
+ attachment->pixbuf_cache = NULL;
+ g_warning ("GdkPixbufLoader Error");
+ }
+
+ /* Destroy everything */
+ g_object_unref (loader);
+ camel_object_unref (mstream);
+ }
+}
+
static void
update (EAttachmentBar *bar)
{