81 #ifndef STBI_INCLUDE_STB_IMAGE_H 82 #define STBI_INCLUDE_STB_IMAGE_H 198 #ifndef STBI_NO_STDIO 200 #endif // STBI_NO_STDIO 202 #define STBI_VERSION 1 214 typedef unsigned char stbi_uc;
220 #ifdef STB_IMAGE_STATIC 221 #define STBIDEF static 223 #define STBIDEF extern 235 STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp);
237 #ifndef STBI_NO_STDIO 238 STBIDEF stbi_uc *stbi_load (
char const *filename,
int *x,
int *y,
int *comp,
int req_comp);
239 STBIDEF stbi_uc *stbi_load_from_file (FILE *f,
int *x,
int *y,
int *comp,
int req_comp);
245 int (*read) (
void *user,
char *data,
int size);
246 void (*skip) (
void *user,
int n);
247 int (*eof) (
void *user);
250 STBIDEF stbi_uc *stbi_load_from_callbacks (
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp,
int req_comp);
253 STBIDEF
float *stbi_loadf_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp);
255 #ifndef STBI_NO_STDIO 256 STBIDEF
float *stbi_loadf (
char const *filename,
int *x,
int *y,
int *comp,
int req_comp);
257 STBIDEF
float *stbi_loadf_from_file (FILE *f,
int *x,
int *y,
int *comp,
int req_comp);
260 STBIDEF
float *stbi_loadf_from_callbacks (
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp,
int req_comp);
262 STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma);
263 STBIDEF
void stbi_hdr_to_ldr_scale(
float scale);
265 STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma);
266 STBIDEF
void stbi_ldr_to_hdr_scale(
float scale);
267 #endif // STBI_NO_HDR 270 STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk,
void *user);
271 STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const *buffer,
int len);
272 #ifndef STBI_NO_STDIO 273 STBIDEF
int stbi_is_hdr (
char const *filename);
274 STBIDEF
int stbi_is_hdr_from_file(FILE *f);
275 #endif // STBI_NO_STDIO 280 STBIDEF
const char *stbi_failure_reason (
void);
283 STBIDEF
void stbi_image_free (
void *retval_from_stbi_load);
286 STBIDEF
int stbi_info_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp);
287 STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp);
289 #ifndef STBI_NO_STDIO 290 STBIDEF
int stbi_info (
char const *filename,
int *x,
int *y,
int *comp);
291 STBIDEF
int stbi_info_from_file (FILE *f,
int *x,
int *y,
int *comp);
300 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply);
304 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert);
309 STBIDEF
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer,
int len,
int initial_size,
int *outlen);
310 STBIDEF
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer,
int len,
int initial_size,
int *outlen,
int parse_header);
311 STBIDEF
char *stbi_zlib_decode_malloc(
const char *buffer,
int len,
int *outlen);
312 STBIDEF
int stbi_zlib_decode_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen);
314 STBIDEF
char *stbi_zlib_decode_noheader_malloc(
const char *buffer,
int len,
int *outlen);
315 STBIDEF
int stbi_zlib_decode_noheader_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen);
320 typedef void (*stbi_idct_8x8)(stbi_uc *out,
int out_stride,
short data[64],
unsigned short *dequantize);
325 typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc
const *y, stbi_uc
const *cb, stbi_uc
const *cr,
int count,
int step);
333 STBIDEF
void stbi_install_idct(stbi_idct_8x8 func);
334 STBIDEF
void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func);
345 #endif // STBI_INCLUDE_STB_IMAGE_H 347 #ifdef STB_IMAGE_IMPLEMENTATION 354 #ifndef STBI_NO_STDIO 361 #define STBI_ASSERT(x) assert(x) 368 #define stbi_inline inline 373 #define stbi_inline __forceinline 378 typedef unsigned short stbi__uint16;
379 typedef signed short stbi__int16;
380 typedef unsigned int stbi__uint32;
381 typedef signed int stbi__int32;
384 typedef uint16_t stbi__uint16;
385 typedef int16_t stbi__int16;
386 typedef uint32_t stbi__uint32;
387 typedef int32_t stbi__int32;
391 typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
394 #define STBI_NOTUSED(v) (void)(v) 396 #define STBI_NOTUSED(v) (void)sizeof(v) 400 #define STBI_HAS_LROTL 403 #ifdef STBI_HAS_LROTL 404 #define stbi_lrot(x,y) _lrotl(x,y) 406 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) 417 stbi__uint32 img_x, img_y;
418 int img_n, img_out_n;
423 int read_from_callbacks;
425 stbi_uc buffer_start[128];
427 stbi_uc *img_buffer, *img_buffer_end;
428 stbi_uc *img_buffer_original;
432 static void stbi__refill_buffer(stbi__context *s);
435 static void stbi__start_mem(stbi__context *s, stbi_uc
const *buffer,
int len)
438 s->read_from_callbacks = 0;
439 s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
440 s->img_buffer_end = (stbi_uc *) buffer+len;
444 static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user)
447 s->io_user_data = user;
448 s->buflen =
sizeof(s->buffer_start);
449 s->read_from_callbacks = 1;
450 s->img_buffer_original = s->buffer_start;
451 stbi__refill_buffer(s);
454 #ifndef STBI_NO_STDIO 456 static int stbi__stdio_read(
void *user,
char *data,
int size)
458 return (
int) fread(data,1,size,(FILE*) user);
461 static void stbi__stdio_skip(
void *user,
int n)
463 fseek((FILE*) user, n, SEEK_CUR);
466 static int stbi__stdio_eof(
void *user)
468 return feof((FILE*) user);
478 static void stbi__start_file(stbi__context *s, FILE *f)
480 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *) f);
485 #endif // !STBI_NO_STDIO 487 static void stbi__rewind(stbi__context *s)
492 s->img_buffer = s->img_buffer_original;
495 static int stbi__jpeg_test(stbi__context *s);
496 static stbi_uc *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
497 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
498 static int stbi__png_test(stbi__context *s);
499 static stbi_uc *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
500 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
501 static int stbi__bmp_test(stbi__context *s);
502 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
503 static int stbi__tga_test(stbi__context *s);
504 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
505 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
506 static int stbi__psd_test(stbi__context *s);
507 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
509 static int stbi__hdr_test(stbi__context *s);
510 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
512 static int stbi__pic_test(stbi__context *s);
513 static stbi_uc *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
514 static int stbi__gif_test(stbi__context *s);
515 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
516 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
520 static const char *stbi__g_failure_reason;
522 STBIDEF
const char *stbi_failure_reason(
void)
524 return stbi__g_failure_reason;
527 static int stbi__err(
const char *str)
529 stbi__g_failure_reason = str;
533 static void *stbi__malloc(
size_t size)
542 #ifdef STBI_NO_FAILURE_STRINGS 543 #define stbi__err(x,y) 0 544 #elif defined(STBI_FAILURE_USERMSG) 545 #define stbi__err(x,y) stbi__err(y) 547 #define stbi__err(x,y) stbi__err(x) 550 #define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL)) 551 #define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL)) 553 STBIDEF
void stbi_image_free(
void *retval_from_stbi_load)
555 free(retval_from_stbi_load);
559 static float *stbi__ldr_to_hdr(stbi_uc *data,
int x,
int y,
int comp);
560 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
563 static unsigned char *stbi_load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
565 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s,x,y,comp,req_comp);
566 if (stbi__png_test(s))
return stbi__png_load(s,x,y,comp,req_comp);
567 if (stbi__bmp_test(s))
return stbi__bmp_load(s,x,y,comp,req_comp);
568 if (stbi__gif_test(s))
return stbi__gif_load(s,x,y,comp,req_comp);
569 if (stbi__psd_test(s))
return stbi__psd_load(s,x,y,comp,req_comp);
570 if (stbi__pic_test(s))
return stbi__pic_load(s,x,y,comp,req_comp);
573 if (stbi__hdr_test(s)) {
574 float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);
575 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
580 if (stbi__tga_test(s))
581 return stbi__tga_load(s,x,y,comp,req_comp);
582 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
585 #ifndef STBI_NO_STDIO 587 FILE *stbi__fopen(
char const *filename,
char const *mode)
590 #if defined(_MSC_VER) && _MSC_VER >= 1400 591 if (0 != fopen_s(&f, filename, mode))
594 f = fopen(filename, mode);
600 STBIDEF
unsigned char *stbi_load(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
602 FILE *f = stbi__fopen(filename,
"rb");
603 unsigned char *result;
604 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
605 result = stbi_load_from_file(f,x,y,comp,req_comp);
610 STBIDEF
unsigned char *stbi_load_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp)
612 unsigned char *result;
614 stbi__start_file(&s,f);
615 result = stbi_load_main(&s,x,y,comp,req_comp);
618 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
624 STBIDEF
unsigned char *stbi_load_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp)
627 stbi__start_mem(&s,buffer,len);
628 return stbi_load_main(&s,x,y,comp,req_comp);
631 unsigned char *stbi_load_from_callbacks(
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp,
int req_comp)
635 return stbi_load_main(&s,x,y,comp,req_comp);
640 float *stbi_loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
644 if (stbi__hdr_test(s))
645 return stbi__hdr_load(s,x,y,comp,req_comp);
647 data = stbi_load_main(s, x, y, comp, req_comp);
649 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
650 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
653 float *stbi_loadf_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp)
656 stbi__start_mem(&s,buffer,len);
657 return stbi_loadf_main(&s,x,y,comp,req_comp);
660 float *stbi_loadf_from_callbacks(
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp,
int req_comp)
664 return stbi_loadf_main(&s,x,y,comp,req_comp);
667 #ifndef STBI_NO_STDIO 668 float *stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
671 FILE *f = stbi__fopen(filename,
"rb");
672 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
673 result = stbi_loadf_from_file(f,x,y,comp,req_comp);
678 float *stbi_loadf_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp)
681 stbi__start_file(&s,f);
682 return stbi_loadf_main(&s,x,y,comp,req_comp);
684 #endif // !STBI_NO_STDIO 686 #endif // !STBI_NO_HDR 692 int stbi_is_hdr_from_memory(stbi_uc
const *buffer,
int len)
696 stbi__start_mem(&s,buffer,len);
697 return stbi__hdr_test(&s);
699 STBI_NOTUSED(buffer);
705 #ifndef STBI_NO_STDIO 706 STBIDEF
int stbi_is_hdr (
char const *filename)
708 FILE *f = stbi__fopen(filename,
"rb");
711 result = stbi_is_hdr_from_file(f);
717 STBIDEF
int stbi_is_hdr_from_file(FILE *f)
721 stbi__start_file(&s,f);
722 return stbi__hdr_test(&s);
727 #endif // !STBI_NO_STDIO 729 STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk,
void *user)
734 return stbi__hdr_test(&s);
741 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
742 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
744 void stbi_hdr_to_ldr_gamma(
float gamma) { stbi__h2l_gamma_i = 1/gamma; }
745 void stbi_hdr_to_ldr_scale(
float scale) { stbi__h2l_scale_i = 1/scale; }
747 void stbi_ldr_to_hdr_gamma(
float gamma) { stbi__l2h_gamma = gamma; }
748 void stbi_ldr_to_hdr_scale(
float scale) { stbi__l2h_scale = scale; }
764 static void stbi__refill_buffer(stbi__context *s)
766 int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
770 s->read_from_callbacks = 0;
771 s->img_buffer = s->buffer_start;
772 s->img_buffer_end = s->buffer_start+1;
775 s->img_buffer = s->buffer_start;
776 s->img_buffer_end = s->buffer_start + n;
780 stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
782 if (s->img_buffer < s->img_buffer_end)
783 return *s->img_buffer++;
784 if (s->read_from_callbacks) {
785 stbi__refill_buffer(s);
786 return *s->img_buffer++;
791 stbi_inline
static int stbi__at_eof(stbi__context *s)
794 if (!(s->io.eof)(s->io_user_data))
return 0;
797 if (s->read_from_callbacks == 0)
return 1;
800 return s->img_buffer >= s->img_buffer_end;
803 static void stbi__skip(stbi__context *s,
int n)
806 int blen = (int) (s->img_buffer_end - s->img_buffer);
808 s->img_buffer = s->img_buffer_end;
809 (s->io.skip)(s->io_user_data, n - blen);
816 static int stbi__getn(stbi__context *s, stbi_uc *buffer,
int n)
819 int blen = (int) (s->img_buffer_end - s->img_buffer);
823 memcpy(buffer, s->img_buffer, blen);
825 count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
826 res = (count == (n-blen));
827 s->img_buffer = s->img_buffer_end;
832 if (s->img_buffer+n <= s->img_buffer_end) {
833 memcpy(buffer, s->img_buffer, n);
840 static int stbi__get16be(stbi__context *s)
842 int z = stbi__get8(s);
843 return (z << 8) + stbi__get8(s);
846 static stbi__uint32 stbi__get32be(stbi__context *s)
848 stbi__uint32 z = stbi__get16be(s);
849 return (z << 16) + stbi__get16be(s);
852 static int stbi__get16le(stbi__context *s)
854 int z = stbi__get8(s);
855 return z + (stbi__get8(s) << 8);
858 static stbi__uint32 stbi__get32le(stbi__context *s)
860 stbi__uint32 z = stbi__get16le(s);
861 return z + (stbi__get16le(s) << 16);
875 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
877 return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
880 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
885 if (req_comp == img_n)
return data;
886 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
888 good = (
unsigned char *) stbi__malloc(req_comp * x * y);
891 return stbi__errpuc(
"outofmem",
"Out of memory");
894 for (j=0; j < (int) y; ++j) {
895 unsigned char *src = data + j * x * img_n ;
896 unsigned char *dest = good + j * x * req_comp;
898 #define COMBO(a,b) ((a)*8+(b)) 899 #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 902 switch (COMBO(img_n, req_comp)) {
903 CASE(1,2) dest[0]=src[0], dest[1]=255;
break;
904 CASE(1,3) dest[0]=dest[1]=dest[2]=src[0];
break;
905 CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255;
break;
906 CASE(2,1) dest[0]=src[0];
break;
907 CASE(2,3) dest[0]=dest[1]=dest[2]=src[0];
break;
908 CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1];
break;
909 CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255;
break;
910 CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]);
break;
911 CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255;
break;
912 CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]);
break;
913 CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3];
break;
914 CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2];
break;
915 default: STBI_ASSERT(0);
925 static float *stbi__ldr_to_hdr(stbi_uc *data,
int x,
int y,
int comp)
928 float *output = (
float *) stbi__malloc(x * y * comp *
sizeof(
float));
929 if (output == NULL) { free(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
931 if (comp & 1) n = comp;
else n = comp-1;
932 for (i=0; i < x*y; ++i) {
933 for (k=0; k < n; ++k) {
934 output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
936 if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
942 #define stbi__float2int(x) ((int) (x)) 943 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
946 stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp);
947 if (output == NULL) { free(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
949 if (comp & 1) n = comp;
else n = comp-1;
950 for (i=0; i < x*y; ++i) {
951 for (k=0; k < n; ++k) {
952 float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
954 if (z > 255) z = 255;
955 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
958 float z = data[i*comp+k] * 255 + 0.5f;
960 if (z > 255) z = 255;
961 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
997 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache 1001 stbi_uc fast[1 << FAST_BITS];
1003 stbi__uint16 code[256];
1004 stbi_uc values[256];
1006 unsigned int maxcode[18];
1013 unsigned short dequant2[4][64];
1016 stbi__huffman huff_dc[4];
1017 stbi__huffman huff_ac[4];
1018 stbi_uc dequant[4][64];
1021 int img_h_max, img_v_max;
1022 int img_mcu_x, img_mcu_y;
1023 int img_mcu_w, img_mcu_h;
1040 stbi__uint32 code_buffer;
1042 unsigned char marker;
1045 int scan_n, order[4];
1046 int restart_interval, todo;
1049 static int stbi__build_huffman(stbi__huffman *h,
int *count)
1053 for (i=0; i < 16; ++i)
1054 for (j=0; j < count[i]; ++j)
1055 h->size[k++] = (stbi_uc) (i+1);
1061 for(j=1; j <= 16; ++j) {
1063 h->delta[j] = k - code;
1064 if (h->size[k] == j) {
1065 while (h->size[k] == j)
1066 h->code[k++] = (stbi__uint16) (code++);
1067 if (code-1 >= (1 << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1070 h->maxcode[j] = code << (16-j);
1073 h->maxcode[j] = 0xffffffff;
1076 memset(h->fast, 255, 1 << FAST_BITS);
1077 for (i=0; i < k; ++i) {
1079 if (s <= FAST_BITS) {
1080 int c = h->code[i] << (FAST_BITS-s);
1081 int m = 1 << (FAST_BITS-s);
1082 for (j=0; j < m; ++j) {
1083 h->fast[c+j] = (stbi_uc) i;
1090 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1093 int b = j->nomore ? 0 : stbi__get8(j->s);
1095 int c = stbi__get8(j->s);
1097 j->marker = (
unsigned char) c;
1102 j->code_buffer |= b << (24 - j->code_bits);
1104 }
while (j->code_bits <= 24);
1108 static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1111 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1116 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1120 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1124 if (s > j->code_bits)
1126 j->code_buffer <<= s;
1128 return h->values[k];
1137 temp = j->code_buffer >> 16;
1138 for (k=FAST_BITS+1 ; ; ++k)
1139 if (temp < h->maxcode[k])
1147 if (k > j->code_bits)
1151 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1152 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1156 j->code_buffer <<= k;
1157 return h->values[c];
1162 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1164 unsigned int m = 1 << (n-1);
1166 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1169 k = stbi_lrot(j->code_buffer, n);
1170 j->code_buffer = k & ~stbi__bmask[n];
1171 k &= stbi__bmask[n];
1174 k = (j->code_buffer >> (32 - n)) & stbi__bmask[n];
1176 j->code_buffer <<= n;
1182 return (-1 << n) + k + 1;
1189 static stbi_uc stbi__jpeg_dezigzag[64+15] =
1191 0, 1, 8, 16, 9, 2, 3, 10,
1192 17, 24, 32, 25, 18, 11, 4, 5,
1193 12, 19, 26, 33, 40, 48, 41, 34,
1194 27, 20, 13, 6, 7, 14, 21, 28,
1195 35, 42, 49, 56, 57, 50, 43, 36,
1196 29, 22, 15, 23, 30, 37, 44, 51,
1197 58, 59, 52, 45, 38, 31, 39, 46,
1198 53, 60, 61, 54, 47, 55, 62, 63,
1200 63, 63, 63, 63, 63, 63, 63, 63,
1201 63, 63, 63, 63, 63, 63, 63
1205 static int stbi__jpeg_decode_block(stbi__jpeg *j,
short data[64], stbi__huffman *hdc, stbi__huffman *hac,
int b)
1208 int t = stbi__jpeg_huff_decode(j, hdc);
1209 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1212 memset(data,0,64*
sizeof(data[0]));
1214 diff = t ? stbi__extend_receive(j, t) : 0;
1215 dc = j->img_comp[b].dc_pred + diff;
1216 j->img_comp[b].dc_pred = dc;
1217 data[0] = (short) dc;
1223 int rs = stbi__jpeg_huff_decode(j, hac);
1224 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1228 if (rs != 0xf0)
break;
1233 data[stbi__jpeg_dezigzag[k++]] = (short) stbi__extend_receive(j,s);
1240 stbi_inline
static stbi_uc stbi__clamp(
int x)
1243 if ((
unsigned int) x > 255) {
1244 if (x < 0)
return 0;
1245 if (x > 255)
return 255;
1250 #define stbi__f2f(x) (int) (((x) * 4096 + 0.5)) 1251 #define stbi__fsh(x) ((x) << 12) 1254 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ 1255 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ 1258 p1 = (p2+p3) * stbi__f2f(0.5411961f); \ 1259 t2 = p1 + p3*stbi__f2f(-1.847759065f); \ 1260 t3 = p1 + p2*stbi__f2f( 0.765366865f); \ 1263 t0 = stbi__fsh(p2+p3); \ 1264 t1 = stbi__fsh(p2-p3); \ 1277 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ 1278 t0 = t0*stbi__f2f( 0.298631336f); \ 1279 t1 = t1*stbi__f2f( 2.053119869f); \ 1280 t2 = t2*stbi__f2f( 3.072711026f); \ 1281 t3 = t3*stbi__f2f( 1.501321110f); \ 1282 p1 = p5 + p1*stbi__f2f(-0.899976223f); \ 1283 p2 = p5 + p2*stbi__f2f(-2.562915447f); \ 1284 p3 = p3*stbi__f2f(-1.961570560f); \ 1285 p4 = p4*stbi__f2f(-0.390180644f); \ 1292 typedef unsigned short stbi_dequantize_t;
1294 typedef stbi_uc stbi_dequantize_t;
1298 static void stbi__idct_block(stbi_uc *out,
int out_stride,
short data[64], stbi_dequantize_t *dequantize)
1300 int i,val[64],*v=val;
1301 stbi_dequantize_t *dq = dequantize;
1306 for (i=0; i < 8; ++i,++d,++dq, ++v) {
1308 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
1309 && d[40]==0 && d[48]==0 && d[56]==0) {
1314 int dcterm = d[0] * dq[0] << 2;
1315 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1317 STBI__IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24],
1318 d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56])
1321 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
1322 v[ 0] = (x0+t3) >> 10;
1323 v[56] = (x0-t3) >> 10;
1324 v[ 8] = (x1+t2) >> 10;
1325 v[48] = (x1-t2) >> 10;
1326 v[16] = (x2+t1) >> 10;
1327 v[40] = (x2-t1) >> 10;
1328 v[24] = (x3+t0) >> 10;
1329 v[32] = (x3-t0) >> 10;
1333 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
1335 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
1342 x0 += 65536 + (128<<17);
1343 x1 += 65536 + (128<<17);
1344 x2 += 65536 + (128<<17);
1345 x3 += 65536 + (128<<17);
1348 o[0] = stbi__clamp((x0+t3) >> 17);
1349 o[7] = stbi__clamp((x0-t3) >> 17);
1350 o[1] = stbi__clamp((x1+t2) >> 17);
1351 o[6] = stbi__clamp((x1-t2) >> 17);
1352 o[2] = stbi__clamp((x2+t1) >> 17);
1353 o[5] = stbi__clamp((x2-t1) >> 17);
1354 o[3] = stbi__clamp((x3+t0) >> 17);
1355 o[4] = stbi__clamp((x3-t0) >> 17);
1360 static stbi_idct_8x8 stbi__idct_installed = stbi__idct_block;
1362 STBIDEF
void stbi_install_idct(stbi_idct_8x8 func)
1364 stbi__idct_installed = func;
1368 #define STBI__MARKER_none 0xff 1372 static stbi_uc stbi__get_marker(stbi__jpeg *j)
1375 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
1376 x = stbi__get8(j->s);
1377 if (x != 0xff)
return STBI__MARKER_none;
1379 x = stbi__get8(j->s);
1385 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) 1389 static void stbi__jpeg_reset(stbi__jpeg *j)
1394 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
1395 j->marker = STBI__MARKER_none;
1396 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
1401 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
1403 stbi__jpeg_reset(z);
1404 if (z->scan_n == 1) {
1407 __declspec(align(16))
1410 int n = z->order[0];
1415 int w = (z->img_comp[n].x+7) >> 3;
1416 int h = (z->img_comp[n].y+7) >> 3;
1417 for (j=0; j < h; ++j) {
1418 for (i=0; i < w; ++i) {
1419 if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n))
return 0;
1421 stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1423 stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1426 if (--z->todo <= 0) {
1427 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
1430 if (!STBI__RESTART(z->marker))
return 1;
1431 stbi__jpeg_reset(z);
1438 for (j=0; j < z->img_mcu_y; ++j) {
1439 for (i=0; i < z->img_mcu_x; ++i) {
1441 for (k=0; k < z->scan_n; ++k) {
1442 int n = z->order[k];
1445 for (y=0; y < z->img_comp[n].v; ++y) {
1446 for (x=0; x < z->img_comp[n].h; ++x) {
1447 int x2 = (i*z->img_comp[n].h + x)*8;
1448 int y2 = (j*z->img_comp[n].v + y)*8;
1449 if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n))
return 0;
1451 stbi__idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1453 stbi__idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1460 if (--z->todo <= 0) {
1461 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
1464 if (!STBI__RESTART(z->marker))
return 1;
1465 stbi__jpeg_reset(z);
1473 static int stbi__process_marker(stbi__jpeg *z,
int m)
1477 case STBI__MARKER_none:
1478 return stbi__err(
"expected marker",
"Corrupt JPEG");
1481 return stbi__err(
"progressive jpeg",
"JPEG format not supported (progressive)");
1484 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
1485 z->restart_interval = stbi__get16be(z->s);
1489 L = stbi__get16be(z->s)-2;
1491 int q = stbi__get8(z->s);
1494 if (p != 0)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
1495 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
1496 for (i=0; i < 64; ++i)
1497 z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
1499 for (i=0; i < 64; ++i)
1500 z->dequant2[t][i] = z->dequant[t][i];
1507 L = stbi__get16be(z->s)-2;
1510 int sizes[16],i,n=0;
1511 int q = stbi__get8(z->s);
1514 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
1515 for (i=0; i < 16; ++i) {
1516 sizes[i] = stbi__get8(z->s);
1521 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
1522 v = z->huff_dc[th].values;
1524 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
1525 v = z->huff_ac[th].values;
1527 for (i=0; i < n; ++i)
1528 v[i] = stbi__get8(z->s);
1534 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
1535 stbi__skip(z->s, stbi__get16be(z->s)-2);
1542 static int stbi__process_scan_header(stbi__jpeg *z)
1545 int Ls = stbi__get16be(z->s);
1546 z->scan_n = stbi__get8(z->s);
1547 if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (
int) z->s->img_n)
return stbi__err(
"bad stbi__SOS component count",
"Corrupt JPEG");
1548 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad stbi__SOS len",
"Corrupt JPEG");
1549 for (i=0; i < z->scan_n; ++i) {
1550 int id = stbi__get8(z->s), which;
1551 int q = stbi__get8(z->s);
1552 for (which = 0; which < z->s->img_n; ++which)
1553 if (z->img_comp[which].id ==
id)
1555 if (which == z->s->img_n)
return 0;
1556 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
1557 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
1558 z->order[i] = which;
1560 if (stbi__get8(z->s) != 0)
return stbi__err(
"bad stbi__SOS",
"Corrupt JPEG");
1562 if (stbi__get8(z->s) != 0)
return stbi__err(
"bad stbi__SOS",
"Corrupt JPEG");
1567 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
1569 stbi__context *s = z->s;
1570 int Lf,p,i,q, h_max=1,v_max=1,c;
1571 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad stbi__SOF len",
"Corrupt JPEG");
1572 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
1573 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
1574 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
1576 if (c != 3 && c != 1)
return stbi__err(
"bad component count",
"Corrupt JPEG");
1578 for (i=0; i < c; ++i) {
1579 z->img_comp[i].data = NULL;
1580 z->img_comp[i].linebuf = NULL;
1583 if (Lf != 8+3*s->img_n)
return stbi__err(
"bad stbi__SOF len",
"Corrupt JPEG");
1585 for (i=0; i < s->img_n; ++i) {
1586 z->img_comp[i].id = stbi__get8(s);
1587 if (z->img_comp[i].id != i+1)
1588 if (z->img_comp[i].id != i)
1589 return stbi__err(
"bad component ID",
"Corrupt JPEG");
1591 z->img_comp[i].h = (q >> 4);
if (!z->img_comp[i].h || z->img_comp[i].h > 4)
return stbi__err(
"bad H",
"Corrupt JPEG");
1592 z->img_comp[i].v = q & 15;
if (!z->img_comp[i].v || z->img_comp[i].v > 4)
return stbi__err(
"bad V",
"Corrupt JPEG");
1593 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
1596 if (scan != SCAN_load)
return 1;
1598 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
1600 for (i=0; i < s->img_n; ++i) {
1601 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
1602 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
1606 z->img_h_max = h_max;
1607 z->img_v_max = v_max;
1608 z->img_mcu_w = h_max * 8;
1609 z->img_mcu_h = v_max * 8;
1610 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
1611 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
1613 for (i=0; i < s->img_n; ++i) {
1615 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
1616 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
1621 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
1622 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
1623 z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
1624 if (z->img_comp[i].raw_data == NULL) {
1625 for(--i; i >= 0; --i) {
1626 free(z->img_comp[i].raw_data);
1627 z->img_comp[i].data = NULL;
1629 return stbi__err(
"outofmem",
"Out of memory");
1632 z->img_comp[i].data = (stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
1633 z->img_comp[i].linebuf = NULL;
1640 #define stbi__DNL(x) ((x) == 0xdc) 1641 #define stbi__SOI(x) ((x) == 0xd8) 1642 #define stbi__EOI(x) ((x) == 0xd9) 1643 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1) 1644 #define stbi__SOS(x) ((x) == 0xda) 1646 static int decode_jpeg_header(stbi__jpeg *z,
int scan)
1649 z->marker = STBI__MARKER_none;
1650 m = stbi__get_marker(z);
1651 if (!stbi__SOI(m))
return stbi__err(
"no stbi__SOI",
"Corrupt JPEG");
1652 if (scan == SCAN_type)
return 1;
1653 m = stbi__get_marker(z);
1654 while (!stbi__SOF(m)) {
1655 if (!stbi__process_marker(z,m))
return 0;
1656 m = stbi__get_marker(z);
1657 while (m == STBI__MARKER_none) {
1659 if (stbi__at_eof(z->s))
return stbi__err(
"no stbi__SOF",
"Corrupt JPEG");
1660 m = stbi__get_marker(z);
1663 if (!stbi__process_frame_header(z, scan))
return 0;
1667 static int decode_jpeg_image(stbi__jpeg *j)
1670 j->restart_interval = 0;
1671 if (!decode_jpeg_header(j, SCAN_load))
return 0;
1672 m = stbi__get_marker(j);
1673 while (!stbi__EOI(m)) {
1675 if (!stbi__process_scan_header(j))
return 0;
1676 if (!stbi__parse_entropy_coded_data(j))
return 0;
1677 if (j->marker == STBI__MARKER_none ) {
1679 while (!stbi__at_eof(j->s)) {
1680 int x = stbi__get8(j->s);
1682 j->marker = stbi__get8(j->s);
1684 }
else if (x != 0) {
1691 if (!stbi__process_marker(j, m))
return 0;
1693 m = stbi__get_marker(j);
1700 typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
1703 #define stbi__div4(x) ((stbi_uc) ((x) >> 2)) 1705 static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
1708 STBI_NOTUSED(in_far);
1714 static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
1719 for (i=0; i < w; ++i)
1720 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
1724 static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
1728 stbi_uc *input = in_near;
1732 out[0] = out[1] = input[0];
1737 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
1738 for (i=1; i < w-1; ++i) {
1739 int n = 3*input[i]+2;
1740 out[i*2+0] = stbi__div4(n+input[i-1]);
1741 out[i*2+1] = stbi__div4(n+input[i+1]);
1743 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
1744 out[i*2+1] = input[w-1];
1746 STBI_NOTUSED(in_far);
1752 #define stbi__div16(x) ((stbi_uc) ((x) >> 4)) 1754 static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
1759 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
1763 t1 = 3*in_near[0] + in_far[0];
1764 out[0] = stbi__div4(t1+2);
1765 for (i=1; i < w; ++i) {
1767 t1 = 3*in_near[i]+in_far[i];
1768 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
1769 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
1771 out[w*2-1] = stbi__div4(t1+2);
1778 static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
1782 STBI_NOTUSED(in_far);
1783 for (i=0; i < w; ++i)
1784 for (j=0; j < hs; ++j)
1785 out[i*hs+j] = in_near[i];
1789 #define float2fixed(x) ((int) ((x) * 65536 + 0.5)) 1793 static void stbi__YCbCr_to_RGB_row(stbi_uc *out,
const stbi_uc *y,
const stbi_uc *pcb,
const stbi_uc *pcr,
int count,
int step)
1796 for (i=0; i < count; ++i) {
1797 int y_fixed = (y[i] << 16) + 32768;
1799 int cr = pcr[i] - 128;
1800 int cb = pcb[i] - 128;
1801 r = y_fixed + cr*float2fixed(1.40200f);
1802 g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
1803 b = y_fixed + cb*float2fixed(1.77200f);
1807 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
1808 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
1809 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
1810 out[0] = (stbi_uc)r;
1811 out[1] = (stbi_uc)g;
1812 out[2] = (stbi_uc)b;
1819 static stbi_YCbCr_to_RGB_run stbi__YCbCr_installed = stbi__YCbCr_to_RGB_row;
1821 STBIDEF
void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func)
1823 stbi__YCbCr_installed = func;
1829 static void stbi__cleanup_jpeg(stbi__jpeg *j)
1832 for (i=0; i < j->s->img_n; ++i) {
1833 if (j->img_comp[i].raw_data) {
1834 free(j->img_comp[i].raw_data);
1835 j->img_comp[i].raw_data = NULL;
1836 j->img_comp[i].data = NULL;
1838 if (j->img_comp[i].linebuf) {
1839 free(j->img_comp[i].linebuf);
1840 j->img_comp[i].linebuf = NULL;
1847 resample_row_func resample;
1848 stbi_uc *line0,*line1;
1855 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
1861 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
1864 if (!decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
1867 n = req_comp ? req_comp : z->s->img_n;
1869 if (z->s->img_n == 3 && n < 3)
1872 decode_n = z->s->img_n;
1879 stbi_uc *coutput[4];
1881 stbi__resample res_comp[4];
1883 for (k=0; k < decode_n; ++k) {
1884 stbi__resample *r = &res_comp[k];
1888 z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
1889 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1891 r->hs = z->img_h_max / z->img_comp[k].h;
1892 r->vs = z->img_v_max / z->img_comp[k].v;
1893 r->ystep = r->vs >> 1;
1894 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
1896 r->line0 = r->line1 = z->img_comp[k].data;
1898 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
1899 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
1900 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
1901 else if (r->hs == 2 && r->vs == 2) r->resample = stbi__resample_row_hv_2;
1902 else r->resample = stbi__resample_row_generic;
1906 output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
1907 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1910 for (j=0; j < z->s->img_y; ++j) {
1911 stbi_uc *out = output + n * z->s->img_x * j;
1912 for (k=0; k < decode_n; ++k) {
1913 stbi__resample *r = &res_comp[k];
1914 int y_bot = r->ystep >= (r->vs >> 1);
1915 coutput[k] = r->resample(z->img_comp[k].linebuf,
1916 y_bot ? r->line1 : r->line0,
1917 y_bot ? r->line0 : r->line1,
1919 if (++r->ystep >= r->vs) {
1921 r->line0 = r->line1;
1922 if (++r->ypos < z->img_comp[k].y)
1923 r->line1 += z->img_comp[k].w2;
1927 stbi_uc *y = coutput[0];
1928 if (z->s->img_n == 3) {
1930 stbi__YCbCr_installed(out, y, coutput[1], coutput[2], z->s->img_x, n);
1932 stbi__YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s->img_x, n);
1935 for (i=0; i < z->s->img_x; ++i) {
1936 out[0] = out[1] = out[2] = y[i];
1941 stbi_uc *y = coutput[0];
1943 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
1945 for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
1948 stbi__cleanup_jpeg(z);
1949 *out_x = z->s->img_x;
1950 *out_y = z->s->img_y;
1951 if (comp) *comp = z->s->img_n;
1956 static unsigned char *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1960 return load_jpeg_image(&j, x,y,comp,req_comp);
1963 static int stbi__jpeg_test(stbi__context *s)
1968 r = decode_jpeg_header(&j, SCAN_type);
1973 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
1975 if (!decode_jpeg_header(j, SCAN_header)) {
1976 stbi__rewind( j->s );
1979 if (x) *x = j->s->img_x;
1980 if (y) *y = j->s->img_y;
1981 if (comp) *comp = j->s->img_n;
1985 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
1989 return stbi__jpeg_info_raw(&j, x, y, comp);
2000 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables 2001 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) 2007 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
2008 stbi__uint16 firstcode[16];
2010 stbi__uint16 firstsymbol[16];
2012 stbi__uint16 value[288];
2015 stbi_inline
static int stbi__bitreverse16(
int n)
2017 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
2018 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
2019 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
2020 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
2024 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
2026 STBI_ASSERT(bits <= 16);
2029 return stbi__bitreverse16(v) >> (16-bits);
2032 static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist,
int num)
2035 int code, next_code[16], sizes[17];
2038 memset(sizes, 0,
sizeof(sizes));
2039 memset(z->fast, 255,
sizeof(z->fast));
2040 for (i=0; i < num; ++i)
2041 ++sizes[sizelist[i]];
2043 for (i=1; i < 16; ++i)
2044 STBI_ASSERT(sizes[i] <= (1 << i));
2046 for (i=1; i < 16; ++i) {
2047 next_code[i] = code;
2048 z->firstcode[i] = (stbi__uint16) code;
2049 z->firstsymbol[i] = (stbi__uint16) k;
2050 code = (code + sizes[i]);
2052 if (code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt JPEG");
2053 z->maxcode[i] = code << (16-i);
2057 z->maxcode[16] = 0x10000;
2058 for (i=0; i < num; ++i) {
2059 int s = sizelist[i];
2061 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
2062 z->size [c] = (stbi_uc ) s;
2063 z->value[c] = (stbi__uint16) i;
2064 if (s <= STBI__ZFAST_BITS) {
2065 int k = stbi__bit_reverse(next_code[s],s);
2066 while (k < (1 << STBI__ZFAST_BITS)) {
2067 z->fast[k] = (stbi__uint16) c;
2085 stbi_uc *zbuffer, *zbuffer_end;
2087 stbi__uint32 code_buffer;
2094 stbi__zhuffman z_length, z_distance;
2097 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
2099 if (z->zbuffer >= z->zbuffer_end)
return 0;
2100 return *z->zbuffer++;
2103 static void stbi__fill_bits(stbi__zbuf *z)
2106 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
2107 z->code_buffer |= stbi__zget8(z) << z->num_bits;
2109 }
while (z->num_bits <= 24);
2112 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
2115 if (z->num_bits < n) stbi__fill_bits(z);
2116 k = z->code_buffer & ((1 << n) - 1);
2117 z->code_buffer >>= n;
2122 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
2125 if (a->num_bits < 16) stbi__fill_bits(a);
2126 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
2129 a->code_buffer >>= s;
2136 k = stbi__bit_reverse(a->code_buffer, 16);
2137 for (s=STBI__ZFAST_BITS+1; ; ++s)
2138 if (k < z->maxcode[s])
2140 if (s == 16)
return -1;
2142 b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
2143 STBI_ASSERT(z->size[b] == s);
2144 a->code_buffer >>= s;
2149 static int stbi__zexpand(stbi__zbuf *z,
int n)
2153 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
2154 cur = (int) (z->zout - z->zout_start);
2155 limit = (int) (z->zout_end - z->zout_start);
2156 while (cur + n > limit)
2158 q = (
char *) realloc(z->zout_start, limit);
2159 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
2162 z->zout_end = q + limit;
2166 static int stbi__zlength_base[31] = {
2167 3,4,5,6,7,8,9,10,11,13,
2168 15,17,19,23,27,31,35,43,51,59,
2169 67,83,99,115,131,163,195,227,258,0,0 };
2171 static int stbi__zlength_extra[31]=
2172 { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
2174 static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
2175 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
2177 static int stbi__zdist_extra[32] =
2178 { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
2180 static int stbi__parse_huffman_block(stbi__zbuf *a)
2183 int z = stbi__zhuffman_decode(a, &a->z_length);
2185 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
2186 if (a->zout >= a->zout_end)
if (!stbi__zexpand(a, 1))
return 0;
2187 *a->zout++ = (char) z;
2191 if (z == 256)
return 1;
2193 len = stbi__zlength_base[z];
2194 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
2195 z = stbi__zhuffman_decode(a, &a->z_distance);
2196 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
2197 dist = stbi__zdist_base[z];
2198 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
2199 if (a->zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
2200 if (a->zout + len > a->zout_end)
if (!stbi__zexpand(a, len))
return 0;
2201 p = (stbi_uc *) (a->zout - dist);
2208 static int stbi__compute_huffman_codes(stbi__zbuf *a)
2210 static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
2211 stbi__zhuffman z_codelength;
2212 stbi_uc lencodes[286+32+137];
2213 stbi_uc codelength_sizes[19];
2216 int hlit = stbi__zreceive(a,5) + 257;
2217 int hdist = stbi__zreceive(a,5) + 1;
2218 int hclen = stbi__zreceive(a,4) + 4;
2220 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
2221 for (i=0; i < hclen; ++i) {
2222 int s = stbi__zreceive(a,3);
2223 codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
2225 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
2228 while (n < hlit + hdist) {
2229 int c = stbi__zhuffman_decode(a, &z_codelength);
2230 STBI_ASSERT(c >= 0 && c < 19);
2232 lencodes[n++] = (stbi_uc) c;
2234 c = stbi__zreceive(a,2)+3;
2235 memset(lencodes+n, lencodes[n-1], c);
2237 }
else if (c == 17) {
2238 c = stbi__zreceive(a,3)+3;
2239 memset(lencodes+n, 0, c);
2242 STBI_ASSERT(c == 18);
2243 c = stbi__zreceive(a,7)+11;
2244 memset(lencodes+n, 0, c);
2248 if (n != hlit+hdist)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
2249 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
2250 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
2254 static int stbi__parse_uncomperssed_block(stbi__zbuf *a)
2258 if (a->num_bits & 7)
2259 stbi__zreceive(a, a->num_bits & 7);
2262 while (a->num_bits > 0) {
2263 header[k++] = (stbi_uc) (a->code_buffer & 255);
2264 a->code_buffer >>= 8;
2267 STBI_ASSERT(a->num_bits == 0);
2270 header[k++] = stbi__zget8(a);
2271 len = header[1] * 256 + header[0];
2272 nlen = header[3] * 256 + header[2];
2273 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
2274 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
2275 if (a->zout + len > a->zout_end)
2276 if (!stbi__zexpand(a, len))
return 0;
2277 memcpy(a->zout, a->zbuffer, len);
2283 static int stbi__parse_zlib_header(stbi__zbuf *a)
2285 int cmf = stbi__zget8(a);
2288 int flg = stbi__zget8(a);
2289 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
2290 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
2291 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
2297 static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
2298 static void stbi__init_zdefaults(
void)
2301 for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
2302 for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
2303 for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
2304 for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
2306 for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
2309 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
2313 if (!stbi__parse_zlib_header(a))
return 0;
2317 final = stbi__zreceive(a,1);
2318 type = stbi__zreceive(a,2);
2320 if (!stbi__parse_uncomperssed_block(a))
return 0;
2321 }
else if (type == 3) {
2326 if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
2327 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288))
return 0;
2328 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
2330 if (!stbi__compute_huffman_codes(a))
return 0;
2332 if (!stbi__parse_huffman_block(a))
return 0;
2338 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
2340 a->zout_start = obuf;
2342 a->zout_end = obuf + olen;
2343 a->z_expandable = exp;
2345 return stbi__parse_zlib(a, parse_header);
2348 STBIDEF
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer,
int len,
int initial_size,
int *outlen)
2351 char *p = (
char *) stbi__malloc(initial_size);
2352 if (p == NULL)
return NULL;
2353 a.zbuffer = (stbi_uc *) buffer;
2354 a.zbuffer_end = (stbi_uc *) buffer + len;
2355 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
2356 if (outlen) *outlen = (int) (a.zout - a.zout_start);
2357 return a.zout_start;
2364 STBIDEF
char *stbi_zlib_decode_malloc(
char const *buffer,
int len,
int *outlen)
2366 return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
2369 STBIDEF
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer,
int len,
int initial_size,
int *outlen,
int parse_header)
2372 char *p = (
char *) stbi__malloc(initial_size);
2373 if (p == NULL)
return NULL;
2374 a.zbuffer = (stbi_uc *) buffer;
2375 a.zbuffer_end = (stbi_uc *) buffer + len;
2376 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
2377 if (outlen) *outlen = (int) (a.zout - a.zout_start);
2378 return a.zout_start;
2385 STBIDEF
int stbi_zlib_decode_buffer(
char *obuffer,
int olen,
char const *ibuffer,
int ilen)
2388 a.zbuffer = (stbi_uc *) ibuffer;
2389 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
2390 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
2391 return (
int) (a.zout - a.zout_start);
2396 STBIDEF
char *stbi_zlib_decode_noheader_malloc(
char const *buffer,
int len,
int *outlen)
2399 char *p = (
char *) stbi__malloc(16384);
2400 if (p == NULL)
return NULL;
2401 a.zbuffer = (stbi_uc *) buffer;
2402 a.zbuffer_end = (stbi_uc *) buffer+len;
2403 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
2404 if (outlen) *outlen = (int) (a.zout - a.zout_start);
2405 return a.zout_start;
2412 STBIDEF
int stbi_zlib_decode_noheader_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen)
2415 a.zbuffer = (stbi_uc *) ibuffer;
2416 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
2417 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
2418 return (
int) (a.zout - a.zout_start);
2436 stbi__uint32 length;
2440 #define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) 2442 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
2445 c.length = stbi__get32be(s);
2446 c.type = stbi__get32be(s);
2450 static int stbi__check_png_header(stbi__context *s)
2452 static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
2454 for (i=0; i < 8; ++i)
2455 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
2462 stbi_uc *idata, *expanded, *out;
2467 STBI__F_none=0, STBI__F_sub=1, STBI__F_up=2, STBI__F_avg=3, STBI__F_paeth=4,
2468 STBI__F_avg_first, STBI__F_paeth_first
2471 static stbi_uc first_row_filter[5] =
2473 STBI__F_none, STBI__F_sub, STBI__F_none, STBI__F_avg_first, STBI__F_paeth_first
2476 static int stbi__paeth(
int a,
int b,
int c)
2482 if (pa <= pb && pa <= pc)
return a;
2483 if (pb <= pc)
return b;
2487 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings 2490 static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len,
int out_n, stbi__uint32 x, stbi__uint32 y)
2492 stbi__context *s = a->s;
2493 stbi__uint32 i,j,stride = x*out_n;
2495 int img_n = s->img_n;
2496 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
2497 a->out = (stbi_uc *) stbi__malloc(x * y * out_n);
2498 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
2499 if (s->img_x == x && s->img_y == y) {
2500 if (raw_len != (img_n * x + 1) * y)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
2502 if (raw_len < (img_n * x + 1) * y)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
2504 for (j=0; j < y; ++j) {
2505 stbi_uc *cur = a->out + stride*j;
2506 stbi_uc *prior = cur - stride;
2507 int filter = *raw++;
2508 if (filter > 4)
return stbi__err(
"invalid filter",
"Corrupt PNG");
2510 if (j == 0) filter = first_row_filter[filter];
2512 for (k=0; k < img_n; ++k) {
2514 case STBI__F_none : cur[k] = raw[k];
break;
2515 case STBI__F_sub : cur[k] = raw[k];
break;
2516 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
2517 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
2518 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
2519 case STBI__F_avg_first : cur[k] = raw[k];
break;
2520 case STBI__F_paeth_first: cur[k] = raw[k];
break;
2523 if (img_n != out_n) cur[img_n] = 255;
2528 if (img_n == out_n) {
2531 for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \ 2532 for (k=0; k < img_n; ++k) 2534 CASE(STBI__F_none) cur[k] = raw[k];
break;
2535 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-img_n]);
break;
2536 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
2537 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-img_n])>>1));
break;
2538 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-img_n],prior[k],prior[k-img_n]));
break;
2539 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-img_n] >> 1));
break;
2540 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-img_n],0,0));
break;
2544 STBI_ASSERT(img_n+1 == out_n);
2547 for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ 2548 for (k=0; k < img_n; ++k) 2550 CASE(STBI__F_none) cur[k] = raw[k];
break;
2551 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]);
break;
2552 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
2553 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1));
break;
2554 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n]));
break;
2555 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1));
break;
2556 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0));
break;
2564 static int stbi__create_png_image(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len,
int out_n,
int interlaced)
2569 return stbi__create_png_image_raw(a, raw, raw_len, out_n, a->s->img_x, a->s->img_y);
2572 final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
2573 for (p=0; p < 7; ++p) {
2574 int xorig[] = { 0,4,0,2,0,1,0 };
2575 int yorig[] = { 0,0,4,0,2,0,1 };
2576 int xspc[] = { 8,8,4,4,2,2,1 };
2577 int yspc[] = { 8,8,8,4,4,2,2 };
2580 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
2581 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
2583 if (!stbi__create_png_image_raw(a, raw, raw_len, out_n, x, y)) {
2587 for (j=0; j < y; ++j)
2588 for (i=0; i < x; ++i)
2589 memcpy(
final + (j*yspc[p]+yorig[p])*a->s->img_x*out_n + (i*xspc[p]+xorig[p])*out_n,
2590 a->out + (j*x+i)*out_n, out_n);
2592 raw += (x*out_n+1)*y;
2593 raw_len -= (x*out_n+1)*y;
2601 static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3],
int out_n)
2603 stbi__context *s = z->s;
2604 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
2605 stbi_uc *p = z->out;
2609 STBI_ASSERT(out_n == 2 || out_n == 4);
2612 for (i=0; i < pixel_count; ++i) {
2613 p[1] = (p[0] == tc[0] ? 0 : 255);
2617 for (i=0; i < pixel_count; ++i) {
2618 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
2626 static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette,
int len,
int pal_img_n)
2628 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
2629 stbi_uc *p, *temp_out, *orig = a->out;
2631 p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
2632 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
2637 if (pal_img_n == 3) {
2638 for (i=0; i < pixel_count; ++i) {
2641 p[1] = palette[n+1];
2642 p[2] = palette[n+2];
2646 for (i=0; i < pixel_count; ++i) {
2649 p[1] = palette[n+1];
2650 p[2] = palette[n+2];
2651 p[3] = palette[n+3];
2663 static int stbi__unpremultiply_on_load = 0;
2664 static int stbi__de_iphone_flag = 0;
2666 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply)
2668 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
2671 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert)
2673 stbi__de_iphone_flag = flag_true_if_should_convert;
2676 static void stbi__de_iphone(stbi__png *z)
2678 stbi__context *s = z->s;
2679 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
2680 stbi_uc *p = z->out;
2682 if (s->img_out_n == 3) {
2683 for (i=0; i < pixel_count; ++i) {
2690 STBI_ASSERT(s->img_out_n == 4);
2691 if (stbi__unpremultiply_on_load) {
2693 for (i=0; i < pixel_count; ++i) {
2697 p[0] = p[2] * 255 / a;
2698 p[1] = p[1] * 255 / a;
2708 for (i=0; i < pixel_count; ++i) {
2718 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
2720 stbi_uc palette[1024], pal_img_n=0;
2721 stbi_uc has_trans=0, tc[3];
2722 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
2723 int first=1,k,interlace=0, is_iphone=0;
2724 stbi__context *s = z->s;
2730 if (!stbi__check_png_header(s))
return 0;
2732 if (scan == SCAN_type)
return 1;
2735 stbi__pngchunk c = stbi__get_chunk_header(s);
2737 case PNG_TYPE(
'C',
'g',
'B',
'I'):
2739 stbi__skip(s, c.length);
2741 case PNG_TYPE(
'I',
'H',
'D',
'R'): {
2742 int depth,color,comp,filter;
2743 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
2745 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
2746 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
2747 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
2748 depth = stbi__get8(s);
if (depth != 8)
return stbi__err(
"8bit only",
"PNG not supported: 8-bit only");
2749 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
2750 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
2751 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
2752 filter= stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
2753 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
2754 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
2756 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
2757 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
2758 if (scan == SCAN_header)
return 1;
2763 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
2769 case PNG_TYPE(
'P',
'L',
'T',
'E'): {
2770 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
2771 if (c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
2772 pal_len = c.length / 3;
2773 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
2774 for (i=0; i < pal_len; ++i) {
2775 palette[i*4+0] = stbi__get8(s);
2776 palette[i*4+1] = stbi__get8(s);
2777 palette[i*4+2] = stbi__get8(s);
2778 palette[i*4+3] = 255;
2783 case PNG_TYPE(
't',
'R',
'N',
'S'): {
2784 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
2785 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
2787 if (scan == SCAN_header) { s->img_n = 4;
return 1; }
2788 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
2789 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
2791 for (i=0; i < c.length; ++i)
2792 palette[i*4+3] = stbi__get8(s);
2794 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
2795 if (c.length != (stbi__uint32) s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
2797 for (k=0; k < s->img_n; ++k)
2798 tc[k] = (stbi_uc) (stbi__get16be(s) & 255);
2803 case PNG_TYPE(
'I',
'D',
'A',
'T'): {
2804 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
2805 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
2806 if (scan == SCAN_header) { s->img_n = pal_img_n;
return 1; }
2807 if (ioff + c.length > idata_limit) {
2809 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
2810 while (ioff + c.length > idata_limit)
2812 p = (stbi_uc *) realloc(z->idata, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
2815 if (!stbi__getn(s, z->idata+ioff,c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
2820 case PNG_TYPE(
'I',
'E',
'N',
'D'): {
2821 stbi__uint32 raw_len;
2822 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
2823 if (scan != SCAN_load)
return 1;
2824 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
2825 z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((
char *) z->idata, ioff, 16384, (
int *) &raw_len, !is_iphone);
2826 if (z->expanded == NULL)
return 0;
2827 free(z->idata); z->idata = NULL;
2828 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
2829 s->img_out_n = s->img_n+1;
2831 s->img_out_n = s->img_n;
2832 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace))
return 0;
2834 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
2835 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
2839 s->img_n = pal_img_n;
2840 s->img_out_n = pal_img_n;
2841 if (req_comp >= 3) s->img_out_n = req_comp;
2842 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
2845 free(z->expanded); z->expanded = NULL;
2851 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
2852 if ((c.type & (1 << 29)) == 0) {
2853 #ifndef STBI_NO_FAILURE_STRINGS 2855 static char invalid_chunk[] =
"XXXX PNG chunk not known";
2856 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
2857 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
2858 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
2859 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
2861 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
2863 stbi__skip(s, c.length);
2871 static unsigned char *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp)
2873 unsigned char *result=NULL;
2874 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
2875 if (stbi__parse_png_file(p, SCAN_load, req_comp)) {
2878 if (req_comp && req_comp != p->s->img_out_n) {
2879 result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
2880 p->s->img_out_n = req_comp;
2881 if (result == NULL)
return result;
2885 if (n) *n = p->s->img_out_n;
2887 free(p->out); p->out = NULL;
2888 free(p->expanded); p->expanded = NULL;
2889 free(p->idata); p->idata = NULL;
2894 static unsigned char *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
2898 return stbi__do_png(&p, x,y,comp,req_comp);
2901 static int stbi__png_test(stbi__context *s)
2904 r = stbi__check_png_header(s);
2909 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
2911 if (!stbi__parse_png_file(p, SCAN_header, 0)) {
2912 stbi__rewind( p->s );
2915 if (x) *x = p->s->img_x;
2916 if (y) *y = p->s->img_y;
2917 if (comp) *comp = p->s->img_n;
2921 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
2925 return stbi__png_info_raw(&p, x, y, comp);
2929 static int stbi__bmp_test_raw(stbi__context *s)
2933 if (stbi__get8(s) !=
'B')
return 0;
2934 if (stbi__get8(s) !=
'M')
return 0;
2939 sz = stbi__get32le(s);
2940 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
2944 static int stbi__bmp_test(stbi__context *s)
2946 int r = stbi__bmp_test_raw(s);
2953 static int stbi__high_bit(
unsigned int z)
2956 if (z == 0)
return -1;
2957 if (z >= 0x10000) n += 16, z >>= 16;
2958 if (z >= 0x00100) n += 8, z >>= 8;
2959 if (z >= 0x00010) n += 4, z >>= 4;
2960 if (z >= 0x00004) n += 2, z >>= 2;
2961 if (z >= 0x00002) n += 1, z >>= 1;
2965 static int stbi__bitcount(
unsigned int a)
2967 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
2968 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
2969 a = (a + (a >> 4)) & 0x0f0f0f0f;
2971 a = (a + (a >> 16));
2975 static int stbi__shiftsigned(
int v,
int shift,
int bits)
2980 if (shift < 0) v <<= -shift;
2992 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
2995 unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0;
2996 stbi_uc pal[256][4];
2997 int psize=0,i,j,compress=0,width;
2998 int bpp, flip_vertically, pad, target, offset, hsz;
2999 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
3003 offset = stbi__get32le(s);
3004 hsz = stbi__get32le(s);
3005 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
3007 s->img_x = stbi__get16le(s);
3008 s->img_y = stbi__get16le(s);
3010 s->img_x = stbi__get32le(s);
3011 s->img_y = stbi__get32le(s);
3013 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
3014 bpp = stbi__get16le(s);
3015 if (bpp == 1)
return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
3016 flip_vertically = ((int) s->img_y) > 0;
3017 s->img_y = abs((
int) s->img_y);
3020 psize = (offset - 14 - 24) / 3;
3022 compress = stbi__get32le(s);
3023 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
3029 if (hsz == 40 || hsz == 56) {
3036 if (bpp == 16 || bpp == 32) {
3038 if (compress == 0) {
3045 STBI_NOTUSED(fake_a);
3051 }
else if (compress == 3) {
3052 mr = stbi__get32le(s);
3053 mg = stbi__get32le(s);
3054 mb = stbi__get32le(s);
3056 if (mr == mg && mg == mb) {
3058 return stbi__errpuc(
"bad BMP",
"bad BMP");
3061 return stbi__errpuc(
"bad BMP",
"bad BMP");
3064 STBI_ASSERT(hsz == 108 || hsz == 124);
3065 mr = stbi__get32le(s);
3066 mg = stbi__get32le(s);
3067 mb = stbi__get32le(s);
3068 ma = stbi__get32le(s);
3070 for (i=0; i < 12; ++i)
3080 psize = (offset - 14 - hsz) >> 2;
3082 s->img_n = ma ? 4 : 3;
3083 if (req_comp && req_comp >= 3)
3087 out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);
3088 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
3091 if (psize == 0 || psize > 256) { free(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
3092 for (i=0; i < psize; ++i) {
3093 pal[i][2] = stbi__get8(s);
3094 pal[i][1] = stbi__get8(s);
3095 pal[i][0] = stbi__get8(s);
3096 if (hsz != 12) stbi__get8(s);
3099 stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
3100 if (bpp == 4) width = (s->img_x + 1) >> 1;
3101 else if (bpp == 8) width = s->img_x;
3102 else { free(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
3104 for (j=0; j < (int) s->img_y; ++j) {
3105 for (i=0; i < (int) s->img_x; i += 2) {
3106 int v=stbi__get8(s),v2=0;
3111 out[z++] = pal[v][0];
3112 out[z++] = pal[v][1];
3113 out[z++] = pal[v][2];
3114 if (target == 4) out[z++] = 255;
3115 if (i+1 == (
int) s->img_x)
break;
3116 v = (bpp == 8) ? stbi__get8(s) : v2;
3117 out[z++] = pal[v][0];
3118 out[z++] = pal[v][1];
3119 out[z++] = pal[v][2];
3120 if (target == 4) out[z++] = 255;
3125 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
3128 stbi__skip(s, offset - 14 - hsz);
3129 if (bpp == 24) width = 3 * s->img_x;
3130 else if (bpp == 16) width = 2*s->img_x;
3135 }
else if (bpp == 32) {
3136 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
3140 if (!mr || !mg || !mb) { free(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
3142 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
3143 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
3144 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
3145 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
3147 for (j=0; j < (int) s->img_y; ++j) {
3149 for (i=0; i < (int) s->img_x; ++i) {
3151 out[z+2] = stbi__get8(s);
3152 out[z+1] = stbi__get8(s);
3153 out[z+0] = stbi__get8(s);
3155 a = (easy == 2 ? stbi__get8(s) : 255);
3156 if (target == 4) out[z++] = a;
3159 for (i=0; i < (int) s->img_x; ++i) {
3160 stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s));
3162 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
3163 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
3164 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
3165 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
3166 if (target == 4) out[z++] = STBI__BYTECAST(a);
3172 if (flip_vertically) {
3174 for (j=0; j < (int) s->img_y>>1; ++j) {
3175 stbi_uc *p1 = out + j *s->img_x*target;
3176 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
3177 for (i=0; i < (int) s->img_x*target; ++i) {
3178 t = p1[i], p1[i] = p2[i], p2[i] = t;
3183 if (req_comp && req_comp != target) {
3184 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
3185 if (out == NULL)
return out;
3190 if (comp) *comp = s->img_n;
3197 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
3199 int tga_w, tga_h, tga_comp;
3209 if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11))
return 0;
3211 tga_w = stbi__get16le(s);
3216 tga_h = stbi__get16le(s);
3223 if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
3230 if (comp) *comp = tga_comp / 8;
3234 static int stbi__tga_test(stbi__context *s)
3240 if ( sz > 1 )
return 0;
3242 if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) )
return 0;
3248 if ( stbi__get16be(s) < 1 )
return 0;
3249 if ( stbi__get16be(s) < 1 )
return 0;
3251 if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )
3259 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
3262 int tga_offset = stbi__get8(s);
3263 int tga_indexed = stbi__get8(s);
3264 int tga_image_type = stbi__get8(s);
3266 int tga_palette_start = stbi__get16le(s);
3267 int tga_palette_len = stbi__get16le(s);
3268 int tga_palette_bits = stbi__get8(s);
3269 int tga_x_origin = stbi__get16le(s);
3270 int tga_y_origin = stbi__get16le(s);
3271 int tga_width = stbi__get16le(s);
3272 int tga_height = stbi__get16le(s);
3273 int tga_bits_per_pixel = stbi__get8(s);
3274 int tga_comp = tga_bits_per_pixel / 8;
3275 int tga_inverted = stbi__get8(s);
3277 unsigned char *tga_data;
3278 unsigned char *tga_palette = NULL;
3280 unsigned char raw_data[4];
3282 int RLE_repeating = 0;
3283 int read_next_pixel = 1;
3286 if ( tga_image_type >= 8 )
3288 tga_image_type -= 8;
3292 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
3296 (tga_width < 1) || (tga_height < 1) ||
3297 (tga_image_type < 1) || (tga_image_type > 3) ||
3298 ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
3299 (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
3308 tga_comp = tga_palette_bits / 8;
3314 if (comp) *comp = tga_comp;
3316 tga_data = (
unsigned char*)stbi__malloc( tga_width * tga_height * tga_comp );
3317 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
3320 stbi__skip(s, tga_offset );
3322 if ( !tga_indexed && !tga_is_RLE) {
3323 for (i=0; i < tga_height; ++i) {
3324 int y = tga_inverted ? tga_height -i - 1 : i;
3325 stbi_uc *tga_row = tga_data + y*tga_width*tga_comp;
3326 stbi__getn(s, tga_row, tga_width * tga_comp);
3333 stbi__skip(s, tga_palette_start );
3335 tga_palette = (
unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );
3338 return stbi__errpuc(
"outofmem",
"Out of memory");
3340 if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
3343 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
3347 for (i=0; i < tga_width * tga_height; ++i)
3352 if ( RLE_count == 0 )
3355 int RLE_cmd = stbi__get8(s);
3356 RLE_count = 1 + (RLE_cmd & 127);
3357 RLE_repeating = RLE_cmd >> 7;
3358 read_next_pixel = 1;
3359 }
else if ( !RLE_repeating )
3361 read_next_pixel = 1;
3365 read_next_pixel = 1;
3368 if ( read_next_pixel )
3374 int pal_idx = stbi__get8(s);
3375 if ( pal_idx >= tga_palette_len )
3380 pal_idx *= tga_bits_per_pixel / 8;
3381 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
3383 raw_data[j] = tga_palette[pal_idx+j];
3388 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
3390 raw_data[j] = stbi__get8(s);
3394 read_next_pixel = 0;
3398 for (j = 0; j < tga_comp; ++j)
3399 tga_data[i*tga_comp+j] = raw_data[j];
3407 for (j = 0; j*2 < tga_height; ++j)
3409 int index1 = j * tga_width * tga_comp;
3410 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
3411 for (i = tga_width * tga_comp; i > 0; --i)
3413 unsigned char temp = tga_data[index1];
3414 tga_data[index1] = tga_data[index2];
3415 tga_data[index2] = temp;
3422 if ( tga_palette != NULL )
3424 free( tga_palette );
3431 unsigned char* tga_pixel = tga_data;
3432 for (i=0; i < tga_width * tga_height; ++i)
3434 unsigned char temp = tga_pixel[0];
3435 tga_pixel[0] = tga_pixel[2];
3436 tga_pixel[2] = temp;
3437 tga_pixel += tga_comp;
3442 if (req_comp && req_comp != tga_comp)
3443 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
3447 tga_palette_start = tga_palette_len = tga_palette_bits =
3448 tga_x_origin = tga_y_origin = 0;
3456 static int stbi__psd_test(stbi__context *s)
3458 int r = (stbi__get32be(s) == 0x38425053);
3463 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
3466 int channelCount, compression;
3467 int channel, i, count, len;
3472 if (stbi__get32be(s) != 0x38425053)
3473 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
3476 if (stbi__get16be(s) != 1)
3477 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
3483 channelCount = stbi__get16be(s);
3484 if (channelCount < 0 || channelCount > 16)
3485 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
3488 h = stbi__get32be(s);
3489 w = stbi__get32be(s);
3492 if (stbi__get16be(s) != 8)
3493 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 bit");
3505 if (stbi__get16be(s) != 3)
3506 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
3509 stbi__skip(s,stbi__get32be(s) );
3512 stbi__skip(s, stbi__get32be(s) );
3515 stbi__skip(s, stbi__get32be(s) );
3521 compression = stbi__get16be(s);
3522 if (compression > 1)
3523 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
3526 out = (stbi_uc *) stbi__malloc(4 * w*h);
3527 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
3545 stbi__skip(s, h * channelCount * 2 );
3548 for (channel = 0; channel < 4; channel++) {
3552 if (channel >= channelCount) {
3554 for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;
3558 while (count < pixelCount) {
3559 len = stbi__get8(s);
3562 }
else if (len < 128) {
3571 }
else if (len > 128) {
3577 val = stbi__get8(s);
3594 for (channel = 0; channel < 4; channel++) {
3598 if (channel > channelCount) {
3600 for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;
3603 for (i = 0; i < pixelCount; i++)
3604 *p = stbi__get8(s), p += 4;
3609 if (req_comp && req_comp != 4) {
3610 out = stbi__convert_format(out, 4, req_comp, w, h);
3611 if (out == NULL)
return out;
3614 if (comp) *comp = channelCount;
3628 static int stbi__pic_is4(stbi__context *s,
const char *str)
3632 if (stbi__get8(s) != (stbi_uc)str[i])
3638 static int stbi__pic_test_core(stbi__context *s)
3642 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
3648 if (!stbi__pic_is4(s,
"PICT"))
3656 stbi_uc size,type,channel;
3659 static stbi_uc *stbi__readval(stbi__context *s,
int channel, stbi_uc *dest)
3663 for (i=0; i<4; ++i, mask>>=1) {
3664 if (channel & mask) {
3665 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
3666 dest[i]=stbi__get8(s);
3673 static void stbi__copyval(
int channel,stbi_uc *dest,
const stbi_uc *src)
3677 for (i=0;i<4; ++i, mask>>=1)
3682 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp, stbi_uc *result)
3684 int act_comp=0,num_packets=0,y,chained;
3685 stbi__pic_packet packets[10];
3690 stbi__pic_packet *packet;
3692 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
3693 return stbi__errpuc(
"bad format",
"too many packets");
3695 packet = &packets[num_packets++];
3697 chained = stbi__get8(s);
3698 packet->size = stbi__get8(s);
3699 packet->type = stbi__get8(s);
3700 packet->channel = stbi__get8(s);
3702 act_comp |= packet->channel;
3704 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
3705 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
3708 *comp = (act_comp & 0x10 ? 4 : 3);
3710 for(y=0; y<height; ++y) {
3713 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
3714 stbi__pic_packet *packet = &packets[packet_idx];
3715 stbi_uc *dest = result+y*width*4;
3717 switch (packet->type) {
3719 return stbi__errpuc(
"bad format",
"packet has bad compression type");
3724 for(x=0;x<width;++x, dest+=4)
3725 if (!stbi__readval(s,packet->channel,dest))
3735 stbi_uc count,value[4];
3737 count=stbi__get8(s);
3738 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
3741 count = (stbi_uc) left;
3743 if (!stbi__readval(s,packet->channel,value))
return 0;
3745 for(i=0; i<count; ++i,dest+=4)
3746 stbi__copyval(packet->channel,dest,value);
3755 int count = stbi__get8(s), i;
3756 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
3763 count = stbi__get16be(s);
3767 return stbi__errpuc(
"bad file",
"scanline overrun");
3769 if (!stbi__readval(s,packet->channel,value))
3772 for(i=0;i<count;++i, dest += 4)
3773 stbi__copyval(packet->channel,dest,value);
3776 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
3778 for(i=0;i<count;++i, dest+=4)
3779 if (!stbi__readval(s,packet->channel,dest))
3793 static stbi_uc *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp)
3798 for (i=0; i<92; ++i)
3801 x = stbi__get16be(s);
3802 y = stbi__get16be(s);
3803 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
3804 if ((1 << 28) / x < y)
return stbi__errpuc(
"too large",
"Image too large to decode");
3811 result = (stbi_uc *) stbi__malloc(x*y*4);
3812 memset(result, 0xff, x*y*4);
3814 if (!stbi__pic_load_core(s,x,y,comp, result)) {
3820 if (req_comp == 0) req_comp = *comp;
3821 result=stbi__convert_format(result,4,req_comp,x,y);
3826 static int stbi__pic_test(stbi__context *s)
3828 int r = stbi__pic_test_core(s);
3846 int flags, bgindex, ratio, transparent, eflags;
3847 stbi_uc pal[256][4];
3848 stbi_uc lpal[256][4];
3849 stbi__gif_lzw codes[4096];
3850 stbi_uc *color_table;
3853 int start_x, start_y;
3859 static int stbi__gif_test_raw(stbi__context *s)
3862 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
3864 if (sz !=
'9' && sz !=
'7')
return 0;
3865 if (stbi__get8(s) !=
'a')
return 0;
3869 static int stbi__gif_test(stbi__context *s)
3871 int r = stbi__gif_test_raw(s);
3876 static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4],
int num_entries,
int transp)
3879 for (i=0; i < num_entries; ++i) {
3880 pal[i][2] = stbi__get8(s);
3881 pal[i][1] = stbi__get8(s);
3882 pal[i][0] = stbi__get8(s);
3883 pal[i][3] = transp ? 0 : 255;
3887 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
3890 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
3891 return stbi__err(
"not GIF",
"Corrupt GIF");
3893 version = stbi__get8(s);
3894 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
3895 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
3897 stbi__g_failure_reason =
"";
3898 g->w = stbi__get16le(s);
3899 g->h = stbi__get16le(s);
3900 g->flags = stbi__get8(s);
3901 g->bgindex = stbi__get8(s);
3902 g->ratio = stbi__get8(s);
3903 g->transparent = -1;
3905 if (comp != 0) *comp = 4;
3907 if (is_info)
return 1;
3909 if (g->flags & 0x80)
3910 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
3915 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
3918 if (!stbi__gif_header(s, &g, comp, 1)) {
3927 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
3933 if (g->codes[code].prefix >= 0)
3934 stbi__out_gif_code(g, g->codes[code].prefix);
3936 if (g->cur_y >= g->max_y)
return;
3938 p = &g->out[g->cur_x + g->cur_y];
3939 c = &g->color_table[g->codes[code].suffix * 4];
3949 if (g->cur_x >= g->max_x) {
3950 g->cur_x = g->start_x;
3951 g->cur_y += g->step;
3953 while (g->cur_y >= g->max_y && g->parse > 0) {
3954 g->step = (1 << g->parse) * g->line_size;
3955 g->cur_y = g->start_y + (g->step >> 1);
3961 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
3964 stbi__int32 len, code;
3966 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
3969 lzw_cs = stbi__get8(s);
3970 clear = 1 << lzw_cs;
3972 codesize = lzw_cs + 1;
3973 codemask = (1 << codesize) - 1;
3976 for (code = 0; code < clear; code++) {
3977 g->codes[code].prefix = -1;
3978 g->codes[code].first = (stbi_uc) code;
3979 g->codes[code].suffix = (stbi_uc) code;
3988 if (valid_bits < codesize) {
3990 len = stbi__get8(s);
3995 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
3998 stbi__int32 code = bits & codemask;
4000 valid_bits -= codesize;
4002 if (code == clear) {
4003 codesize = lzw_cs + 1;
4004 codemask = (1 << codesize) - 1;
4008 }
else if (code == clear + 1) {
4010 while ((len = stbi__get8(s)) > 0)
4013 }
else if (code <= avail) {
4014 if (first)
return stbi__errpuc(
"no clear code",
"Corrupt GIF");
4017 p = &g->codes[avail++];
4018 if (avail > 4096)
return stbi__errpuc(
"too many codes",
"Corrupt GIF");
4019 p->prefix = (stbi__int16) oldcode;
4020 p->first = g->codes[oldcode].first;
4021 p->suffix = (code == avail) ? p->first : g->codes[code].first;
4022 }
else if (code == avail)
4023 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
4025 stbi__out_gif_code(g, (stbi__uint16) code);
4027 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
4029 codemask = (1 << codesize) - 1;
4034 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
4040 static void stbi__fill_gif_background(stbi__gif *g)
4043 stbi_uc *c = g->pal[g->bgindex];
4045 for (i = 0; i < g->w * g->h * 4; i += 4) {
4046 stbi_uc *p = &g->out[i];
4055 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp)
4058 stbi_uc *old_out = 0;
4061 if (!stbi__gif_header(s, g, comp,0))
return 0;
4062 g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
4063 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
4064 stbi__fill_gif_background(g);
4067 if (((g->eflags & 0x1C) >> 2) == 3) {
4069 g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
4070 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
4071 memcpy(g->out, old_out, g->w*g->h*4);
4076 switch (stbi__get8(s)) {
4079 stbi__int32 x, y, w, h;
4082 x = stbi__get16le(s);
4083 y = stbi__get16le(s);
4084 w = stbi__get16le(s);
4085 h = stbi__get16le(s);
4086 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
4087 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
4089 g->line_size = g->w * 4;
4091 g->start_y = y * g->line_size;
4092 g->max_x = g->start_x + w * 4;
4093 g->max_y = g->start_y + h * g->line_size;
4094 g->cur_x = g->start_x;
4095 g->cur_y = g->start_y;
4097 g->lflags = stbi__get8(s);
4099 if (g->lflags & 0x40) {
4100 g->step = 8 * g->line_size;
4103 g->step = g->line_size;
4107 if (g->lflags & 0x80) {
4108 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
4109 g->color_table = (stbi_uc *) g->lpal;
4110 }
else if (g->flags & 0x80) {
4111 for (i=0; i < 256; ++i)
4113 if (g->transparent >= 0 && (g->eflags & 0x01))
4114 g->pal[g->transparent][3] = 0;
4115 g->color_table = (stbi_uc *) g->pal;
4117 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
4119 o = stbi__process_gif_raster(s, g);
4120 if (o == NULL)
return NULL;
4122 if (req_comp && req_comp != 4)
4123 o = stbi__convert_format(o, 4, req_comp, g->w, g->h);
4130 if (stbi__get8(s) == 0xF9) {
4131 len = stbi__get8(s);
4133 g->eflags = stbi__get8(s);
4135 g->transparent = stbi__get8(s);
4141 while ((len = stbi__get8(s)) != 0)
4147 return (stbi_uc *) s;
4150 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
4155 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4159 memset(&g, 0,
sizeof(g));
4161 u = stbi__gif_load_next(s, &g, comp, req_comp);
4162 if (u == (stbi_uc *) s) u = 0;
4171 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
4173 return stbi__gif_info_raw(s,x,y,comp);
4181 static int stbi__hdr_test_core(stbi__context *s)
4183 const char *signature =
"#?RADIANCE\n";
4185 for (i=0; signature[i]; ++i)
4186 if (stbi__get8(s) != signature[i])
4191 static int stbi__hdr_test(stbi__context* s)
4193 int r = stbi__hdr_test_core(s);
4198 #define STBI__HDR_BUFLEN 1024 4199 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
4204 c = (char) stbi__get8(z);
4206 while (!stbi__at_eof(z) && c !=
'\n') {
4208 if (len == STBI__HDR_BUFLEN-1) {
4210 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
4214 c = (char) stbi__get8(z);
4221 static void stbi__hdr_convert(
float *output, stbi_uc *input,
int req_comp)
4223 if ( input[3] != 0 ) {
4226 f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
4228 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
4230 output[0] = input[0] * f1;
4231 output[1] = input[1] * f1;
4232 output[2] = input[2] * f1;
4234 if (req_comp == 2) output[1] = 1;
4235 if (req_comp == 4) output[3] = 1;
4238 case 4: output[3] = 1;
4239 case 3: output[0] = output[1] = output[2] = 0;
4241 case 2: output[1] = 1;
4242 case 1: output[0] = 0;
4248 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4250 char buffer[STBI__HDR_BUFLEN];
4257 unsigned char count, value;
4258 int i, j, k, c1,c2, z;
4262 if (strcmp(stbi__hdr_gettoken(s,buffer),
"#?RADIANCE") != 0)
4263 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
4267 token = stbi__hdr_gettoken(s,buffer);
4268 if (token[0] == 0)
break;
4269 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
4272 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
4276 token = stbi__hdr_gettoken(s,buffer);
4277 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
4279 height = (int) strtol(token, &token, 10);
4280 while (*token ==
' ') ++token;
4281 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
4283 width = (int) strtol(token, NULL, 10);
4288 if (comp) *comp = 3;
4289 if (req_comp == 0) req_comp = 3;
4292 hdr_data = (
float *) stbi__malloc(height * width * req_comp *
sizeof(
float));
4296 if ( width < 8 || width >= 32768) {
4298 for (j=0; j < height; ++j) {
4299 for (i=0; i < width; ++i) {
4302 stbi__getn(s, rgbe, 4);
4303 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
4310 for (j = 0; j < height; ++j) {
4313 len = stbi__get8(s);
4314 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
4318 rgbe[0] = (stbi_uc) c1;
4319 rgbe[1] = (stbi_uc) c2;
4320 rgbe[2] = (stbi_uc) len;
4321 rgbe[3] = (stbi_uc) stbi__get8(s);
4322 stbi__hdr_convert(hdr_data, rgbe, req_comp);
4326 goto main_decode_loop;
4329 len |= stbi__get8(s);
4330 if (len != width) { free(hdr_data); free(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
4331 if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4);
4333 for (k = 0; k < 4; ++k) {
4336 count = stbi__get8(s);
4339 value = stbi__get8(s);
4341 for (z = 0; z < count; ++z)
4342 scanline[i++ * 4 + k] = value;
4345 for (z = 0; z < count; ++z)
4346 scanline[i++ * 4 + k] = stbi__get8(s);
4350 for (i=0; i < width; ++i)
4351 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
4359 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
4361 char buffer[STBI__HDR_BUFLEN];
4365 if (strcmp(stbi__hdr_gettoken(s,buffer),
"#?RADIANCE") != 0) {
4371 token = stbi__hdr_gettoken(s,buffer);
4372 if (token[0] == 0)
break;
4373 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
4380 token = stbi__hdr_gettoken(s,buffer);
4381 if (strncmp(token,
"-Y ", 3)) {
4386 *y = (int) strtol(token, &token, 10);
4387 while (*token ==
' ') ++token;
4388 if (strncmp(token,
"+X ", 3)) {
4393 *x = (int) strtol(token, NULL, 10);
4397 #endif // STBI_NO_HDR 4399 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
4402 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M') {
4407 hsz = stbi__get32le(s);
4408 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
4413 *x = stbi__get16le(s);
4414 *y = stbi__get16le(s);
4416 *x = stbi__get32le(s);
4417 *y = stbi__get32le(s);
4419 if (stbi__get16le(s) != 1) {
4423 *comp = stbi__get16le(s) / 8;
4427 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
4430 if (stbi__get32be(s) != 0x38425053) {
4434 if (stbi__get16be(s) != 1) {
4439 channelCount = stbi__get16be(s);
4440 if (channelCount < 0 || channelCount > 16) {
4444 *y = stbi__get32be(s);
4445 *x = stbi__get32be(s);
4446 if (stbi__get16be(s) != 8) {
4450 if (stbi__get16be(s) != 3) {
4458 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
4460 int act_comp=0,num_packets=0,chained;
4461 stbi__pic_packet packets[10];
4465 *x = stbi__get16be(s);
4466 *y = stbi__get16be(s);
4467 if (stbi__at_eof(s))
return 0;
4468 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
4476 stbi__pic_packet *packet;
4478 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
4481 packet = &packets[num_packets++];
4482 chained = stbi__get8(s);
4483 packet->size = stbi__get8(s);
4484 packet->type = stbi__get8(s);
4485 packet->channel = stbi__get8(s);
4486 act_comp |= packet->channel;
4488 if (stbi__at_eof(s)) {
4492 if (packet->size != 8) {
4498 *comp = (act_comp & 0x10 ? 4 : 3);
4503 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
4505 if (stbi__jpeg_info(s, x, y, comp))
4507 if (stbi__png_info(s, x, y, comp))
4509 if (stbi__gif_info(s, x, y, comp))
4511 if (stbi__bmp_info(s, x, y, comp))
4513 if (stbi__psd_info(s, x, y, comp))
4515 if (stbi__pic_info(s, x, y, comp))
4518 if (stbi__hdr_info(s, x, y, comp))
4522 if (stbi__tga_info(s, x, y, comp))
4524 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
4527 #ifndef STBI_NO_STDIO 4528 STBIDEF
int stbi_info(
char const *filename,
int *x,
int *y,
int *comp)
4530 FILE *f = stbi__fopen(filename,
"rb");
4532 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
4533 result = stbi_info_from_file(f, x, y, comp);
4538 STBIDEF
int stbi_info_from_file(FILE *f,
int *x,
int *y,
int *comp)
4542 long pos = ftell(f);
4543 stbi__start_file(&s, f);
4544 r = stbi__info_main(&s,x,y,comp);
4545 fseek(f,pos,SEEK_SET);
4548 #endif // !STBI_NO_STDIO 4550 STBIDEF
int stbi_info_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp)
4553 stbi__start_mem(&s,buffer,len);
4554 return stbi__info_main(&s,x,y,comp);
4557 STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const *c,
void *user,
int *x,
int *y,
int *comp)
4561 return stbi__info_main(&s,x,y,comp);
4564 #endif // STB_IMAGE_IMPLEMENTATION Definition: stb_image.h:243
+