fix bug where we couldn't rewind a file that reached EOF, which can happen with < 92-byte PIC,PNM,HDR,TGA
This commit is contained in:
parent
28a29dd0f1
commit
90dc93a1cc
30
stb_image.h
30
stb_image.h
@ -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
|
|||||||
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)
|
|||||||
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 *
|
|||||||
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)
|
|||||||
// 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,11 +6114,19 @@ 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;
|
||||||
@ -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)
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user