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.
This commit is contained in:
Paul Eggert 2017-10-16 01:14:58 -07:00
parent 1ca9ae7069
commit 3205b12a78

View file

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