diff options
author | Srinivasa Ragavan <sragavan@src.gnome.org> | 2006-04-22 03:43:24 +0800 |
---|---|---|
committer | Srinivasa Ragavan <sragavan@src.gnome.org> | 2006-04-22 03:43:24 +0800 |
commit | 940383d6760233b3c265abcfbc843ed6e036e845 (patch) | |
tree | 5a4876976788dc55cf169b4f980abd00a4ec5623 /widgets | |
parent | 4900743e0d9b494e26e9c18df1ec4dbcb39b67ac (diff) | |
download | gsoc2013-evolution-940383d6760233b3c265abcfbc843ed6e036e845.tar gsoc2013-evolution-940383d6760233b3c265abcfbc843ed6e036e845.tar.gz gsoc2013-evolution-940383d6760233b3c265abcfbc843ed6e036e845.tar.bz2 gsoc2013-evolution-940383d6760233b3c265abcfbc843ed6e036e845.tar.lz gsoc2013-evolution-940383d6760233b3c265abcfbc843ed6e036e845.tar.xz 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')
-rw-r--r-- | widgets/misc/ChangeLog | 6 | ||||
-rw-r--r-- | widgets/misc/e-attachment-bar.c | 60 |
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) { |