all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
From: YAMAMOTO Mitsuharu <mituharu@math.s.chiba-u.ac.jp>
To: "Roland Winkler" <winkler@gnu.org>
Cc: 37153@debbugs.gnu.org, Paul Eggert <eggert@cs.ucla.edu>
Subject: bug#37153: 26.1; some png images scrambled
Date: Sun, 25 Aug 2019 15:58:27 +0900	[thread overview]
Message-ID: <wlwof1ive4.wl-mituharu@math.s.chiba-u.ac.jp> (raw)
In-Reply-To: <5136.20784.40920.23906@gargle.gargle.HOWL>

On Sun, 25 Aug 2019 13:52:32 +0900,
Roland Winkler wrote:
> 
> On Sat Aug 24 2019 mituharu@math.s.chiba-u.ac.jp wrote:
> > I suspect there is a longstanding typo (or thinko) in PNG
> > transparency handling code.
> 
> It may be helpful to check the "official" test-suite for PNG
> 
> http://www.schaik.com/pngsuite2011/pngsuite.html
> 
> which contains also png files with transparency
> 
> http://www.schaik.com/pngsuite2011/pngsuite_trn_png.html
> 
> Somehow emacs ignores the transparency for image type png, see for
> example the file tm3n3p02.png with multiple levels of transparency.
> 
> Transparency is honored for these images when emacs uses imagemagick.

It seems to be necessary to look into the tRNS chunk data for paletted
images.  Again, W32 would need some more work.

				     YAMAMOTO Mitsuharu
				mituharu@math.s.chiba-u.ac.jp

diff --git a/src/image.c b/src/image.c
index 81d8cb4e2b2..7f1561d7a68 100644
--- a/src/image.c
+++ b/src/image.c
@@ -6589,10 +6589,28 @@ png_load_body (struct frame *f, struct image *img, struct png_load_context *c)
 
   /* If image contains simply transparency data, we prefer to
      construct a clipping mask.  */
+  transparent_p = false;
   if (png_get_valid (png_ptr, info_ptr, PNG_INFO_tRNS))
-    transparent_p = 1;
-  else
-    transparent_p = 0;
+    {
+      if (color_type != PNG_COLOR_TYPE_PALETTE)
+	transparent_p = true;
+      else
+	{
+	  /* Paletted images can specify transparency levels. */
+	  png_bytep trans;
+	  int i, num_trans;
+
+	  if (png_get_tRNS (png_ptr, info_ptr, &trans, &num_trans, NULL)
+	      == PNG_INFO_tRNS)
+	    {
+	      for (i = 0; i < num_trans; i++)
+		if (!(trans[i] == 0 || trans[i] == 255))
+		  break;
+	      if (i == num_trans)
+		transparent_p = true;
+	    }
+	}
+    }
 
   /* This function is easier to write if we only have to handle
      one data format: RGB or RGBA with 8 bits per channel.  Let's
@@ -6680,7 +6698,7 @@ png_load_body (struct frame *f, struct image *img, struct png_load_context *c)
   /* Create an image and pixmap serving as mask if the PNG image
      contains an alpha channel.  */
   if (channels == 4
-      && !transparent_p
+      && transparent_p
       && !image_create_x_image_and_pixmap (f, img, width, height, 1,
 					   &mask_img, 1))
     {





  reply	other threads:[~2019-08-25  6:58 UTC|newest]

Thread overview: 29+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2019-08-23  4:49 bug#37153: 26.1; some png images scrambled Roland Winkler
2019-08-23  8:47 ` Eli Zaretskii
2019-08-23 11:39   ` Roland Winkler
2019-08-23 12:22     ` Eli Zaretskii
2019-08-23 15:07       ` Roland Winkler
2019-08-23 15:34         ` Eli Zaretskii
2019-08-23 19:37 ` Paul Eggert
2019-08-23 20:11   ` Eli Zaretskii
2019-08-23 20:33     ` Paul Eggert
2019-08-24  5:51       ` Eli Zaretskii
2019-08-24  3:17   ` Roland Winkler
2019-08-24  3:39     ` Paul Eggert
2019-08-24  4:19       ` Roland Winkler
2019-08-24  6:26       ` Eli Zaretskii
2019-08-24  6:22     ` Eli Zaretskii
2019-08-24  9:01     ` mituharu
2019-08-24 10:17       ` Eli Zaretskii
2019-08-25  4:19         ` YAMAMOTO Mitsuharu
2019-08-25  7:24           ` Eli Zaretskii
2019-08-25  4:52       ` Roland Winkler
2019-08-25  6:58         ` YAMAMOTO Mitsuharu [this message]
2019-08-25 12:19           ` Roland Winkler
2019-08-25 18:38           ` Paul Eggert
2019-08-25 18:56             ` Eli Zaretskii
2019-08-25 23:02             ` YAMAMOTO Mitsuharu
2019-08-25 23:06               ` YAMAMOTO Mitsuharu
2019-08-25 23:39               ` Paul Eggert
2019-09-24 16:23                 ` Lars Ingebrigtsen
2019-09-24 17:14                   ` Eli Zaretskii

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=wlwof1ive4.wl-mituharu@math.s.chiba-u.ac.jp \
    --to=mituharu@math.s.chiba-u.ac.jp \
    --cc=37153@debbugs.gnu.org \
    --cc=eggert@cs.ucla.edu \
    --cc=winkler@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.