104 #ifndef STBI_INCLUDE_STB_IMAGE_H 105 #define STBI_INCLUDE_STB_IMAGE_H 305 #ifndef STBI_NO_STDIO 307 #endif // STBI_NO_STDIO 309 #define STBI_VERSION 1 321 typedef unsigned char stbi_uc;
322 typedef unsigned short stbi_us;
328 #ifdef STB_IMAGE_STATIC 329 #define STBIDEF static 331 #define STBIDEF extern 345 int (*read) (
void *user,
char *data,
int size);
346 void (*skip) (
void *user,
int n);
347 int (*eof) (
void *user);
355 STBIDEF stbi_uc *stbi_load (
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
356 STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc
const *buffer,
int len ,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
357 STBIDEF stbi_uc *stbi_load_from_callbacks(
stbi_io_callbacks const *clbk ,
void *user,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
359 #ifndef STBI_NO_STDIO 360 STBIDEF stbi_uc *stbi_load_from_file (FILE *f,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
369 STBIDEF stbi_us *stbi_load_16(
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
370 #ifndef STBI_NO_STDIO 371 STBIDEF stbi_us *stbi_load_from_file_16(FILE *f,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
379 #ifndef STBI_NO_LINEAR 380 STBIDEF
float *stbi_loadf (
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
381 STBIDEF
float *stbi_loadf_from_memory (stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
382 STBIDEF
float *stbi_loadf_from_callbacks (
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
384 #ifndef STBI_NO_STDIO 385 STBIDEF
float *stbi_loadf_from_file (FILE *f,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
390 STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma);
391 STBIDEF
void stbi_hdr_to_ldr_scale(
float scale);
392 #endif // STBI_NO_HDR 394 #ifndef STBI_NO_LINEAR 395 STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma);
396 STBIDEF
void stbi_ldr_to_hdr_scale(
float scale);
397 #endif // STBI_NO_LINEAR 400 STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk,
void *user);
401 STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const *buffer,
int len);
402 #ifndef STBI_NO_STDIO 403 STBIDEF
int stbi_is_hdr (
char const *filename);
404 STBIDEF
int stbi_is_hdr_from_file(FILE *f);
405 #endif // STBI_NO_STDIO 410 STBIDEF
const char *stbi_failure_reason (
void);
413 STBIDEF
void stbi_image_free (
void *retval_from_stbi_load);
416 STBIDEF
int stbi_info_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp);
417 STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp);
419 #ifndef STBI_NO_STDIO 420 STBIDEF
int stbi_info (
char const *filename,
int *x,
int *y,
int *comp);
421 STBIDEF
int stbi_info_from_file (FILE *f,
int *x,
int *y,
int *comp);
430 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply);
434 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert);
437 STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip);
441 STBIDEF
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer,
int len,
int initial_size,
int *outlen);
442 STBIDEF
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer,
int len,
int initial_size,
int *outlen,
int parse_header);
443 STBIDEF
char *stbi_zlib_decode_malloc(
const char *buffer,
int len,
int *outlen);
444 STBIDEF
int stbi_zlib_decode_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen);
446 STBIDEF
char *stbi_zlib_decode_noheader_malloc(
const char *buffer,
int len,
int *outlen);
447 STBIDEF
int stbi_zlib_decode_noheader_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen);
457 #endif // STBI_INCLUDE_STB_IMAGE_H 459 #ifdef STB_IMAGE_IMPLEMENTATION 461 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ 462 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ 463 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ 464 || defined(STBI_ONLY_ZLIB) 465 #ifndef STBI_ONLY_JPEG 468 #ifndef STBI_ONLY_PNG 471 #ifndef STBI_ONLY_BMP 474 #ifndef STBI_ONLY_PSD 477 #ifndef STBI_ONLY_TGA 480 #ifndef STBI_ONLY_GIF 483 #ifndef STBI_ONLY_HDR 486 #ifndef STBI_ONLY_PIC 489 #ifndef STBI_ONLY_PNM 494 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) 505 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) 509 #ifndef STBI_NO_STDIO 515 #define STBI_ASSERT(x) assert(x) 521 #define stbi_inline inline 526 #define stbi_inline __forceinline 531 typedef unsigned short stbi__uint16;
532 typedef signed short stbi__int16;
533 typedef unsigned int stbi__uint32;
534 typedef signed int stbi__int32;
537 typedef uint16_t stbi__uint16;
538 typedef int16_t stbi__int16;
539 typedef uint32_t stbi__uint32;
540 typedef int32_t stbi__int32;
544 typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
547 #define STBI_NOTUSED(v) (void)(v) 549 #define STBI_NOTUSED(v) (void)sizeof(v) 553 #define STBI_HAS_LROTL 556 #ifdef STBI_HAS_LROTL 557 #define stbi_lrot(x,y) _lrotl(x,y) 559 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) 562 #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) 564 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) 567 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." 571 #define STBI_MALLOC(sz) malloc(sz) 572 #define STBI_REALLOC(p,newsz) realloc(p,newsz) 573 #define STBI_FREE(p) free(p) 576 #ifndef STBI_REALLOC_SIZED 577 #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) 581 #if defined(__x86_64__) || defined(_M_X64) 582 #define STBI__X64_TARGET 583 #elif defined(__i386) || defined(_M_IX86) 584 #define STBI__X86_TARGET 587 #if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) 598 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) 613 #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) 615 #include <emmintrin.h> 619 #if _MSC_VER >= 1400 // not VC6 621 static int stbi__cpuid3(
void)
628 static int stbi__cpuid3(
void)
640 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name 642 static int stbi__sse2_available()
644 int info3 = stbi__cpuid3();
645 return ((info3 >> 26) & 1) != 0;
647 #else // assume GCC-style if not VC++ 648 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 650 static int stbi__sse2_available()
661 #if defined(STBI_NO_SIMD) && defined(STBI_NEON) 666 #include <arm_neon.h> 668 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 671 #ifndef STBI_SIMD_ALIGN 672 #define STBI_SIMD_ALIGN(type, name) type name 683 stbi__uint32 img_x, img_y;
684 int img_n, img_out_n;
689 int read_from_callbacks;
691 stbi_uc buffer_start[128];
693 stbi_uc *img_buffer, *img_buffer_end;
694 stbi_uc *img_buffer_original, *img_buffer_original_end;
698 static void stbi__refill_buffer(stbi__context *s);
701 static void stbi__start_mem(stbi__context *s, stbi_uc
const *buffer,
int len)
704 s->read_from_callbacks = 0;
705 s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
706 s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
710 static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user)
713 s->io_user_data = user;
714 s->buflen =
sizeof(s->buffer_start);
715 s->read_from_callbacks = 1;
716 s->img_buffer_original = s->buffer_start;
717 stbi__refill_buffer(s);
718 s->img_buffer_original_end = s->img_buffer_end;
721 #ifndef STBI_NO_STDIO 723 static int stbi__stdio_read(
void *user,
char *data,
int size)
725 return (
int) fread(data,1,size,(FILE*) user);
728 static void stbi__stdio_skip(
void *user,
int n)
730 fseek((FILE*) user, n, SEEK_CUR);
733 static int stbi__stdio_eof(
void *user)
735 return feof((FILE*) user);
745 static void stbi__start_file(stbi__context *s, FILE *f)
747 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *) f);
752 #endif // !STBI_NO_STDIO 754 static void stbi__rewind(stbi__context *s)
759 s->img_buffer = s->img_buffer_original;
760 s->img_buffer_end = s->img_buffer_original_end;
771 int bits_per_channel;
777 static int stbi__jpeg_test(stbi__context *s);
778 static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
779 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
783 static int stbi__png_test(stbi__context *s);
784 static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
785 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
789 static int stbi__bmp_test(stbi__context *s);
790 static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
791 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
795 static int stbi__tga_test(stbi__context *s);
796 static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
797 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
801 static int stbi__psd_test(stbi__context *s);
802 static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc);
803 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
807 static int stbi__hdr_test(stbi__context *s);
808 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
809 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
813 static int stbi__pic_test(stbi__context *s);
814 static void *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
815 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
819 static int stbi__gif_test(stbi__context *s);
820 static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
821 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
825 static int stbi__pnm_test(stbi__context *s);
826 static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
827 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
831 static const char *stbi__g_failure_reason;
833 STBIDEF
const char *stbi_failure_reason(
void)
835 return stbi__g_failure_reason;
838 static int stbi__err(
const char *str)
840 stbi__g_failure_reason = str;
844 static void *stbi__malloc(
size_t size)
846 return STBI_MALLOC(size);
861 static int stbi__addsizes_valid(
int a,
int b)
868 return a <= INT_MAX - b;
873 static int stbi__mul2sizes_valid(
int a,
int b)
875 if (a < 0 || b < 0)
return 0;
876 if (b == 0)
return 1;
878 return a <= INT_MAX/b;
882 static int stbi__mad2sizes_valid(
int a,
int b,
int add)
884 return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
888 static int stbi__mad3sizes_valid(
int a,
int b,
int c,
int add)
890 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
891 stbi__addsizes_valid(a*b*c, add);
895 static int stbi__mad4sizes_valid(
int a,
int b,
int c,
int d,
int add)
897 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
898 stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
902 static void *stbi__malloc_mad2(
int a,
int b,
int add)
904 if (!stbi__mad2sizes_valid(a, b, add))
return NULL;
905 return stbi__malloc(a*b + add);
908 static void *stbi__malloc_mad3(
int a,
int b,
int c,
int add)
910 if (!stbi__mad3sizes_valid(a, b, c, add))
return NULL;
911 return stbi__malloc(a*b*c + add);
914 static void *stbi__malloc_mad4(
int a,
int b,
int c,
int d,
int add)
916 if (!stbi__mad4sizes_valid(a, b, c, d, add))
return NULL;
917 return stbi__malloc(a*b*c*d + add);
924 #ifdef STBI_NO_FAILURE_STRINGS 925 #define stbi__err(x,y) 0 926 #elif defined(STBI_FAILURE_USERMSG) 927 #define stbi__err(x,y) stbi__err(y) 929 #define stbi__err(x,y) stbi__err(x) 932 #define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) 933 #define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) 935 STBIDEF
void stbi_image_free(
void *retval_from_stbi_load)
937 STBI_FREE(retval_from_stbi_load);
940 #ifndef STBI_NO_LINEAR 941 static float *stbi__ldr_to_hdr(stbi_uc *data,
int x,
int y,
int comp);
945 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
948 static int stbi__vertically_flip_on_load = 0;
950 STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip)
952 stbi__vertically_flip_on_load = flag_true_if_should_flip;
955 static void *stbi__load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
957 memset(ri, 0,
sizeof(*ri));
958 ri->bits_per_channel = 8;
959 ri->channel_order = STBI_ORDER_RGB;
960 ri->num_channels = 0;
963 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
966 if (stbi__png_test(s))
return stbi__png_load(s,x,y,comp,req_comp, ri);
969 if (stbi__bmp_test(s))
return stbi__bmp_load(s,x,y,comp,req_comp, ri);
972 if (stbi__gif_test(s))
return stbi__gif_load(s,x,y,comp,req_comp, ri);
975 if (stbi__psd_test(s))
return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
978 if (stbi__pic_test(s))
return stbi__pic_load(s,x,y,comp,req_comp, ri);
981 if (stbi__pnm_test(s))
return stbi__pnm_load(s,x,y,comp,req_comp, ri);
985 if (stbi__hdr_test(s)) {
986 float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
987 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
993 if (stbi__tga_test(s))
994 return stbi__tga_load(s,x,y,comp,req_comp, ri);
997 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
1000 static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig,
int w,
int h,
int channels)
1003 int img_len = w * h * channels;
1006 reduced = (stbi_uc *) stbi__malloc(img_len);
1007 if (reduced == NULL)
return stbi__errpuc(
"outofmem",
"Out of memory");
1009 for (i = 0; i < img_len; ++i)
1010 reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF);
1016 static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig,
int w,
int h,
int channels)
1019 int img_len = w * h * channels;
1020 stbi__uint16 *enlarged;
1022 enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
1023 if (enlarged == NULL)
return (stbi__uint16 *) stbi__errpuc(
"outofmem",
"Out of memory");
1025 for (i = 0; i < img_len; ++i)
1026 enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]);
1032 static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1034 stbi__result_info ri;
1035 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1040 if (ri.bits_per_channel != 8) {
1041 STBI_ASSERT(ri.bits_per_channel == 16);
1042 result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1043 ri.bits_per_channel = 8;
1048 if (stbi__vertically_flip_on_load) {
1050 int channels = req_comp ? req_comp : *comp;
1052 stbi_uc *image = (stbi_uc *) result;
1055 for (row = 0; row < (h>>1); row++) {
1056 for (col = 0; col < w; col++) {
1057 for (z = 0; z < channels; z++) {
1058 stbi_uc temp = image[(row * w + col) * channels + z];
1059 image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z];
1060 image[((h - row - 1) * w + col) * channels + z] = temp;
1066 return (
unsigned char *) result;
1069 static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1071 stbi__result_info ri;
1072 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1077 if (ri.bits_per_channel != 16) {
1078 STBI_ASSERT(ri.bits_per_channel == 8);
1079 result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1080 ri.bits_per_channel = 16;
1086 if (stbi__vertically_flip_on_load) {
1088 int channels = req_comp ? req_comp : *comp;
1090 stbi__uint16 *image = (stbi__uint16 *) result;
1093 for (row = 0; row < (h>>1); row++) {
1094 for (col = 0; col < w; col++) {
1095 for (z = 0; z < channels; z++) {
1096 stbi__uint16 temp = image[(row * w + col) * channels + z];
1097 image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z];
1098 image[((h - row - 1) * w + col) * channels + z] = temp;
1104 return (stbi__uint16 *) result;
1108 static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp)
1110 if (stbi__vertically_flip_on_load && result != NULL) {
1112 int depth = req_comp ? req_comp : *comp;
1117 for (row = 0; row < (h>>1); row++) {
1118 for (col = 0; col < w; col++) {
1119 for (z = 0; z < depth; z++) {
1120 temp = result[(row * w + col) * depth + z];
1121 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
1122 result[((h - row - 1) * w + col) * depth + z] = temp;
1130 #ifndef STBI_NO_STDIO 1132 static FILE *stbi__fopen(
char const *filename,
char const *mode)
1135 #if defined(_MSC_VER) && _MSC_VER >= 1400 1136 if (0 != fopen_s(&f, filename, mode))
1139 f = fopen(filename, mode);
1145 STBIDEF stbi_uc *stbi_load(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1147 FILE *f = stbi__fopen(filename,
"rb");
1148 unsigned char *result;
1149 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1150 result = stbi_load_from_file(f,x,y,comp,req_comp);
1155 STBIDEF stbi_uc *stbi_load_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp)
1157 unsigned char *result;
1159 stbi__start_file(&s,f);
1160 result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1163 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1168 STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f,
int *x,
int *y,
int *comp,
int req_comp)
1170 stbi__uint16 *result;
1172 stbi__start_file(&s,f);
1173 result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
1176 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1181 STBIDEF stbi_us *stbi_load_16(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1183 FILE *f = stbi__fopen(filename,
"rb");
1184 stbi__uint16 *result;
1185 if (!f)
return (stbi_us *) stbi__errpuc(
"can't fopen",
"Unable to open file");
1186 result = stbi_load_from_file_16(f,x,y,comp,req_comp);
1194 STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp)
1197 stbi__start_mem(&s,buffer,len);
1198 return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1201 STBIDEF stbi_uc *stbi_load_from_callbacks(
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp,
int req_comp)
1205 return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1208 #ifndef STBI_NO_LINEAR 1209 static float *stbi__loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1211 unsigned char *data;
1213 if (stbi__hdr_test(s)) {
1214 stbi__result_info ri;
1215 float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
1217 stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1221 data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
1223 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1224 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1227 STBIDEF
float *stbi_loadf_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp)
1230 stbi__start_mem(&s,buffer,len);
1231 return stbi__loadf_main(&s,x,y,comp,req_comp);
1234 STBIDEF
float *stbi_loadf_from_callbacks(
stbi_io_callbacks const *clbk,
void *user,
int *x,
int *y,
int *comp,
int req_comp)
1238 return stbi__loadf_main(&s,x,y,comp,req_comp);
1241 #ifndef STBI_NO_STDIO 1242 STBIDEF
float *stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1245 FILE *f = stbi__fopen(filename,
"rb");
1246 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1247 result = stbi_loadf_from_file(f,x,y,comp,req_comp);
1252 STBIDEF
float *stbi_loadf_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp)
1255 stbi__start_file(&s,f);
1256 return stbi__loadf_main(&s,x,y,comp,req_comp);
1258 #endif // !STBI_NO_STDIO 1260 #endif // !STBI_NO_LINEAR 1266 STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const *buffer,
int len)
1270 stbi__start_mem(&s,buffer,len);
1271 return stbi__hdr_test(&s);
1273 STBI_NOTUSED(buffer);
1279 #ifndef STBI_NO_STDIO 1280 STBIDEF
int stbi_is_hdr (
char const *filename)
1282 FILE *f = stbi__fopen(filename,
"rb");
1285 result = stbi_is_hdr_from_file(f);
1291 STBIDEF
int stbi_is_hdr_from_file(FILE *f)
1295 stbi__start_file(&s,f);
1296 return stbi__hdr_test(&s);
1302 #endif // !STBI_NO_STDIO 1304 STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk,
void *user)
1309 return stbi__hdr_test(&s);
1317 #ifndef STBI_NO_LINEAR 1318 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1320 STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma) { stbi__l2h_gamma = gamma; }
1321 STBIDEF
void stbi_ldr_to_hdr_scale(
float scale) { stbi__l2h_scale = scale; }
1324 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1326 STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma) { stbi__h2l_gamma_i = 1/gamma; }
1327 STBIDEF
void stbi_hdr_to_ldr_scale(
float scale) { stbi__h2l_scale_i = 1/scale; }
1342 static void stbi__refill_buffer(stbi__context *s)
1344 int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
1348 s->read_from_callbacks = 0;
1349 s->img_buffer = s->buffer_start;
1350 s->img_buffer_end = s->buffer_start+1;
1353 s->img_buffer = s->buffer_start;
1354 s->img_buffer_end = s->buffer_start + n;
1358 stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1360 if (s->img_buffer < s->img_buffer_end)
1361 return *s->img_buffer++;
1362 if (s->read_from_callbacks) {
1363 stbi__refill_buffer(s);
1364 return *s->img_buffer++;
1369 stbi_inline
static int stbi__at_eof(stbi__context *s)
1372 if (!(s->io.eof)(s->io_user_data))
return 0;
1375 if (s->read_from_callbacks == 0)
return 1;
1378 return s->img_buffer >= s->img_buffer_end;
1381 static void stbi__skip(stbi__context *s,
int n)
1384 s->img_buffer = s->img_buffer_end;
1388 int blen = (int) (s->img_buffer_end - s->img_buffer);
1390 s->img_buffer = s->img_buffer_end;
1391 (s->io.skip)(s->io_user_data, n - blen);
1398 static int stbi__getn(stbi__context *s, stbi_uc *buffer,
int n)
1401 int blen = (int) (s->img_buffer_end - s->img_buffer);
1405 memcpy(buffer, s->img_buffer, blen);
1407 count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
1408 res = (count == (n-blen));
1409 s->img_buffer = s->img_buffer_end;
1414 if (s->img_buffer+n <= s->img_buffer_end) {
1415 memcpy(buffer, s->img_buffer, n);
1422 static int stbi__get16be(stbi__context *s)
1424 int z = stbi__get8(s);
1425 return (z << 8) + stbi__get8(s);
1428 static stbi__uint32 stbi__get32be(stbi__context *s)
1430 stbi__uint32 z = stbi__get16be(s);
1431 return (z << 16) + stbi__get16be(s);
1434 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) 1437 static int stbi__get16le(stbi__context *s)
1439 int z = stbi__get8(s);
1440 return z + (stbi__get8(s) << 8);
1445 static stbi__uint32 stbi__get32le(stbi__context *s)
1447 stbi__uint32 z = stbi__get16le(s);
1448 return z + (stbi__get16le(s) << 16);
1452 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings 1466 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1468 return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
1471 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1474 unsigned char *good;
1476 if (req_comp == img_n)
return data;
1477 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1479 good = (
unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
1482 return stbi__errpuc(
"outofmem",
"Out of memory");
1485 for (j=0; j < (int) y; ++j) {
1486 unsigned char *src = data + j * x * img_n ;
1487 unsigned char *dest = good + j * x * req_comp;
1489 #define STBI__COMBO(a,b) ((a)*8+(b)) 1490 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 1493 switch (STBI__COMBO(img_n, req_comp)) {
1494 STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255; }
break;
1495 STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1496 STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; }
break;
1497 STBI__CASE(2,1) { dest[0]=src[0]; }
break;
1498 STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1499 STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; }
break;
1500 STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; }
break;
1501 STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); }
break;
1502 STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; }
break;
1503 STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); }
break;
1504 STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; }
break;
1505 STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; }
break;
1506 default: STBI_ASSERT(0);
1515 static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b)
1517 return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
1520 static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1525 if (req_comp == img_n)
return data;
1526 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1528 good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
1531 return (stbi__uint16 *) stbi__errpuc(
"outofmem",
"Out of memory");
1534 for (j=0; j < (int) y; ++j) {
1535 stbi__uint16 *src = data + j * x * img_n ;
1536 stbi__uint16 *dest = good + j * x * req_comp;
1538 #define STBI__COMBO(a,b) ((a)*8+(b)) 1539 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 1542 switch (STBI__COMBO(img_n, req_comp)) {
1543 STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff; }
break;
1544 STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1545 STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff; }
break;
1546 STBI__CASE(2,1) { dest[0]=src[0]; }
break;
1547 STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1548 STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; }
break;
1549 STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff; }
break;
1550 STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); }
break;
1551 STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; }
break;
1552 STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); }
break;
1553 STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; }
break;
1554 STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; }
break;
1555 default: STBI_ASSERT(0);
1564 #ifndef STBI_NO_LINEAR 1565 static float *stbi__ldr_to_hdr(stbi_uc *data,
int x,
int y,
int comp)
1569 if (!data)
return NULL;
1570 output = (
float *) stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1571 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1573 if (comp & 1) n = comp;
else n = comp-1;
1574 for (i=0; i < x*y; ++i) {
1575 for (k=0; k < n; ++k) {
1576 output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1578 if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
1586 #define stbi__float2int(x) ((int) (x)) 1587 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1591 if (!data)
return NULL;
1592 output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
1593 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1595 if (comp & 1) n = comp;
else n = comp-1;
1596 for (i=0; i < x*y; ++i) {
1597 for (k=0; k < n; ++k) {
1598 float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1600 if (z > 255) z = 255;
1601 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1604 float z = data[i*comp+k] * 255 + 0.5f;
1606 if (z > 255) z = 255;
1607 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1636 #ifndef STBI_NO_JPEG 1639 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache 1643 stbi_uc fast[1 << FAST_BITS];
1645 stbi__uint16 code[256];
1646 stbi_uc values[256];
1648 unsigned int maxcode[18];
1655 stbi__huffman huff_dc[4];
1656 stbi__huffman huff_ac[4];
1657 stbi__uint16 dequant[4][64];
1658 stbi__int16 fast_ac[4][1 << FAST_BITS];
1661 int img_h_max, img_v_max;
1662 int img_mcu_x, img_mcu_y;
1663 int img_mcu_w, img_mcu_h;
1676 void *raw_data, *raw_coeff;
1679 int coeff_w, coeff_h;
1682 stbi__uint32 code_buffer;
1684 unsigned char marker;
1694 int app14_color_transform;
1697 int scan_n, order[4];
1698 int restart_interval, todo;
1701 void (*idct_block_kernel)(stbi_uc *out,
int out_stride,
short data[64]);
1702 void (*YCbCr_to_RGB_kernel)(stbi_uc *out,
const stbi_uc *y,
const stbi_uc *pcb,
const stbi_uc *pcr,
int count,
int step);
1703 stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs);
1706 static int stbi__build_huffman(stbi__huffman *h,
int *count)
1710 for (i=0; i < 16; ++i)
1711 for (j=0; j < count[i]; ++j)
1712 h->size[k++] = (stbi_uc) (i+1);
1718 for(j=1; j <= 16; ++j) {
1720 h->delta[j] = k - code;
1721 if (h->size[k] == j) {
1722 while (h->size[k] == j)
1723 h->code[k++] = (stbi__uint16) (code++);
1724 if (code-1 >= (1 << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1727 h->maxcode[j] = code << (16-j);
1730 h->maxcode[j] = 0xffffffff;
1733 memset(h->fast, 255, 1 << FAST_BITS);
1734 for (i=0; i < k; ++i) {
1736 if (s <= FAST_BITS) {
1737 int c = h->code[i] << (FAST_BITS-s);
1738 int m = 1 << (FAST_BITS-s);
1739 for (j=0; j < m; ++j) {
1740 h->fast[c+j] = (stbi_uc) i;
1749 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1752 for (i=0; i < (1 << FAST_BITS); ++i) {
1753 stbi_uc fast = h->fast[i];
1756 int rs = h->values[fast];
1757 int run = (rs >> 4) & 15;
1758 int magbits = rs & 15;
1759 int len = h->size[fast];
1761 if (magbits && len + magbits <= FAST_BITS) {
1763 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1764 int m = 1 << (magbits - 1);
1765 if (k < m) k += (~0U << magbits) + 1;
1767 if (k >= -128 && k <= 127)
1768 fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
1774 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1777 int b = j->nomore ? 0 : stbi__get8(j->s);
1779 int c = stbi__get8(j->s);
1780 while (c == 0xff) c = stbi__get8(j->s);
1782 j->marker = (
unsigned char) c;
1787 j->code_buffer |= b << (24 - j->code_bits);
1789 }
while (j->code_bits <= 24);
1793 static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1796 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1801 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1805 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1809 if (s > j->code_bits)
1811 j->code_buffer <<= s;
1813 return h->values[k];
1822 temp = j->code_buffer >> 16;
1823 for (k=FAST_BITS+1 ; ; ++k)
1824 if (temp < h->maxcode[k])
1832 if (k > j->code_bits)
1836 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1837 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1841 j->code_buffer <<= k;
1842 return h->values[c];
1846 static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1850 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1854 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1856 sgn = (stbi__int32)j->code_buffer >> 31;
1857 k = stbi_lrot(j->code_buffer, n);
1858 STBI_ASSERT(n >= 0 && n < (
int) (
sizeof(stbi__bmask)/
sizeof(*stbi__bmask)));
1859 j->code_buffer = k & ~stbi__bmask[n];
1860 k &= stbi__bmask[n];
1862 return k + (stbi__jbias[n] & ~sgn);
1866 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
1869 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1870 k = stbi_lrot(j->code_buffer, n);
1871 j->code_buffer = k & ~stbi__bmask[n];
1872 k &= stbi__bmask[n];
1877 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
1880 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1882 j->code_buffer <<= 1;
1884 return k & 0x80000000;
1889 static stbi_uc stbi__jpeg_dezigzag[64+15] =
1891 0, 1, 8, 16, 9, 2, 3, 10,
1892 17, 24, 32, 25, 18, 11, 4, 5,
1893 12, 19, 26, 33, 40, 48, 41, 34,
1894 27, 20, 13, 6, 7, 14, 21, 28,
1895 35, 42, 49, 56, 57, 50, 43, 36,
1896 29, 22, 15, 23, 30, 37, 44, 51,
1897 58, 59, 52, 45, 38, 31, 39, 46,
1898 53, 60, 61, 54, 47, 55, 62, 63,
1900 63, 63, 63, 63, 63, 63, 63, 63,
1901 63, 63, 63, 63, 63, 63, 63
1905 static int stbi__jpeg_decode_block(stbi__jpeg *j,
short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac,
int b, stbi__uint16 *dequant)
1910 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1911 t = stbi__jpeg_huff_decode(j, hdc);
1912 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1915 memset(data,0,64*
sizeof(data[0]));
1917 diff = t ? stbi__extend_receive(j, t) : 0;
1918 dc = j->img_comp[b].dc_pred + diff;
1919 j->img_comp[b].dc_pred = dc;
1920 data[0] = (short) (dc * dequant[0]);
1927 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1928 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1933 j->code_buffer <<= s;
1936 zig = stbi__jpeg_dezigzag[k++];
1937 data[zig] = (short) ((r >> 8) * dequant[zig]);
1939 int rs = stbi__jpeg_huff_decode(j, hac);
1940 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1944 if (rs != 0xf0)
break;
1949 zig = stbi__jpeg_dezigzag[k++];
1950 data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
1957 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
1961 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1963 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1965 if (j->succ_high == 0) {
1967 memset(data,0,64*
sizeof(data[0]));
1968 t = stbi__jpeg_huff_decode(j, hdc);
1969 diff = t ? stbi__extend_receive(j, t) : 0;
1971 dc = j->img_comp[b].dc_pred + diff;
1972 j->img_comp[b].dc_pred = dc;
1973 data[0] = (short) (dc << j->succ_low);
1976 if (stbi__jpeg_get_bit(j))
1977 data[0] += (
short) (1 << j->succ_low);
1984 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
1987 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1989 if (j->succ_high == 0) {
1990 int shift = j->succ_low;
2001 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2002 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2007 j->code_buffer <<= s;
2009 zig = stbi__jpeg_dezigzag[k++];
2010 data[zig] = (short) ((r >> 8) << shift);
2012 int rs = stbi__jpeg_huff_decode(j, hac);
2013 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2018 j->eob_run = (1 << r);
2020 j->eob_run += stbi__jpeg_get_bits(j, r);
2027 zig = stbi__jpeg_dezigzag[k++];
2028 data[zig] = (short) (stbi__extend_receive(j,s) << shift);
2031 }
while (k <= j->spec_end);
2035 short bit = (short) (1 << j->succ_low);
2039 for (k = j->spec_start; k <= j->spec_end; ++k) {
2040 short *p = &data[stbi__jpeg_dezigzag[k]];
2042 if (stbi__jpeg_get_bit(j))
2043 if ((*p & bit)==0) {
2054 int rs = stbi__jpeg_huff_decode(j, hac);
2055 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2060 j->eob_run = (1 << r) - 1;
2062 j->eob_run += stbi__jpeg_get_bits(j, r);
2070 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2072 if (stbi__jpeg_get_bit(j))
2079 while (k <= j->spec_end) {
2080 short *p = &data[stbi__jpeg_dezigzag[k++]];
2082 if (stbi__jpeg_get_bit(j))
2083 if ((*p & bit)==0) {
2097 }
while (k <= j->spec_end);
2104 stbi_inline
static stbi_uc stbi__clamp(
int x)
2107 if ((
unsigned int) x > 255) {
2108 if (x < 0)
return 0;
2109 if (x > 255)
return 255;
2114 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) 2115 #define stbi__fsh(x) ((x) << 12) 2118 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ 2119 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ 2122 p1 = (p2+p3) * stbi__f2f(0.5411961f); \ 2123 t2 = p1 + p3*stbi__f2f(-1.847759065f); \ 2124 t3 = p1 + p2*stbi__f2f( 0.765366865f); \ 2127 t0 = stbi__fsh(p2+p3); \ 2128 t1 = stbi__fsh(p2-p3); \ 2141 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ 2142 t0 = t0*stbi__f2f( 0.298631336f); \ 2143 t1 = t1*stbi__f2f( 2.053119869f); \ 2144 t2 = t2*stbi__f2f( 3.072711026f); \ 2145 t3 = t3*stbi__f2f( 1.501321110f); \ 2146 p1 = p5 + p1*stbi__f2f(-0.899976223f); \ 2147 p2 = p5 + p2*stbi__f2f(-2.562915447f); \ 2148 p3 = p3*stbi__f2f(-1.961570560f); \ 2149 p4 = p4*stbi__f2f(-0.390180644f); \ 2155 static void stbi__idct_block(stbi_uc *out,
int out_stride,
short data[64])
2157 int i,val[64],*v=val;
2162 for (i=0; i < 8; ++i,++d, ++v) {
2164 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
2165 && d[40]==0 && d[48]==0 && d[56]==0) {
2170 int dcterm = d[0] << 2;
2171 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2173 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
2176 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2177 v[ 0] = (x0+t3) >> 10;
2178 v[56] = (x0-t3) >> 10;
2179 v[ 8] = (x1+t2) >> 10;
2180 v[48] = (x1-t2) >> 10;
2181 v[16] = (x2+t1) >> 10;
2182 v[40] = (x2-t1) >> 10;
2183 v[24] = (x3+t0) >> 10;
2184 v[32] = (x3-t0) >> 10;
2188 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
2190 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
2197 x0 += 65536 + (128<<17);
2198 x1 += 65536 + (128<<17);
2199 x2 += 65536 + (128<<17);
2200 x3 += 65536 + (128<<17);
2203 o[0] = stbi__clamp((x0+t3) >> 17);
2204 o[7] = stbi__clamp((x0-t3) >> 17);
2205 o[1] = stbi__clamp((x1+t2) >> 17);
2206 o[6] = stbi__clamp((x1-t2) >> 17);
2207 o[2] = stbi__clamp((x2+t1) >> 17);
2208 o[5] = stbi__clamp((x2-t1) >> 17);
2209 o[3] = stbi__clamp((x3+t0) >> 17);
2210 o[4] = stbi__clamp((x3-t0) >> 17);
2218 static void stbi__idct_simd(stbi_uc *out,
int out_stride,
short data[64])
2221 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2225 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) 2229 #define dct_rot(out0,out1, x,y,c0,c1) \ 2230 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ 2231 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ 2232 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ 2233 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ 2234 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ 2235 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) 2238 #define dct_widen(out, in) \ 2239 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ 2240 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) 2243 #define dct_wadd(out, a, b) \ 2244 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ 2245 __m128i out##_h = _mm_add_epi32(a##_h, b##_h) 2248 #define dct_wsub(out, a, b) \ 2249 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ 2250 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) 2253 #define dct_bfly32o(out0, out1, a,b,bias,s) \ 2255 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ 2256 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ 2257 dct_wadd(sum, abiased, b); \ 2258 dct_wsub(dif, abiased, b); \ 2259 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ 2260 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ 2264 #define dct_interleave8(a, b) \ 2266 a = _mm_unpacklo_epi8(a, b); \ 2267 b = _mm_unpackhi_epi8(tmp, b) 2270 #define dct_interleave16(a, b) \ 2272 a = _mm_unpacklo_epi16(a, b); \ 2273 b = _mm_unpackhi_epi16(tmp, b) 2275 #define dct_pass(bias,shift) \ 2278 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ 2279 __m128i sum04 = _mm_add_epi16(row0, row4); \ 2280 __m128i dif04 = _mm_sub_epi16(row0, row4); \ 2281 dct_widen(t0e, sum04); \ 2282 dct_widen(t1e, dif04); \ 2283 dct_wadd(x0, t0e, t3e); \ 2284 dct_wsub(x3, t0e, t3e); \ 2285 dct_wadd(x1, t1e, t2e); \ 2286 dct_wsub(x2, t1e, t2e); \ 2288 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ 2289 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ 2290 __m128i sum17 = _mm_add_epi16(row1, row7); \ 2291 __m128i sum35 = _mm_add_epi16(row3, row5); \ 2292 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ 2293 dct_wadd(x4, y0o, y4o); \ 2294 dct_wadd(x5, y1o, y5o); \ 2295 dct_wadd(x6, y2o, y5o); \ 2296 dct_wadd(x7, y3o, y4o); \ 2297 dct_bfly32o(row0,row7, x0,x7,bias,shift); \ 2298 dct_bfly32o(row1,row6, x1,x6,bias,shift); \ 2299 dct_bfly32o(row2,row5, x2,x5,bias,shift); \ 2300 dct_bfly32o(row3,row4, x3,x4,bias,shift); \ 2303 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2304 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2305 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2306 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2307 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2308 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2309 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2310 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
2313 __m128i bias_0 = _mm_set1_epi32(512);
2314 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2317 row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
2318 row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
2319 row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
2320 row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
2321 row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
2322 row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
2323 row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
2324 row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
2327 dct_pass(bias_0, 10);
2331 dct_interleave16(row0, row4);
2332 dct_interleave16(row1, row5);
2333 dct_interleave16(row2, row6);
2334 dct_interleave16(row3, row7);
2337 dct_interleave16(row0, row2);
2338 dct_interleave16(row1, row3);
2339 dct_interleave16(row4, row6);
2340 dct_interleave16(row5, row7);
2343 dct_interleave16(row0, row1);
2344 dct_interleave16(row2, row3);
2345 dct_interleave16(row4, row5);
2346 dct_interleave16(row6, row7);
2350 dct_pass(bias_1, 17);
2354 __m128i p0 = _mm_packus_epi16(row0, row1);
2355 __m128i p1 = _mm_packus_epi16(row2, row3);
2356 __m128i p2 = _mm_packus_epi16(row4, row5);
2357 __m128i p3 = _mm_packus_epi16(row6, row7);
2360 dct_interleave8(p0, p2);
2361 dct_interleave8(p1, p3);
2364 dct_interleave8(p0, p1);
2365 dct_interleave8(p2, p3);
2368 dct_interleave8(p0, p2);
2369 dct_interleave8(p1, p3);
2372 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2373 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2374 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2375 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2376 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2377 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2378 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2379 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2388 #undef dct_interleave8 2389 #undef dct_interleave16 2399 static void stbi__idct_simd(stbi_uc *out,
int out_stride,
short data[64])
2401 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2403 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2404 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2405 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2406 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2407 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2408 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2409 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2410 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2411 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2412 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2413 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2414 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2416 #define dct_long_mul(out, inq, coeff) \ 2417 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ 2418 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) 2420 #define dct_long_mac(out, acc, inq, coeff) \ 2421 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ 2422 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) 2424 #define dct_widen(out, inq) \ 2425 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ 2426 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) 2429 #define dct_wadd(out, a, b) \ 2430 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ 2431 int32x4_t out##_h = vaddq_s32(a##_h, b##_h) 2434 #define dct_wsub(out, a, b) \ 2435 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ 2436 int32x4_t out##_h = vsubq_s32(a##_h, b##_h) 2439 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \ 2441 dct_wadd(sum, a, b); \ 2442 dct_wsub(dif, a, b); \ 2443 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ 2444 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ 2447 #define dct_pass(shiftop, shift) \ 2450 int16x8_t sum26 = vaddq_s16(row2, row6); \ 2451 dct_long_mul(p1e, sum26, rot0_0); \ 2452 dct_long_mac(t2e, p1e, row6, rot0_1); \ 2453 dct_long_mac(t3e, p1e, row2, rot0_2); \ 2454 int16x8_t sum04 = vaddq_s16(row0, row4); \ 2455 int16x8_t dif04 = vsubq_s16(row0, row4); \ 2456 dct_widen(t0e, sum04); \ 2457 dct_widen(t1e, dif04); \ 2458 dct_wadd(x0, t0e, t3e); \ 2459 dct_wsub(x3, t0e, t3e); \ 2460 dct_wadd(x1, t1e, t2e); \ 2461 dct_wsub(x2, t1e, t2e); \ 2463 int16x8_t sum15 = vaddq_s16(row1, row5); \ 2464 int16x8_t sum17 = vaddq_s16(row1, row7); \ 2465 int16x8_t sum35 = vaddq_s16(row3, row5); \ 2466 int16x8_t sum37 = vaddq_s16(row3, row7); \ 2467 int16x8_t sumodd = vaddq_s16(sum17, sum35); \ 2468 dct_long_mul(p5o, sumodd, rot1_0); \ 2469 dct_long_mac(p1o, p5o, sum17, rot1_1); \ 2470 dct_long_mac(p2o, p5o, sum35, rot1_2); \ 2471 dct_long_mul(p3o, sum37, rot2_0); \ 2472 dct_long_mul(p4o, sum15, rot2_1); \ 2473 dct_wadd(sump13o, p1o, p3o); \ 2474 dct_wadd(sump24o, p2o, p4o); \ 2475 dct_wadd(sump23o, p2o, p3o); \ 2476 dct_wadd(sump14o, p1o, p4o); \ 2477 dct_long_mac(x4, sump13o, row7, rot3_0); \ 2478 dct_long_mac(x5, sump24o, row5, rot3_1); \ 2479 dct_long_mac(x6, sump23o, row3, rot3_2); \ 2480 dct_long_mac(x7, sump14o, row1, rot3_3); \ 2481 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ 2482 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ 2483 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ 2484 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ 2488 row0 = vld1q_s16(data + 0*8);
2489 row1 = vld1q_s16(data + 1*8);
2490 row2 = vld1q_s16(data + 2*8);
2491 row3 = vld1q_s16(data + 3*8);
2492 row4 = vld1q_s16(data + 4*8);
2493 row5 = vld1q_s16(data + 5*8);
2494 row6 = vld1q_s16(data + 6*8);
2495 row7 = vld1q_s16(data + 7*8);
2498 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2501 dct_pass(vrshrn_n_s32, 10);
2507 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } 2508 #define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } 2509 #define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } 2512 dct_trn16(row0, row1);
2513 dct_trn16(row2, row3);
2514 dct_trn16(row4, row5);
2515 dct_trn16(row6, row7);
2518 dct_trn32(row0, row2);
2519 dct_trn32(row1, row3);
2520 dct_trn32(row4, row6);
2521 dct_trn32(row5, row7);
2524 dct_trn64(row0, row4);
2525 dct_trn64(row1, row5);
2526 dct_trn64(row2, row6);
2527 dct_trn64(row3, row7);
2538 dct_pass(vshrn_n_s32, 16);
2542 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2543 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2544 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2545 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2546 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2547 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2548 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2549 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2552 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } 2553 #define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } 2554 #define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } 2566 dct_trn8_16(p0, p2);
2567 dct_trn8_16(p1, p3);
2568 dct_trn8_16(p4, p6);
2569 dct_trn8_16(p5, p7);
2572 dct_trn8_32(p0, p4);
2573 dct_trn8_32(p1, p5);
2574 dct_trn8_32(p2, p6);
2575 dct_trn8_32(p3, p7);
2578 vst1_u8(out, p0); out += out_stride;
2579 vst1_u8(out, p1); out += out_stride;
2580 vst1_u8(out, p2); out += out_stride;
2581 vst1_u8(out, p3); out += out_stride;
2582 vst1_u8(out, p4); out += out_stride;
2583 vst1_u8(out, p5); out += out_stride;
2584 vst1_u8(out, p6); out += out_stride;
2603 #define STBI__MARKER_none 0xff 2607 static stbi_uc stbi__get_marker(stbi__jpeg *j)
2610 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2611 x = stbi__get8(j->s);
2612 if (x != 0xff)
return STBI__MARKER_none;
2614 x = stbi__get8(j->s);
2620 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) 2624 static void stbi__jpeg_reset(stbi__jpeg *j)
2629 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
2630 j->marker = STBI__MARKER_none;
2631 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2637 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2639 stbi__jpeg_reset(z);
2640 if (!z->progressive) {
2641 if (z->scan_n == 1) {
2643 STBI_SIMD_ALIGN(
short, data[64]);
2644 int n = z->order[0];
2649 int w = (z->img_comp[n].x+7) >> 3;
2650 int h = (z->img_comp[n].y+7) >> 3;
2651 for (j=0; j < h; ++j) {
2652 for (i=0; i < w; ++i) {
2653 int ha = z->img_comp[n].ha;
2654 if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
return 0;
2655 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2657 if (--z->todo <= 0) {
2658 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2661 if (!STBI__RESTART(z->marker))
return 1;
2662 stbi__jpeg_reset(z);
2669 STBI_SIMD_ALIGN(
short, data[64]);
2670 for (j=0; j < z->img_mcu_y; ++j) {
2671 for (i=0; i < z->img_mcu_x; ++i) {
2673 for (k=0; k < z->scan_n; ++k) {
2674 int n = z->order[k];
2677 for (y=0; y < z->img_comp[n].v; ++y) {
2678 for (x=0; x < z->img_comp[n].h; ++x) {
2679 int x2 = (i*z->img_comp[n].h + x)*8;
2680 int y2 = (j*z->img_comp[n].v + y)*8;
2681 int ha = z->img_comp[n].ha;
2682 if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
return 0;
2683 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2689 if (--z->todo <= 0) {
2690 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2691 if (!STBI__RESTART(z->marker))
return 1;
2692 stbi__jpeg_reset(z);
2699 if (z->scan_n == 1) {
2701 int n = z->order[0];
2706 int w = (z->img_comp[n].x+7) >> 3;
2707 int h = (z->img_comp[n].y+7) >> 3;
2708 for (j=0; j < h; ++j) {
2709 for (i=0; i < w; ++i) {
2710 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2711 if (z->spec_start == 0) {
2712 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2715 int ha = z->img_comp[n].ha;
2716 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2720 if (--z->todo <= 0) {
2721 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2722 if (!STBI__RESTART(z->marker))
return 1;
2723 stbi__jpeg_reset(z);
2730 for (j=0; j < z->img_mcu_y; ++j) {
2731 for (i=0; i < z->img_mcu_x; ++i) {
2733 for (k=0; k < z->scan_n; ++k) {
2734 int n = z->order[k];
2737 for (y=0; y < z->img_comp[n].v; ++y) {
2738 for (x=0; x < z->img_comp[n].h; ++x) {
2739 int x2 = (i*z->img_comp[n].h + x);
2740 int y2 = (j*z->img_comp[n].v + y);
2741 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2742 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2749 if (--z->todo <= 0) {
2750 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2751 if (!STBI__RESTART(z->marker))
return 1;
2752 stbi__jpeg_reset(z);
2761 static void stbi__jpeg_dequantize(
short *data, stbi__uint16 *dequant)
2764 for (i=0; i < 64; ++i)
2765 data[i] *= dequant[i];
2768 static void stbi__jpeg_finish(stbi__jpeg *z)
2770 if (z->progressive) {
2773 for (n=0; n < z->s->img_n; ++n) {
2774 int w = (z->img_comp[n].x+7) >> 3;
2775 int h = (z->img_comp[n].y+7) >> 3;
2776 for (j=0; j < h; ++j) {
2777 for (i=0; i < w; ++i) {
2778 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2779 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2780 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2787 static int stbi__process_marker(stbi__jpeg *z,
int m)
2791 case STBI__MARKER_none:
2792 return stbi__err(
"expected marker",
"Corrupt JPEG");
2795 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2796 z->restart_interval = stbi__get16be(z->s);
2800 L = stbi__get16be(z->s)-2;
2802 int q = stbi__get8(z->s);
2803 int p = q >> 4, sixteen = (p != 0);
2805 if (p != 0 && p != 1)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2806 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2808 for (i=0; i < 64; ++i)
2809 z->dequant[t][stbi__jpeg_dezigzag[i]] = sixteen ? stbi__get16be(z->s) : stbi__get8(z->s);
2810 L -= (sixteen ? 129 : 65);
2815 L = stbi__get16be(z->s)-2;
2818 int sizes[16],i,n=0;
2819 int q = stbi__get8(z->s);
2822 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2823 for (i=0; i < 16; ++i) {
2824 sizes[i] = stbi__get8(z->s);
2829 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
2830 v = z->huff_dc[th].values;
2832 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
2833 v = z->huff_ac[th].values;
2835 for (i=0; i < n; ++i)
2836 v[i] = stbi__get8(z->s);
2838 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2845 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2846 L = stbi__get16be(z->s);
2849 return stbi__err(
"bad COM len",
"Corrupt JPEG");
2851 return stbi__err(
"bad APP len",
"Corrupt JPEG");
2855 if (m == 0xE0 && L >= 5) {
2856 static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0'};
2859 for (i=0; i < 5; ++i)
2860 if (stbi__get8(z->s) != tag[i])
2865 }
else if (m == 0xEE && L >= 12) {
2866 static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0'};
2869 for (i=0; i < 6; ++i)
2870 if (stbi__get8(z->s) != tag[i])
2875 stbi__get16be(z->s);
2876 stbi__get16be(z->s);
2877 z->app14_color_transform = stbi__get8(z->s);
2882 stbi__skip(z->s, L);
2886 return stbi__err(
"unknown marker",
"Corrupt JPEG");
2890 static int stbi__process_scan_header(stbi__jpeg *z)
2893 int Ls = stbi__get16be(z->s);
2894 z->scan_n = stbi__get8(z->s);
2895 if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (
int) z->s->img_n)
return stbi__err(
"bad SOS component count",
"Corrupt JPEG");
2896 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2897 for (i=0; i < z->scan_n; ++i) {
2898 int id = stbi__get8(z->s), which;
2899 int q = stbi__get8(z->s);
2900 for (which = 0; which < z->s->img_n; ++which)
2901 if (z->img_comp[which].id ==
id)
2903 if (which == z->s->img_n)
return 0;
2904 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2905 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2906 z->order[i] = which;
2911 z->spec_start = stbi__get8(z->s);
2912 z->spec_end = stbi__get8(z->s);
2913 aa = stbi__get8(z->s);
2914 z->succ_high = (aa >> 4);
2915 z->succ_low = (aa & 15);
2916 if (z->progressive) {
2917 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2918 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2920 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2921 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2929 static int stbi__free_jpeg_components(stbi__jpeg *z,
int ncomp,
int why)
2932 for (i=0; i < ncomp; ++i) {
2933 if (z->img_comp[i].raw_data) {
2934 STBI_FREE(z->img_comp[i].raw_data);
2935 z->img_comp[i].raw_data = NULL;
2936 z->img_comp[i].data = NULL;
2938 if (z->img_comp[i].raw_coeff) {
2939 STBI_FREE(z->img_comp[i].raw_coeff);
2940 z->img_comp[i].raw_coeff = 0;
2941 z->img_comp[i].coeff = 0;
2943 if (z->img_comp[i].linebuf) {
2944 STBI_FREE(z->img_comp[i].linebuf);
2945 z->img_comp[i].linebuf = NULL;
2951 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
2953 stbi__context *s = z->s;
2954 int Lf,p,i,q, h_max=1,v_max=1,c;
2955 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2956 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
2957 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
2958 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
2960 if (c != 3 && c != 1 && c != 4)
return stbi__err(
"bad component count",
"Corrupt JPEG");
2962 for (i=0; i < c; ++i) {
2963 z->img_comp[i].data = NULL;
2964 z->img_comp[i].linebuf = NULL;
2967 if (Lf != 8+3*s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2970 for (i=0; i < s->img_n; ++i) {
2971 static unsigned char rgb[3] = {
'R',
'G',
'B' };
2972 z->img_comp[i].id = stbi__get8(s);
2973 if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
2976 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");
2977 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");
2978 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
2981 if (scan != STBI__SCAN_load)
return 1;
2983 if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0))
return stbi__err(
"too large",
"Image too large to decode");
2985 for (i=0; i < s->img_n; ++i) {
2986 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
2987 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
2991 z->img_h_max = h_max;
2992 z->img_v_max = v_max;
2993 z->img_mcu_w = h_max * 8;
2994 z->img_mcu_h = v_max * 8;
2996 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
2997 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
2999 for (i=0; i < s->img_n; ++i) {
3001 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
3002 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
3010 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3011 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3012 z->img_comp[i].coeff = 0;
3013 z->img_comp[i].raw_coeff = 0;
3014 z->img_comp[i].linebuf = NULL;
3015 z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3016 if (z->img_comp[i].raw_data == NULL)
3017 return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem",
"Out of memory"));
3019 z->img_comp[i].data = (stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
3020 if (z->progressive) {
3022 z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3023 z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3024 z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2,
sizeof(
short), 15);
3025 if (z->img_comp[i].raw_coeff == NULL)
3026 return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem",
"Out of memory"));
3027 z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
3035 #define stbi__DNL(x) ((x) == 0xdc) 3036 #define stbi__SOI(x) ((x) == 0xd8) 3037 #define stbi__EOI(x) ((x) == 0xd9) 3038 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) 3039 #define stbi__SOS(x) ((x) == 0xda) 3041 #define stbi__SOF_progressive(x) ((x) == 0xc2) 3043 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
3047 z->app14_color_transform = -1;
3048 z->marker = STBI__MARKER_none;
3049 m = stbi__get_marker(z);
3050 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
3051 if (scan == STBI__SCAN_type)
return 1;
3052 m = stbi__get_marker(z);
3053 while (!stbi__SOF(m)) {
3054 if (!stbi__process_marker(z,m))
return 0;
3055 m = stbi__get_marker(z);
3056 while (m == STBI__MARKER_none) {
3058 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
3059 m = stbi__get_marker(z);
3062 z->progressive = stbi__SOF_progressive(m);
3063 if (!stbi__process_frame_header(z, scan))
return 0;
3068 static int stbi__decode_jpeg_image(stbi__jpeg *j)
3071 for (m = 0; m < 4; m++) {
3072 j->img_comp[m].raw_data = NULL;
3073 j->img_comp[m].raw_coeff = NULL;
3075 j->restart_interval = 0;
3076 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
3077 m = stbi__get_marker(j);
3078 while (!stbi__EOI(m)) {
3080 if (!stbi__process_scan_header(j))
return 0;
3081 if (!stbi__parse_entropy_coded_data(j))
return 0;
3082 if (j->marker == STBI__MARKER_none ) {
3084 while (!stbi__at_eof(j->s)) {
3085 int x = stbi__get8(j->s);
3087 j->marker = stbi__get8(j->s);
3093 }
else if (stbi__DNL(m)) {
3094 int Ld = stbi__get16be(j->s);
3095 stbi__uint32 NL = stbi__get16be(j->s);
3096 if (Ld != 4) stbi__err(
"bad DNL len",
"Corrupt JPEG");
3097 if (NL != j->s->img_y) stbi__err(
"bad DNL height",
"Corrupt JPEG");
3099 if (!stbi__process_marker(j, m))
return 0;
3101 m = stbi__get_marker(j);
3104 stbi__jpeg_finish(j);
3110 typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
3113 #define stbi__div4(x) ((stbi_uc) ((x) >> 2)) 3115 static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3118 STBI_NOTUSED(in_far);
3124 static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3129 for (i=0; i < w; ++i)
3130 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
3134 static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3138 stbi_uc *input = in_near;
3142 out[0] = out[1] = input[0];
3147 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
3148 for (i=1; i < w-1; ++i) {
3149 int n = 3*input[i]+2;
3150 out[i*2+0] = stbi__div4(n+input[i-1]);
3151 out[i*2+1] = stbi__div4(n+input[i+1]);
3153 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
3154 out[i*2+1] = input[w-1];
3156 STBI_NOTUSED(in_far);
3162 #define stbi__div16(x) ((stbi_uc) ((x) >> 4)) 3164 static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3169 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3173 t1 = 3*in_near[0] + in_far[0];
3174 out[0] = stbi__div4(t1+2);
3175 for (i=1; i < w; ++i) {
3177 t1 = 3*in_near[i]+in_far[i];
3178 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3179 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3181 out[w*2-1] = stbi__div4(t1+2);
3188 #if defined(STBI_SSE2) || defined(STBI_NEON) 3189 static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3195 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3199 t1 = 3*in_near[0] + in_far[0];
3203 for (; i < ((w-1) & ~7); i += 8) {
3204 #if defined(STBI_SSE2) 3207 __m128i zero = _mm_setzero_si128();
3208 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
3209 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
3210 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3211 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3212 __m128i diff = _mm_sub_epi16(farw, nearw);
3213 __m128i nears = _mm_slli_epi16(nearw, 2);
3214 __m128i curr = _mm_add_epi16(nears, diff);
3221 __m128i prv0 = _mm_slli_si128(curr, 2);
3222 __m128i nxt0 = _mm_srli_si128(curr, 2);
3223 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3224 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
3230 __m128i bias = _mm_set1_epi16(8);
3231 __m128i curs = _mm_slli_epi16(curr, 2);
3232 __m128i prvd = _mm_sub_epi16(prev, curr);
3233 __m128i nxtd = _mm_sub_epi16(next, curr);
3234 __m128i curb = _mm_add_epi16(curs, bias);
3235 __m128i even = _mm_add_epi16(prvd, curb);
3236 __m128i odd = _mm_add_epi16(nxtd, curb);
3239 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3240 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3241 __m128i de0 = _mm_srli_epi16(int0, 4);
3242 __m128i de1 = _mm_srli_epi16(int1, 4);
3245 __m128i outv = _mm_packus_epi16(de0, de1);
3246 _mm_storeu_si128((__m128i *) (out + i*2), outv);
3247 #elif defined(STBI_NEON) 3250 uint8x8_t farb = vld1_u8(in_far + i);
3251 uint8x8_t nearb = vld1_u8(in_near + i);
3252 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3253 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3254 int16x8_t curr = vaddq_s16(nears, diff);
3261 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3262 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3263 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3264 int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3270 int16x8_t curs = vshlq_n_s16(curr, 2);
3271 int16x8_t prvd = vsubq_s16(prev, curr);
3272 int16x8_t nxtd = vsubq_s16(next, curr);
3273 int16x8_t even = vaddq_s16(curs, prvd);
3274 int16x8_t odd = vaddq_s16(curs, nxtd);
3278 o.val[0] = vqrshrun_n_s16(even, 4);
3279 o.val[1] = vqrshrun_n_s16(odd, 4);
3280 vst2_u8(out + i*2, o);
3284 t1 = 3*in_near[i+7] + in_far[i+7];
3288 t1 = 3*in_near[i] + in_far[i];
3289 out[i*2] = stbi__div16(3*t1 + t0 + 8);
3291 for (++i; i < w; ++i) {
3293 t1 = 3*in_near[i]+in_far[i];
3294 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3295 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3297 out[w*2-1] = stbi__div4(t1+2);
3305 static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs)
3309 STBI_NOTUSED(in_far);
3310 for (i=0; i < w; ++i)
3311 for (j=0; j < hs; ++j)
3312 out[i*hs+j] = in_near[i];
3318 #define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) 3319 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)
3322 for (i=0; i < count; ++i) {
3323 int y_fixed = (y[i] << 20) + (1<<19);
3325 int cr = pcr[i] - 128;
3326 int cb = pcb[i] - 128;
3327 r = y_fixed + cr* stbi__float2fixed(1.40200f);
3328 g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3329 b = y_fixed + cb* stbi__float2fixed(1.77200f);
3333 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3334 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3335 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3336 out[0] = (stbi_uc)r;
3337 out[1] = (stbi_uc)g;
3338 out[2] = (stbi_uc)b;
3344 #if defined(STBI_SSE2) || defined(STBI_NEON) 3345 static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc
const *y, stbi_uc
const *pcb, stbi_uc
const *pcr,
int count,
int step)
3355 __m128i signflip = _mm_set1_epi8(-0x80);
3356 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200f*4096.0f+0.5f));
3357 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
3358 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
3359 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200f*4096.0f+0.5f));
3360 __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
3361 __m128i xw = _mm_set1_epi16(255);
3363 for (; i+7 < count; i += 8) {
3365 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3366 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3367 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3368 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3369 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3372 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3373 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3374 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3377 __m128i yws = _mm_srli_epi16(yw, 4);
3378 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3379 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3380 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3381 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3382 __m128i rws = _mm_add_epi16(cr0, yws);
3383 __m128i gwt = _mm_add_epi16(cb0, yws);
3384 __m128i bws = _mm_add_epi16(yws, cb1);
3385 __m128i gws = _mm_add_epi16(gwt, cr1);
3388 __m128i rw = _mm_srai_epi16(rws, 4);
3389 __m128i bw = _mm_srai_epi16(bws, 4);
3390 __m128i gw = _mm_srai_epi16(gws, 4);
3393 __m128i brb = _mm_packus_epi16(rw, bw);
3394 __m128i gxb = _mm_packus_epi16(gw, xw);
3397 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3398 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3399 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3400 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3403 _mm_storeu_si128((__m128i *) (out + 0), o0);
3404 _mm_storeu_si128((__m128i *) (out + 16), o1);
3414 uint8x8_t signflip = vdup_n_u8(0x80);
3415 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200f*4096.0f+0.5f));
3416 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
3417 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
3418 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200f*4096.0f+0.5f));
3420 for (; i+7 < count; i += 8) {
3422 uint8x8_t y_bytes = vld1_u8(y + i);
3423 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3424 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3425 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3426 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3429 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3430 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3431 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3434 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3435 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3436 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3437 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3438 int16x8_t rws = vaddq_s16(yws, cr0);
3439 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3440 int16x8_t bws = vaddq_s16(yws, cb1);
3444 o.val[0] = vqrshrun_n_s16(rws, 4);
3445 o.val[1] = vqrshrun_n_s16(gws, 4);
3446 o.val[2] = vqrshrun_n_s16(bws, 4);
3447 o.val[3] = vdup_n_u8(255);
3456 for (; i < count; ++i) {
3457 int y_fixed = (y[i] << 20) + (1<<19);
3459 int cr = pcr[i] - 128;
3460 int cb = pcb[i] - 128;
3461 r = y_fixed + cr* stbi__float2fixed(1.40200f);
3462 g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3463 b = y_fixed + cb* stbi__float2fixed(1.77200f);
3467 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3468 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3469 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3470 out[0] = (stbi_uc)r;
3471 out[1] = (stbi_uc)g;
3472 out[2] = (stbi_uc)b;
3480 static void stbi__setup_jpeg(stbi__jpeg *j)
3482 j->idct_block_kernel = stbi__idct_block;
3483 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3484 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3487 if (stbi__sse2_available()) {
3488 j->idct_block_kernel = stbi__idct_simd;
3489 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3490 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3495 j->idct_block_kernel = stbi__idct_simd;
3496 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3497 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3502 static void stbi__cleanup_jpeg(stbi__jpeg *j)
3504 stbi__free_jpeg_components(j, j->s->img_n, 0);
3509 resample_row_func resample;
3510 stbi_uc *line0,*line1;
3518 static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
3520 unsigned int t = x*y + 128;
3521 return (stbi_uc) ((t + (t >>8)) >> 8);
3524 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3526 int n, decode_n, is_rgb;
3530 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3533 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3536 n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3538 is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3540 if (z->s->img_n == 3 && n < 3 && !is_rgb)
3543 decode_n = z->s->img_n;
3550 stbi_uc *coutput[4];
3552 stbi__resample res_comp[4];
3554 for (k=0; k < decode_n; ++k) {
3555 stbi__resample *r = &res_comp[k];
3559 z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
3560 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3562 r->hs = z->img_h_max / z->img_comp[k].h;
3563 r->vs = z->img_v_max / z->img_comp[k].v;
3564 r->ystep = r->vs >> 1;
3565 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3567 r->line0 = r->line1 = z->img_comp[k].data;
3569 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3570 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3571 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3572 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3573 else r->resample = stbi__resample_row_generic;
3577 output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3578 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3581 for (j=0; j < z->s->img_y; ++j) {
3582 stbi_uc *out = output + n * z->s->img_x * j;
3583 for (k=0; k < decode_n; ++k) {
3584 stbi__resample *r = &res_comp[k];
3585 int y_bot = r->ystep >= (r->vs >> 1);
3586 coutput[k] = r->resample(z->img_comp[k].linebuf,
3587 y_bot ? r->line1 : r->line0,
3588 y_bot ? r->line0 : r->line1,
3590 if (++r->ystep >= r->vs) {
3592 r->line0 = r->line1;
3593 if (++r->ypos < z->img_comp[k].y)
3594 r->line1 += z->img_comp[k].w2;
3598 stbi_uc *y = coutput[0];
3599 if (z->s->img_n == 3) {
3601 for (i=0; i < z->s->img_x; ++i) {
3603 out[1] = coutput[1][i];
3604 out[2] = coutput[2][i];
3609 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3611 }
else if (z->s->img_n == 4) {
3612 if (z->app14_color_transform == 0) {
3613 for (i=0; i < z->s->img_x; ++i) {
3614 stbi_uc k = coutput[3][i];
3615 out[0] = stbi__blinn_8x8(coutput[0][i], k);
3616 out[1] = stbi__blinn_8x8(coutput[1][i], k);
3617 out[2] = stbi__blinn_8x8(coutput[2][i], k);
3621 }
else if (z->app14_color_transform == 2) {
3622 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3623 for (i=0; i < z->s->img_x; ++i) {
3624 stbi_uc k = coutput[3][i];
3625 out[0] = stbi__blinn_8x8(255 - out[0], k);
3626 out[1] = stbi__blinn_8x8(255 - out[1], k);
3627 out[2] = stbi__blinn_8x8(255 - out[2], k);
3631 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3634 for (i=0; i < z->s->img_x; ++i) {
3635 out[0] = out[1] = out[2] = y[i];
3642 for (i=0; i < z->s->img_x; ++i)
3643 *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3645 for (i=0; i < z->s->img_x; ++i, out += 2) {
3646 out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3650 }
else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
3651 for (i=0; i < z->s->img_x; ++i) {
3652 stbi_uc k = coutput[3][i];
3653 stbi_uc r = stbi__blinn_8x8(coutput[0][i], k);
3654 stbi_uc g = stbi__blinn_8x8(coutput[1][i], k);
3655 stbi_uc b = stbi__blinn_8x8(coutput[2][i], k);
3656 out[0] = stbi__compute_y(r, g, b);
3660 }
else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
3661 for (i=0; i < z->s->img_x; ++i) {
3662 out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
3667 stbi_uc *y = coutput[0];
3669 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3671 for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3675 stbi__cleanup_jpeg(z);
3676 *out_x = z->s->img_x;
3677 *out_y = z->s->img_y;
3678 if (comp) *comp = z->s->img_n >= 3 ? 3 : 1;
3683 static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
3685 unsigned char* result;
3686 stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(
sizeof(stbi__jpeg));
3689 stbi__setup_jpeg(j);
3690 result = load_jpeg_image(j, x,y,comp,req_comp);
3695 static int stbi__jpeg_test(stbi__context *s)
3698 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
3700 stbi__setup_jpeg(j);
3701 r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
3707 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
3709 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3710 stbi__rewind( j->s );
3713 if (x) *x = j->s->img_x;
3714 if (y) *y = j->s->img_y;
3715 if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
3719 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
3722 stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(
sizeof(stbi__jpeg)));
3724 result = stbi__jpeg_info_raw(j, x, y, comp);
3737 #ifndef STBI_NO_ZLIB 3740 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables 3741 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) 3747 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3748 stbi__uint16 firstcode[16];
3750 stbi__uint16 firstsymbol[16];
3752 stbi__uint16 value[288];
3755 stbi_inline
static int stbi__bitreverse16(
int n)
3757 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3758 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3759 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3760 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3764 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3766 STBI_ASSERT(bits <= 16);
3769 return stbi__bitreverse16(v) >> (16-bits);
3772 static int stbi__zbuild_huffman(stbi__zhuffman *z,
const stbi_uc *sizelist,
int num)
3775 int code, next_code[16], sizes[17];
3778 memset(sizes, 0,
sizeof(sizes));
3779 memset(z->fast, 0,
sizeof(z->fast));
3780 for (i=0; i < num; ++i)
3781 ++sizes[sizelist[i]];
3783 for (i=1; i < 16; ++i)
3784 if (sizes[i] > (1 << i))
3785 return stbi__err(
"bad sizes",
"Corrupt PNG");
3787 for (i=1; i < 16; ++i) {
3788 next_code[i] = code;
3789 z->firstcode[i] = (stbi__uint16) code;
3790 z->firstsymbol[i] = (stbi__uint16) k;
3791 code = (code + sizes[i]);
3793 if (code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3794 z->maxcode[i] = code << (16-i);
3798 z->maxcode[16] = 0x10000;
3799 for (i=0; i < num; ++i) {
3800 int s = sizelist[i];
3802 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3803 stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
3804 z->size [c] = (stbi_uc ) s;
3805 z->value[c] = (stbi__uint16) i;
3806 if (s <= STBI__ZFAST_BITS) {
3807 int j = stbi__bit_reverse(next_code[s],s);
3808 while (j < (1 << STBI__ZFAST_BITS)) {
3827 stbi_uc *zbuffer, *zbuffer_end;
3829 stbi__uint32 code_buffer;
3836 stbi__zhuffman z_length, z_distance;
3839 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
3841 if (z->zbuffer >= z->zbuffer_end)
return 0;
3842 return *z->zbuffer++;
3845 static void stbi__fill_bits(stbi__zbuf *z)
3848 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3849 z->code_buffer |= (
unsigned int) stbi__zget8(z) << z->num_bits;
3851 }
while (z->num_bits <= 24);
3854 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
3857 if (z->num_bits < n) stbi__fill_bits(z);
3858 k = z->code_buffer & ((1 << n) - 1);
3859 z->code_buffer >>= n;
3864 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
3869 k = stbi__bit_reverse(a->code_buffer, 16);
3870 for (s=STBI__ZFAST_BITS+1; ; ++s)
3871 if (k < z->maxcode[s])
3873 if (s == 16)
return -1;
3875 b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
3876 STBI_ASSERT(z->size[b] == s);
3877 a->code_buffer >>= s;
3882 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3885 if (a->num_bits < 16) stbi__fill_bits(a);
3886 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3889 a->code_buffer >>= s;
3893 return stbi__zhuffman_decode_slowpath(a, z);
3896 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
3899 int cur, limit, old_limit;
3901 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3902 cur = (int) (z->zout - z->zout_start);
3903 limit = old_limit = (int) (z->zout_end - z->zout_start);
3904 while (cur + n > limit)
3906 q = (
char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
3907 STBI_NOTUSED(old_limit);
3908 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
3911 z->zout_end = q + limit;
3915 static int stbi__zlength_base[31] = {
3916 3,4,5,6,7,8,9,10,11,13,
3917 15,17,19,23,27,31,35,43,51,59,
3918 67,83,99,115,131,163,195,227,258,0,0 };
3920 static int stbi__zlength_extra[31]=
3921 { 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 };
3923 static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3924 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
3926 static int stbi__zdist_extra[32] =
3927 { 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};
3929 static int stbi__parse_huffman_block(stbi__zbuf *a)
3931 char *zout = a->zout;
3933 int z = stbi__zhuffman_decode(a, &a->z_length);
3935 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3936 if (zout >= a->zout_end) {
3937 if (!stbi__zexpand(a, zout, 1))
return 0;
3949 len = stbi__zlength_base[z];
3950 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
3951 z = stbi__zhuffman_decode(a, &a->z_distance);
3952 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3953 dist = stbi__zdist_base[z];
3954 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
3955 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
3956 if (zout + len > a->zout_end) {
3957 if (!stbi__zexpand(a, zout, len))
return 0;
3960 p = (stbi_uc *) (zout - dist);
3963 if (len) {
do *zout++ = v;
while (--len); }
3965 if (len) {
do *zout++ = *p++;
while (--len); }
3971 static int stbi__compute_huffman_codes(stbi__zbuf *a)
3973 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 };
3974 stbi__zhuffman z_codelength;
3975 stbi_uc lencodes[286+32+137];
3976 stbi_uc codelength_sizes[19];
3979 int hlit = stbi__zreceive(a,5) + 257;
3980 int hdist = stbi__zreceive(a,5) + 1;
3981 int hclen = stbi__zreceive(a,4) + 4;
3982 int ntot = hlit + hdist;
3984 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
3985 for (i=0; i < hclen; ++i) {
3986 int s = stbi__zreceive(a,3);
3987 codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
3989 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
3993 int c = stbi__zhuffman_decode(a, &z_codelength);
3994 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3996 lencodes[n++] = (stbi_uc) c;
4000 c = stbi__zreceive(a,2)+3;
4001 if (n == 0)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4002 fill = lencodes[n-1];
4004 c = stbi__zreceive(a,3)+3;
4006 STBI_ASSERT(c == 18);
4007 c = stbi__zreceive(a,7)+11;
4009 if (ntot - n < c)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4010 memset(lencodes+n, fill, c);
4014 if (n != ntot)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4015 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
4016 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
4020 static int stbi__parse_uncompressed_block(stbi__zbuf *a)
4024 if (a->num_bits & 7)
4025 stbi__zreceive(a, a->num_bits & 7);
4028 while (a->num_bits > 0) {
4029 header[k++] = (stbi_uc) (a->code_buffer & 255);
4030 a->code_buffer >>= 8;
4033 STBI_ASSERT(a->num_bits == 0);
4036 header[k++] = stbi__zget8(a);
4037 len = header[1] * 256 + header[0];
4038 nlen = header[3] * 256 + header[2];
4039 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4040 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
4041 if (a->zout + len > a->zout_end)
4042 if (!stbi__zexpand(a, a->zout, len))
return 0;
4043 memcpy(a->zout, a->zbuffer, len);
4049 static int stbi__parse_zlib_header(stbi__zbuf *a)
4051 int cmf = stbi__zget8(a);
4054 int flg = stbi__zget8(a);
4055 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4056 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
4057 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
4062 static const stbi_uc stbi__zdefault_length[288] =
4064 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4065 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4066 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4067 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4068 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4069 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4070 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4071 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4072 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8
4074 static const stbi_uc stbi__zdefault_distance[32] =
4076 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
4091 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
4095 if (!stbi__parse_zlib_header(a))
return 0;
4099 final = stbi__zreceive(a,1);
4100 type = stbi__zreceive(a,2);
4102 if (!stbi__parse_uncompressed_block(a))
return 0;
4103 }
else if (type == 3) {
4108 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288))
return 0;
4109 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
4111 if (!stbi__compute_huffman_codes(a))
return 0;
4113 if (!stbi__parse_huffman_block(a))
return 0;
4119 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
4121 a->zout_start = obuf;
4123 a->zout_end = obuf + olen;
4124 a->z_expandable = exp;
4126 return stbi__parse_zlib(a, parse_header);
4129 STBIDEF
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer,
int len,
int initial_size,
int *outlen)
4132 char *p = (
char *) stbi__malloc(initial_size);
4133 if (p == NULL)
return NULL;
4134 a.zbuffer = (stbi_uc *) buffer;
4135 a.zbuffer_end = (stbi_uc *) buffer + len;
4136 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4137 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4138 return a.zout_start;
4140 STBI_FREE(a.zout_start);
4145 STBIDEF
char *stbi_zlib_decode_malloc(
char const *buffer,
int len,
int *outlen)
4147 return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
4150 STBIDEF
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer,
int len,
int initial_size,
int *outlen,
int parse_header)
4153 char *p = (
char *) stbi__malloc(initial_size);
4154 if (p == NULL)
return NULL;
4155 a.zbuffer = (stbi_uc *) buffer;
4156 a.zbuffer_end = (stbi_uc *) buffer + len;
4157 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4158 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4159 return a.zout_start;
4161 STBI_FREE(a.zout_start);
4166 STBIDEF
int stbi_zlib_decode_buffer(
char *obuffer,
int olen,
char const *ibuffer,
int ilen)
4169 a.zbuffer = (stbi_uc *) ibuffer;
4170 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
4171 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4172 return (
int) (a.zout - a.zout_start);
4177 STBIDEF
char *stbi_zlib_decode_noheader_malloc(
char const *buffer,
int len,
int *outlen)
4180 char *p = (
char *) stbi__malloc(16384);
4181 if (p == NULL)
return NULL;
4182 a.zbuffer = (stbi_uc *) buffer;
4183 a.zbuffer_end = (stbi_uc *) buffer+len;
4184 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4185 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4186 return a.zout_start;
4188 STBI_FREE(a.zout_start);
4193 STBIDEF
int stbi_zlib_decode_noheader_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen)
4196 a.zbuffer = (stbi_uc *) ibuffer;
4197 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
4198 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4199 return (
int) (a.zout - a.zout_start);
4218 stbi__uint32 length;
4222 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
4225 c.length = stbi__get32be(s);
4226 c.type = stbi__get32be(s);
4230 static int stbi__check_png_header(stbi__context *s)
4232 static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4234 for (i=0; i < 8; ++i)
4235 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
4242 stbi_uc *idata, *expanded, *out;
4258 static stbi_uc first_row_filter[5] =
4267 static int stbi__paeth(
int a,
int b,
int c)
4273 if (pa <= pb && pa <= pc)
return a;
4274 if (pb <= pc)
return b;
4278 static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4281 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,
int depth,
int color)
4283 int bytes = (depth == 16? 2 : 1);
4284 stbi__context *s = a->s;
4285 stbi__uint32 i,j,stride = x*out_n*bytes;
4286 stbi__uint32 img_len, img_width_bytes;
4288 int img_n = s->img_n;
4290 int output_bytes = out_n*bytes;
4291 int filter_bytes = img_n*bytes;
4294 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
4295 a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0);
4296 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
4298 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4299 img_len = (img_width_bytes + 1) * y;
4300 if (s->img_x == x && s->img_y == y) {
4301 if (raw_len != img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4303 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4306 for (j=0; j < y; ++j) {
4307 stbi_uc *cur = a->out + stride*j;
4309 int filter = *raw++;
4312 return stbi__err(
"invalid filter",
"Corrupt PNG");
4315 STBI_ASSERT(img_width_bytes <= x);
4316 cur += x*out_n - img_width_bytes;
4318 width = img_width_bytes;
4320 prior = cur - stride;
4323 if (j == 0) filter = first_row_filter[filter];
4326 for (k=0; k < filter_bytes; ++k) {
4328 case STBI__F_none : cur[k] = raw[k];
break;
4329 case STBI__F_sub : cur[k] = raw[k];
break;
4330 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4331 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
4332 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
4333 case STBI__F_avg_first : cur[k] = raw[k];
break;
4334 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4344 }
else if (depth == 16) {
4345 if (img_n != out_n) {
4346 cur[filter_bytes] = 255;
4347 cur[filter_bytes+1] = 255;
4349 raw += filter_bytes;
4350 cur += output_bytes;
4351 prior += output_bytes;
4359 if (depth < 8 || img_n == out_n) {
4360 int nk = (width - 1)*filter_bytes;
4361 #define STBI__CASE(f) \ 4363 for (k=0; k < nk; ++k) 4366 case STBI__F_none: memcpy(cur, raw, nk);
break;
4367 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); }
break;
4368 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4369 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); }
break;
4370 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); }
break;
4371 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); }
break;
4372 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); }
break;
4377 STBI_ASSERT(img_n+1 == out_n);
4378 #define STBI__CASE(f) \ 4380 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ 4381 for (k=0; k < filter_bytes; ++k) 4383 STBI__CASE(STBI__F_none) { cur[k] = raw[k]; }
break;
4384 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); }
break;
4385 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4386 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); }
break;
4387 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); }
break;
4388 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); }
break;
4389 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); }
break;
4396 cur = a->out + stride*j;
4397 for (i=0; i < x; ++i,cur+=output_bytes) {
4398 cur[filter_bytes+1] = 255;
4408 for (j=0; j < y; ++j) {
4409 stbi_uc *cur = a->out + stride*j;
4410 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
4413 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4422 for (k=x*img_n; k >= 2; k-=2, ++in) {
4423 *cur++ = scale * ((*in >> 4) );
4424 *cur++ = scale * ((*in ) & 0x0f);
4426 if (k > 0) *cur++ = scale * ((*in >> 4) );
4427 }
else if (depth == 2) {
4428 for (k=x*img_n; k >= 4; k-=4, ++in) {
4429 *cur++ = scale * ((*in >> 6) );
4430 *cur++ = scale * ((*in >> 4) & 0x03);
4431 *cur++ = scale * ((*in >> 2) & 0x03);
4432 *cur++ = scale * ((*in ) & 0x03);
4434 if (k > 0) *cur++ = scale * ((*in >> 6) );
4435 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4436 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4437 }
else if (depth == 1) {
4438 for (k=x*img_n; k >= 8; k-=8, ++in) {
4439 *cur++ = scale * ((*in >> 7) );
4440 *cur++ = scale * ((*in >> 6) & 0x01);
4441 *cur++ = scale * ((*in >> 5) & 0x01);
4442 *cur++ = scale * ((*in >> 4) & 0x01);
4443 *cur++ = scale * ((*in >> 3) & 0x01);
4444 *cur++ = scale * ((*in >> 2) & 0x01);
4445 *cur++ = scale * ((*in >> 1) & 0x01);
4446 *cur++ = scale * ((*in ) & 0x01);
4448 if (k > 0) *cur++ = scale * ((*in >> 7) );
4449 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4450 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4451 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4452 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4453 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4454 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4456 if (img_n != out_n) {
4459 cur = a->out + stride*j;
4461 for (q=x-1; q >= 0; --q) {
4463 cur[q*2+0] = cur[q];
4466 STBI_ASSERT(img_n == 3);
4467 for (q=x-1; q >= 0; --q) {
4469 cur[q*4+2] = cur[q*3+2];
4470 cur[q*4+1] = cur[q*3+1];
4471 cur[q*4+0] = cur[q*3+0];
4476 }
else if (depth == 16) {
4481 stbi_uc *cur = a->out;
4482 stbi__uint16 *cur16 = (stbi__uint16*)cur;
4484 for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
4485 *cur16 = (cur[0] << 8) | cur[1];
4492 static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len,
int out_n,
int depth,
int color,
int interlaced)
4494 int bytes = (depth == 16 ? 2 : 1);
4495 int out_bytes = out_n * bytes;
4499 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4502 final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4503 for (p=0; p < 7; ++p) {
4504 int xorig[] = { 0,4,0,2,0,1,0 };
4505 int yorig[] = { 0,0,4,0,2,0,1 };
4506 int xspc[] = { 8,8,4,4,2,2,1 };
4507 int yspc[] = { 8,8,8,4,4,2,2 };
4510 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4511 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4513 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4514 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4518 for (j=0; j < y; ++j) {
4519 for (i=0; i < x; ++i) {
4520 int out_y = j*yspc[p]+yorig[p];
4521 int out_x = i*xspc[p]+xorig[p];
4522 memcpy(
final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
4523 a->out + (j*x+i)*out_bytes, out_bytes);
4527 image_data += img_len;
4528 image_data_len -= img_len;
4536 static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3],
int out_n)
4538 stbi__context *s = z->s;
4539 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4540 stbi_uc *p = z->out;
4544 STBI_ASSERT(out_n == 2 || out_n == 4);
4547 for (i=0; i < pixel_count; ++i) {
4548 p[1] = (p[0] == tc[0] ? 0 : 255);
4552 for (i=0; i < pixel_count; ++i) {
4553 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4561 static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3],
int out_n)
4563 stbi__context *s = z->s;
4564 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4565 stbi__uint16 *p = (stbi__uint16*) z->out;
4569 STBI_ASSERT(out_n == 2 || out_n == 4);
4572 for (i = 0; i < pixel_count; ++i) {
4573 p[1] = (p[0] == tc[0] ? 0 : 65535);
4577 for (i = 0; i < pixel_count; ++i) {
4578 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4586 static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette,
int len,
int pal_img_n)
4588 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4589 stbi_uc *p, *temp_out, *orig = a->out;
4591 p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4592 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4597 if (pal_img_n == 3) {
4598 for (i=0; i < pixel_count; ++i) {
4601 p[1] = palette[n+1];
4602 p[2] = palette[n+2];
4606 for (i=0; i < pixel_count; ++i) {
4609 p[1] = palette[n+1];
4610 p[2] = palette[n+2];
4611 p[3] = palette[n+3];
4623 static int stbi__unpremultiply_on_load = 0;
4624 static int stbi__de_iphone_flag = 0;
4626 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply)
4628 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4631 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert)
4633 stbi__de_iphone_flag = flag_true_if_should_convert;
4636 static void stbi__de_iphone(stbi__png *z)
4638 stbi__context *s = z->s;
4639 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4640 stbi_uc *p = z->out;
4642 if (s->img_out_n == 3) {
4643 for (i=0; i < pixel_count; ++i) {
4650 STBI_ASSERT(s->img_out_n == 4);
4651 if (stbi__unpremultiply_on_load) {
4653 for (i=0; i < pixel_count; ++i) {
4657 p[0] = p[2] * 255 / a;
4658 p[1] = p[1] * 255 / a;
4668 for (i=0; i < pixel_count; ++i) {
4678 #define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) 4680 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
4682 stbi_uc palette[1024], pal_img_n=0;
4683 stbi_uc has_trans=0, tc[3];
4684 stbi__uint16 tc16[3];
4685 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4686 int first=1,k,interlace=0, color=0, is_iphone=0;
4687 stbi__context *s = z->s;
4693 if (!stbi__check_png_header(s))
return 0;
4695 if (scan == STBI__SCAN_type)
return 1;
4698 stbi__pngchunk c = stbi__get_chunk_header(s);
4700 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4702 stbi__skip(s, c.length);
4704 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4706 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4708 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4709 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4710 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4711 z->depth = stbi__get8(s);
if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)
return stbi__err(
"1/2/4/8/16-bit only",
"PNG not supported: 1/2/4/8/16-bit only");
4712 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4713 if (color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4714 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4715 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4716 filter= stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4717 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4718 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4720 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4721 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4722 if (scan == STBI__SCAN_header)
return 1;
4727 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4733 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4734 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4735 if (c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4736 pal_len = c.length / 3;
4737 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4738 for (i=0; i < pal_len; ++i) {
4739 palette[i*4+0] = stbi__get8(s);
4740 palette[i*4+1] = stbi__get8(s);
4741 palette[i*4+2] = stbi__get8(s);
4742 palette[i*4+3] = 255;
4747 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4748 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4749 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4751 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4752 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4753 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4755 for (i=0; i < c.length; ++i)
4756 palette[i*4+3] = stbi__get8(s);
4758 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4759 if (c.length != (stbi__uint32) s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4761 if (z->depth == 16) {
4762 for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s);
4764 for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth];
4770 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4771 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4772 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4773 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4774 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
4775 if (ioff + c.length > idata_limit) {
4776 stbi__uint32 idata_limit_old = idata_limit;
4778 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4779 while (ioff + c.length > idata_limit)
4781 STBI_NOTUSED(idata_limit_old);
4782 p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4785 if (!stbi__getn(s, z->idata+ioff,c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4790 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4791 stbi__uint32 raw_len, bpl;
4792 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4793 if (scan != STBI__SCAN_load)
return 1;
4794 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4796 bpl = (s->img_x * z->depth + 7) / 8;
4797 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4798 z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((
char *) z->idata, ioff, raw_len, (
int *) &raw_len, !is_iphone);
4799 if (z->expanded == NULL)
return 0;
4800 STBI_FREE(z->idata); z->idata = NULL;
4801 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
4802 s->img_out_n = s->img_n+1;
4804 s->img_out_n = s->img_n;
4805 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace))
return 0;
4807 if (z->depth == 16) {
4808 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
return 0;
4810 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4813 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4817 s->img_n = pal_img_n;
4818 s->img_out_n = pal_img_n;
4819 if (req_comp >= 3) s->img_out_n = req_comp;
4820 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4823 STBI_FREE(z->expanded); z->expanded = NULL;
4829 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4830 if ((c.type & (1 << 29)) == 0) {
4831 #ifndef STBI_NO_FAILURE_STRINGS 4833 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4834 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4835 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4836 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4837 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4839 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4841 stbi__skip(s, c.length);
4849 static void *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp, stbi__result_info *ri)
4852 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4853 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4855 ri->bits_per_channel = 8;
4857 ri->bits_per_channel = p->depth;
4860 if (req_comp && req_comp != p->s->img_out_n) {
4861 if (ri->bits_per_channel == 8)
4862 result = stbi__convert_format((
unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4864 result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4865 p->s->img_out_n = req_comp;
4866 if (result == NULL)
return result;
4870 if (n) *n = p->s->img_n;
4872 STBI_FREE(p->out); p->out = NULL;
4873 STBI_FREE(p->expanded); p->expanded = NULL;
4874 STBI_FREE(p->idata); p->idata = NULL;
4879 static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
4883 return stbi__do_png(&p, x,y,comp,req_comp, ri);
4886 static int stbi__png_test(stbi__context *s)
4889 r = stbi__check_png_header(s);
4894 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
4896 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
4897 stbi__rewind( p->s );
4900 if (x) *x = p->s->img_x;
4901 if (y) *y = p->s->img_y;
4902 if (comp) *comp = p->s->img_n;
4906 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
4910 return stbi__png_info_raw(&p, x, y, comp);
4917 static int stbi__bmp_test_raw(stbi__context *s)
4921 if (stbi__get8(s) !=
'B')
return 0;
4922 if (stbi__get8(s) !=
'M')
return 0;
4927 sz = stbi__get32le(s);
4928 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4932 static int stbi__bmp_test(stbi__context *s)
4934 int r = stbi__bmp_test_raw(s);
4941 static int stbi__high_bit(
unsigned int z)
4944 if (z == 0)
return -1;
4945 if (z >= 0x10000) n += 16, z >>= 16;
4946 if (z >= 0x00100) n += 8, z >>= 8;
4947 if (z >= 0x00010) n += 4, z >>= 4;
4948 if (z >= 0x00004) n += 2, z >>= 2;
4949 if (z >= 0x00002) n += 1, z >>= 1;
4953 static int stbi__bitcount(
unsigned int a)
4955 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
4956 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
4957 a = (a + (a >> 4)) & 0x0f0f0f0f;
4959 a = (a + (a >> 16));
4963 static int stbi__shiftsigned(
int v,
int shift,
int bits)
4968 if (shift < 0) v <<= -shift;
4982 int bpp, offset, hsz;
4983 unsigned int mr,mg,mb,ma, all_a;
4986 static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
4989 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
4993 info->offset = stbi__get32le(s);
4994 info->hsz = hsz = stbi__get32le(s);
4995 info->mr = info->mg = info->mb = info->ma = 0;
4997 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
4999 s->img_x = stbi__get16le(s);
5000 s->img_y = stbi__get16le(s);
5002 s->img_x = stbi__get32le(s);
5003 s->img_y = stbi__get32le(s);
5005 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5006 info->bpp = stbi__get16le(s);
5007 if (info->bpp == 1)
return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
5009 int compress = stbi__get32le(s);
5010 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5016 if (hsz == 40 || hsz == 56) {
5023 if (info->bpp == 16 || info->bpp == 32) {
5024 if (compress == 0) {
5025 if (info->bpp == 32) {
5026 info->mr = 0xffu << 16;
5027 info->mg = 0xffu << 8;
5028 info->mb = 0xffu << 0;
5029 info->ma = 0xffu << 24;
5032 info->mr = 31u << 10;
5033 info->mg = 31u << 5;
5034 info->mb = 31u << 0;
5036 }
else if (compress == 3) {
5037 info->mr = stbi__get32le(s);
5038 info->mg = stbi__get32le(s);
5039 info->mb = stbi__get32le(s);
5041 if (info->mr == info->mg && info->mg == info->mb) {
5043 return stbi__errpuc(
"bad BMP",
"bad BMP");
5046 return stbi__errpuc(
"bad BMP",
"bad BMP");
5050 if (hsz != 108 && hsz != 124)
5051 return stbi__errpuc(
"bad BMP",
"bad BMP");
5052 info->mr = stbi__get32le(s);
5053 info->mg = stbi__get32le(s);
5054 info->mb = stbi__get32le(s);
5055 info->ma = stbi__get32le(s);
5057 for (i=0; i < 12; ++i)
5071 static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5074 unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
5075 stbi_uc pal[256][4];
5076 int psize=0,i,j,width;
5077 int flip_vertically, pad, target;
5078 stbi__bmp_data info;
5082 if (stbi__bmp_parse_header(s, &info) == NULL)
5085 flip_vertically = ((int) s->img_y) > 0;
5086 s->img_y = abs((
int) s->img_y);
5094 if (info.hsz == 12) {
5096 psize = (info.offset - 14 - 24) / 3;
5099 psize = (info.offset - 14 - info.hsz) >> 2;
5102 s->img_n = ma ? 4 : 3;
5103 if (req_comp && req_comp >= 3)
5109 if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5110 return stbi__errpuc(
"too large",
"Corrupt BMP");
5112 out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5113 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5114 if (info.bpp < 16) {
5116 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
5117 for (i=0; i < psize; ++i) {
5118 pal[i][2] = stbi__get8(s);
5119 pal[i][1] = stbi__get8(s);
5120 pal[i][0] = stbi__get8(s);
5121 if (info.hsz != 12) stbi__get8(s);
5124 stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5125 if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5126 else if (info.bpp == 8) width = s->img_x;
5127 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
5129 for (j=0; j < (int) s->img_y; ++j) {
5130 for (i=0; i < (int) s->img_x; i += 2) {
5131 int v=stbi__get8(s),v2=0;
5132 if (info.bpp == 4) {
5136 out[z++] = pal[v][0];
5137 out[z++] = pal[v][1];
5138 out[z++] = pal[v][2];
5139 if (target == 4) out[z++] = 255;
5140 if (i+1 == (
int) s->img_x)
break;
5141 v = (info.bpp == 8) ? stbi__get8(s) : v2;
5142 out[z++] = pal[v][0];
5143 out[z++] = pal[v][1];
5144 out[z++] = pal[v][2];
5145 if (target == 4) out[z++] = 255;
5150 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
5153 stbi__skip(s, info.offset - 14 - info.hsz);
5154 if (info.bpp == 24) width = 3 * s->img_x;
5155 else if (info.bpp == 16) width = 2*s->img_x;
5158 if (info.bpp == 24) {
5160 }
else if (info.bpp == 32) {
5161 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5165 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5167 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
5168 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
5169 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
5170 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
5172 for (j=0; j < (int) s->img_y; ++j) {
5174 for (i=0; i < (int) s->img_x; ++i) {
5176 out[z+2] = stbi__get8(s);
5177 out[z+1] = stbi__get8(s);
5178 out[z+0] = stbi__get8(s);
5180 a = (easy == 2 ? stbi__get8(s) : 255);
5182 if (target == 4) out[z++] = a;
5186 for (i=0; i < (int) s->img_x; ++i) {
5187 stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
5189 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5190 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5191 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5192 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5194 if (target == 4) out[z++] = STBI__BYTECAST(a);
5202 if (target == 4 && all_a == 0)
5203 for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
5206 if (flip_vertically) {
5208 for (j=0; j < (int) s->img_y>>1; ++j) {
5209 stbi_uc *p1 = out + j *s->img_x*target;
5210 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
5211 for (i=0; i < (int) s->img_x*target; ++i) {
5212 t = p1[i], p1[i] = p2[i], p2[i] = t;
5217 if (req_comp && req_comp != target) {
5218 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
5219 if (out == NULL)
return out;
5224 if (comp) *comp = s->img_n;
5233 static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
5236 if(is_rgb16) *is_rgb16 = 0;
5237 switch(bits_per_pixel) {
5238 case 8:
return STBI_grey;
5239 case 16:
if(is_grey)
return STBI_grey_alpha;
5241 case 15:
if(is_rgb16) *is_rgb16 = 1;
5244 case 32:
return bits_per_pixel/8;
5249 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
5251 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5252 int sz, tga_colormap_type;
5254 tga_colormap_type = stbi__get8(s);
5255 if( tga_colormap_type > 1 ) {
5259 tga_image_type = stbi__get8(s);
5260 if ( tga_colormap_type == 1 ) {
5261 if (tga_image_type != 1 && tga_image_type != 9) {
5267 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5272 tga_colormap_bpp = sz;
5274 if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5279 tga_colormap_bpp = 0;
5281 tga_w = stbi__get16le(s);
5286 tga_h = stbi__get16le(s);
5291 tga_bits_per_pixel = stbi__get8(s);
5293 if (tga_colormap_bpp != 0) {
5294 if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5300 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5302 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5310 if (comp) *comp = tga_comp;
5314 static int stbi__tga_test(stbi__context *s)
5317 int sz, tga_color_type;
5319 tga_color_type = stbi__get8(s);
5320 if ( tga_color_type > 1 )
goto errorEnd;
5322 if ( tga_color_type == 1 ) {
5323 if (sz != 1 && sz != 9)
goto errorEnd;
5326 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5329 if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) )
goto errorEnd;
5332 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5333 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5335 if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) )
goto errorEnd;
5336 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5346 static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
5348 stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5349 stbi__uint16 fiveBitMask = 31;
5351 int r = (px >> 10) & fiveBitMask;
5352 int g = (px >> 5) & fiveBitMask;
5353 int b = px & fiveBitMask;
5355 out[0] = (stbi_uc)((r * 255)/31);
5356 out[1] = (stbi_uc)((g * 255)/31);
5357 out[2] = (stbi_uc)((b * 255)/31);
5365 static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5368 int tga_offset = stbi__get8(s);
5369 int tga_indexed = stbi__get8(s);
5370 int tga_image_type = stbi__get8(s);
5372 int tga_palette_start = stbi__get16le(s);
5373 int tga_palette_len = stbi__get16le(s);
5374 int tga_palette_bits = stbi__get8(s);
5375 int tga_x_origin = stbi__get16le(s);
5376 int tga_y_origin = stbi__get16le(s);
5377 int tga_width = stbi__get16le(s);
5378 int tga_height = stbi__get16le(s);
5379 int tga_bits_per_pixel = stbi__get8(s);
5380 int tga_comp, tga_rgb16=0;
5381 int tga_inverted = stbi__get8(s);
5384 unsigned char *tga_data;
5385 unsigned char *tga_palette = NULL;
5387 unsigned char raw_data[4] = {0};
5389 int RLE_repeating = 0;
5390 int read_next_pixel = 1;
5394 if ( tga_image_type >= 8 )
5396 tga_image_type -= 8;
5399 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5402 if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5403 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5406 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5411 if (comp) *comp = tga_comp;
5413 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5414 return stbi__errpuc(
"too large",
"Corrupt TGA");
5416 tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5417 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
5420 stbi__skip(s, tga_offset );
5422 if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
5423 for (i=0; i < tga_height; ++i) {
5424 int row = tga_inverted ? tga_height -i - 1 : i;
5425 stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5426 stbi__getn(s, tga_row, tga_width * tga_comp);
5433 stbi__skip(s, tga_palette_start );
5435 tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5437 STBI_FREE(tga_data);
5438 return stbi__errpuc(
"outofmem",
"Out of memory");
5441 stbi_uc *pal_entry = tga_palette;
5442 STBI_ASSERT(tga_comp == STBI_rgb);
5443 for (i=0; i < tga_palette_len; ++i) {
5444 stbi__tga_read_rgb16(s, pal_entry);
5445 pal_entry += tga_comp;
5447 }
else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5448 STBI_FREE(tga_data);
5449 STBI_FREE(tga_palette);
5450 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5454 for (i=0; i < tga_width * tga_height; ++i)
5459 if ( RLE_count == 0 )
5462 int RLE_cmd = stbi__get8(s);
5463 RLE_count = 1 + (RLE_cmd & 127);
5464 RLE_repeating = RLE_cmd >> 7;
5465 read_next_pixel = 1;
5466 }
else if ( !RLE_repeating )
5468 read_next_pixel = 1;
5472 read_next_pixel = 1;
5475 if ( read_next_pixel )
5481 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5482 if ( pal_idx >= tga_palette_len ) {
5486 pal_idx *= tga_comp;
5487 for (j = 0; j < tga_comp; ++j) {
5488 raw_data[j] = tga_palette[pal_idx+j];
5490 }
else if(tga_rgb16) {
5491 STBI_ASSERT(tga_comp == STBI_rgb);
5492 stbi__tga_read_rgb16(s, raw_data);
5495 for (j = 0; j < tga_comp; ++j) {
5496 raw_data[j] = stbi__get8(s);
5500 read_next_pixel = 0;
5504 for (j = 0; j < tga_comp; ++j)
5505 tga_data[i*tga_comp+j] = raw_data[j];
5513 for (j = 0; j*2 < tga_height; ++j)
5515 int index1 = j * tga_width * tga_comp;
5516 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5517 for (i = tga_width * tga_comp; i > 0; --i)
5519 unsigned char temp = tga_data[index1];
5520 tga_data[index1] = tga_data[index2];
5521 tga_data[index2] = temp;
5528 if ( tga_palette != NULL )
5530 STBI_FREE( tga_palette );
5535 if (tga_comp >= 3 && !tga_rgb16)
5537 unsigned char* tga_pixel = tga_data;
5538 for (i=0; i < tga_width * tga_height; ++i)
5540 unsigned char temp = tga_pixel[0];
5541 tga_pixel[0] = tga_pixel[2];
5542 tga_pixel[2] = temp;
5543 tga_pixel += tga_comp;
5548 if (req_comp && req_comp != tga_comp)
5549 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5553 tga_palette_start = tga_palette_len = tga_palette_bits =
5554 tga_x_origin = tga_y_origin = 0;
5564 static int stbi__psd_test(stbi__context *s)
5566 int r = (stbi__get32be(s) == 0x38425053);
5571 static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p,
int pixelCount)
5573 int count, nleft, len;
5576 while ((nleft = pixelCount - count) > 0) {
5577 len = stbi__get8(s);
5580 }
else if (len < 128) {
5583 if (len > nleft)
return 0;
5590 }
else if (len > 128) {
5595 if (len > nleft)
return 0;
5596 val = stbi__get8(s);
5609 static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
5612 int channelCount, compression;
5620 if (stbi__get32be(s) != 0x38425053)
5621 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5624 if (stbi__get16be(s) != 1)
5625 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5631 channelCount = stbi__get16be(s);
5632 if (channelCount < 0 || channelCount > 16)
5633 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5636 h = stbi__get32be(s);
5637 w = stbi__get32be(s);
5640 bitdepth = stbi__get16be(s);
5641 if (bitdepth != 8 && bitdepth != 16)
5642 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
5654 if (stbi__get16be(s) != 3)
5655 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5658 stbi__skip(s,stbi__get32be(s) );
5661 stbi__skip(s, stbi__get32be(s) );
5664 stbi__skip(s, stbi__get32be(s) );
5670 compression = stbi__get16be(s);
5671 if (compression > 1)
5672 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5675 if (!stbi__mad3sizes_valid(4, w, h, 0))
5676 return stbi__errpuc(
"too large",
"Corrupt PSD");
5680 if (!compression && bitdepth == 16 && bpc == 16) {
5681 out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
5682 ri->bits_per_channel = 16;
5684 out = (stbi_uc *) stbi__malloc(4 * w*h);
5686 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5704 stbi__skip(s, h * channelCount * 2 );
5707 for (channel = 0; channel < 4; channel++) {
5711 if (channel >= channelCount) {
5713 for (i = 0; i < pixelCount; i++, p += 4)
5714 *p = (channel == 3 ? 255 : 0);
5717 if (!stbi__psd_decode_rle(s, p, pixelCount)) {
5719 return stbi__errpuc(
"corrupt",
"bad RLE data");
5729 for (channel = 0; channel < 4; channel++) {
5730 if (channel >= channelCount) {
5732 if (bitdepth == 16 && bpc == 16) {
5733 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
5734 stbi__uint16 val = channel == 3 ? 65535 : 0;
5735 for (i = 0; i < pixelCount; i++, q += 4)
5738 stbi_uc *p = out+channel;
5739 stbi_uc val = channel == 3 ? 255 : 0;
5740 for (i = 0; i < pixelCount; i++, p += 4)
5744 if (ri->bits_per_channel == 16) {
5745 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
5746 for (i = 0; i < pixelCount; i++, q += 4)
5747 *q = (stbi__uint16) stbi__get16be(s);
5749 stbi_uc *p = out+channel;
5750 if (bitdepth == 16) {
5751 for (i = 0; i < pixelCount; i++, p += 4)
5752 *p = (stbi_uc) (stbi__get16be(s) >> 8);
5754 for (i = 0; i < pixelCount; i++, p += 4)
5763 if (channelCount >= 4) {
5764 if (ri->bits_per_channel == 16) {
5765 for (i=0; i < w*h; ++i) {
5766 stbi__uint16 *
pixel = (stbi__uint16 *) out + 4*i;
5768 float a =
pixel[3] / 65535.0f;
5769 float ra = 1.0f / a;
5770 float inv_a = 65535.0f * (1 - ra);
5771 pixel[0] = (stbi__uint16) (
pixel[0]*ra + inv_a);
5772 pixel[1] = (stbi__uint16) (
pixel[1]*ra + inv_a);
5773 pixel[2] = (stbi__uint16) (
pixel[2]*ra + inv_a);
5777 for (i=0; i < w*h; ++i) {
5778 unsigned char *
pixel = out + 4*i;
5780 float a =
pixel[3] / 255.0f;
5781 float ra = 1.0f / a;
5782 float inv_a = 255.0f * (1 - ra);
5783 pixel[0] = (
unsigned char) (
pixel[0]*ra + inv_a);
5784 pixel[1] = (
unsigned char) (
pixel[1]*ra + inv_a);
5785 pixel[2] = (
unsigned char) (
pixel[2]*ra + inv_a);
5792 if (req_comp && req_comp != 4) {
5793 if (ri->bits_per_channel == 16)
5794 out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
5796 out = stbi__convert_format(out, 4, req_comp, w, h);
5797 if (out == NULL)
return out;
5800 if (comp) *comp = 4;
5816 static int stbi__pic_is4(stbi__context *s,
const char *str)
5820 if (stbi__get8(s) != (stbi_uc)str[i])
5826 static int stbi__pic_test_core(stbi__context *s)
5830 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
5836 if (!stbi__pic_is4(s,
"PICT"))
5844 stbi_uc size,type,channel;
5847 static stbi_uc *stbi__readval(stbi__context *s,
int channel, stbi_uc *dest)
5851 for (i=0; i<4; ++i, mask>>=1) {
5852 if (channel & mask) {
5853 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
5854 dest[i]=stbi__get8(s);
5861 static void stbi__copyval(
int channel,stbi_uc *dest,
const stbi_uc *src)
5865 for (i=0;i<4; ++i, mask>>=1)
5870 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp, stbi_uc *result)
5872 int act_comp=0,num_packets=0,y,chained;
5873 stbi__pic_packet packets[10];
5878 stbi__pic_packet *packet;
5880 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
5881 return stbi__errpuc(
"bad format",
"too many packets");
5883 packet = &packets[num_packets++];
5885 chained = stbi__get8(s);
5886 packet->size = stbi__get8(s);
5887 packet->type = stbi__get8(s);
5888 packet->channel = stbi__get8(s);
5890 act_comp |= packet->channel;
5892 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
5893 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
5896 *comp = (act_comp & 0x10 ? 4 : 3);
5898 for(y=0; y<height; ++y) {
5901 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
5902 stbi__pic_packet *packet = &packets[packet_idx];
5903 stbi_uc *dest = result+y*width*4;
5905 switch (packet->type) {
5907 return stbi__errpuc(
"bad format",
"packet has bad compression type");
5912 for(x=0;x<width;++x, dest+=4)
5913 if (!stbi__readval(s,packet->channel,dest))
5923 stbi_uc count,value[4];
5925 count=stbi__get8(s);
5926 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
5929 count = (stbi_uc) left;
5931 if (!stbi__readval(s,packet->channel,value))
return 0;
5933 for(i=0; i<count; ++i,dest+=4)
5934 stbi__copyval(packet->channel,dest,value);
5943 int count = stbi__get8(s), i;
5944 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
5950 count = stbi__get16be(s);
5954 return stbi__errpuc(
"bad file",
"scanline overrun");
5956 if (!stbi__readval(s,packet->channel,value))
5959 for(i=0;i<count;++i, dest += 4)
5960 stbi__copyval(packet->channel,dest,value);
5963 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
5965 for(i=0;i<count;++i, dest+=4)
5966 if (!stbi__readval(s,packet->channel,dest))
5980 static void *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp, stbi__result_info *ri)
5983 int i, x,y, internal_comp;
5986 if (!comp) comp = &internal_comp;
5988 for (i=0; i<92; ++i)
5991 x = stbi__get16be(s);
5992 y = stbi__get16be(s);
5993 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
5994 if (!stbi__mad3sizes_valid(x, y, 4, 0))
return stbi__errpuc(
"too large",
"PIC image too large to decode");
6001 result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
6002 memset(result, 0xff, x*y*4);
6004 if (!stbi__pic_load_core(s,x,y,comp, result)) {
6010 if (req_comp == 0) req_comp = *comp;
6011 result=stbi__convert_format(result,4,req_comp,x,y);
6016 static int stbi__pic_test(stbi__context *s)
6018 int r = stbi__pic_test_core(s);
6038 stbi_uc *out, *old_out;
6039 int flags, bgindex, ratio, transparent, eflags, delay;
6040 stbi_uc pal[256][4];
6041 stbi_uc lpal[256][4];
6042 stbi__gif_lzw codes[4096];
6043 stbi_uc *color_table;
6046 int start_x, start_y;
6052 static int stbi__gif_test_raw(stbi__context *s)
6055 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
6057 if (sz !=
'9' && sz !=
'7')
return 0;
6058 if (stbi__get8(s) !=
'a')
return 0;
6062 static int stbi__gif_test(stbi__context *s)
6064 int r = stbi__gif_test_raw(s);
6069 static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4],
int num_entries,
int transp)
6072 for (i=0; i < num_entries; ++i) {
6073 pal[i][2] = stbi__get8(s);
6074 pal[i][1] = stbi__get8(s);
6075 pal[i][0] = stbi__get8(s);
6076 pal[i][3] = transp == i ? 0 : 255;
6080 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
6083 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
6084 return stbi__err(
"not GIF",
"Corrupt GIF");
6086 version = stbi__get8(s);
6087 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
6088 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
6090 stbi__g_failure_reason =
"";
6091 g->w = stbi__get16le(s);
6092 g->h = stbi__get16le(s);
6093 g->flags = stbi__get8(s);
6094 g->bgindex = stbi__get8(s);
6095 g->ratio = stbi__get8(s);
6096 g->transparent = -1;
6098 if (comp != 0) *comp = 4;
6100 if (is_info)
return 1;
6102 if (g->flags & 0x80)
6103 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
6108 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
6110 stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
6111 if (!stbi__gif_header(s, g, comp, 1)) {
6122 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6128 if (g->codes[code].prefix >= 0)
6129 stbi__out_gif_code(g, g->codes[code].prefix);
6131 if (g->cur_y >= g->max_y)
return;
6133 p = &g->out[g->cur_x + g->cur_y];
6134 c = &g->color_table[g->codes[code].suffix * 4];
6144 if (g->cur_x >= g->max_x) {
6145 g->cur_x = g->start_x;
6146 g->cur_y += g->step;
6148 while (g->cur_y >= g->max_y && g->parse > 0) {
6149 g->step = (1 << g->parse) * g->line_size;
6150 g->cur_y = g->start_y + (g->step >> 1);
6156 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
6159 stbi__int32 len, init_code;
6161 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6164 lzw_cs = stbi__get8(s);
6165 if (lzw_cs > 12)
return NULL;
6166 clear = 1 << lzw_cs;
6168 codesize = lzw_cs + 1;
6169 codemask = (1 << codesize) - 1;
6172 for (init_code = 0; init_code < clear; init_code++) {
6173 g->codes[init_code].prefix = -1;
6174 g->codes[init_code].first = (stbi_uc) init_code;
6175 g->codes[init_code].suffix = (stbi_uc) init_code;
6184 if (valid_bits < codesize) {
6186 len = stbi__get8(s);
6191 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
6194 stbi__int32 code = bits & codemask;
6196 valid_bits -= codesize;
6198 if (code == clear) {
6199 codesize = lzw_cs + 1;
6200 codemask = (1 << codesize) - 1;
6204 }
else if (code == clear + 1) {
6206 while ((len = stbi__get8(s)) > 0)
6209 }
else if (code <= avail) {
6210 if (first)
return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6213 p = &g->codes[avail++];
6214 if (avail > 4096)
return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6215 p->prefix = (stbi__int16) oldcode;
6216 p->first = g->codes[oldcode].first;
6217 p->suffix = (code == avail) ? p->first : g->codes[code].first;
6218 }
else if (code == avail)
6219 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6221 stbi__out_gif_code(g, (stbi__uint16) code);
6223 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6225 codemask = (1 << codesize) - 1;
6230 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6236 static void stbi__fill_gif_background(stbi__gif *g,
int x0,
int y0,
int x1,
int y1)
6239 stbi_uc *c = g->pal[g->bgindex];
6240 for (y = y0; y < y1; y += 4 * g->w) {
6241 for (x = x0; x < x1; x += 4) {
6242 stbi_uc *p = &g->out[y + x];
6252 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp)
6255 stbi_uc *prev_out = 0;
6257 if (g->out == 0 && !stbi__gif_header(s, g, comp,0))
6260 if (!stbi__mad3sizes_valid(g->w, g->h, 4, 0))
6261 return stbi__errpuc(
"too large",
"GIF too large");
6264 g->out = (stbi_uc *) stbi__malloc_mad3(4, g->w, g->h, 0);
6265 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
6267 switch ((g->eflags & 0x1C) >> 2) {
6269 stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);
6272 if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
6273 g->old_out = prev_out;
6276 if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
6277 stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
6281 for (i = g->start_y; i < g->max_y; i += 4 * g->w)
6282 memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
6288 switch (stbi__get8(s)) {
6291 int prev_trans = -1;
6292 stbi__int32 x, y, w, h;
6295 x = stbi__get16le(s);
6296 y = stbi__get16le(s);
6297 w = stbi__get16le(s);
6298 h = stbi__get16le(s);
6299 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6300 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6302 g->line_size = g->w * 4;
6304 g->start_y = y * g->line_size;
6305 g->max_x = g->start_x + w * 4;
6306 g->max_y = g->start_y + h * g->line_size;
6307 g->cur_x = g->start_x;
6308 g->cur_y = g->start_y;
6310 g->lflags = stbi__get8(s);
6312 if (g->lflags & 0x40) {
6313 g->step = 8 * g->line_size;
6316 g->step = g->line_size;
6320 if (g->lflags & 0x80) {
6321 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6322 g->color_table = (stbi_uc *) g->lpal;
6323 }
else if (g->flags & 0x80) {
6324 if (g->transparent >= 0 && (g->eflags & 0x01)) {
6325 prev_trans = g->pal[g->transparent][3];
6326 g->pal[g->transparent][3] = 0;
6328 g->color_table = (stbi_uc *) g->pal;
6330 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6332 o = stbi__process_gif_raster(s, g);
6333 if (o == NULL)
return NULL;
6335 if (prev_trans != -1)
6336 g->pal[g->transparent][3] = (stbi_uc) prev_trans;
6344 if (stbi__get8(s) == 0xF9) {
6345 len = stbi__get8(s);
6347 g->eflags = stbi__get8(s);
6348 g->delay = stbi__get16le(s);
6349 g->transparent = stbi__get8(s);
6355 while ((len = stbi__get8(s)) != 0)
6361 return (stbi_uc *) s;
6364 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6368 STBI_NOTUSED(req_comp);
6371 static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6374 stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
6375 memset(g, 0,
sizeof(*g));
6378 u = stbi__gif_load_next(s, g, comp, req_comp);
6379 if (u == (stbi_uc *) s) u = 0;
6383 if (req_comp && req_comp != 4)
6384 u = stbi__convert_format(u, 4, req_comp, g->w, g->h);
6392 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
6394 return stbi__gif_info_raw(s,x,y,comp);
6402 static int stbi__hdr_test_core(stbi__context *s,
const char *signature)
6405 for (i=0; signature[i]; ++i)
6406 if (stbi__get8(s) != signature[i])
6412 static int stbi__hdr_test(stbi__context* s)
6414 int r = stbi__hdr_test_core(s,
"#?RADIANCE\n");
6417 r = stbi__hdr_test_core(s,
"#?RGBE\n");
6423 #define STBI__HDR_BUFLEN 1024 6424 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
6429 c = (char) stbi__get8(z);
6431 while (!stbi__at_eof(z) && c !=
'\n') {
6433 if (len == STBI__HDR_BUFLEN-1) {
6435 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
6439 c = (char) stbi__get8(z);
6446 static void stbi__hdr_convert(
float *output, stbi_uc *input,
int req_comp)
6448 if ( input[3] != 0 ) {
6451 f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
6453 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
6455 output[0] = input[0] * f1;
6456 output[1] = input[1] * f1;
6457 output[2] = input[2] * f1;
6459 if (req_comp == 2) output[1] = 1;
6460 if (req_comp == 4) output[3] = 1;
6463 case 4: output[3] = 1;
6464 case 3: output[0] = output[1] = output[2] = 0;
6466 case 2: output[1] = 1;
6467 case 1: output[0] = 0;
6473 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6475 char buffer[STBI__HDR_BUFLEN];
6482 unsigned char count, value;
6483 int i, j, k, c1,c2, z;
6484 const char *headerToken;
6488 headerToken = stbi__hdr_gettoken(s,buffer);
6489 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
6490 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
6494 token = stbi__hdr_gettoken(s,buffer);
6495 if (token[0] == 0)
break;
6496 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6499 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
6503 token = stbi__hdr_gettoken(s,buffer);
6504 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6506 height = (int) strtol(token, &token, 10);
6507 while (*token ==
' ') ++token;
6508 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6510 width = (int) strtol(token, NULL, 10);
6515 if (comp) *comp = 3;
6516 if (req_comp == 0) req_comp = 3;
6518 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
6519 return stbi__errpf(
"too large",
"HDR image is too large");
6522 hdr_data = (
float *) stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
6524 return stbi__errpf(
"outofmem",
"Out of memory");
6528 if ( width < 8 || width >= 32768) {
6530 for (j=0; j < height; ++j) {
6531 for (i=0; i < width; ++i) {
6534 stbi__getn(s, rgbe, 4);
6535 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
6542 for (j = 0; j < height; ++j) {
6545 len = stbi__get8(s);
6546 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
6550 rgbe[0] = (stbi_uc) c1;
6551 rgbe[1] = (stbi_uc) c2;
6552 rgbe[2] = (stbi_uc) len;
6553 rgbe[3] = (stbi_uc) stbi__get8(s);
6554 stbi__hdr_convert(hdr_data, rgbe, req_comp);
6557 STBI_FREE(scanline);
6558 goto main_decode_loop;
6561 len |= stbi__get8(s);
6562 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
6563 if (scanline == NULL) {
6564 scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
6566 STBI_FREE(hdr_data);
6567 return stbi__errpf(
"outofmem",
"Out of memory");
6571 for (k = 0; k < 4; ++k) {
6574 while ((nleft = width - i) > 0) {
6575 count = stbi__get8(s);
6578 value = stbi__get8(s);
6580 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6581 for (z = 0; z < count; ++z)
6582 scanline[i++ * 4 + k] = value;
6585 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6586 for (z = 0; z < count; ++z)
6587 scanline[i++ * 4 + k] = stbi__get8(s);
6591 for (i=0; i < width; ++i)
6592 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
6595 STBI_FREE(scanline);
6601 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
6603 char buffer[STBI__HDR_BUFLEN];
6610 if (!comp) comp = &dummy;
6612 if (stbi__hdr_test(s) == 0) {
6618 token = stbi__hdr_gettoken(s,buffer);
6619 if (token[0] == 0)
break;
6620 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6627 token = stbi__hdr_gettoken(s,buffer);
6628 if (strncmp(token,
"-Y ", 3)) {
6633 *y = (int) strtol(token, &token, 10);
6634 while (*token ==
' ') ++token;
6635 if (strncmp(token,
"+X ", 3)) {
6640 *x = (int) strtol(token, NULL, 10);
6644 #endif // STBI_NO_HDR 6647 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
6650 stbi__bmp_data info;
6653 p = stbi__bmp_parse_header(s, &info);
6657 if (x) *x = s->img_x;
6658 if (y) *y = s->img_y;
6659 if (comp) *comp = info.ma ? 4 : 3;
6665 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
6667 int channelCount, dummy;
6670 if (!comp) comp = &dummy;
6671 if (stbi__get32be(s) != 0x38425053) {
6675 if (stbi__get16be(s) != 1) {
6680 channelCount = stbi__get16be(s);
6681 if (channelCount < 0 || channelCount > 16) {
6685 *y = stbi__get32be(s);
6686 *x = stbi__get32be(s);
6687 if (stbi__get16be(s) != 8) {
6691 if (stbi__get16be(s) != 3) {
6701 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
6703 int act_comp=0,num_packets=0,chained,dummy;
6704 stbi__pic_packet packets[10];
6708 if (!comp) comp = &dummy;
6710 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
6717 *x = stbi__get16be(s);
6718 *y = stbi__get16be(s);
6719 if (stbi__at_eof(s)) {
6723 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
6731 stbi__pic_packet *packet;
6733 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
6736 packet = &packets[num_packets++];
6737 chained = stbi__get8(s);
6738 packet->size = stbi__get8(s);
6739 packet->type = stbi__get8(s);
6740 packet->channel = stbi__get8(s);
6741 act_comp |= packet->channel;
6743 if (stbi__at_eof(s)) {
6747 if (packet->size != 8) {
6753 *comp = (act_comp & 0x10 ? 4 : 3);
6773 static int stbi__pnm_test(stbi__context *s)
6776 p = (char) stbi__get8(s);
6777 t = (char) stbi__get8(s);
6778 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6785 static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6790 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
6795 if (comp) *comp = s->img_n;
6797 if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
6798 return stbi__errpuc(
"too large",
"PNM too large");
6800 out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
6801 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6802 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
6804 if (req_comp && req_comp != s->img_n) {
6805 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
6806 if (out == NULL)
return out;
6811 static int stbi__pnm_isspace(
char c)
6813 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
6816 static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
6819 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
6820 *c = (char) stbi__get8(s);
6822 if (stbi__at_eof(s) || *c !=
'#')
6825 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r' )
6826 *c = (
char) stbi__get8(s);
6830 static int stbi__pnm_isdigit(
char c)
6832 return c >=
'0' && c <=
'9';
6835 static int stbi__pnm_getinteger(stbi__context *s,
char *c)
6839 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
6840 value = value*10 + (*c -
'0');
6841 *c = (char) stbi__get8(s);
6847 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
6854 if (!comp) comp = &dummy;
6859 p = (char) stbi__get8(s);
6860 t = (char) stbi__get8(s);
6861 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6866 *comp = (t ==
'6') ? 3 : 1;
6868 c = (char) stbi__get8(s);
6869 stbi__pnm_skip_whitespace(s, &c);
6871 *x = stbi__pnm_getinteger(s, &c);
6872 stbi__pnm_skip_whitespace(s, &c);
6874 *y = stbi__pnm_getinteger(s, &c);
6875 stbi__pnm_skip_whitespace(s, &c);
6877 maxv = stbi__pnm_getinteger(s, &c);
6880 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
6886 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
6888 #ifndef STBI_NO_JPEG 6889 if (stbi__jpeg_info(s, x, y, comp))
return 1;
6893 if (stbi__png_info(s, x, y, comp))
return 1;
6897 if (stbi__gif_info(s, x, y, comp))
return 1;
6901 if (stbi__bmp_info(s, x, y, comp))
return 1;
6905 if (stbi__psd_info(s, x, y, comp))
return 1;
6909 if (stbi__pic_info(s, x, y, comp))
return 1;
6913 if (stbi__pnm_info(s, x, y, comp))
return 1;
6917 if (stbi__hdr_info(s, x, y, comp))
return 1;
6922 if (stbi__tga_info(s, x, y, comp))
6925 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
6928 #ifndef STBI_NO_STDIO 6929 STBIDEF
int stbi_info(
char const *filename,
int *x,
int *y,
int *comp)
6931 FILE *f = stbi__fopen(filename,
"rb");
6933 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
6934 result = stbi_info_from_file(f, x, y, comp);
6939 STBIDEF
int stbi_info_from_file(FILE *f,
int *x,
int *y,
int *comp)
6943 long pos = ftell(f);
6944 stbi__start_file(&s, f);
6945 r = stbi__info_main(&s,x,y,comp);
6946 fseek(f,pos,SEEK_SET);
6949 #endif // !STBI_NO_STDIO 6951 STBIDEF
int stbi_info_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp)
6954 stbi__start_mem(&s,buffer,len);
6955 return stbi__info_main(&s,x,y,comp);
6958 STBIDEF
int stbi_info_from_callbacks(
stbi_io_callbacks const *c,
void *user,
int *x,
int *y,
int *comp)
6962 return stbi__info_main(&s,x,y,comp);
6965 #endif // STB_IMAGE_IMPLEMENTATION