emacs-diffs
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Emacs-diffs] emacs-26 3205b12 1/2: Fix regression in display of PPM ima


From: Paul Eggert
Subject: [Emacs-diffs] emacs-26 3205b12 1/2: Fix regression in display of PPM images
Date: Mon, 16 Oct 2017 04:24:33 -0400 (EDT)

branch: emacs-26
commit 3205b12a78b6c52b247d8e40a70ccf23693807c5
Author: Paul Eggert <address@hidden>
Commit: Paul Eggert <address@hidden>

    Fix regression in display of PPM images
    
    Problem reported by Roland Winkler (Bug#28824#35).
    Based on a patch proposed by Andy Moreton (Bug#28824#38).
    * src/image.c (pbm_scan_index): New function.
    (pbm_load): Use it to decode raw data correctly when its top bit
    is set.
---
 src/image.c | 40 +++++++++++++++++++++++++---------------
 1 file changed, 25 insertions(+), 15 deletions(-)

diff --git a/src/image.c b/src/image.c
index cd4901b..335a43e 100644
--- a/src/image.c
+++ b/src/image.c
@@ -5277,6 +5277,25 @@ pbm_scan_number (char **s, char *end)
   return val;
 }
 
+/* Scan an index from *S and return it.  It is a one-byte unsigned
+   index if !TWO_BYTE, and a two-byte big-endian unsigned index if
+   TWO_BYTE.  */
+
+static int
+pbm_scan_index (char **s, bool two_byte)
+{
+  char *p = *s;
+  unsigned char c0 = *p++;
+  int n = c0;
+  if (two_byte)
+    {
+      unsigned char c1 = *p++;
+      n = (n << 8) + c1;
+    }
+  *s = p;
+  return n;
+}
+
 
 /* Load PBM image IMG for use on frame F.  */
 
@@ -5499,7 +5518,8 @@ pbm_load (struct frame *f, struct image *img)
   else
     {
       int expected_size = height * width;
-      if (max_color_idx > 255)
+      bool two_byte = 255 < max_color_idx;
+      if (two_byte)
        expected_size *= 2;
       if (type == PBM_COLOR)
        expected_size *= 3;
@@ -5522,24 +5542,14 @@ pbm_load (struct frame *f, struct image *img)
            int r, g, b;
 
            if (type == PBM_GRAY && raw_p)
-             {
-               r = g = b = *p++;
-               if (max_color_idx > 255)
-                 r = g = b = r * 256 + *p++;
-             }
+             r = g = b = pbm_scan_index (&p, two_byte);
            else if (type == PBM_GRAY)
              r = g = b = pbm_scan_number (&p, end);
            else if (raw_p)
              {
-               r = *p++;
-               if (max_color_idx > 255)
-                 r = r * 256 + *p++;
-               g = *p++;
-               if (max_color_idx > 255)
-                 g = g * 256 + *p++;
-               b = *p++;
-               if (max_color_idx > 255)
-                 b = b * 256 + *p++;
+               r = pbm_scan_index (&p, two_byte);
+               g = pbm_scan_index (&p, two_byte);
+               b = pbm_scan_index (&p, two_byte);
              }
            else
              {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]