Updated stb_image to latest version (1.33)

This commit is contained in:
Laurent Gomila 2012-03-17 17:09:47 +01:00
parent ee7cd94220
commit 24f8c3535d

View File

@ -1,4 +1,4 @@
/* stbi-1.31 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c /* stbi-1.33 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c
when you control the images you're loading when you control the images you're loading
no warranty implied; use at your own risk no warranty implied; use at your own risk
@ -22,6 +22,8 @@
- overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD) - overridable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD)
Latest revisions: Latest revisions:
1.33 (2011-07-14) minor fixes suggested by Dave Moore
1.32 (2011-07-13) info support for all filetypes (SpartanJ)
1.31 (2011-06-19) a few more leak fixes, bug in PNG handling (SpartanJ) 1.31 (2011-06-19) a few more leak fixes, bug in PNG handling (SpartanJ)
1.30 (2011-06-11) added ability to load files via io callbacks (Ben Wenger) 1.30 (2011-06-11) added ability to load files via io callbacks (Ben Wenger)
1.29 (2010-08-16) various warning fixes from Aurelien Pocheville 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville
@ -51,9 +53,9 @@
Jetro Lauha (stbi_info) Jonathan Blow Jetro Lauha (stbi_info) Jonathan Blow
James "moose2000" Brown (iPhone PNG) Laurent Gomila James "moose2000" Brown (iPhone PNG) Laurent Gomila
Ben "Disch" Wenger (io callbacks) Aruelien Pocheville Ben "Disch" Wenger (io callbacks) Aruelien Pocheville
Ryamond Barbiero Martin "SpartanJ" Golini Ryamond Barbiero
David Woo David Woo
Martin Golini
If your name should be here but isn't, let Sean know. If your name should be here but isn't, let Sean know.
@ -250,15 +252,16 @@ extern stbi_uc *stbi_load_from_callbacks (stbi_io_callbacks const *clbk, void *
extern void stbi_ldr_to_hdr_gamma(float gamma); extern void stbi_ldr_to_hdr_gamma(float gamma);
extern void stbi_ldr_to_hdr_scale(float scale); extern void stbi_ldr_to_hdr_scale(float scale);
#endif // STBI_NO_HDR
// stbi_is_hdr is always defined
extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
#ifndef STBI_NO_STDIO #ifndef STBI_NO_STDIO
extern int stbi_is_hdr (char const *filename); extern int stbi_is_hdr (char const *filename);
extern int stbi_is_hdr_from_file(FILE *f); extern int stbi_is_hdr_from_file(FILE *f);
#endif // STBI_NO_STDIO #endif // STBI_NO_STDIO
extern int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
#endif // STBI_NO_HDR
// get a VERY brief reason for failure // get a VERY brief reason for failure
// NOT THREADSAFE // NOT THREADSAFE
@ -369,7 +372,7 @@ typedef unsigned char validate_uint32[sizeof(uint32)==4 ? 1 : -1];
#define STBI_NO_WRITE #define STBI_NO_WRITE
#endif #endif
#define STBI_NOTUSED(v) v=v #define STBI_NOTUSED(v) (void)sizeof(v)
#ifdef _MSC_VER #ifdef _MSC_VER
#define STBI_HAS_LROTL #define STBI_HAS_LROTL
@ -455,11 +458,7 @@ static void start_file(stbi *s, FILE *f)
start_callbacks(s, &stbi_stdio_callbacks, (void *) f); start_callbacks(s, &stbi_stdio_callbacks, (void *) f);
} }
/* -- [Laurent] this function is not used at all and triggers compiler warnings //static void stop_file(stbi *s) { }
static void stop_file(stbi *s)
{
}
*/
#endif // !STBI_NO_STDIO #endif // !STBI_NO_STDIO
@ -1925,8 +1924,10 @@ static int stbi_jpeg_test(stbi *s)
static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp) static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp)
{ {
if (!decode_jpeg_header(j, SCAN_header)) if (!decode_jpeg_header(j, SCAN_header)) {
stbi_rewind( j->s );
return 0; return 0;
}
if (x) *x = j->s->img_x; if (x) *x = j->s->img_x;
if (y) *y = j->s->img_y; if (y) *y = j->s->img_y;
if (comp) *comp = j->s->img_n; if (comp) *comp = j->s->img_n;
@ -2866,8 +2867,10 @@ static int stbi_png_test(stbi *s)
static int stbi_png_info_raw(png *p, int *x, int *y, int *comp) static int stbi_png_info_raw(png *p, int *x, int *y, int *comp)
{ {
if (!parse_png_file(p, SCAN_header, 0)) if (!parse_png_file(p, SCAN_header, 0)) {
stbi_rewind( p->s );
return 0; return 0;
}
if (x) *x = p->s->img_x; if (x) *x = p->s->img_x;
if (y) *y = p->s->img_y; if (y) *y = p->s->img_y;
if (comp) *comp = p->s->img_n; if (comp) *comp = p->s->img_n;
@ -3155,22 +3158,30 @@ static int tga_info(stbi *s, int *x, int *y, int *comp)
int sz; int sz;
get8u(s); // discard Offset get8u(s); // discard Offset
sz = get8u(s); // color type sz = get8u(s); // color type
if( sz > 1 ) return 0; // only RGB or indexed allowed if( sz > 1 ) {
stbi_rewind(s);
return 0; // only RGB or indexed allowed
}
sz = get8u(s); // image type sz = get8u(s); // image type
// only RGB or grey allowed, +/- RLE // only RGB or grey allowed, +/- RLE
if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0; if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;
get16le(s); // discard palette start skip(s,9);
get16le(s); // discard palette length
get8(s); // discard bits per palette color entry
get16le(s); // discard x origin
get16le(s); // discard y origin
tga_w = get16le(s); tga_w = get16le(s);
if( tga_w < 1 ) return 0; // test width if( tga_w < 1 ) {
stbi_rewind(s);
return 0; // test width
}
tga_h = get16le(s); tga_h = get16le(s);
if( tga_h < 1 ) return 0; // test height if( tga_h < 1 ) {
stbi_rewind(s);
return 0; // test height
}
sz = get8(s); // bits per pixel sz = get8(s); // bits per pixel
// only RGB or RGBA or grey allowed // only RGB or RGBA or grey allowed
if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) return 0; if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
stbi_rewind(s);
return 0;
}
tga_comp = sz; tga_comp = sz;
if (x) *x = tga_w; if (x) *x = tga_w;
if (y) *y = tga_h; if (y) *y = tga_h;
@ -3922,7 +3933,10 @@ static int stbi_gif_header(stbi *s, stbi_gif *g, int *comp, int is_info)
static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp) static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp)
{ {
stbi_gif g; stbi_gif g;
if (!stbi_gif_header(s, &g, comp, 1)) return 0; if (!stbi_gif_header(s, &g, comp, 1)) {
stbi_rewind( s );
return 0;
}
if (x) *x = g.w; if (x) *x = g.w;
if (y) *y = g.h; if (y) *y = g.h;
return 1; return 1;
@ -4364,8 +4378,150 @@ static float *stbi_hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp)
return hdr_load(s,x,y,comp,req_comp); return hdr_load(s,x,y,comp,req_comp);
} }
static int stbi_hdr_info(stbi *s, int *x, int *y, int *comp)
{
char buffer[HDR_BUFLEN];
char *token;
int valid = 0;
if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0) {
stbi_rewind( s );
return 0;
}
for(;;) {
token = hdr_gettoken(s,buffer);
if (token[0] == 0) break;
if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
}
if (!valid) {
stbi_rewind( s );
return 0;
}
token = hdr_gettoken(s,buffer);
if (strncmp(token, "-Y ", 3)) {
stbi_rewind( s );
return 0;
}
token += 3;
*y = strtol(token, &token, 10);
while (*token == ' ') ++token;
if (strncmp(token, "+X ", 3)) {
stbi_rewind( s );
return 0;
}
token += 3;
*x = strtol(token, NULL, 10);
*comp = 3;
return 1;
}
#endif // STBI_NO_HDR #endif // STBI_NO_HDR
static int stbi_bmp_info(stbi *s, int *x, int *y, int *comp)
{
int hsz;
if (get8(s) != 'B' || get8(s) != 'M') {
stbi_rewind( s );
return 0;
}
skip(s,12);
hsz = get32le(s);
if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) {
stbi_rewind( s );
return 0;
}
if (hsz == 12) {
*x = get16le(s);
*y = get16le(s);
} else {
*x = get32le(s);
*y = get32le(s);
}
if (get16le(s) != 1) {
stbi_rewind( s );
return 0;
}
*comp = get16le(s) / 8;
return 1;
}
static int stbi_psd_info(stbi *s, int *x, int *y, int *comp)
{
int channelCount;
if (get32(s) != 0x38425053) {
stbi_rewind( s );
return 0;
}
if (get16(s) != 1) {
stbi_rewind( s );
return 0;
}
skip(s, 6);
channelCount = get16(s);
if (channelCount < 0 || channelCount > 16) {
stbi_rewind( s );
return 0;
}
*y = get32(s);
*x = get32(s);
if (get16(s) != 8) {
stbi_rewind( s );
return 0;
}
if (get16(s) != 3) {
stbi_rewind( s );
return 0;
}
*comp = 4;
return 1;
}
static int stbi_pic_info(stbi *s, int *x, int *y, int *comp)
{
int act_comp=0,num_packets=0,chained;
pic_packet_t packets[10];
skip(s, 92);
*x = get16(s);
*y = get16(s);
if (at_eof(s)) return 0;
if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
stbi_rewind( s );
return 0;
}
skip(s, 8);
do {
pic_packet_t *packet;
if (num_packets==sizeof(packets)/sizeof(packets[0]))
return 0;
packet = &packets[num_packets++];
chained = get8(s);
packet->size = get8u(s);
packet->type = get8u(s);
packet->channel = get8u(s);
act_comp |= packet->channel;
if (at_eof(s)) {
stbi_rewind( s );
return 0;
}
if (packet->size != 8) {
stbi_rewind( s );
return 0;
}
} while (chained);
*comp = (act_comp & 0x10 ? 4 : 3);
return 1;
}
static int stbi_info_main(stbi *s, int *x, int *y, int *comp) static int stbi_info_main(stbi *s, int *x, int *y, int *comp)
{ {
if (stbi_jpeg_info(s, x, y, comp)) if (stbi_jpeg_info(s, x, y, comp))
@ -4374,10 +4530,15 @@ static int stbi_info_main(stbi *s, int *x, int *y, int *comp)
return 1; return 1;
if (stbi_gif_info(s, x, y, comp)) if (stbi_gif_info(s, x, y, comp))
return 1; return 1;
// @TODO: stbi_bmp_info if (stbi_bmp_info(s, x, y, comp))
// @TODO: stbi_psd_info return 1;
if (stbi_psd_info(s, x, y, comp))
return 1;
if (stbi_pic_info(s, x, y, comp))
return 1;
#ifndef STBI_NO_HDR #ifndef STBI_NO_HDR
// @TODO: stbi_hdr_info if (stbi_hdr_info(s, x, y, comp))
return 1;
#endif #endif
// test tga last because it's a crappy test! // test tga last because it's a crappy test!
if (stbi_tga_info(s, x, y, comp)) if (stbi_tga_info(s, x, y, comp))
@ -4426,7 +4587,11 @@ int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int
/* /*
revision history: revision history:
1.31 (2011-06-19) 1.33 (2011-07-14)
make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements
1.32 (2011-07-13)
support for "info" function for all supported filetypes (SpartanJ)
1.31 (2011-06-20)
a few more leak fixes, bug in PNG handling (SpartanJ) a few more leak fixes, bug in PNG handling (SpartanJ)
1.30 (2011-06-11) 1.30 (2011-06-11)
added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)