- PPMs can have comments in the header.

Thanks to Denys for pointing that out. (~+7b)
This commit is contained in:
Bernhard Reutner-Fischer 2009-02-16 12:36:50 +00:00
parent 8ad78e1ec7
commit 051fdb9e7a

View File

@ -216,36 +216,36 @@ static void fb_drawprogressbar(unsigned percent)
*/ */
static void fb_drawimage(void) static void fb_drawimage(void)
{ {
RESERVE_CONFIG_BUFFER(head, 256); char *head, *ptr;
RESERVE_CONFIG_BUFFER(s, 80); FILE *theme_file;
int theme_file;
unsigned char *pixline; unsigned char *pixline;
unsigned i, j, width, height, line_size; unsigned i, j, width, height, line_size;
memset(head, 0, sizeof(head)); theme_file = xfopen_stdin(G.image_filename);
theme_file = open_or_warn_stdin(G.image_filename); head = xmalloc(256);
// parse ppm header // parse ppm header
while (1) { while (1) {
if (safe_read(theme_file, s, sizeof(s)) <= 0) if (fgets(head, 256, theme_file) == NULL
bb_error_msg_and_die("bad PPM file '%s'", G.image_filename); /* do not overrun the buffer */
|| strlen(bb_common_bufsiz1) >= sizeof(bb_common_bufsiz1) - 256)
if (s[0] == '#')
continue;
if (strlen(head) + strlen(s) >= sizeof(head))
bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
strcat(head, s);
if (head[0] != 'P' || head[1] != '6')
bb_error_msg_and_die("bad PPM file '%s'", G.image_filename); bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
ptr = memchr(head, '#', 256);
if (ptr != NULL)
*ptr = 0; /* ignore comments */
strcat(bb_common_bufsiz1, head);
// width, height, max_color_val // width, height, max_color_val
if (sscanf(head, "P6 %u %u %u", &width, &height, &i) == 3) if (sscanf(bb_common_bufsiz1, "P6 %u %u %u", &width, &height, &i) == 3
&& i <= 255)
break; break;
// TODO: i must be <= 255! /* If we do not find a signature throughout the whole file then
we will diagnose this via EOF on read in the head of the loop. */
} }
if (ENABLE_FEATURE_CLEAN_UP)
free(head);
line_size = width*3; line_size = width*3;
if (width > G.scr_var.xres) if (width > G.scr_var.xres)
width = G.scr_var.xres; width = G.scr_var.xres;
@ -257,7 +257,7 @@ static void fb_drawimage(void)
unsigned char *pixel = pixline; unsigned char *pixel = pixline;
DATA *src = (DATA *)(G.addr + j * G.scr_fix.line_length); DATA *src = (DATA *)(G.addr + j * G.scr_fix.line_length);
if (safe_read(theme_file, pixline, line_size) != line_size) if (fread(pixline, 1, line_size, theme_file) != line_size)
bb_error_msg_and_die("bad PPM file '%s'", G.image_filename); bb_error_msg_and_die("bad PPM file '%s'", G.image_filename);
for (i = 0; i < width; i++) { for (i = 0; i < width; i++) {
unsigned thispix; unsigned thispix;
@ -268,12 +268,9 @@ static void fb_drawimage(void)
pixel += 3; pixel += 3;
} }
} }
if (ENABLE_FEATURE_CLEAN_UP) { if (ENABLE_FEATURE_CLEAN_UP)
free(pixline); free(pixline);
RELEASE_CONFIG_BUFFER(s); fclose(theme_file);
RELEASE_CONFIG_BUFFER(head);
}
close(theme_file);
} }