From: Julien Danjou <julien@danjou.info>
To: emacs-devel@gnu.org
Cc: Julien Danjou <julien@danjou.info>
Subject: [PATCH 1/2] image: add support for GIF transparency
Date: Wed, 27 Oct 2010 17:00:50 +0200 [thread overview]
Message-ID: <1288191651-3958-1-git-send-email-julien@danjou.info> (raw)
In-Reply-To: <sa3r5fbisy7.fsf@cigue.easter-eggs.fr>
Signed-off-by: Julien Danjou <julien@danjou.info>
---
src/ChangeLog | 4 ++++
src/image.c | 27 +++++++++++++++++++++++----
2 files changed, 27 insertions(+), 4 deletions(-)
diff --git a/src/ChangeLog b/src/ChangeLog
index 51645ac..3d9b6bf 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,7 @@
+2010-10-27 Julien Danjou <julien@danjou.info>
+
+ * image.c (gif_load): Add support for transparency.
+
2010-10-26 Juanma Barranquero <lekktu@gmail.com>
* eval.c (init_eval_once): Set max_lisp_eval_depth to 600;
diff --git a/src/image.c b/src/image.c
index b7edf05..e9b85fa 100644
--- a/src/image.c
+++ b/src/image.c
@@ -7096,12 +7096,15 @@ gif_read_from_memory (GifFileType *file, GifByteType *buf, int len)
static const int interlace_start[] = {0, 4, 2, 1};
static const int interlace_increment[] = {8, 8, 4, 2};
+#define GIF_LOCAL_DESCRIPTOR_EXTENSION 249
+
static int
gif_load (struct frame *f, struct image *img)
{
Lisp_Object file, specified_file;
Lisp_Object specified_data;
int rc, width, height, x, y, i;
+ boolean transparent_p;
XImagePtr ximg;
ColorMapObject *gif_color_map;
unsigned long pixel_colors[256];
@@ -7110,6 +7113,7 @@ gif_load (struct frame *f, struct image *img)
int ino, image_height, image_width;
gif_memory_source memsrc;
unsigned char *raster;
+ unsigned int transparency_color_index;
specified_file = image_spec_value (img->spec, QCfile, NULL);
specified_data = image_spec_value (img->spec, QCdata, NULL);
@@ -7182,6 +7186,16 @@ gif_load (struct frame *f, struct image *img)
return 0;
}
+ for(i = 0; i < gif->SavedImages[ino].ExtensionBlockCount; i++)
+ if (gif->SavedImages[ino].ExtensionBlocks[i].Function == GIF_LOCAL_DESCRIPTOR_EXTENSION
+ && gif->SavedImages[ino].ExtensionBlocks[i].ByteCount == 4
+ /* Transparency enabled? */
+ && gif->SavedImages[ino].ExtensionBlocks[i].Bytes[0] & 1)
+ {
+ transparent_p = 1;
+ transparency_color_index = (unsigned char) gif->SavedImages[ino].ExtensionBlocks[i].Bytes[3];
+ }
+
img->corners[TOP_CORNER] = gif->SavedImages[ino].ImageDesc.Top;
img->corners[LEFT_CORNER] = gif->SavedImages[ino].ImageDesc.Left;
image_height = gif->SavedImages[ino].ImageDesc.Height;
@@ -7220,10 +7234,15 @@ gif_load (struct frame *f, struct image *img)
if (gif_color_map)
for (i = 0; i < gif_color_map->ColorCount; ++i)
{
- int r = gif_color_map->Colors[i].Red << 8;
- int g = gif_color_map->Colors[i].Green << 8;
- int b = gif_color_map->Colors[i].Blue << 8;
- pixel_colors[i] = lookup_rgb_color (f, r, g, b);
+ if (transparent_p && transparency_color_index == i)
+ pixel_colors[i] = FRAME_BACKGROUND_PIXEL (f);
+ else
+ {
+ int r = gif_color_map->Colors[i].Red << 8;
+ int g = gif_color_map->Colors[i].Green << 8;
+ int b = gif_color_map->Colors[i].Blue << 8;
+ pixel_colors[i] = lookup_rgb_color (f, r, g, b);
+ }
}
#ifdef COLOR_TABLE_SUPPORT
--
1.7.2.3
next prev parent reply other threads:[~2010-10-27 15:00 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2010-10-27 14:27 [PATCH 1/2] image: add support for GIF transparency Julien Danjou
2010-10-27 14:27 ` [PATCH 2/2] image: add support for specified :background on GIF Julien Danjou
2010-10-27 14:57 ` [PATCH 1/2] image: add support for GIF transparency Julien Danjou
2010-10-27 15:00 ` Julien Danjou [this message]
2010-11-03 20:09 ` Chong Yidong
2010-11-04 1:44 ` YAMAMOTO Mitsuharu
2010-11-04 23:01 ` Miles Bader
2010-10-27 15:00 ` [PATCH 2/2] image: add support for specified :background on GIF Julien Danjou
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1288191651-3958-1-git-send-email-julien@danjou.info \
--to=julien@danjou.info \
--cc=emacs-devel@gnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.