Subject: bug#7316: closed (Re: bug#7316: Acknowledgement (24.0.50; [PATCH] Add support for GIF transparency))

From: [email-masked] (GNU bug Tracking System)
Date: Fri, 05 Nov 2010 13:21:02 +0000

Your bug report

#7316: 24.0.50; [PATCH] Add support for GIF transparency

which was filed against the emacs package, has been closed.

The explanation is attached below, along with your original report.
If you require more details, please reply to [email-masked].

-- 
7316: http://debbugs.gnu.org/cgi/bugreport.cgi?bug=7316
GNU Bug Tracking System
Contact [email-masked] with problems

Subject: Re: bug#7316: Acknowledgement (24.0.50; [PATCH] Add support for GIF transparency)
From: Julien Danjou <[email-masked]>
To: [email-masked]
Date: Fri, 05 Nov 2010 14:24:46 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Already merged into trunk.

-- 
Julien Danjou
// ᐰ <[email-masked]>   http://julien.danjou.info

Subject: 24.0.50; [PATCH] Add support for GIF transparency
From: Julien Danjou <[email-masked]>
To: [email-masked]
Date: Tue, 02 Nov 2010 10:39:59 +0100
List-Id: <debbugs-submit.debbugs.gnu.org>

Attached are 2 patches adding correct transparency support for GIF
images inside Emacs.

>From nobody Tue Nov  2 10:39:02 2010
From: Julien Danjou <[email-masked]>
To: [email-masked]
Date: Wed, 27 Oct 2010 17:00:50 +0200
Cc: Julien Danjou <[email-masked]>
Subject: [PATCH 1/2] image: add support for GIF transparency
Sender: emacs-devel-bounces+julien=[email-masked]

Signed-off-by: Julien Danjou <[email-masked]>
---
 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  <[email-masked]>
+
+	* image.c (gif_load): Add support for transparency.
+
 2010-10-26  Juanma Barranquero  <[email-masked]>
 
 	* 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

>From nobody Tue Nov  2 10:39:05 2010
From: Julien Danjou <[email-masked]>
To: [email-masked]
Date: Wed, 27 Oct 2010 17:00:51 +0200
Cc: Julien Danjou <[email-masked]>
Subject: [PATCH 2/2] image: add support for specified :background on GIF
Sender: emacs-devel-bounces+julien=[email-masked]

Signed-off-by: Julien Danjou <[email-masked]>
---
 src/ChangeLog |    1 +
 src/image.c   |    9 ++++++++-
 2 files changed, 9 insertions(+), 1 deletions(-)

diff --git a/src/ChangeLog b/src/ChangeLog
index 3d9b6bf..65d2730 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,6 +1,7 @@
 2010-10-27  Julien Danjou  <[email-masked]>
 
 	* image.c (gif_load): Add support for transparency.
+	(gif_load): Add support for specified :background.
 
 2010-10-26  Juanma Barranquero  <[email-masked]>
 
diff --git a/src/image.c b/src/image.c
index e9b85fa..ef6a6d0 100644
--- a/src/image.c
+++ b/src/image.c
@@ -7235,7 +7235,14 @@ gif_load (struct frame *f, struct image *img)
     for (i = 0; i < gif_color_map->ColorCount; ++i)
       {
         if (transparent_p && transparency_color_index == i)
-            pixel_colors[i] = FRAME_BACKGROUND_PIXEL (f);
+          {
+            Lisp_Object specified_bg
+              = image_spec_value (img->spec, QCbackground, NULL);
+            if (STRINGP (specified_bg))
+              pixel_colors[i] = x_alloc_image_color (f, img, specified_bg, FRAME_BACKGROUND_PIXEL (f));
+            else
+              pixel_colors[i] = FRAME_BACKGROUND_PIXEL (f);
+          }
         else
           {
             int r = gif_color_map->Colors[i].Red << 8;
-- 
1.7.2.3

Cheers,
-- 
Julien Danjou
// ᐰ <[email-masked]>   http://julien.danjou.info