[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
{