diff src/glyphs-eimage.c @ 306:9ea74add5d37 r21-0b51

Import from CVS: tag r21-0b51
author cvs
date Mon, 13 Aug 2007 10:41:58 +0200
parents c9fe270a4101
children 33bdb3d4b97f
line wrap: on
line diff
--- a/src/glyphs-eimage.c	Mon Aug 13 10:41:13 2007 +0200
+++ b/src/glyphs-eimage.c	Mon Aug 13 10:41:58 2007 +0200
@@ -49,6 +49,7 @@
 #include "lstream.h"
 #include "console.h"
 #include "device.h"
+#include "faces.h"
 #include "glyphs.h"
 #include "objects.h"
 
@@ -902,6 +903,42 @@
     for (y = 0; y < height; y++)
       row_pointers[y] = unwind.eimage + (width * 3 * y);
 
+    {
+      /* if the png specifies a background chunk, go ahead and
+	 use it, else use what we can get from the default face. */
+      png_color_16 my_background, *image_background;
+      Lisp_Object bkgd = Qnil;
+
+      my_background.red   = 0x7fff;
+      my_background.green = 0x7fff;
+      my_background.blue  = 0x7fff;
+      bkgd = FACE_BACKGROUND (Vdefault_face, domain);
+      if (!COLOR_INSTANCEP (bkgd))
+	{
+	  warn_when_safe (Qpng, Qinfo, "Couldn't get background color!");
+	}
+      else
+	{
+	  struct Lisp_Color_Instance *c;
+	  Lisp_Object rgblist;
+
+	  c = XCOLOR_INSTANCE (bkgd);
+	  rgblist = MAYBE_LISP_DEVMETH (XDEVICE (c->device),
+					color_instance_rgb_components,
+					(c));
+	  my_background.red = XINT (XCAR (rgblist));
+	  my_background.green = XINT (XCAR (XCDR (rgblist)));
+	  my_background.blue = XINT (XCAR (XCDR (XCDR (rgblist))));
+	}
+      
+      if (png_get_bKGD (png_ptr, info_ptr, &image_background))
+	png_set_background (png_ptr, image_background,
+			    PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
+      else 
+	png_set_background (png_ptr, &my_background,
+			    PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
+    }
+
     /* Now that we're using EImage, ask for 8bit RGB triples for any type
        of image*/
     /* convert palatte images to full RGB */
@@ -914,12 +951,6 @@
     /* we can't handle alpha values */
     if (info_ptr->color_type & PNG_COLOR_MASK_ALPHA)
       png_set_strip_alpha (png_ptr);
-    /* rip out any transparancy layers/colors */
-    if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
-      {
-        png_set_expand (png_ptr);
-	png_set_strip_alpha (png_ptr);
-      }
     /* tell libpng to strip 16 bit depth files down to 8 bits */
     if (info_ptr->bit_depth == 16)
       png_set_strip_16 (png_ptr);
@@ -932,25 +963,6 @@
 	  png_set_packing (png_ptr);
       }
 
-#if 1 /* tests? or permanent? */
-    {
-      /* if the png specifies a background chunk, go ahead and
-	 use it */
-      png_color_16 my_background, *image_background;
-    
-      /* ### how do I get the background of the current frame? */
-      my_background.red   = 0x7fff;
-      my_background.green = 0x7fff;
-      my_background.blue  = 0x7fff;
-
-      if (png_get_bKGD (png_ptr, info_ptr, &image_background))
-	png_set_background (png_ptr, image_background,
-			    PNG_BACKGROUND_GAMMA_FILE, 1, 1.0);
-      else 
-	png_set_background (png_ptr, &my_background,
-			    PNG_BACKGROUND_GAMMA_SCREEN, 0, 1.0);
-    }
-#endif
     png_read_image (png_ptr, row_pointers);
     png_read_end (png_ptr, info_ptr);