提交 90dc93a1 编写于 作者: S Sean Barrett

fix bug where we couldn't rewind a file that reached EOF, which can happen...

fix bug where we couldn't rewind a file that reached EOF, which can happen with < 92-byte PIC,PNM,HDR,TGA
上级 28a29dd0
...@@ -146,8 +146,9 @@ ...@@ -146,8 +146,9 @@
Latest revision history: Latest revision history:
2.07 (2015-09-13) fix compiler warnings; animated GIF support close; 2.07 (2015-09-13) partial animated GIF support
limited 16-bit PSD support; #ifdef unused functions limited 16-bit PSD support
minor bugs, code cleanup, and compiler warnings
2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value
2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning
2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit
...@@ -757,7 +758,7 @@ typedef struct ...@@ -757,7 +758,7 @@ typedef struct
stbi_uc buffer_start[128]; stbi_uc buffer_start[128];
stbi_uc *img_buffer, *img_buffer_end; stbi_uc *img_buffer, *img_buffer_end;
stbi_uc *img_buffer_original; stbi_uc *img_buffer_original, *img_buffer_original_end;
} stbi__context; } stbi__context;
...@@ -769,7 +770,7 @@ static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) ...@@ -769,7 +770,7 @@ static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)
s->io.read = NULL; s->io.read = NULL;
s->read_from_callbacks = 0; s->read_from_callbacks = 0;
s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
s->img_buffer_end = (stbi_uc *) buffer+len; s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
} }
// initialize a callback-based context // initialize a callback-based context
...@@ -781,6 +782,7 @@ static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void * ...@@ -781,6 +782,7 @@ static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *
s->read_from_callbacks = 1; s->read_from_callbacks = 1;
s->img_buffer_original = s->buffer_start; s->img_buffer_original = s->buffer_start;
stbi__refill_buffer(s); stbi__refill_buffer(s);
s->img_buffer_original_end = s->img_buffer_end;
} }
#ifndef STBI_NO_STDIO #ifndef STBI_NO_STDIO
...@@ -822,6 +824,7 @@ static void stbi__rewind(stbi__context *s) ...@@ -822,6 +824,7 @@ static void stbi__rewind(stbi__context *s)
// but we just rewind to the beginning of the initial buffer, because // but we just rewind to the beginning of the initial buffer, because
// we only use it after doing 'test', which only ever looks at at most 92 bytes // we only use it after doing 'test', which only ever looks at at most 92 bytes
s->img_buffer = s->img_buffer_original; s->img_buffer = s->img_buffer_original;
s->img_buffer_end = s->img_buffer_original_end;
} }
#ifndef STBI_NO_JPEG #ifndef STBI_NO_JPEG
...@@ -6111,14 +6114,22 @@ static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) ...@@ -6111,14 +6114,22 @@ static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
int act_comp=0,num_packets=0,chained; int act_comp=0,num_packets=0,chained;
stbi__pic_packet packets[10]; stbi__pic_packet packets[10];
stbi__skip(s, 92); if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
stbi__rewind(s);
return 0;
}
stbi__skip(s, 88);
*x = stbi__get16be(s); *x = stbi__get16be(s);
*y = stbi__get16be(s); *y = stbi__get16be(s);
if (stbi__at_eof(s)) return 0; if (stbi__at_eof(s)) {
stbi__rewind( s);
return 0;
}
if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
stbi__rewind( s ); stbi__rewind( s );
return 0; return 0;
} }
stbi__skip(s, 8); stbi__skip(s, 8);
...@@ -6344,8 +6355,11 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int ...@@ -6344,8 +6355,11 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int
/* /*
revision history: revision history:
2.07 (2015-09-13) fix compiler warnings; animated GIF support; 2.07 (2015-09-13) fix compiler warnings
limited 16-bit PSD support; #ifdef unused functions partial animated GIF support
limited 16-bit PSD support
#ifdef unused functions
bug with < 92 byte PIC,PNM,HDR,TGA
2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value
2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning
2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit
......
...@@ -73,14 +73,17 @@ int main(int argc, char **argv) ...@@ -73,14 +73,17 @@ int main(int argc, char **argv)
int i, n; int i, n;
for (i=1; i < argc; ++i) { for (i=1; i < argc; ++i) {
int res;
unsigned char *data; unsigned char *data;
printf("%s\n", argv[i]); printf("%s\n", argv[i]);
res = stbi_info(argv[1], &w, &h, &n);
data = stbi_load(argv[i], &w, &h, &n, 4); if (data) free(data); else printf("Failed &n\n"); data = stbi_load(argv[i], &w, &h, &n, 4); if (data) free(data); else printf("Failed &n\n");
data = stbi_load(argv[i], &w, &h, 0, 1); if (data) free(data); else printf("Failed 1\n"); data = stbi_load(argv[i], &w, &h, 0, 1); if (data) free(data); else printf("Failed 1\n");
data = stbi_load(argv[i], &w, &h, 0, 2); if (data) free(data); else printf("Failed 2\n"); data = stbi_load(argv[i], &w, &h, 0, 2); if (data) free(data); else printf("Failed 2\n");
data = stbi_load(argv[i], &w, &h, 0, 3); if (data) free(data); else printf("Failed 3\n"); data = stbi_load(argv[i], &w, &h, 0, 3); if (data) free(data); else printf("Failed 3\n");
data = stbi_load(argv[i], &w, &h, 0, 4); data = stbi_load(argv[i], &w, &h, 0, 4);
assert(data); assert(data);
assert(res);
if (data) { if (data) {
char fname[512]; char fname[512];
stb_splitpath(fname, argv[i], STB_FILE); stb_splitpath(fname, argv[i], STB_FILE);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册