219 #ifndef STBI_INCLUDE_STB_IMAGE_H 220 #define STBI_INCLUDE_STB_IMAGE_H 391 #ifndef STBI_NO_STDIO 393 #endif // STBI_NO_STDIO 395 #define STBI_VERSION 1 406 typedef unsigned char stbi_uc;
412 #ifdef STB_IMAGE_STATIC 413 #define STBIDEF static 415 #define STBIDEF extern 435 int (*eof)(
void *user);
438 STBIDEF stbi_uc *stbi_load(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp);
440 stbi_load_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp);
441 STBIDEF stbi_uc *stbi_load_from_callbacks(
442 stbi_io_callbacks
const *clbk,
449 #ifndef STBI_NO_STDIO 450 STBIDEF stbi_uc *stbi_load_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp);
454 #ifndef STBI_NO_LINEAR 455 STBIDEF
float *stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp);
457 stbi_loadf_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp);
458 STBIDEF
float *stbi_loadf_from_callbacks(
459 stbi_io_callbacks
const *clbk,
466 #ifndef STBI_NO_STDIO 467 STBIDEF
float *stbi_loadf_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp);
472 STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma);
473 STBIDEF
void stbi_hdr_to_ldr_scale(
float scale);
474 #endif // STBI_NO_HDR 476 #ifndef STBI_NO_LINEAR 477 STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma);
478 STBIDEF
void stbi_ldr_to_hdr_scale(
float scale);
479 #endif // STBI_NO_LINEAR 482 STBIDEF
int stbi_is_hdr_from_callbacks(stbi_io_callbacks
const *clbk,
void *user);
483 STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const *buffer,
int len);
484 #ifndef STBI_NO_STDIO 485 STBIDEF
int stbi_is_hdr(
char const *filename);
486 STBIDEF
int stbi_is_hdr_from_file(FILE *f);
487 #endif // STBI_NO_STDIO 491 STBIDEF
const char *stbi_failure_reason(
void);
494 STBIDEF
void stbi_image_free(
void *retval_from_stbi_load);
497 STBIDEF
int stbi_info_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp);
499 stbi_info_from_callbacks(stbi_io_callbacks
const *clbk,
void *user,
int *x,
int *y,
int *comp);
501 #ifndef STBI_NO_STDIO 502 STBIDEF
int stbi_info(
char const *filename,
int *x,
int *y,
int *comp);
503 STBIDEF
int stbi_info_from_file(FILE *f,
int *x,
int *y,
int *comp);
510 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply);
514 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert);
517 STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip);
522 stbi_zlib_decode_malloc_guesssize(
const char *buffer,
int len,
int initial_size,
int *outlen);
523 STBIDEF
char *stbi_zlib_decode_malloc_guesssize_headerflag(
529 STBIDEF
char *stbi_zlib_decode_malloc(
const char *buffer,
int len,
int *outlen);
530 STBIDEF
int stbi_zlib_decode_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen);
532 STBIDEF
char *stbi_zlib_decode_noheader_malloc(
const char *buffer,
int len,
int *outlen);
534 stbi_zlib_decode_noheader_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen);
543 #endif // STBI_INCLUDE_STB_IMAGE_H 545 #ifdef STB_IMAGE_IMPLEMENTATION 547 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ 548 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ 549 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ 550 || defined(STBI_ONLY_ZLIB) 551 #ifndef STBI_ONLY_JPEG 554 #ifndef STBI_ONLY_PNG 557 #ifndef STBI_ONLY_BMP 560 #ifndef STBI_ONLY_PSD 563 #ifndef STBI_ONLY_TGA 566 #ifndef STBI_ONLY_GIF 569 #ifndef STBI_ONLY_HDR 572 #ifndef STBI_ONLY_PIC 575 #ifndef STBI_ONLY_PNM 580 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) 589 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) 593 #ifndef STBI_NO_STDIO 599 #define STBI_ASSERT(x) assert(x) 604 #define stbi_inline inline 609 #define stbi_inline __forceinline 613 typedef unsigned short stbi__uint16;
614 typedef signed short stbi__int16;
615 typedef unsigned int stbi__uint32;
616 typedef signed int stbi__int32;
619 typedef uint16_t stbi__uint16;
620 typedef int16_t stbi__int16;
621 typedef uint32_t stbi__uint32;
622 typedef int32_t stbi__int32;
626 typedef unsigned char validate_uint32[
sizeof(stbi__uint32) == 4 ? 1 : -1];
629 #define STBI_NOTUSED(v) (void)(v) 631 #define STBI_NOTUSED(v) (void)sizeof(v) 635 #define STBI_HAS_LROTL 638 #ifdef STBI_HAS_LROTL 639 #define stbi_lrot(x, y) _lrotl(x, y) 641 #define stbi_lrot(x, y) (((x) << (y)) | ((x) >> (32 - (y)))) 644 #if defined(STBI_MALLOC) && defined(STBI_FREE) \ 645 && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) 647 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) \ 648 && !defined(STBI_REALLOC_SIZED) 652 "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." 656 #define STBI_MALLOC(sz) malloc(sz) 657 #define STBI_REALLOC(p, newsz) realloc(p, newsz) 658 #define STBI_FREE(p) free(p) 661 #ifndef STBI_REALLOC_SIZED 662 #define STBI_REALLOC_SIZED(p, oldsz, newsz) STBI_REALLOC(p, newsz) 666 #if defined(__x86_64__) || defined(_M_X64) 667 #define STBI__X64_TARGET 668 #elif defined(__i386) || defined(_M_IX86) 669 #define STBI__X86_TARGET 672 #if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) \ 673 && !defined(__SSE2__) && !defined(STBI_NO_SIMD) 682 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) \ 683 && !defined(STBI_NO_SIMD) 698 #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) 700 #include <emmintrin.h> 704 #if _MSC_VER >= 1400 // not VC6 706 static int stbi__cpuid3(
void) {
712 static int stbi__cpuid3(
void) {
723 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name 725 static int stbi__sse2_available() {
726 int info3 = stbi__cpuid3();
727 return ((info3 >> 26) & 1) != 0;
729 #else // assume GCC-style if not VC++ 730 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 732 static int stbi__sse2_available() {
733 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later 735 return __builtin_cpu_supports(
"sse2");
746 #if defined(STBI_NO_SIMD) && defined(STBI_NEON) 751 #include <arm_neon.h> 753 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 756 #ifndef STBI_SIMD_ALIGN 757 #define STBI_SIMD_ALIGN(type, name) type name 767 stbi__uint32 img_x, img_y;
768 int img_n, img_out_n;
773 int read_from_callbacks;
775 stbi_uc buffer_start[128];
777 stbi_uc *img_buffer, *img_buffer_end;
778 stbi_uc *img_buffer_original, *img_buffer_original_end;
781 static void stbi__refill_buffer(stbi__context *s);
784 static void stbi__start_mem(stbi__context *s, stbi_uc
const *buffer,
int len) {
786 s->read_from_callbacks = 0;
787 s->img_buffer = s->img_buffer_original = (stbi_uc *)buffer;
788 s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *)buffer + len;
792 static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user) {
794 s->io_user_data = user;
795 s->buflen =
sizeof(s->buffer_start);
796 s->read_from_callbacks = 1;
797 s->img_buffer_original = s->buffer_start;
798 stbi__refill_buffer(s);
799 s->img_buffer_original_end = s->img_buffer_end;
802 #ifndef STBI_NO_STDIO 804 static int stbi__stdio_read(
void *user,
char *data,
int size) {
805 return (
int)fread(data, 1, size, (FILE *)user);
808 static void stbi__stdio_skip(
void *user,
int n) { fseek((FILE *)user, n, SEEK_CUR); }
810 static int stbi__stdio_eof(
void *user) {
return feof((FILE *)user); }
818 static void stbi__start_file(stbi__context *s, FILE *f) {
819 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *)f);
824 #endif // !STBI_NO_STDIO 826 static void stbi__rewind(stbi__context *s) {
830 s->img_buffer = s->img_buffer_original;
831 s->img_buffer_end = s->img_buffer_original_end;
835 static int stbi__jpeg_test(stbi__context *s);
836 static stbi_uc *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
837 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
841 static int stbi__png_test(stbi__context *s);
842 static stbi_uc *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
843 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
847 static int stbi__bmp_test(stbi__context *s);
848 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
849 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
853 static int stbi__tga_test(stbi__context *s);
854 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
855 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
859 static int stbi__psd_test(stbi__context *s);
860 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
861 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
865 static int stbi__hdr_test(stbi__context *s);
866 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
867 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
871 static int stbi__pic_test(stbi__context *s);
872 static stbi_uc *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
873 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
877 static int stbi__gif_test(stbi__context *s);
878 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
879 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
883 static int stbi__pnm_test(stbi__context *s);
884 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
885 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
889 static const char *stbi__g_failure_reason;
891 STBIDEF
const char *stbi_failure_reason(
void) {
return stbi__g_failure_reason; }
893 static int stbi__err(
const char *str) {
894 stbi__g_failure_reason = str;
898 static void *stbi__malloc(
size_t size) {
return STBI_MALLOC(size); }
904 #ifdef STBI_NO_FAILURE_STRINGS 905 #define stbi__err(x, y) 0 906 #elif defined(STBI_FAILURE_USERMSG) 907 #define stbi__err(x, y) stbi__err(y) 909 #define stbi__err(x, y) stbi__err(x) 912 #define stbi__errpf(x, y) ((float *)(size_t)(stbi__err(x, y) ? NULL : NULL)) 913 #define stbi__errpuc(x, y) ((unsigned char *)(size_t)(stbi__err(x, y) ? NULL : NULL)) 915 STBIDEF
void stbi_image_free(
void *retval_from_stbi_load) { STBI_FREE(retval_from_stbi_load); }
917 #ifndef STBI_NO_LINEAR 918 static float *stbi__ldr_to_hdr(stbi_uc *data,
int x,
int y,
int comp);
922 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
925 static int stbi__vertically_flip_on_load = 0;
927 STBIDEF
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip) {
928 stbi__vertically_flip_on_load = flag_true_if_should_flip;
931 static unsigned char *stbi__load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
933 if (stbi__jpeg_test(s))
934 return stbi__jpeg_load(s, x, y, comp, req_comp);
937 if (stbi__png_test(s))
938 return stbi__png_load(s, x, y, comp, req_comp);
941 if (stbi__bmp_test(s))
942 return stbi__bmp_load(s, x, y, comp, req_comp);
945 if (stbi__gif_test(s))
946 return stbi__gif_load(s, x, y, comp, req_comp);
949 if (stbi__psd_test(s))
950 return stbi__psd_load(s, x, y, comp, req_comp);
953 if (stbi__pic_test(s))
954 return stbi__pic_load(s, x, y, comp, req_comp);
957 if (stbi__pnm_test(s))
958 return stbi__pnm_load(s, x, y, comp, req_comp);
962 if (stbi__hdr_test(s)) {
963 float *hdr = stbi__hdr_load(s, x, y, comp, req_comp);
964 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
970 if (stbi__tga_test(s))
971 return stbi__tga_load(s, x, y, comp, req_comp);
974 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
977 static unsigned char *stbi__load_flip(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
978 unsigned char *result = stbi__load_main(s, x, y, comp, req_comp);
980 if (stbi__vertically_flip_on_load && result != NULL) {
982 int depth = req_comp ? req_comp : *comp;
987 for (row = 0; row < (h >> 1); row++) {
988 for (col = 0; col < w; col++) {
989 for (z = 0; z < depth; z++) {
990 temp = result[(row * w + col) * depth + z];
991 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
992 result[((h - row - 1) * w + col) * depth + z] = temp;
1002 static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp) {
1003 if (stbi__vertically_flip_on_load && result != NULL) {
1005 int depth = req_comp ? req_comp : *comp;
1010 for (row = 0; row < (h >> 1); row++) {
1011 for (col = 0; col < w; col++) {
1012 for (z = 0; z < depth; z++) {
1013 temp = result[(row * w + col) * depth + z];
1014 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
1015 result[((h - row - 1) * w + col) * depth + z] = temp;
1023 #ifndef STBI_NO_STDIO 1025 static FILE *stbi__fopen(
char const *filename,
char const *mode) {
1027 #if defined(_MSC_VER) && _MSC_VER >= 1400 1028 if (0 != fopen_s(&f, filename, mode))
1031 f = fopen(filename, mode);
1036 STBIDEF stbi_uc *stbi_load(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp) {
1037 FILE *f = stbi__fopen(filename,
"rb");
1038 unsigned char *result;
1040 return stbi__errpuc(
"can't fopen",
"Unable to open file");
1041 result = stbi_load_from_file(f, x, y, comp, req_comp);
1046 STBIDEF stbi_uc *stbi_load_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp) {
1047 unsigned char *result;
1049 stbi__start_file(&s, f);
1050 result = stbi__load_flip(&s, x, y, comp, req_comp);
1053 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
1060 stbi_load_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp) {
1062 stbi__start_mem(&s, buffer, len);
1063 return stbi__load_flip(&s, x, y, comp, req_comp);
1066 STBIDEF stbi_uc *stbi_load_from_callbacks(
1075 return stbi__load_flip(&s, x, y, comp, req_comp);
1078 #ifndef STBI_NO_LINEAR 1079 static float *stbi__loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
1080 unsigned char *data;
1082 if (stbi__hdr_test(s)) {
1083 float *hdr_data = stbi__hdr_load(s, x, y, comp, req_comp);
1085 stbi__float_postprocess(hdr_data, x, y, comp, req_comp);
1089 data = stbi__load_flip(s, x, y, comp, req_comp);
1091 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1092 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1096 stbi_loadf_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp,
int req_comp) {
1098 stbi__start_mem(&s, buffer, len);
1099 return stbi__loadf_main(&s, x, y, comp, req_comp);
1102 STBIDEF
float *stbi_loadf_from_callbacks(
1111 return stbi__loadf_main(&s, x, y, comp, req_comp);
1114 #ifndef STBI_NO_STDIO 1115 STBIDEF
float *stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp) {
1117 FILE *f = stbi__fopen(filename,
"rb");
1119 return stbi__errpf(
"can't fopen",
"Unable to open file");
1120 result = stbi_loadf_from_file(f, x, y, comp, req_comp);
1125 STBIDEF
float *stbi_loadf_from_file(FILE *f,
int *x,
int *y,
int *comp,
int req_comp) {
1127 stbi__start_file(&s, f);
1128 return stbi__loadf_main(&s, x, y, comp, req_comp);
1130 #endif // !STBI_NO_STDIO 1132 #endif // !STBI_NO_LINEAR 1138 STBIDEF
int stbi_is_hdr_from_memory(stbi_uc
const *buffer,
int len) {
1141 stbi__start_mem(&s, buffer, len);
1142 return stbi__hdr_test(&s);
1144 STBI_NOTUSED(buffer);
1150 #ifndef STBI_NO_STDIO 1151 STBIDEF
int stbi_is_hdr(
char const *filename) {
1152 FILE *f = stbi__fopen(filename,
"rb");
1155 result = stbi_is_hdr_from_file(f);
1161 STBIDEF
int stbi_is_hdr_from_file(FILE *f) {
1164 stbi__start_file(&s, f);
1165 return stbi__hdr_test(&s);
1171 #endif // !STBI_NO_STDIO 1173 STBIDEF
int stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk,
void *user) {
1177 return stbi__hdr_test(&s);
1185 #ifndef STBI_NO_LINEAR 1186 static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f;
1188 STBIDEF
void stbi_ldr_to_hdr_gamma(
float gamma) { stbi__l2h_gamma = gamma; }
1189 STBIDEF
void stbi_ldr_to_hdr_scale(
float scale) { stbi__l2h_scale = scale; }
1192 static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f;
1194 STBIDEF
void stbi_hdr_to_ldr_gamma(
float gamma) { stbi__h2l_gamma_i = 1 / gamma; }
1195 STBIDEF
void stbi_hdr_to_ldr_scale(
float scale) { stbi__h2l_scale_i = 1 / scale; }
1202 enum { STBI__SCAN_load = 0, STBI__SCAN_type, STBI__SCAN_header };
1204 static void stbi__refill_buffer(stbi__context *s) {
1205 int n = (s->io.read)(s->io_user_data, (
char *)s->buffer_start, s->buflen);
1209 s->read_from_callbacks = 0;
1210 s->img_buffer = s->buffer_start;
1211 s->img_buffer_end = s->buffer_start + 1;
1215 s->img_buffer = s->buffer_start;
1216 s->img_buffer_end = s->buffer_start + n;
1220 stbi_inline
static stbi_uc stbi__get8(stbi__context *s) {
1221 if (s->img_buffer < s->img_buffer_end)
1222 return *s->img_buffer++;
1223 if (s->read_from_callbacks) {
1224 stbi__refill_buffer(s);
1225 return *s->img_buffer++;
1230 stbi_inline
static int stbi__at_eof(stbi__context *s) {
1232 if (!(s->io.eof)(s->io_user_data))
1236 if (s->read_from_callbacks == 0)
1240 return s->img_buffer >= s->img_buffer_end;
1243 static void stbi__skip(stbi__context *s,
int n) {
1245 s->img_buffer = s->img_buffer_end;
1249 int blen = (int)(s->img_buffer_end - s->img_buffer);
1251 s->img_buffer = s->img_buffer_end;
1252 (s->io.skip)(s->io_user_data, n - blen);
1259 static int stbi__getn(stbi__context *s, stbi_uc *buffer,
int n) {
1261 int blen = (int)(s->img_buffer_end - s->img_buffer);
1265 memcpy(buffer, s->img_buffer, blen);
1267 count = (s->io.read)(s->io_user_data, (
char *)buffer + blen, n - blen);
1268 res = (count == (n - blen));
1269 s->img_buffer = s->img_buffer_end;
1274 if (s->img_buffer + n <= s->img_buffer_end) {
1275 memcpy(buffer, s->img_buffer, n);
1283 static int stbi__get16be(stbi__context *s) {
1284 int z = stbi__get8(s);
1285 return (z << 8) + stbi__get8(s);
1288 static stbi__uint32 stbi__get32be(stbi__context *s) {
1289 stbi__uint32 z = stbi__get16be(s);
1290 return (z << 16) + stbi__get16be(s);
1293 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) 1296 static int stbi__get16le(stbi__context *s) {
1297 int z = stbi__get8(s);
1298 return z + (stbi__get8(s) << 8);
1303 static stbi__uint32 stbi__get32le(stbi__context *s) {
1304 stbi__uint32 z = stbi__get16le(s);
1305 return z + (stbi__get16le(s) << 16);
1309 #define STBI__BYTECAST(x) ((stbi_uc)((x)&255)) // truncate int to byte without warnings 1322 static stbi_uc stbi__compute_y(
int r,
int g,
int b) {
1323 return (stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1326 static unsigned char *
1327 stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y) {
1329 unsigned char *good;
1331 if (req_comp == img_n)
1333 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1335 good = (
unsigned char *)stbi__malloc(req_comp * x * y);
1338 return stbi__errpuc(
"outofmem",
"Out of memory");
1341 for (j = 0; j < (int)y; ++j) {
1342 unsigned char *src = data + j * x * img_n;
1343 unsigned char *dest = good + j * x * req_comp;
1345 #define COMBO(a, b) ((a)*8 + (b)) 1346 #define CASE(a, b) \ 1348 for (i = x - 1; i >= 0; --i, src += a, dest += b) 1351 switch (COMBO(img_n, req_comp)) {
1352 CASE(1, 2) dest[0] = src[0], dest[1] = 255;
1354 CASE(1, 3) dest[0] = dest[1] = dest[2] = src[0];
1356 CASE(1, 4) dest[0] = dest[1] = dest[2] = src[0], dest[3] = 255;
1358 CASE(2, 1) dest[0] = src[0];
1360 CASE(2, 3) dest[0] = dest[1] = dest[2] = src[0];
1362 CASE(2, 4) dest[0] = dest[1] = dest[2] = src[0], dest[3] = src[1];
1364 CASE(3, 4) dest[0] = src[0], dest[1] = src[1], dest[2] = src[2], dest[3] = 255;
1366 CASE(3, 1) dest[0] = stbi__compute_y(src[0], src[1], src[2]);
1368 CASE(3, 2) dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = 255;
1370 CASE(4, 1) dest[0] = stbi__compute_y(src[0], src[1], src[2]);
1372 CASE(4, 2) dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = src[3];
1374 CASE(4, 3) dest[0] = src[0], dest[1] = src[1], dest[2] = src[2];
1376 default: STBI_ASSERT(0);
1385 #ifndef STBI_NO_LINEAR 1386 static float *stbi__ldr_to_hdr(stbi_uc *data,
int x,
int y,
int comp) {
1388 float *output = (
float *)stbi__malloc(x * y * comp *
sizeof(
float));
1389 if (output == NULL) {
1391 return stbi__errpf(
"outofmem",
"Out of memory");
1398 for (i = 0; i < x * y; ++i) {
1399 for (k = 0; k < n; ++k) {
1400 output[i * comp + k] =
1401 (float)(powf(data[i * comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1404 output[i * comp + k] = data[i * comp + k] / 255.0f;
1412 #define stbi__float2int(x) ((int)(x)) 1413 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp) {
1415 stbi_uc *output = (stbi_uc *)stbi__malloc(x * y * comp);
1416 if (output == NULL) {
1418 return stbi__errpuc(
"outofmem",
"Out of memory");
1425 for (i = 0; i < x * y; ++i) {
1426 for (k = 0; k < n; ++k) {
1428 (float)pow(data[i * comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1433 output[i * comp + k] = (stbi_uc)stbi__float2int(z);
1436 float z = data[i * comp + k] * 255 + 0.5f;
1441 output[i * comp + k] = (stbi_uc)stbi__float2int(z);
1470 #ifndef STBI_NO_JPEG 1473 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache 1476 stbi_uc fast[1 << FAST_BITS];
1478 stbi__uint16 code[256];
1479 stbi_uc values[256];
1481 unsigned int maxcode[18];
1487 stbi__huffman huff_dc[4];
1488 stbi__huffman huff_ac[4];
1489 stbi_uc dequant[4][64];
1490 stbi__int16 fast_ac[4][1 << FAST_BITS];
1493 int img_h_max, img_v_max;
1494 int img_mcu_x, img_mcu_y;
1495 int img_mcu_w, img_mcu_h;
1507 void *raw_data, *raw_coeff;
1510 int coeff_w, coeff_h;
1513 stbi__uint32 code_buffer;
1515 unsigned char marker;
1526 int scan_n, order[4];
1527 int restart_interval, todo;
1530 void (*idct_block_kernel)(stbi_uc *out,
int out_stride,
short data[64]);
1531 void (*YCbCr_to_RGB_kernel)(
1539 *resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs);
1542 static int stbi__build_huffman(stbi__huffman *h,
int *count) {
1543 int i, j, k = 0, code;
1545 for (i = 0; i < 16; ++i)
1546 for (j = 0; j < count[i]; ++j)
1547 h->size[k++] = (stbi_uc)(i + 1);
1553 for (j = 1; j <= 16; ++j) {
1555 h->delta[j] = k - code;
1556 if (h->size[k] == j) {
1557 while (h->size[k] == j)
1558 h->code[k++] = (stbi__uint16)(code++);
1559 if (code - 1 >= (1 << j))
1560 return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1563 h->maxcode[j] = code << (16 - j);
1566 h->maxcode[j] = 0xffffffff;
1569 memset(h->fast, 255, 1 << FAST_BITS);
1570 for (i = 0; i < k; ++i) {
1572 if (s <= FAST_BITS) {
1573 int c = h->code[i] << (FAST_BITS - s);
1574 int m = 1 << (FAST_BITS - s);
1575 for (j = 0; j < m; ++j) {
1576 h->fast[c + j] = (stbi_uc)i;
1585 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) {
1587 for (i = 0; i < (1 << FAST_BITS); ++i) {
1588 stbi_uc fast = h->fast[i];
1591 int rs = h->values[fast];
1592 int run = (rs >> 4) & 15;
1593 int magbits = rs & 15;
1594 int len = h->size[fast];
1596 if (magbits && len + magbits <= FAST_BITS) {
1598 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1599 int m = 1 << (magbits - 1);
1601 k += (-1 << magbits) + 1;
1603 if (k >= -128 && k <= 127)
1604 fast_ac[i] = (stbi__int16)((k << 8) + (run << 4) + (len + magbits));
1610 static void stbi__grow_buffer_unsafe(stbi__jpeg *j) {
1612 int b = j->nomore ? 0 : stbi__get8(j->s);
1614 int c = stbi__get8(j->s);
1616 j->marker = (
unsigned char)c;
1621 j->code_buffer |= b << (24 - j->code_bits);
1623 }
while (j->code_bits <= 24);
1627 static stbi__uint32 stbi__bmask[17] =
1628 {0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535};
1631 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) {
1635 if (j->code_bits < 16)
1636 stbi__grow_buffer_unsafe(j);
1640 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
1644 if (s > j->code_bits)
1646 j->code_buffer <<= s;
1648 return h->values[k];
1657 temp = j->code_buffer >> 16;
1658 for (k = FAST_BITS + 1;; ++k)
1659 if (temp < h->maxcode[k])
1667 if (k > j->code_bits)
1671 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1672 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1676 j->code_buffer <<= k;
1677 return h->values[c];
1681 static int const stbi__jbias[16] =
1682 {0, -1, -3, -7, -15, -31, -63, -127, -255, -511, -1023, -2047, -4095, -8191, -16383, -32767};
1686 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n) {
1689 if (j->code_bits < n)
1690 stbi__grow_buffer_unsafe(j);
1692 sgn = (stbi__int32)j->code_buffer >> 31;
1693 k = stbi_lrot(j->code_buffer, n);
1694 STBI_ASSERT(n >= 0 && n < (
int)(
sizeof(stbi__bmask) /
sizeof(*stbi__bmask)));
1695 j->code_buffer = k & ~stbi__bmask[n];
1696 k &= stbi__bmask[n];
1698 return k + (stbi__jbias[n] & ~sgn);
1702 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n) {
1704 if (j->code_bits < n)
1705 stbi__grow_buffer_unsafe(j);
1706 k = stbi_lrot(j->code_buffer, n);
1707 j->code_buffer = k & ~stbi__bmask[n];
1708 k &= stbi__bmask[n];
1713 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j) {
1715 if (j->code_bits < 1)
1716 stbi__grow_buffer_unsafe(j);
1718 j->code_buffer <<= 1;
1720 return k & 0x80000000;
1725 static stbi_uc stbi__jpeg_dezigzag[64 + 15] = {0,
1807 static int stbi__jpeg_decode_block(
1818 if (j->code_bits < 16)
1819 stbi__grow_buffer_unsafe(j);
1820 t = stbi__jpeg_huff_decode(j, hdc);
1822 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1825 memset(data, 0, 64 *
sizeof(data[0]));
1827 diff = t ? stbi__extend_receive(j, t) : 0;
1828 dc = j->img_comp[b].dc_pred + diff;
1829 j->img_comp[b].dc_pred = dc;
1830 data[0] = (short)(dc * dequant[0]);
1837 if (j->code_bits < 16)
1838 stbi__grow_buffer_unsafe(j);
1839 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
1844 j->code_buffer <<= s;
1847 zig = stbi__jpeg_dezigzag[k++];
1848 data[zig] = (short)((r >> 8) * dequant[zig]);
1851 int rs = stbi__jpeg_huff_decode(j, hac);
1853 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1864 zig = stbi__jpeg_dezigzag[k++];
1865 data[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]);
1873 stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b) {
1876 if (j->spec_end != 0)
1877 return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1879 if (j->code_bits < 16)
1880 stbi__grow_buffer_unsafe(j);
1882 if (j->succ_high == 0) {
1884 memset(data, 0, 64 *
sizeof(data[0]));
1885 t = stbi__jpeg_huff_decode(j, hdc);
1886 diff = t ? stbi__extend_receive(j, t) : 0;
1888 dc = j->img_comp[b].dc_pred + diff;
1889 j->img_comp[b].dc_pred = dc;
1890 data[0] = (short)(dc << j->succ_low);
1894 if (stbi__jpeg_get_bit(j))
1895 data[0] += (
short)(1 << j->succ_low);
1902 static int stbi__jpeg_decode_block_prog_ac(
1908 if (j->spec_start == 0)
1909 return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1911 if (j->succ_high == 0) {
1912 int shift = j->succ_low;
1923 if (j->code_bits < 16)
1924 stbi__grow_buffer_unsafe(j);
1925 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
1930 j->code_buffer <<= s;
1932 zig = stbi__jpeg_dezigzag[k++];
1933 data[zig] = (short)((r >> 8) << shift);
1936 int rs = stbi__jpeg_huff_decode(j, hac);
1938 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1943 j->eob_run = (1 << r);
1945 j->eob_run += stbi__jpeg_get_bits(j, r);
1953 zig = stbi__jpeg_dezigzag[k++];
1954 data[zig] = (short)(stbi__extend_receive(j, s) << shift);
1957 }
while (k <= j->spec_end);
1962 short bit = (short)(1 << j->succ_low);
1966 for (k = j->spec_start; k <= j->spec_end; ++k) {
1967 short *p = &data[stbi__jpeg_dezigzag[k]];
1969 if (stbi__jpeg_get_bit(j))
1970 if ((*p & bit) == 0) {
1982 int rs = stbi__jpeg_huff_decode(j, hac);
1985 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1990 j->eob_run = (1 << r) - 1;
1992 j->eob_run += stbi__jpeg_get_bits(j, r);
2003 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2005 if (stbi__jpeg_get_bit(j))
2012 while (k <= j->spec_end) {
2013 short *p = &data[stbi__jpeg_dezigzag[k++]];
2015 if (stbi__jpeg_get_bit(j))
2016 if ((*p & bit) == 0) {
2031 }
while (k <= j->spec_end);
2038 stbi_inline
static stbi_uc stbi__clamp(
int x) {
2040 if ((
unsigned int)x > 255) {
2049 #define stbi__f2f(x) ((int)(((x)*4096 + 0.5f))) 2050 #define stbi__fsh(x) ((x) << 12) 2053 #define STBI__IDCT_1D(s0, s1, s2, s3, s4, s5, s6, s7) \ 2054 int t0, t1, t2, t3, p1, p2, p3, p4, p5, x0, x1, x2, x3; \ 2057 p1 = (p2 + p3) * stbi__f2f(0.5411961f); \ 2058 t2 = p1 + p3 * stbi__f2f(-1.847759065f); \ 2059 t3 = p1 + p2 * stbi__f2f(0.765366865f); \ 2062 t0 = stbi__fsh(p2 + p3); \ 2063 t1 = stbi__fsh(p2 - p3); \ 2076 p5 = (p3 + p4) * stbi__f2f(1.175875602f); \ 2077 t0 = t0 * stbi__f2f(0.298631336f); \ 2078 t1 = t1 * stbi__f2f(2.053119869f); \ 2079 t2 = t2 * stbi__f2f(3.072711026f); \ 2080 t3 = t3 * stbi__f2f(1.501321110f); \ 2081 p1 = p5 + p1 * stbi__f2f(-0.899976223f); \ 2082 p2 = p5 + p2 * stbi__f2f(-2.562915447f); \ 2083 p3 = p3 * stbi__f2f(-1.961570560f); \ 2084 p4 = p4 * stbi__f2f(-0.390180644f); \ 2090 static void stbi__idct_block(stbi_uc *out,
int out_stride,
short data[64]) {
2091 int i, val[64], *v = val;
2096 for (i = 0; i < 8; ++i, ++d, ++v) {
2098 if (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0 && d[40] == 0 && d[48] == 0
2104 int dcterm = d[0] << 2;
2105 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2108 STBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56])
2115 v[0] = (x0 + t3) >> 10;
2116 v[56] = (x0 - t3) >> 10;
2117 v[8] = (x1 + t2) >> 10;
2118 v[48] = (x1 - t2) >> 10;
2119 v[16] = (x2 + t1) >> 10;
2120 v[40] = (x2 - t1) >> 10;
2121 v[24] = (x3 + t0) >> 10;
2122 v[32] = (x3 - t0) >> 10;
2126 for (i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) {
2128 STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7])
2135 x0 += 65536 + (128 << 17);
2136 x1 += 65536 + (128 << 17);
2137 x2 += 65536 + (128 << 17);
2138 x3 += 65536 + (128 << 17);
2141 o[0] = stbi__clamp((x0 + t3) >> 17);
2142 o[7] = stbi__clamp((x0 - t3) >> 17);
2143 o[1] = stbi__clamp((x1 + t2) >> 17);
2144 o[6] = stbi__clamp((x1 - t2) >> 17);
2145 o[2] = stbi__clamp((x2 + t1) >> 17);
2146 o[5] = stbi__clamp((x2 - t1) >> 17);
2147 o[3] = stbi__clamp((x3 + t0) >> 17);
2148 o[4] = stbi__clamp((x3 - t0) >> 17);
2156 static void stbi__idct_simd(stbi_uc *out,
int out_stride,
short data[64]) {
2158 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2162 #define dct_const(x, y) _mm_setr_epi16((x), (y), (x), (y), (x), (y), (x), (y)) 2166 #define dct_rot(out0, out1, x, y, c0, c1) \ 2167 __m128i c0##lo = _mm_unpacklo_epi16((x), (y)); \ 2168 __m128i c0##hi = _mm_unpackhi_epi16((x), (y)); \ 2169 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ 2170 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ 2171 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ 2172 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) 2175 #define dct_widen(out, in) \ 2176 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ 2177 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) 2180 #define dct_wadd(out, a, b) \ 2181 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ 2182 __m128i out##_h = _mm_add_epi32(a##_h, b##_h) 2185 #define dct_wsub(out, a, b) \ 2186 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ 2187 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) 2190 #define dct_bfly32o(out0, out1, a, b, bias, s) \ 2192 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ 2193 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ 2194 dct_wadd(sum, abiased, b); \ 2195 dct_wsub(dif, abiased, b); \ 2196 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ 2197 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ 2201 #define dct_interleave8(a, b) \ 2203 a = _mm_unpacklo_epi8(a, b); \ 2204 b = _mm_unpackhi_epi8(tmp, b) 2207 #define dct_interleave16(a, b) \ 2209 a = _mm_unpacklo_epi16(a, b); \ 2210 b = _mm_unpackhi_epi16(tmp, b) 2212 #define dct_pass(bias, shift) \ 2215 dct_rot(t2e, t3e, row2, row6, rot0_0, rot0_1); \ 2216 __m128i sum04 = _mm_add_epi16(row0, row4); \ 2217 __m128i dif04 = _mm_sub_epi16(row0, row4); \ 2218 dct_widen(t0e, sum04); \ 2219 dct_widen(t1e, dif04); \ 2220 dct_wadd(x0, t0e, t3e); \ 2221 dct_wsub(x3, t0e, t3e); \ 2222 dct_wadd(x1, t1e, t2e); \ 2223 dct_wsub(x2, t1e, t2e); \ 2225 dct_rot(y0o, y2o, row7, row3, rot2_0, rot2_1); \ 2226 dct_rot(y1o, y3o, row5, row1, rot3_0, rot3_1); \ 2227 __m128i sum17 = _mm_add_epi16(row1, row7); \ 2228 __m128i sum35 = _mm_add_epi16(row3, row5); \ 2229 dct_rot(y4o, y5o, sum17, sum35, rot1_0, rot1_1); \ 2230 dct_wadd(x4, y0o, y4o); \ 2231 dct_wadd(x5, y1o, y5o); \ 2232 dct_wadd(x6, y2o, y5o); \ 2233 dct_wadd(x7, y3o, y4o); \ 2234 dct_bfly32o(row0, row7, x0, x7, bias, shift); \ 2235 dct_bfly32o(row1, row6, x1, x6, bias, shift); \ 2236 dct_bfly32o(row2, row5, x2, x5, bias, shift); \ 2237 dct_bfly32o(row3, row4, x3, x4, bias, shift); \ 2241 dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2243 dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f));
2245 dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2247 dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2249 dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f));
2251 dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f));
2253 dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f));
2255 dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f));
2258 __m128i bias_0 = _mm_set1_epi32(512);
2259 __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17));
2262 row0 = _mm_load_si128((
const __m128i *)(data + 0 * 8));
2263 row1 = _mm_load_si128((
const __m128i *)(data + 1 * 8));
2264 row2 = _mm_load_si128((
const __m128i *)(data + 2 * 8));
2265 row3 = _mm_load_si128((
const __m128i *)(data + 3 * 8));
2266 row4 = _mm_load_si128((
const __m128i *)(data + 4 * 8));
2267 row5 = _mm_load_si128((
const __m128i *)(data + 5 * 8));
2268 row6 = _mm_load_si128((
const __m128i *)(data + 6 * 8));
2269 row7 = _mm_load_si128((
const __m128i *)(data + 7 * 8));
2272 dct_pass(bias_0, 10);
2276 dct_interleave16(row0, row4);
2277 dct_interleave16(row1, row5);
2278 dct_interleave16(row2, row6);
2279 dct_interleave16(row3, row7);
2282 dct_interleave16(row0, row2);
2283 dct_interleave16(row1, row3);
2284 dct_interleave16(row4, row6);
2285 dct_interleave16(row5, row7);
2288 dct_interleave16(row0, row1);
2289 dct_interleave16(row2, row3);
2290 dct_interleave16(row4, row5);
2291 dct_interleave16(row6, row7);
2295 dct_pass(bias_1, 17);
2299 __m128i p0 = _mm_packus_epi16(row0, row1);
2300 __m128i p1 = _mm_packus_epi16(row2, row3);
2301 __m128i p2 = _mm_packus_epi16(row4, row5);
2302 __m128i p3 = _mm_packus_epi16(row6, row7);
2305 dct_interleave8(p0, p2);
2306 dct_interleave8(p1, p3);
2309 dct_interleave8(p0, p1);
2310 dct_interleave8(p2, p3);
2313 dct_interleave8(p0, p2);
2314 dct_interleave8(p1, p3);
2317 _mm_storel_epi64((__m128i *)out, p0);
2319 _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p0, 0x4e));
2321 _mm_storel_epi64((__m128i *)out, p2);
2323 _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p2, 0x4e));
2325 _mm_storel_epi64((__m128i *)out, p1);
2327 _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p1, 0x4e));
2329 _mm_storel_epi64((__m128i *)out, p3);
2331 _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p3, 0x4e));
2340 #undef dct_interleave8 2341 #undef dct_interleave16 2351 static void stbi__idct_simd(stbi_uc *out,
int out_stride,
short data[64]) {
2352 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2354 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2355 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2356 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f));
2357 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f));
2358 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2359 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2360 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2361 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2362 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f));
2363 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f));
2364 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f));
2365 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f));
2367 #define dct_long_mul(out, inq, coeff) \ 2368 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ 2369 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) 2371 #define dct_long_mac(out, acc, inq, coeff) \ 2372 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ 2373 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) 2375 #define dct_widen(out, inq) \ 2376 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ 2377 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) 2380 #define dct_wadd(out, a, b) \ 2381 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ 2382 int32x4_t out##_h = vaddq_s32(a##_h, b##_h) 2385 #define dct_wsub(out, a, b) \ 2386 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ 2387 int32x4_t out##_h = vsubq_s32(a##_h, b##_h) 2390 #define dct_bfly32o(out0, out1, a, b, shiftop, s) \ 2392 dct_wadd(sum, a, b); \ 2393 dct_wsub(dif, a, b); \ 2394 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ 2395 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ 2398 #define dct_pass(shiftop, shift) \ 2401 int16x8_t sum26 = vaddq_s16(row2, row6); \ 2402 dct_long_mul(p1e, sum26, rot0_0); \ 2403 dct_long_mac(t2e, p1e, row6, rot0_1); \ 2404 dct_long_mac(t3e, p1e, row2, rot0_2); \ 2405 int16x8_t sum04 = vaddq_s16(row0, row4); \ 2406 int16x8_t dif04 = vsubq_s16(row0, row4); \ 2407 dct_widen(t0e, sum04); \ 2408 dct_widen(t1e, dif04); \ 2409 dct_wadd(x0, t0e, t3e); \ 2410 dct_wsub(x3, t0e, t3e); \ 2411 dct_wadd(x1, t1e, t2e); \ 2412 dct_wsub(x2, t1e, t2e); \ 2414 int16x8_t sum15 = vaddq_s16(row1, row5); \ 2415 int16x8_t sum17 = vaddq_s16(row1, row7); \ 2416 int16x8_t sum35 = vaddq_s16(row3, row5); \ 2417 int16x8_t sum37 = vaddq_s16(row3, row7); \ 2418 int16x8_t sumodd = vaddq_s16(sum17, sum35); \ 2419 dct_long_mul(p5o, sumodd, rot1_0); \ 2420 dct_long_mac(p1o, p5o, sum17, rot1_1); \ 2421 dct_long_mac(p2o, p5o, sum35, rot1_2); \ 2422 dct_long_mul(p3o, sum37, rot2_0); \ 2423 dct_long_mul(p4o, sum15, rot2_1); \ 2424 dct_wadd(sump13o, p1o, p3o); \ 2425 dct_wadd(sump24o, p2o, p4o); \ 2426 dct_wadd(sump23o, p2o, p3o); \ 2427 dct_wadd(sump14o, p1o, p4o); \ 2428 dct_long_mac(x4, sump13o, row7, rot3_0); \ 2429 dct_long_mac(x5, sump24o, row5, rot3_1); \ 2430 dct_long_mac(x6, sump23o, row3, rot3_2); \ 2431 dct_long_mac(x7, sump14o, row1, rot3_3); \ 2432 dct_bfly32o(row0, row7, x0, x7, shiftop, shift); \ 2433 dct_bfly32o(row1, row6, x1, x6, shiftop, shift); \ 2434 dct_bfly32o(row2, row5, x2, x5, shiftop, shift); \ 2435 dct_bfly32o(row3, row4, x3, x4, shiftop, shift); \ 2439 row0 = vld1q_s16(data + 0 * 8);
2440 row1 = vld1q_s16(data + 1 * 8);
2441 row2 = vld1q_s16(data + 2 * 8);
2442 row3 = vld1q_s16(data + 3 * 8);
2443 row4 = vld1q_s16(data + 4 * 8);
2444 row5 = vld1q_s16(data + 5 * 8);
2445 row6 = vld1q_s16(data + 6 * 8);
2446 row7 = vld1q_s16(data + 7 * 8);
2449 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2452 dct_pass(vrshrn_n_s32, 10);
2458 #define dct_trn16(x, y) \ 2460 int16x8x2_t t = vtrnq_s16(x, y); \ 2464 #define dct_trn32(x, y) \ 2466 int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); \ 2467 x = vreinterpretq_s16_s32(t.val[0]); \ 2468 y = vreinterpretq_s16_s32(t.val[1]); \ 2470 #define dct_trn64(x, y) \ 2474 x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); \ 2475 y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); \ 2479 dct_trn16(row0, row1);
2480 dct_trn16(row2, row3);
2481 dct_trn16(row4, row5);
2482 dct_trn16(row6, row7);
2485 dct_trn32(row0, row2);
2486 dct_trn32(row1, row3);
2487 dct_trn32(row4, row6);
2488 dct_trn32(row5, row7);
2491 dct_trn64(row0, row4);
2492 dct_trn64(row1, row5);
2493 dct_trn64(row2, row6);
2494 dct_trn64(row3, row7);
2505 dct_pass(vshrn_n_s32, 16);
2509 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2510 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2511 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2512 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2513 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2514 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2515 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2516 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2519 #define dct_trn8_8(x, y) \ 2521 uint8x8x2_t t = vtrn_u8(x, y); \ 2525 #define dct_trn8_16(x, y) \ 2527 uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); \ 2528 x = vreinterpret_u8_u16(t.val[0]); \ 2529 y = vreinterpret_u8_u16(t.val[1]); \ 2531 #define dct_trn8_32(x, y) \ 2533 uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); \ 2534 x = vreinterpret_u8_u32(t.val[0]); \ 2535 y = vreinterpret_u8_u32(t.val[1]); \ 2548 dct_trn8_16(p0, p2);
2549 dct_trn8_16(p1, p3);
2550 dct_trn8_16(p4, p6);
2551 dct_trn8_16(p5, p7);
2554 dct_trn8_32(p0, p4);
2555 dct_trn8_32(p1, p5);
2556 dct_trn8_32(p2, p6);
2557 dct_trn8_32(p3, p7);
2592 #define STBI__MARKER_none 0xff 2596 static stbi_uc stbi__get_marker(stbi__jpeg *j) {
2598 if (j->marker != STBI__MARKER_none) {
2600 j->marker = STBI__MARKER_none;
2603 x = stbi__get8(j->s);
2605 return STBI__MARKER_none;
2607 x = stbi__get8(j->s);
2613 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) 2617 static void stbi__jpeg_reset(stbi__jpeg *j) {
2621 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
2622 j->marker = STBI__MARKER_none;
2623 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2629 static int stbi__parse_entropy_coded_data(stbi__jpeg *z) {
2630 stbi__jpeg_reset(z);
2631 if (!z->progressive) {
2632 if (z->scan_n == 1) {
2634 STBI_SIMD_ALIGN(
short, data[64]);
2635 int n = z->order[0];
2640 int w = (z->img_comp[n].x + 7) >> 3;
2641 int h = (z->img_comp[n].y + 7) >> 3;
2642 for (j = 0; j < h; ++j) {
2643 for (i = 0; i < w; ++i) {
2644 int ha = z->img_comp[n].ha;
2645 if (!stbi__jpeg_decode_block(
2648 z->huff_dc + z->img_comp[n].hd,
2652 z->dequant[z->img_comp[n].tq]))
2654 z->idct_block_kernel(
2655 z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8,
2659 if (--z->todo <= 0) {
2660 if (z->code_bits < 24)
2661 stbi__grow_buffer_unsafe(z);
2664 if (!STBI__RESTART(z->marker))
2666 stbi__jpeg_reset(z);
2674 STBI_SIMD_ALIGN(
short, data[64]);
2675 for (j = 0; j < z->img_mcu_y; ++j) {
2676 for (i = 0; i < z->img_mcu_x; ++i) {
2678 for (k = 0; k < z->scan_n; ++k) {
2679 int n = z->order[k];
2682 for (y = 0; y < z->img_comp[n].v; ++y) {
2683 for (x = 0; x < z->img_comp[n].h; ++x) {
2684 int x2 = (i * z->img_comp[n].h + x) * 8;
2685 int y2 = (j * z->img_comp[n].v + y) * 8;
2686 int ha = z->img_comp[n].ha;
2687 if (!stbi__jpeg_decode_block(
2690 z->huff_dc + z->img_comp[n].hd,
2694 z->dequant[z->img_comp[n].tq]))
2696 z->idct_block_kernel(
2697 z->img_comp[n].data + z->img_comp[n].w2 * y2 + x2,
2705 if (--z->todo <= 0) {
2706 if (z->code_bits < 24)
2707 stbi__grow_buffer_unsafe(z);
2708 if (!STBI__RESTART(z->marker))
2710 stbi__jpeg_reset(z);
2718 if (z->scan_n == 1) {
2720 int n = z->order[0];
2725 int w = (z->img_comp[n].x + 7) >> 3;
2726 int h = (z->img_comp[n].y + 7) >> 3;
2727 for (j = 0; j < h; ++j) {
2728 for (i = 0; i < w; ++i) {
2729 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2730 if (z->spec_start == 0) {
2731 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2735 int ha = z->img_comp[n].ha;
2736 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2740 if (--z->todo <= 0) {
2741 if (z->code_bits < 24)
2742 stbi__grow_buffer_unsafe(z);
2743 if (!STBI__RESTART(z->marker))
2745 stbi__jpeg_reset(z);
2753 for (j = 0; j < z->img_mcu_y; ++j) {
2754 for (i = 0; i < z->img_mcu_x; ++i) {
2756 for (k = 0; k < z->scan_n; ++k) {
2757 int n = z->order[k];
2760 for (y = 0; y < z->img_comp[n].v; ++y) {
2761 for (x = 0; x < z->img_comp[n].h; ++x) {
2762 int x2 = (i * z->img_comp[n].h + x);
2763 int y2 = (j * z->img_comp[n].v + y);
2765 z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2766 if (!stbi__jpeg_decode_block_prog_dc(
2767 z, data, &z->huff_dc[z->img_comp[n].hd], n))
2774 if (--z->todo <= 0) {
2775 if (z->code_bits < 24)
2776 stbi__grow_buffer_unsafe(z);
2777 if (!STBI__RESTART(z->marker))
2779 stbi__jpeg_reset(z);
2788 static void stbi__jpeg_dequantize(
short *data, stbi_uc *dequant) {
2790 for (i = 0; i < 64; ++i)
2791 data[i] *= dequant[i];
2794 static void stbi__jpeg_finish(stbi__jpeg *z) {
2795 if (z->progressive) {
2798 for (n = 0; n < z->s->img_n; ++n) {
2799 int w = (z->img_comp[n].x + 7) >> 3;
2800 int h = (z->img_comp[n].y + 7) >> 3;
2801 for (j = 0; j < h; ++j) {
2802 for (i = 0; i < w; ++i) {
2803 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2804 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2805 z->idct_block_kernel(
2806 z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8,
2815 static int stbi__process_marker(stbi__jpeg *z,
int m) {
2818 case STBI__MARKER_none:
2819 return stbi__err(
"expected marker",
"Corrupt JPEG");
2822 if (stbi__get16be(z->s) != 4)
2823 return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2824 z->restart_interval = stbi__get16be(z->s);
2828 L = stbi__get16be(z->s) - 2;
2830 int q = stbi__get8(z->s);
2834 return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2836 return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2837 for (i = 0; i < 64; ++i)
2838 z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
2844 L = stbi__get16be(z->s) - 2;
2847 int sizes[16], i, n = 0;
2848 int q = stbi__get8(z->s);
2851 if (tc > 1 || th > 3)
2852 return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2853 for (i = 0; i < 16; ++i) {
2854 sizes[i] = stbi__get8(z->s);
2859 if (!stbi__build_huffman(z->huff_dc + th, sizes))
2861 v = z->huff_dc[th].values;
2864 if (!stbi__build_huffman(z->huff_ac + th, sizes))
2866 v = z->huff_ac[th].values;
2868 for (i = 0; i < n; ++i)
2869 v[i] = stbi__get8(z->s);
2871 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2877 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2878 stbi__skip(z->s, stbi__get16be(z->s) - 2);
2885 static int stbi__process_scan_header(stbi__jpeg *z) {
2887 int Ls = stbi__get16be(z->s);
2888 z->scan_n = stbi__get8(z->s);
2889 if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (
int)z->s->img_n)
2890 return stbi__err(
"bad SOS component count",
"Corrupt JPEG");
2891 if (Ls != 6 + 2 * z->scan_n)
2892 return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2893 for (i = 0; i < z->scan_n; ++i) {
2894 int id = stbi__get8(z->s), which;
2895 int q = stbi__get8(z->s);
2896 for (which = 0; which < z->s->img_n; ++which)
2897 if (z->img_comp[which].id ==
id)
2899 if (which == z->s->img_n)
2901 z->img_comp[which].hd = q >> 4;
2902 if (z->img_comp[which].hd > 3)
2903 return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2904 z->img_comp[which].ha = q & 15;
2905 if (z->img_comp[which].ha > 3)
2906 return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2907 z->order[i] = which;
2912 z->spec_start = stbi__get8(z->s);
2913 z->spec_end = stbi__get8(z->s);
2914 aa = stbi__get8(z->s);
2915 z->succ_high = (aa >> 4);
2916 z->succ_low = (aa & 15);
2917 if (z->progressive) {
2918 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end
2919 || z->succ_high > 13
2920 || z->succ_low > 13)
2921 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2924 if (z->spec_start != 0)
2925 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2926 if (z->succ_high != 0 || z->succ_low != 0)
2927 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2935 static int stbi__process_frame_header(stbi__jpeg *z,
int scan) {
2936 stbi__context *s = z->s;
2937 int Lf, p, i, q, h_max = 1, v_max = 1, c;
2938 Lf = stbi__get16be(s);
2940 return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2943 return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
2944 s->img_y = stbi__get16be(s);
2947 "no header height",
"JPEG format not supported: delayed height");
2950 s->img_x = stbi__get16be(s);
2952 return stbi__err(
"0 width",
"Corrupt JPEG");
2954 if (c != 3 && c != 1)
2955 return stbi__err(
"bad component count",
"Corrupt JPEG");
2957 for (i = 0; i < c; ++i) {
2958 z->img_comp[i].data = NULL;
2959 z->img_comp[i].linebuf = NULL;
2962 if (Lf != 8 + 3 * s->img_n)
2963 return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2966 for (i = 0; i < s->img_n; ++i) {
2967 static unsigned char rgb[3] = {
'R',
'G',
'B'};
2968 z->img_comp[i].id = stbi__get8(s);
2969 if (z->img_comp[i].id != i + 1)
2970 if (z->img_comp[i].id != i) {
2973 if (z->img_comp[i].id != rgb[i])
2974 return stbi__err(
"bad component ID",
"Corrupt JPEG");
2978 z->img_comp[i].h = (q >> 4);
2979 if (!z->img_comp[i].h || z->img_comp[i].h > 4)
2980 return stbi__err(
"bad H",
"Corrupt JPEG");
2981 z->img_comp[i].v = q & 15;
2982 if (!z->img_comp[i].v || z->img_comp[i].v > 4)
2983 return stbi__err(
"bad V",
"Corrupt JPEG");
2984 z->img_comp[i].tq = stbi__get8(s);
2985 if (z->img_comp[i].tq > 3)
2986 return stbi__err(
"bad TQ",
"Corrupt JPEG");
2989 if (scan != STBI__SCAN_load)
2992 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
2993 return stbi__err(
"too large",
"Image too large to decode");
2995 for (i = 0; i < s->img_n; ++i) {
2996 if (z->img_comp[i].h > h_max)
2997 h_max = z->img_comp[i].h;
2998 if (z->img_comp[i].v > v_max)
2999 v_max = z->img_comp[i].v;
3003 z->img_h_max = h_max;
3004 z->img_v_max = v_max;
3005 z->img_mcu_w = h_max * 8;
3006 z->img_mcu_h = v_max * 8;
3007 z->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w;
3008 z->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h;
3010 for (i = 0; i < s->img_n; ++i) {
3012 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max;
3013 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max;
3018 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3019 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3020 z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2 + 15);
3022 if (z->img_comp[i].raw_data == NULL) {
3023 for (--i; i >= 0; --i) {
3024 STBI_FREE(z->img_comp[i].raw_data);
3025 z->img_comp[i].raw_data = NULL;
3027 return stbi__err(
"outofmem",
"Out of memory");
3030 z->img_comp[i].data = (stbi_uc *)(((
size_t)z->img_comp[i].raw_data + 15) & ~15);
3031 z->img_comp[i].linebuf = NULL;
3032 if (z->progressive) {
3033 z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;
3034 z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
3035 z->img_comp[i].raw_coeff = STBI_MALLOC(
3036 z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 *
sizeof(
short) + 15);
3037 z->img_comp[i].coeff = (
short *)(((
size_t)z->img_comp[i].raw_coeff + 15) & ~15);
3040 z->img_comp[i].coeff = 0;
3041 z->img_comp[i].raw_coeff = 0;
3049 #define stbi__DNL(x) ((x) == 0xdc) 3050 #define stbi__SOI(x) ((x) == 0xd8) 3051 #define stbi__EOI(x) ((x) == 0xd9) 3052 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) 3053 #define stbi__SOS(x) ((x) == 0xda) 3055 #define stbi__SOF_progressive(x) ((x) == 0xc2) 3057 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan) {
3059 z->marker = STBI__MARKER_none;
3060 m = stbi__get_marker(z);
3062 return stbi__err(
"no SOI",
"Corrupt JPEG");
3063 if (scan == STBI__SCAN_type)
3065 m = stbi__get_marker(z);
3066 while (!stbi__SOF(m)) {
3067 if (!stbi__process_marker(z, m))
3069 m = stbi__get_marker(z);
3070 while (m == STBI__MARKER_none) {
3072 if (stbi__at_eof(z->s))
3073 return stbi__err(
"no SOF",
"Corrupt JPEG");
3074 m = stbi__get_marker(z);
3077 z->progressive = stbi__SOF_progressive(m);
3078 if (!stbi__process_frame_header(z, scan))
3084 static int stbi__decode_jpeg_image(stbi__jpeg *j) {
3086 for (m = 0; m < 4; m++) {
3087 j->img_comp[m].raw_data = NULL;
3088 j->img_comp[m].raw_coeff = NULL;
3090 j->restart_interval = 0;
3091 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
3093 m = stbi__get_marker(j);
3094 while (!stbi__EOI(m)) {
3096 if (!stbi__process_scan_header(j))
3098 if (!stbi__parse_entropy_coded_data(j))
3100 if (j->marker == STBI__MARKER_none) {
3102 while (!stbi__at_eof(j->s)) {
3103 int x = stbi__get8(j->s);
3105 j->marker = stbi__get8(j->s);
3109 return stbi__err(
"junk before marker",
"Corrupt JPEG");
3117 if (!stbi__process_marker(j, m))
3120 m = stbi__get_marker(j);
3123 stbi__jpeg_finish(j);
3129 typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
int w,
int hs);
3131 #define stbi__div4(x) ((stbi_uc)((x) >> 2)) 3133 static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs) {
3135 STBI_NOTUSED(in_far);
3142 stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs) {
3146 for (i = 0; i < w; ++i)
3147 out[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2);
3152 stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs) {
3155 stbi_uc *input = in_near;
3159 out[0] = out[1] = input[0];
3164 out[1] = stbi__div4(input[0] * 3 + input[1] + 2);
3165 for (i = 1; i < w - 1; ++i) {
3166 int n = 3 * input[i] + 2;
3167 out[i * 2 + 0] = stbi__div4(n + input[i - 1]);
3168 out[i * 2 + 1] = stbi__div4(n + input[i + 1]);
3170 out[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2);
3171 out[i * 2 + 1] = input[w - 1];
3173 STBI_NOTUSED(in_far);
3179 #define stbi__div16(x) ((stbi_uc)((x) >> 4)) 3182 stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs) {
3186 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3190 t1 = 3 * in_near[0] + in_far[0];
3191 out[0] = stbi__div4(t1 + 2);
3192 for (i = 1; i < w; ++i) {
3194 t1 = 3 * in_near[i] + in_far[i];
3195 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3196 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3198 out[w * 2 - 1] = stbi__div4(t1 + 2);
3205 #if defined(STBI_SSE2) || defined(STBI_NEON) 3207 stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs) {
3212 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3216 t1 = 3 * in_near[0] + in_far[0];
3220 for (; i < ((w - 1) & ~7); i += 8) {
3221 #if defined(STBI_SSE2) 3224 __m128i zero = _mm_setzero_si128();
3225 __m128i farb = _mm_loadl_epi64((__m128i *)(in_far + i));
3226 __m128i nearb = _mm_loadl_epi64((__m128i *)(in_near + i));
3227 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3228 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3229 __m128i diff = _mm_sub_epi16(farw, nearw);
3230 __m128i nears = _mm_slli_epi16(nearw, 2);
3231 __m128i curr = _mm_add_epi16(nears, diff);
3238 __m128i prv0 = _mm_slli_si128(curr, 2);
3239 __m128i nxt0 = _mm_srli_si128(curr, 2);
3240 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3241 __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7);
3247 __m128i bias = _mm_set1_epi16(8);
3248 __m128i curs = _mm_slli_epi16(curr, 2);
3249 __m128i prvd = _mm_sub_epi16(prev, curr);
3250 __m128i nxtd = _mm_sub_epi16(next, curr);
3251 __m128i curb = _mm_add_epi16(curs, bias);
3252 __m128i even = _mm_add_epi16(prvd, curb);
3253 __m128i odd = _mm_add_epi16(nxtd, curb);
3256 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3257 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3258 __m128i de0 = _mm_srli_epi16(int0, 4);
3259 __m128i de1 = _mm_srli_epi16(int1, 4);
3262 __m128i outv = _mm_packus_epi16(de0, de1);
3263 _mm_storeu_si128((__m128i *)(out + i * 2), outv);
3264 #elif defined(STBI_NEON) 3267 uint8x8_t farb = vld1_u8(in_far + i);
3268 uint8x8_t nearb = vld1_u8(in_near + i);
3269 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3270 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3271 int16x8_t curr = vaddq_s16(nears, diff);
3278 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3279 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3280 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3281 int16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7);
3287 int16x8_t curs = vshlq_n_s16(curr, 2);
3288 int16x8_t prvd = vsubq_s16(prev, curr);
3289 int16x8_t nxtd = vsubq_s16(next, curr);
3290 int16x8_t even = vaddq_s16(curs, prvd);
3291 int16x8_t odd = vaddq_s16(curs, nxtd);
3295 o.val[0] = vqrshrun_n_s16(even, 4);
3296 o.val[1] = vqrshrun_n_s16(odd, 4);
3297 vst2_u8(out + i * 2, o);
3301 t1 = 3 * in_near[i + 7] + in_far[i + 7];
3305 t1 = 3 * in_near[i] + in_far[i];
3306 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3308 for (++i; i < w; ++i) {
3310 t1 = 3 * in_near[i] + in_far[i];
3311 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3312 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3314 out[w * 2 - 1] = stbi__div4(t1 + 2);
3323 stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far,
int w,
int hs) {
3326 STBI_NOTUSED(in_far);
3327 for (i = 0; i < w; ++i)
3328 for (j = 0; j < hs; ++j)
3329 out[i * hs + j] = in_near[i];
3333 #ifdef STBI_JPEG_OLD 3336 #define float2fixed(x) ((int)((x)*65536 + 0.5)) 3337 static void stbi__YCbCr_to_RGB_row(
3345 for (i = 0; i < count; ++i) {
3346 int y_fixed = (y[i] << 16) + 32768;
3348 int cr = pcr[i] - 128;
3349 int cb = pcb[i] - 128;
3350 r = y_fixed + cr * float2fixed(1.40200f);
3351 g = y_fixed - cr * float2fixed(0.71414f) - cb * float2fixed(0.34414f);
3352 b = y_fixed + cb * float2fixed(1.77200f);
3356 if ((
unsigned)r > 255) {
3362 if ((
unsigned)g > 255) {
3368 if ((
unsigned)b > 255) {
3374 out[0] = (stbi_uc)r;
3375 out[1] = (stbi_uc)g;
3376 out[2] = (stbi_uc)b;
3384 #define float2fixed(x) (((int)((x)*4096.0f + 0.5f)) << 8) 3385 static void stbi__YCbCr_to_RGB_row(
3393 for (i = 0; i < count; ++i) {
3394 int y_fixed = (y[i] << 20) + (1 << 19);
3396 int cr = pcr[i] - 128;
3397 int cb = pcb[i] - 128;
3398 r = y_fixed + cr * float2fixed(1.40200f);
3399 g = y_fixed + (cr * -float2fixed(0.71414f)) + ((cb * -float2fixed(0.34414f)) & 0xffff0000);
3400 b = y_fixed + cb * float2fixed(1.77200f);
3404 if ((
unsigned)r > 255) {
3410 if ((
unsigned)g > 255) {
3416 if ((
unsigned)b > 255) {
3422 out[0] = (stbi_uc)r;
3423 out[1] = (stbi_uc)g;
3424 out[2] = (stbi_uc)b;
3431 #if defined(STBI_SSE2) || defined(STBI_NEON) 3432 static void stbi__YCbCr_to_RGB_simd(
3447 __m128i signflip = _mm_set1_epi8(-0x80);
3448 __m128i cr_const0 = _mm_set1_epi16((
short)(1.40200f * 4096.0f + 0.5f));
3449 __m128i cr_const1 = _mm_set1_epi16(-(
short)(0.71414f * 4096.0f + 0.5f));
3450 __m128i cb_const0 = _mm_set1_epi16(-(
short)(0.34414f * 4096.0f + 0.5f));
3451 __m128i cb_const1 = _mm_set1_epi16((
short)(1.77200f * 4096.0f + 0.5f));
3452 __m128i y_bias = _mm_set1_epi8((
char)(
unsigned char)128);
3453 __m128i xw = _mm_set1_epi16(255);
3455 for (; i + 7 < count; i += 8) {
3457 __m128i y_bytes = _mm_loadl_epi64((__m128i *)(y + i));
3458 __m128i cr_bytes = _mm_loadl_epi64((__m128i *)(pcr + i));
3459 __m128i cb_bytes = _mm_loadl_epi64((__m128i *)(pcb + i));
3460 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3461 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3464 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3465 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3466 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3469 __m128i yws = _mm_srli_epi16(yw, 4);
3470 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3471 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3472 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3473 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3474 __m128i rws = _mm_add_epi16(cr0, yws);
3475 __m128i gwt = _mm_add_epi16(cb0, yws);
3476 __m128i bws = _mm_add_epi16(yws, cb1);
3477 __m128i gws = _mm_add_epi16(gwt, cr1);
3480 __m128i rw = _mm_srai_epi16(rws, 4);
3481 __m128i bw = _mm_srai_epi16(bws, 4);
3482 __m128i gw = _mm_srai_epi16(gws, 4);
3485 __m128i brb = _mm_packus_epi16(rw, bw);
3486 __m128i gxb = _mm_packus_epi16(gw, xw);
3489 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3490 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3491 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3492 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3495 _mm_storeu_si128((__m128i *)(out + 0), o0);
3496 _mm_storeu_si128((__m128i *)(out + 16), o1);
3506 uint8x8_t signflip = vdup_n_u8(0x80);
3507 int16x8_t cr_const0 = vdupq_n_s16((
short)(1.40200f * 4096.0f + 0.5f));
3508 int16x8_t cr_const1 = vdupq_n_s16(-(
short)(0.71414f * 4096.0f + 0.5f));
3509 int16x8_t cb_const0 = vdupq_n_s16(-(
short)(0.34414f * 4096.0f + 0.5f));
3510 int16x8_t cb_const1 = vdupq_n_s16((
short)(1.77200f * 4096.0f + 0.5f));
3512 for (; i + 7 < count; i += 8) {
3514 uint8x8_t y_bytes = vld1_u8(y + i);
3515 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3516 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3517 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3518 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3521 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3522 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3523 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3526 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3527 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3528 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3529 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3530 int16x8_t rws = vaddq_s16(yws, cr0);
3531 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3532 int16x8_t bws = vaddq_s16(yws, cb1);
3536 o.val[0] = vqrshrun_n_s16(rws, 4);
3537 o.val[1] = vqrshrun_n_s16(gws, 4);
3538 o.val[2] = vqrshrun_n_s16(bws, 4);
3539 o.val[3] = vdup_n_u8(255);
3548 for (; i < count; ++i) {
3549 int y_fixed = (y[i] << 20) + (1 << 19);
3551 int cr = pcr[i] - 128;
3552 int cb = pcb[i] - 128;
3553 r = y_fixed + cr * float2fixed(1.40200f);
3554 g = y_fixed + cr * -float2fixed(0.71414f) + ((cb * -float2fixed(0.34414f)) & 0xffff0000);
3555 b = y_fixed + cb * float2fixed(1.77200f);
3559 if ((
unsigned)r > 255) {
3565 if ((
unsigned)g > 255) {
3571 if ((
unsigned)b > 255) {
3577 out[0] = (stbi_uc)r;
3578 out[1] = (stbi_uc)g;
3579 out[2] = (stbi_uc)b;
3587 static void stbi__setup_jpeg(stbi__jpeg *j) {
3588 j->idct_block_kernel = stbi__idct_block;
3589 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3590 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3593 if (stbi__sse2_available()) {
3594 j->idct_block_kernel = stbi__idct_simd;
3595 #ifndef STBI_JPEG_OLD 3596 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3598 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3603 j->idct_block_kernel = stbi__idct_simd;
3604 #ifndef STBI_JPEG_OLD 3605 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3607 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3612 static void stbi__cleanup_jpeg(stbi__jpeg *j) {
3614 for (i = 0; i < j->s->img_n; ++i) {
3615 if (j->img_comp[i].raw_data) {
3616 STBI_FREE(j->img_comp[i].raw_data);
3617 j->img_comp[i].raw_data = NULL;
3618 j->img_comp[i].data = NULL;
3620 if (j->img_comp[i].raw_coeff) {
3621 STBI_FREE(j->img_comp[i].raw_coeff);
3622 j->img_comp[i].raw_coeff = 0;
3623 j->img_comp[i].coeff = 0;
3625 if (j->img_comp[i].linebuf) {
3626 STBI_FREE(j->img_comp[i].linebuf);
3627 j->img_comp[i].linebuf = NULL;
3633 resample_row_func resample;
3634 stbi_uc *line0, *line1;
3641 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp) {
3646 if (req_comp < 0 || req_comp > 4)
3647 return stbi__errpuc(
"bad req_comp",
"Internal error");
3650 if (!stbi__decode_jpeg_image(z)) {
3651 stbi__cleanup_jpeg(z);
3656 n = req_comp ? req_comp : z->s->img_n;
3658 if (z->s->img_n == 3 && n < 3)
3661 decode_n = z->s->img_n;
3668 stbi_uc *coutput[4];
3670 stbi__resample res_comp[4];
3672 for (k = 0; k < decode_n; ++k) {
3673 stbi__resample *r = &res_comp[k];
3677 z->img_comp[k].linebuf = (stbi_uc *)stbi__malloc(z->s->img_x + 3);
3678 if (!z->img_comp[k].linebuf) {
3679 stbi__cleanup_jpeg(z);
3680 return stbi__errpuc(
"outofmem",
"Out of memory");
3683 r->hs = z->img_h_max / z->img_comp[k].h;
3684 r->vs = z->img_v_max / z->img_comp[k].v;
3685 r->ystep = r->vs >> 1;
3686 r->w_lores = (z->s->img_x + r->hs - 1) / r->hs;
3688 r->line0 = r->line1 = z->img_comp[k].data;
3690 if (r->hs == 1 && r->vs == 1)
3691 r->resample = resample_row_1;
3692 else if (r->hs == 1 && r->vs == 2)
3693 r->resample = stbi__resample_row_v_2;
3694 else if (r->hs == 2 && r->vs == 1)
3695 r->resample = stbi__resample_row_h_2;
3696 else if (r->hs == 2 && r->vs == 2)
3697 r->resample = z->resample_row_hv_2_kernel;
3699 r->resample = stbi__resample_row_generic;
3703 output = (stbi_uc *)stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
3705 stbi__cleanup_jpeg(z);
3706 return stbi__errpuc(
"outofmem",
"Out of memory");
3710 for (j = 0; j < z->s->img_y; ++j) {
3711 stbi_uc *out = output + n * z->s->img_x * j;
3712 for (k = 0; k < decode_n; ++k) {
3713 stbi__resample *r = &res_comp[k];
3714 int y_bot = r->ystep >= (r->vs >> 1);
3715 coutput[k] = r->resample(
3716 z->img_comp[k].linebuf,
3717 y_bot ? r->line1 : r->line0,
3718 y_bot ? r->line0 : r->line1,
3721 if (++r->ystep >= r->vs) {
3723 r->line0 = r->line1;
3724 if (++r->ypos < z->img_comp[k].y)
3725 r->line1 += z->img_comp[k].w2;
3729 stbi_uc *y = coutput[0];
3730 if (z->s->img_n == 3) {
3732 for (i = 0; i < z->s->img_x; ++i) {
3734 out[1] = coutput[1][i];
3735 out[2] = coutput[2][i];
3741 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3745 for (i = 0; i < z->s->img_x; ++i) {
3746 out[0] = out[1] = out[2] = y[i];
3752 stbi_uc *y = coutput[0];
3754 for (i = 0; i < z->s->img_x; ++i)
3757 for (i = 0; i < z->s->img_x; ++i)
3758 *out++ = y[i], *out++ = 255;
3761 stbi__cleanup_jpeg(z);
3762 *out_x = z->s->img_x;
3763 *out_y = z->s->img_y;
3765 *comp = z->s->img_n;
3770 static unsigned char *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
3771 unsigned char *result;
3772 stbi__jpeg *j = (stbi__jpeg *)stbi__malloc(
sizeof(stbi__jpeg));
3774 stbi__setup_jpeg(j);
3775 result = load_jpeg_image(j, x, y, comp, req_comp);
3780 static int stbi__jpeg_test(stbi__context *s) {
3784 stbi__setup_jpeg(&j);
3785 r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
3790 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp) {
3791 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3800 *comp = j->s->img_n;
3804 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp) {
3806 stbi__jpeg *j = (stbi__jpeg *)(stbi__malloc(
sizeof(stbi__jpeg)));
3808 result = stbi__jpeg_info_raw(j, x, y, comp);
3821 #ifndef STBI_NO_ZLIB 3824 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables 3825 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) 3830 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3831 stbi__uint16 firstcode[16];
3833 stbi__uint16 firstsymbol[16];
3835 stbi__uint16 value[288];
3838 stbi_inline
static int stbi__bitreverse16(
int n) {
3839 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3840 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3841 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3842 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3846 stbi_inline
static int stbi__bit_reverse(
int v,
int bits) {
3847 STBI_ASSERT(bits <= 16);
3850 return stbi__bitreverse16(v) >> (16 - bits);
3853 static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist,
int num) {
3855 int code, next_code[16], sizes[17];
3858 memset(sizes, 0,
sizeof(sizes));
3859 memset(z->fast, 0,
sizeof(z->fast));
3860 for (i = 0; i < num; ++i)
3861 ++sizes[sizelist[i]];
3863 for (i = 1; i < 16; ++i)
3864 if (sizes[i] > (1 << i))
3865 return stbi__err(
"bad sizes",
"Corrupt PNG");
3867 for (i = 1; i < 16; ++i) {
3868 next_code[i] = code;
3869 z->firstcode[i] = (stbi__uint16)code;
3870 z->firstsymbol[i] = (stbi__uint16)k;
3871 code = (code + sizes[i]);
3873 if (code - 1 >= (1 << i))
3874 return stbi__err(
"bad codelengths",
"Corrupt PNG");
3875 z->maxcode[i] = code << (16 - i);
3879 z->maxcode[16] = 0x10000;
3880 for (i = 0; i < num; ++i) {
3881 int s = sizelist[i];
3883 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3884 stbi__uint16 fastv = (stbi__uint16)((s << 9) | i);
3885 z->size[c] = (stbi_uc)s;
3886 z->value[c] = (stbi__uint16)i;
3887 if (s <= STBI__ZFAST_BITS) {
3888 int j = stbi__bit_reverse(next_code[s], s);
3889 while (j < (1 << STBI__ZFAST_BITS)) {
3907 stbi_uc *zbuffer, *zbuffer_end;
3909 stbi__uint32 code_buffer;
3916 stbi__zhuffman z_length, z_distance;
3919 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z) {
3920 if (z->zbuffer >= z->zbuffer_end)
3922 return *z->zbuffer++;
3925 static void stbi__fill_bits(stbi__zbuf *z) {
3927 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3928 z->code_buffer |= (
unsigned int)stbi__zget8(z) << z->num_bits;
3930 }
while (z->num_bits <= 24);
3933 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n) {
3935 if (z->num_bits < n)
3937 k = z->code_buffer & ((1 << n) - 1);
3938 z->code_buffer >>= n;
3943 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) {
3947 k = stbi__bit_reverse(a->code_buffer, 16);
3948 for (s = STBI__ZFAST_BITS + 1;; ++s)
3949 if (k < z->maxcode[s])
3954 b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s];
3955 STBI_ASSERT(z->size[b] == s);
3956 a->code_buffer >>= s;
3961 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) {
3963 if (a->num_bits < 16)
3965 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3968 a->code_buffer >>= s;
3972 return stbi__zhuffman_decode_slowpath(a, z);
3975 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
3978 int cur, limit, old_limit;
3980 if (!z->z_expandable)
3981 return stbi__err(
"output buffer limit",
"Corrupt PNG");
3982 cur = (int)(z->zout - z->zout_start);
3983 limit = old_limit = (int)(z->zout_end - z->zout_start);
3984 while (cur + n > limit)
3986 q = (
char *)STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
3987 STBI_NOTUSED(old_limit);
3989 return stbi__err(
"outofmem",
"Out of memory");
3992 z->zout_end = q + limit;
3996 static int stbi__zlength_base[31] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15,
3997 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83,
3998 99, 115, 131, 163, 195, 227, 258, 0, 0};
4000 static int stbi__zlength_extra[31] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
4001 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0};
4003 static int stbi__zdist_base[32] = {
4004 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
4005 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0};
4007 static int stbi__zdist_extra[32] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6,
4008 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
4010 static int stbi__parse_huffman_block(stbi__zbuf *a) {
4011 char *zout = a->zout;
4013 int z = stbi__zhuffman_decode(a, &a->z_length);
4016 return stbi__err(
"bad huffman code",
"Corrupt PNG");
4017 if (zout >= a->zout_end) {
4018 if (!stbi__zexpand(a, zout, 1))
4032 len = stbi__zlength_base[z];
4033 if (stbi__zlength_extra[z])
4034 len += stbi__zreceive(a, stbi__zlength_extra[z]);
4035 z = stbi__zhuffman_decode(a, &a->z_distance);
4037 return stbi__err(
"bad huffman code",
"Corrupt PNG");
4038 dist = stbi__zdist_base[z];
4039 if (stbi__zdist_extra[z])
4040 dist += stbi__zreceive(a, stbi__zdist_extra[z]);
4041 if (zout - a->zout_start < dist)
4042 return stbi__err(
"bad dist",
"Corrupt PNG");
4043 if (zout + len > a->zout_end) {
4044 if (!stbi__zexpand(a, zout, len))
4048 p = (stbi_uc *)(zout - dist);
4068 static int stbi__compute_huffman_codes(stbi__zbuf *a) {
4069 static stbi_uc length_dezigzag[19] = {
4070 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
4071 stbi__zhuffman z_codelength;
4072 stbi_uc lencodes[286 + 32 + 137];
4073 stbi_uc codelength_sizes[19];
4076 int hlit = stbi__zreceive(a, 5) + 257;
4077 int hdist = stbi__zreceive(a, 5) + 1;
4078 int hclen = stbi__zreceive(a, 4) + 4;
4080 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4081 for (i = 0; i < hclen; ++i) {
4082 int s = stbi__zreceive(a, 3);
4083 codelength_sizes[length_dezigzag[i]] = (stbi_uc)s;
4085 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
4089 while (n < hlit + hdist) {
4090 int c = stbi__zhuffman_decode(a, &z_codelength);
4091 if (c < 0 || c >= 19)
4092 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4094 lencodes[n++] = (stbi_uc)c;
4096 c = stbi__zreceive(a, 2) + 3;
4097 memset(lencodes + n, lencodes[n - 1], c);
4101 c = stbi__zreceive(a, 3) + 3;
4102 memset(lencodes + n, 0, c);
4106 STBI_ASSERT(c == 18);
4107 c = stbi__zreceive(a, 7) + 11;
4108 memset(lencodes + n, 0, c);
4112 if (n != hlit + hdist)
4113 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4114 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
4116 if (!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist))
4121 static int stbi__parse_uncompressed_block(stbi__zbuf *a) {
4124 if (a->num_bits & 7)
4125 stbi__zreceive(a, a->num_bits & 7);
4128 while (a->num_bits > 0) {
4129 header[k++] = (stbi_uc)(a->code_buffer & 255);
4130 a->code_buffer >>= 8;
4133 STBI_ASSERT(a->num_bits == 0);
4136 header[k++] = stbi__zget8(a);
4137 len = header[1] * 256 + header[0];
4138 nlen = header[3] * 256 + header[2];
4139 if (nlen != (len ^ 0xffff))
4140 return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4141 if (a->zbuffer + len > a->zbuffer_end)
4142 return stbi__err(
"read past buffer",
"Corrupt PNG");
4143 if (a->zout + len > a->zout_end)
4144 if (!stbi__zexpand(a, a->zout, len))
4146 memcpy(a->zout, a->zbuffer, len);
4152 static int stbi__parse_zlib_header(stbi__zbuf *a) {
4153 int cmf = stbi__zget8(a);
4156 int flg = stbi__zget8(a);
4157 if ((cmf * 256 + flg) % 31 != 0)
4158 return stbi__err(
"bad zlib header",
"Corrupt PNG");
4160 return stbi__err(
"no preset dict",
"Corrupt PNG");
4162 return stbi__err(
"bad compression",
"Corrupt PNG");
4168 static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
4169 static void stbi__init_zdefaults(
void) {
4171 for (i = 0; i <= 143; ++i)
4172 stbi__zdefault_length[i] = 8;
4173 for (; i <= 255; ++i)
4174 stbi__zdefault_length[i] = 9;
4175 for (; i <= 279; ++i)
4176 stbi__zdefault_length[i] = 7;
4177 for (; i <= 287; ++i)
4178 stbi__zdefault_length[i] = 8;
4180 for (i = 0; i <= 31; ++i)
4181 stbi__zdefault_distance[i] = 5;
4184 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header) {
4187 if (!stbi__parse_zlib_header(a))
4192 final = stbi__zreceive(a, 1);
4193 type = stbi__zreceive(a, 2);
4195 if (!stbi__parse_uncompressed_block(a))
4198 else if (type == 3) {
4204 if (!stbi__zdefault_distance[31])
4205 stbi__init_zdefaults();
4206 if (!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, 288))
4208 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
4212 if (!stbi__compute_huffman_codes(a))
4215 if (!stbi__parse_huffman_block(a))
4222 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header) {
4223 a->zout_start = obuf;
4225 a->zout_end = obuf + olen;
4226 a->z_expandable = exp;
4228 return stbi__parse_zlib(a, parse_header);
4232 stbi_zlib_decode_malloc_guesssize(
const char *buffer,
int len,
int initial_size,
int *outlen) {
4234 char *p = (
char *)stbi__malloc(initial_size);
4237 a.zbuffer = (stbi_uc *)buffer;
4238 a.zbuffer_end = (stbi_uc *)buffer + len;
4239 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4241 *outlen = (int)(a.zout - a.zout_start);
4242 return a.zout_start;
4245 STBI_FREE(a.zout_start);
4250 STBIDEF
char *stbi_zlib_decode_malloc(
char const *buffer,
int len,
int *outlen) {
4251 return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
4254 STBIDEF
char *stbi_zlib_decode_malloc_guesssize_headerflag(
4261 char *p = (
char *)stbi__malloc(initial_size);
4264 a.zbuffer = (stbi_uc *)buffer;
4265 a.zbuffer_end = (stbi_uc *)buffer + len;
4266 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4268 *outlen = (int)(a.zout - a.zout_start);
4269 return a.zout_start;
4272 STBI_FREE(a.zout_start);
4277 STBIDEF
int stbi_zlib_decode_buffer(
char *obuffer,
int olen,
char const *ibuffer,
int ilen) {
4279 a.zbuffer = (stbi_uc *)ibuffer;
4280 a.zbuffer_end = (stbi_uc *)ibuffer + ilen;
4281 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4282 return (
int)(a.zout - a.zout_start);
4287 STBIDEF
char *stbi_zlib_decode_noheader_malloc(
char const *buffer,
int len,
int *outlen) {
4289 char *p = (
char *)stbi__malloc(16384);
4292 a.zbuffer = (stbi_uc *)buffer;
4293 a.zbuffer_end = (stbi_uc *)buffer + len;
4294 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4296 *outlen = (int)(a.zout - a.zout_start);
4297 return a.zout_start;
4300 STBI_FREE(a.zout_start);
4306 stbi_zlib_decode_noheader_buffer(
char *obuffer,
int olen,
const char *ibuffer,
int ilen) {
4308 a.zbuffer = (stbi_uc *)ibuffer;
4309 a.zbuffer_end = (stbi_uc *)ibuffer + ilen;
4310 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4311 return (
int)(a.zout - a.zout_start);
4329 stbi__uint32 length;
4333 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) {
4335 c.length = stbi__get32be(s);
4336 c.type = stbi__get32be(s);
4340 static int stbi__check_png_header(stbi__context *s) {
4341 static stbi_uc png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
4343 for (i = 0; i < 8; ++i)
4344 if (stbi__get8(s) != png_sig[i])
4345 return stbi__err(
"bad png sig",
"Not a PNG");
4351 stbi_uc *idata, *expanded, *out;
4366 static stbi_uc first_row_filter[5] = {STBI__F_none,
4370 STBI__F_paeth_first};
4372 static int stbi__paeth(
int a,
int b,
int c) {
4374 int pa = abs(p - a);
4375 int pb = abs(p - b);
4376 int pc = abs(p - c);
4377 if (pa <= pb && pa <= pc)
4384 static stbi_uc stbi__depth_scale_table[9] = {0, 0xff, 0x55, 0, 0x11, 0, 0, 0, 0x01};
4387 static int stbi__create_png_image_raw(
4390 stbi__uint32 raw_len,
4396 int bytes = (depth == 16 ? 2 : 1);
4397 stbi__context *s = a->s;
4398 stbi__uint32 i, j, stride = x * out_n * bytes;
4399 stbi__uint32 img_len, img_width_bytes;
4401 int img_n = s->img_n;
4403 int output_bytes = out_n * bytes;
4404 int filter_bytes = img_n * bytes;
4407 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1);
4408 a->out = (stbi_uc *)stbi__malloc(x * y * output_bytes);
4410 return stbi__err(
"outofmem",
"Out of memory");
4412 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4413 img_len = (img_width_bytes + 1) * y;
4414 if (s->img_x == x && s->img_y == y) {
4415 if (raw_len != img_len)
4416 return stbi__err(
"not enough pixels",
"Corrupt PNG");
4419 if (raw_len < img_len)
4420 return stbi__err(
"not enough pixels",
"Corrupt PNG");
4423 for (j = 0; j < y; ++j) {
4424 stbi_uc *cur = a->out + stride * j;
4425 stbi_uc *prior = cur - stride;
4426 int filter = *raw++;
4429 return stbi__err(
"invalid filter",
"Corrupt PNG");
4432 STBI_ASSERT(img_width_bytes <= x);
4433 cur += x * out_n - img_width_bytes;
4436 width = img_width_bytes;
4441 filter = first_row_filter[filter];
4444 for (k = 0; k < filter_bytes; ++k) {
4446 case STBI__F_none: cur[k] = raw[k];
break;
4447 case STBI__F_sub: cur[k] = raw[k];
break;
4448 case STBI__F_up: cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4449 case STBI__F_avg: cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1));
break;
4451 cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0, prior[k], 0));
4453 case STBI__F_avg_first: cur[k] = raw[k];
break;
4454 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4465 else if (depth == 16) {
4466 if (img_n != out_n) {
4467 cur[filter_bytes] = 255;
4468 cur[filter_bytes + 1] = 255;
4470 raw += filter_bytes;
4471 cur += output_bytes;
4472 prior += output_bytes;
4481 if (depth < 8 || img_n == out_n) {
4482 int nk = (width - 1) * filter_bytes;
4485 for (k = 0; k < nk; ++k) 4489 memcpy(cur, raw, nk);
4491 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]);
4493 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
4496 cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1));
4499 cur[k] = STBI__BYTECAST(
4501 + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes]));
4503 CASE(STBI__F_avg_first)
4504 cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1));
4506 CASE(STBI__F_paeth_first)
4507 cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], 0, 0));
4514 STBI_ASSERT(img_n + 1 == out_n);
4517 for (i = x - 1; i >= 1; --i, \ 4518 cur[filter_bytes] = 255, \ 4519 raw += filter_bytes, \ 4520 cur += output_bytes, \ 4521 prior += output_bytes) \ 4522 for (k = 0; k < filter_bytes; ++k) 4524 CASE(STBI__F_none) cur[k] = raw[k];
4526 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k - output_bytes]);
4528 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
4531 cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - output_bytes]) >> 1));
4534 cur[k] = STBI__BYTECAST(
4535 raw[k] + stbi__paeth(cur[k - output_bytes], prior[k], prior[k - output_bytes]));
4537 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k - output_bytes] >> 1));
4539 CASE(STBI__F_paeth_first)
4540 cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], 0, 0));
4548 cur = a->out + stride * j;
4549 for (i = 0; i < x; ++i, cur += output_bytes) {
4550 cur[filter_bytes + 1] = 255;
4560 for (j = 0; j < y; ++j) {
4561 stbi_uc *cur = a->out + stride * j;
4562 stbi_uc *in = a->out + stride * j + x * out_n - img_width_bytes;
4567 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth]
4577 for (k = x * img_n; k >= 2; k -= 2, ++in) {
4578 *cur++ = scale * ((*in >> 4));
4579 *cur++ = scale * ((*in) & 0x0f);
4582 *cur++ = scale * ((*in >> 4));
4584 else if (depth == 2) {
4585 for (k = x * img_n; k >= 4; k -= 4, ++in) {
4586 *cur++ = scale * ((*in >> 6));
4587 *cur++ = scale * ((*in >> 4) & 0x03);
4588 *cur++ = scale * ((*in >> 2) & 0x03);
4589 *cur++ = scale * ((*in) & 0x03);
4592 *cur++ = scale * ((*in >> 6));
4594 *cur++ = scale * ((*in >> 4) & 0x03);
4596 *cur++ = scale * ((*in >> 2) & 0x03);
4598 else if (depth == 1) {
4599 for (k = x * img_n; k >= 8; k -= 8, ++in) {
4600 *cur++ = scale * ((*in >> 7));
4601 *cur++ = scale * ((*in >> 6) & 0x01);
4602 *cur++ = scale * ((*in >> 5) & 0x01);
4603 *cur++ = scale * ((*in >> 4) & 0x01);
4604 *cur++ = scale * ((*in >> 3) & 0x01);
4605 *cur++ = scale * ((*in >> 2) & 0x01);
4606 *cur++ = scale * ((*in >> 1) & 0x01);
4607 *cur++ = scale * ((*in) & 0x01);
4610 *cur++ = scale * ((*in >> 7));
4612 *cur++ = scale * ((*in >> 6) & 0x01);
4614 *cur++ = scale * ((*in >> 5) & 0x01);
4616 *cur++ = scale * ((*in >> 4) & 0x01);
4618 *cur++ = scale * ((*in >> 3) & 0x01);
4620 *cur++ = scale * ((*in >> 2) & 0x01);
4622 *cur++ = scale * ((*in >> 1) & 0x01);
4624 if (img_n != out_n) {
4627 cur = a->out + stride * j;
4629 for (q = x - 1; q >= 0; --q) {
4630 cur[q * 2 + 1] = 255;
4631 cur[q * 2 + 0] = cur[q];
4635 STBI_ASSERT(img_n == 3);
4636 for (q = x - 1; q >= 0; --q) {
4637 cur[q * 4 + 3] = 255;
4638 cur[q * 4 + 2] = cur[q * 3 + 2];
4639 cur[q * 4 + 1] = cur[q * 3 + 1];
4640 cur[q * 4 + 0] = cur[q * 3 + 0];
4646 else if (depth == 16) {
4651 stbi_uc *cur = a->out;
4652 stbi__uint16 *cur16 = (stbi__uint16 *)cur;
4654 for (i = 0; i < x * y * out_n; ++i, cur16++, cur += 2) {
4655 *cur16 = (cur[0] << 8) | cur[1];
4662 static int stbi__create_png_image(
4664 stbi_uc *image_data,
4665 stbi__uint32 image_data_len,
4673 return stbi__create_png_image_raw(
4674 a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4677 final = (stbi_uc *)stbi__malloc(a->s->img_x * a->s->img_y * out_n);
4678 for (p = 0; p < 7; ++p) {
4679 int xorig[] = {0, 4, 0, 2, 0, 1, 0};
4680 int yorig[] = {0, 0, 4, 0, 2, 0, 1};
4681 int xspc[] = {8, 8, 4, 4, 2, 2, 1};
4682 int yspc[] = {8, 8, 8, 4, 4, 2, 2};
4685 x = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p];
4686 y = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p];
4688 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4689 if (!stbi__create_png_image_raw(
4690 a, image_data, image_data_len, out_n, x, y, depth, color)) {
4694 for (j = 0; j < y; ++j) {
4695 for (i = 0; i < x; ++i) {
4696 int out_y = j * yspc[p] + yorig[p];
4697 int out_x = i * xspc[p] + xorig[p];
4699 final + out_y * a->s->img_x * out_n + out_x * out_n,
4700 a->out + (j * x + i) * out_n,
4705 image_data += img_len;
4706 image_data_len -= img_len;
4714 static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3],
int out_n) {
4715 stbi__context *s = z->s;
4716 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4717 stbi_uc *p = z->out;
4721 STBI_ASSERT(out_n == 2 || out_n == 4);
4724 for (i = 0; i < pixel_count; ++i) {
4725 p[1] = (p[0] == tc[0] ? 0 : 255);
4730 for (i = 0; i < pixel_count; ++i) {
4731 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4739 static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3],
int out_n) {
4740 stbi__context *s = z->s;
4741 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4742 stbi__uint16 *p = (stbi__uint16 *)z->out;
4746 STBI_ASSERT(out_n == 2 || out_n == 4);
4749 for (i = 0; i < pixel_count; ++i) {
4750 p[1] = (p[0] == tc[0] ? 0 : 65535);
4755 for (i = 0; i < pixel_count; ++i) {
4756 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4764 static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette,
int len,
int pal_img_n) {
4765 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4766 stbi_uc *p, *temp_out, *orig = a->out;
4768 p = (stbi_uc *)stbi__malloc(pixel_count * pal_img_n);
4770 return stbi__err(
"outofmem",
"Out of memory");
4775 if (pal_img_n == 3) {
4776 for (i = 0; i < pixel_count; ++i) {
4777 int n = orig[i] * 4;
4779 p[1] = palette[n + 1];
4780 p[2] = palette[n + 2];
4785 for (i = 0; i < pixel_count; ++i) {
4786 int n = orig[i] * 4;
4788 p[1] = palette[n + 1];
4789 p[2] = palette[n + 2];
4790 p[3] = palette[n + 3];
4802 static int stbi__reduce_png(stbi__png *p) {
4804 int img_len = p->s->img_x * p->s->img_y * p->s->img_out_n;
4806 stbi__uint16 *orig = (stbi__uint16 *)p->out;
4811 reduced = (stbi_uc *)stbi__malloc(img_len);
4813 return stbi__err(
"outofmem",
"Out of memory");
4815 for (i = 0; i < img_len; ++i)
4816 reduced[i] = (stbi_uc)(
4817 (orig[i] >> 8) & 0xFF);
4825 static int stbi__unpremultiply_on_load = 0;
4826 static int stbi__de_iphone_flag = 0;
4828 STBIDEF
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply) {
4829 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4832 STBIDEF
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert) {
4833 stbi__de_iphone_flag = flag_true_if_should_convert;
4836 static void stbi__de_iphone(stbi__png *z) {
4837 stbi__context *s = z->s;
4838 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4839 stbi_uc *p = z->out;
4841 if (s->img_out_n == 3) {
4842 for (i = 0; i < pixel_count; ++i) {
4850 STBI_ASSERT(s->img_out_n == 4);
4851 if (stbi__unpremultiply_on_load) {
4853 for (i = 0; i < pixel_count; ++i) {
4857 p[0] = p[2] * 255 / a;
4858 p[1] = p[1] * 255 / a;
4870 for (i = 0; i < pixel_count; ++i) {
4880 #define STBI__PNG_TYPE(a, b, c, d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) 4882 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp) {
4883 stbi_uc palette[1024], pal_img_n = 0;
4884 stbi_uc has_trans = 0, tc[3];
4885 stbi__uint16 tc16[3];
4886 stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0;
4887 int first = 1, k, interlace = 0, color = 0, is_iphone = 0;
4888 stbi__context *s = z->s;
4894 if (!stbi__check_png_header(s))
4897 if (scan == STBI__SCAN_type)
4901 stbi__pngchunk c = stbi__get_chunk_header(s);
4903 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4905 stbi__skip(s, c.length);
4907 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4910 return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4913 return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4914 s->img_x = stbi__get32be(s);
4915 if (s->img_x > (1 << 24))
4916 return stbi__err(
"too large",
"Very large image (corrupt?)");
4917 s->img_y = stbi__get32be(s);
4918 if (s->img_y > (1 << 24))
4919 return stbi__err(
"too large",
"Very large image (corrupt?)");
4920 z->depth = stbi__get8(s);
4921 if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)
4922 return stbi__err(
"1/2/4/8/16-bit only",
"PNG not supported: 1/2/4/8/16-bit only");
4923 color = stbi__get8(s);
4925 return stbi__err(
"bad ctype",
"Corrupt PNG");
4926 if (color == 3 && z->depth == 16)
4927 return stbi__err(
"bad ctype",
"Corrupt PNG");
4931 return stbi__err(
"bad ctype",
"Corrupt PNG");
4932 comp = stbi__get8(s);
4934 return stbi__err(
"bad comp method",
"Corrupt PNG");
4935 filter = stbi__get8(s);
4937 return stbi__err(
"bad filter method",
"Corrupt PNG");
4938 interlace = stbi__get8(s);
4940 return stbi__err(
"bad interlace method",
"Corrupt PNG");
4941 if (!s->img_x || !s->img_y)
4942 return stbi__err(
"0-pixel image",
"Corrupt PNG");
4944 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4945 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
4946 return stbi__err(
"too large",
"Image too large to decode");
4947 if (scan == STBI__SCAN_header)
4954 if ((1 << 30) / s->img_x / 4 < s->img_y)
4955 return stbi__err(
"too large",
"Corrupt PNG");
4961 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4963 return stbi__err(
"first not IHDR",
"Corrupt PNG");
4964 if (c.length > 256 * 3)
4965 return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4966 pal_len = c.length / 3;
4967 if (pal_len * 3 != c.length)
4968 return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4969 for (i = 0; i < pal_len; ++i) {
4970 palette[i * 4 + 0] = stbi__get8(s);
4971 palette[i * 4 + 1] = stbi__get8(s);
4972 palette[i * 4 + 2] = stbi__get8(s);
4973 palette[i * 4 + 3] = 255;
4978 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4980 return stbi__err(
"first not IHDR",
"Corrupt PNG");
4982 return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4984 if (scan == STBI__SCAN_header) {
4989 return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4990 if (c.length > pal_len)
4991 return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4993 for (i = 0; i < c.length; ++i)
4994 palette[i * 4 + 3] = stbi__get8(s);
4997 if (!(s->img_n & 1))
4998 return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4999 if (c.length != (stbi__uint32)s->img_n * 2)
5000 return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5002 if (z->depth == 16) {
5003 for (k = 0; k < s->img_n; ++k)
5004 tc16[k] = stbi__get16be(s);
5007 for (k = 0; k < s->img_n; ++k)
5008 tc[k] = (stbi_uc)(stbi__get16be(s) & 255)
5009 * stbi__depth_scale_table[z->depth];
5015 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
5017 return stbi__err(
"first not IHDR",
"Corrupt PNG");
5018 if (pal_img_n && !pal_len)
5019 return stbi__err(
"no PLTE",
"Corrupt PNG");
5020 if (scan == STBI__SCAN_header) {
5021 s->img_n = pal_img_n;
5024 if ((
int)(ioff + c.length) < (
int)ioff)
5026 if (ioff + c.length > idata_limit) {
5027 stbi__uint32 idata_limit_old = idata_limit;
5029 if (idata_limit == 0)
5030 idata_limit = c.length > 4096 ? c.length : 4096;
5031 while (ioff + c.length > idata_limit)
5033 STBI_NOTUSED(idata_limit_old);
5034 p = (stbi_uc *)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
5036 return stbi__err(
"outofmem",
"Out of memory");
5039 if (!stbi__getn(s, z->idata + ioff, c.length))
5040 return stbi__err(
"outofdata",
"Corrupt PNG");
5045 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
5046 stbi__uint32 raw_len, bpl;
5048 return stbi__err(
"first not IHDR",
"Corrupt PNG");
5049 if (scan != STBI__SCAN_load)
5051 if (z->idata == NULL)
5052 return stbi__err(
"no IDAT",
"Corrupt PNG");
5054 bpl = (s->img_x * z->depth + 7) / 8;
5055 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
5056 z->expanded = (stbi_uc *)stbi_zlib_decode_malloc_guesssize_headerflag(
5057 (
char *)z->idata, ioff, raw_len, (
int *)&raw_len, !is_iphone);
5058 if (z->expanded == NULL)
5060 STBI_FREE(z->idata);
5062 if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans)
5063 s->img_out_n = s->img_n + 1;
5065 s->img_out_n = s->img_n;
5066 if (!stbi__create_png_image(
5067 z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace))
5070 if (z->depth == 16) {
5071 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
5075 if (!stbi__compute_transparency(z, tc, s->img_out_n))
5079 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
5083 s->img_n = pal_img_n;
5084 s->img_out_n = pal_img_n;
5086 s->img_out_n = req_comp;
5087 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
5090 STBI_FREE(z->expanded);
5098 return stbi__err(
"first not IHDR",
"Corrupt PNG");
5099 if ((c.type & (1 << 29)) == 0) {
5100 #ifndef STBI_NO_FAILURE_STRINGS 5102 static char invalid_chunk[] =
"XXXX PNG chunk not known";
5103 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
5104 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
5105 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
5106 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
5108 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
5110 stbi__skip(s, c.length);
5118 static unsigned char *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp) {
5119 unsigned char *result = NULL;
5120 if (req_comp < 0 || req_comp > 4)
5121 return stbi__errpuc(
"bad req_comp",
"Internal error");
5122 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
5123 if (p->depth == 16) {
5124 if (!stbi__reduce_png(p)) {
5130 if (req_comp && req_comp != p->s->img_out_n) {
5131 result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
5132 p->s->img_out_n = req_comp;
5143 STBI_FREE(p->expanded);
5145 STBI_FREE(p->idata);
5151 static unsigned char *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
5154 return stbi__do_png(&p, x, y, comp, req_comp);
5157 static int stbi__png_test(stbi__context *s) {
5159 r = stbi__check_png_header(s);
5164 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp) {
5165 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
5174 *comp = p->s->img_n;
5178 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp) {
5181 return stbi__png_info_raw(&p, x, y, comp);
5188 static int stbi__bmp_test_raw(stbi__context *s) {
5191 if (stbi__get8(s) !=
'B')
5193 if (stbi__get8(s) !=
'M')
5199 sz = stbi__get32le(s);
5200 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5204 static int stbi__bmp_test(stbi__context *s) {
5205 int r = stbi__bmp_test_raw(s);
5211 static int stbi__high_bit(
unsigned int z) {
5228 static int stbi__bitcount(
unsigned int a) {
5229 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
5230 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
5231 a = (a + (a >> 4)) & 0x0f0f0f0f;
5233 a = (a + (a >> 16));
5237 static int stbi__shiftsigned(
int v,
int shift,
int bits) {
5256 int bpp, offset, hsz;
5257 unsigned int mr, mg, mb, ma, all_a;
5260 static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) {
5262 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
5263 return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5267 info->offset = stbi__get32le(s);
5268 info->hsz = hsz = stbi__get32le(s);
5269 info->mr = info->mg = info->mb = info->ma = 0;
5271 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
5272 return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5274 s->img_x = stbi__get16le(s);
5275 s->img_y = stbi__get16le(s);
5278 s->img_x = stbi__get32le(s);
5279 s->img_y = stbi__get32le(s);
5281 if (stbi__get16le(s) != 1)
5282 return stbi__errpuc(
"bad BMP",
"bad BMP");
5283 info->bpp = stbi__get16le(s);
5285 return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
5287 int compress = stbi__get32le(s);
5288 if (compress == 1 || compress == 2)
5289 return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5295 if (hsz == 40 || hsz == 56) {
5302 if (info->bpp == 16 || info->bpp == 32) {
5303 if (compress == 0) {
5304 if (info->bpp == 32) {
5305 info->mr = 0xffu << 16;
5306 info->mg = 0xffu << 8;
5307 info->mb = 0xffu << 0;
5308 info->ma = 0xffu << 24;
5313 info->mr = 31u << 10;
5314 info->mg = 31u << 5;
5315 info->mb = 31u << 0;
5318 else if (compress == 3) {
5319 info->mr = stbi__get32le(s);
5320 info->mg = stbi__get32le(s);
5321 info->mb = stbi__get32le(s);
5323 if (info->mr == info->mg && info->mg == info->mb) {
5325 return stbi__errpuc(
"bad BMP",
"bad BMP");
5329 return stbi__errpuc(
"bad BMP",
"bad BMP");
5334 if (hsz != 108 && hsz != 124)
5335 return stbi__errpuc(
"bad BMP",
"bad BMP");
5336 info->mr = stbi__get32le(s);
5337 info->mg = stbi__get32le(s);
5338 info->mb = stbi__get32le(s);
5339 info->ma = stbi__get32le(s);
5341 for (i = 0; i < 12; ++i)
5354 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
5356 unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a;
5357 stbi_uc pal[256][4];
5358 int psize = 0, i, j, width;
5359 int flip_vertically, pad, target;
5360 stbi__bmp_data info;
5363 if (stbi__bmp_parse_header(s, &info) == NULL)
5366 flip_vertically = ((int)s->img_y) > 0;
5367 s->img_y = abs((
int)s->img_y);
5375 if (info.hsz == 12) {
5377 psize = (info.offset - 14 - 24) / 3;
5381 psize = (info.offset - 14 - info.hsz) >> 2;
5384 s->img_n = ma ? 4 : 3;
5385 if (req_comp && req_comp >= 3)
5390 out = (stbi_uc *)stbi__malloc(target * s->img_x * s->img_y);
5392 return stbi__errpuc(
"outofmem",
"Out of memory");
5393 if (info.bpp < 16) {
5395 if (psize == 0 || psize > 256) {
5397 return stbi__errpuc(
"invalid",
"Corrupt BMP");
5399 for (i = 0; i < psize; ++i) {
5400 pal[i][2] = stbi__get8(s);
5401 pal[i][1] = stbi__get8(s);
5402 pal[i][0] = stbi__get8(s);
5407 stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5409 width = (s->img_x + 1) >> 1;
5410 else if (info.bpp == 8)
5414 return stbi__errpuc(
"bad bpp",
"Corrupt BMP");
5417 for (j = 0; j < (int)s->img_y; ++j) {
5418 for (i = 0; i < (int)s->img_x; i += 2) {
5419 int v = stbi__get8(s), v2 = 0;
5420 if (info.bpp == 4) {
5424 out[z++] = pal[v][0];
5425 out[z++] = pal[v][1];
5426 out[z++] = pal[v][2];
5429 if (i + 1 == (
int)s->img_x)
5431 v = (info.bpp == 8) ? stbi__get8(s) : v2;
5432 out[z++] = pal[v][0];
5433 out[z++] = pal[v][1];
5434 out[z++] = pal[v][2];
5442 int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0,
5446 stbi__skip(s, info.offset - 14 - info.hsz);
5448 width = 3 * s->img_x;
5449 else if (info.bpp == 16)
5450 width = 2 * s->img_x;
5454 if (info.bpp == 24) {
5457 else if (info.bpp == 32) {
5458 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5462 if (!mr || !mg || !mb) {
5464 return stbi__errpuc(
"bad masks",
"Corrupt BMP");
5467 rshift = stbi__high_bit(mr) - 7;
5468 rcount = stbi__bitcount(mr);
5469 gshift = stbi__high_bit(mg) - 7;
5470 gcount = stbi__bitcount(mg);
5471 bshift = stbi__high_bit(mb) - 7;
5472 bcount = stbi__bitcount(mb);
5473 ashift = stbi__high_bit(ma) - 7;
5474 acount = stbi__bitcount(ma);
5476 for (j = 0; j < (int)s->img_y; ++j) {
5478 for (i = 0; i < (int)s->img_x; ++i) {
5480 out[z + 2] = stbi__get8(s);
5481 out[z + 1] = stbi__get8(s);
5482 out[z + 0] = stbi__get8(s);
5484 a = (easy == 2 ? stbi__get8(s) : 255);
5492 for (i = 0; i < (int)s->img_x; ++i) {
5493 stbi__uint32 v = (bpp == 16 ? (stbi__uint32)stbi__get16le(s) : stbi__get32le(s));
5495 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5496 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5497 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5498 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5501 out[z++] = STBI__BYTECAST(a);
5509 if (target == 4 && all_a == 0)
5510 for (i = 4 * s->img_x * s->img_y - 1; i >= 0; i -= 4)
5513 if (flip_vertically) {
5515 for (j = 0; j<(int)s->img_y>> 1; ++j) {
5516 stbi_uc *p1 = out + j * s->img_x * target;
5517 stbi_uc *p2 = out + (s->img_y - 1 - j) * s->img_x * target;
5518 for (i = 0; i < (int)s->img_x * target; ++i) {
5519 t = p1[i], p1[i] = p2[i], p2[i] = t;
5524 if (req_comp && req_comp != target) {
5525 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
5542 static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int *is_rgb16) {
5546 switch (bits_per_pixel) {
5547 case 8:
return STBI_grey;
5550 return STBI_grey_alpha;
5557 case 32:
return bits_per_pixel / 8;
5562 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp) {
5563 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5564 int sz, tga_colormap_type;
5566 tga_colormap_type = stbi__get8(s);
5567 if (tga_colormap_type > 1) {
5571 tga_image_type = stbi__get8(s);
5572 if (tga_colormap_type == 1) {
5573 if (tga_image_type != 1 && tga_image_type != 9) {
5579 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) {
5584 tga_colormap_bpp = sz;
5587 if ((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10)
5588 && (tga_image_type != 11)) {
5593 tga_colormap_bpp = 0;
5595 tga_w = stbi__get16le(s);
5600 tga_h = stbi__get16le(s);
5605 tga_bits_per_pixel = stbi__get8(s);
5607 if (tga_colormap_bpp != 0) {
5608 if ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5614 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5617 tga_comp = stbi__tga_get_comp(
5618 tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5633 static int stbi__tga_test(stbi__context *s) {
5635 int sz, tga_color_type;
5637 tga_color_type = stbi__get8(s);
5638 if (tga_color_type > 1)
5641 if (tga_color_type == 1) {
5642 if (sz != 1 && sz != 9)
5646 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
5651 if ((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11))
5655 if (stbi__get16le(s) < 1)
5657 if (stbi__get16le(s) < 1)
5660 if ((tga_color_type == 1) && (sz != 8) && (sz != 16))
5662 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
5673 void stbi__tga_read_rgb16(stbi__context *s, stbi_uc *out) {
5674 stbi__uint16 px = stbi__get16le(s);
5675 stbi__uint16 fiveBitMask = 31;
5677 int r = (px >> 10) & fiveBitMask;
5678 int g = (px >> 5) & fiveBitMask;
5679 int b = px & fiveBitMask;
5681 out[0] = (r * 255) / 31;
5682 out[1] = (g * 255) / 31;
5683 out[2] = (b * 255) / 31;
5691 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
5693 int tga_offset = stbi__get8(s);
5694 int tga_indexed = stbi__get8(s);
5695 int tga_image_type = stbi__get8(s);
5697 int tga_palette_start = stbi__get16le(s);
5698 int tga_palette_len = stbi__get16le(s);
5699 int tga_palette_bits = stbi__get8(s);
5700 int tga_x_origin = stbi__get16le(s);
5701 int tga_y_origin = stbi__get16le(s);
5702 int tga_width = stbi__get16le(s);
5703 int tga_height = stbi__get16le(s);
5704 int tga_bits_per_pixel = stbi__get8(s);
5705 int tga_comp, tga_rgb16 = 0;
5706 int tga_inverted = stbi__get8(s);
5709 unsigned char *tga_data;
5710 unsigned char *tga_palette = NULL;
5712 unsigned char raw_data[4];
5714 int RLE_repeating = 0;
5715 int read_next_pixel = 1;
5718 if (tga_image_type >= 8) {
5719 tga_image_type -= 8;
5722 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5726 tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5728 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5731 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5739 tga_data = (
unsigned char *)stbi__malloc((
size_t)tga_width * tga_height * tga_comp);
5741 return stbi__errpuc(
"outofmem",
"Out of memory");
5744 stbi__skip(s, tga_offset);
5746 if (!tga_indexed && !tga_is_RLE && !tga_rgb16) {
5747 for (i = 0; i < tga_height; ++i) {
5748 int row = tga_inverted ? tga_height - i - 1 : i;
5749 stbi_uc *tga_row = tga_data + row * tga_width * tga_comp;
5750 stbi__getn(s, tga_row, tga_width * tga_comp);
5757 stbi__skip(s, tga_palette_start);
5759 tga_palette = (
unsigned char *)stbi__malloc(tga_palette_len * tga_comp);
5761 STBI_FREE(tga_data);
5762 return stbi__errpuc(
"outofmem",
"Out of memory");
5765 stbi_uc *pal_entry = tga_palette;
5766 STBI_ASSERT(tga_comp == STBI_rgb);
5767 for (i = 0; i < tga_palette_len; ++i) {
5768 stbi__tga_read_rgb16(s, pal_entry);
5769 pal_entry += tga_comp;
5772 else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5773 STBI_FREE(tga_data);
5774 STBI_FREE(tga_palette);
5775 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5779 for (i = 0; i < tga_width * tga_height; ++i) {
5782 if (RLE_count == 0) {
5784 int RLE_cmd = stbi__get8(s);
5785 RLE_count = 1 + (RLE_cmd & 127);
5786 RLE_repeating = RLE_cmd >> 7;
5787 read_next_pixel = 1;
5789 else if (!RLE_repeating) {
5790 read_next_pixel = 1;
5794 read_next_pixel = 1;
5797 if (read_next_pixel) {
5801 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5802 if (pal_idx >= tga_palette_len) {
5806 pal_idx *= tga_comp;
5807 for (j = 0; j < tga_comp; ++j) {
5808 raw_data[j] = tga_palette[pal_idx + j];
5811 else if (tga_rgb16) {
5812 STBI_ASSERT(tga_comp == STBI_rgb);
5813 stbi__tga_read_rgb16(s, raw_data);
5817 for (j = 0; j < tga_comp; ++j) {
5818 raw_data[j] = stbi__get8(s);
5822 read_next_pixel = 0;
5826 for (j = 0; j < tga_comp; ++j)
5827 tga_data[i * tga_comp + j] = raw_data[j];
5834 for (j = 0; j * 2 < tga_height; ++j) {
5835 int index1 = j * tga_width * tga_comp;
5836 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5837 for (i = tga_width * tga_comp; i > 0; --i) {
5838 unsigned char temp = tga_data[index1];
5839 tga_data[index1] = tga_data[index2];
5840 tga_data[index2] = temp;
5847 if (tga_palette != NULL) {
5848 STBI_FREE(tga_palette);
5853 if (tga_comp >= 3 && !tga_rgb16) {
5854 unsigned char *tga_pixel = tga_data;
5855 for (i = 0; i < tga_width * tga_height; ++i) {
5856 unsigned char temp = tga_pixel[0];
5857 tga_pixel[0] = tga_pixel[2];
5858 tga_pixel[2] = temp;
5859 tga_pixel += tga_comp;
5864 if (req_comp && req_comp != tga_comp)
5865 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5869 tga_palette_start = tga_palette_len = tga_palette_bits = tga_x_origin = tga_y_origin = 0;
5879 static int stbi__psd_test(stbi__context *s) {
5880 int r = (stbi__get32be(s) == 0x38425053);
5885 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
5887 int channelCount, compression;
5888 int channel, i, count, len;
5894 if (stbi__get32be(s) != 0x38425053)
5895 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5898 if (stbi__get16be(s) != 1)
5899 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5905 channelCount = stbi__get16be(s);
5906 if (channelCount < 0 || channelCount > 16)
5907 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5910 h = stbi__get32be(s);
5911 w = stbi__get32be(s);
5914 bitdepth = stbi__get16be(s);
5915 if (bitdepth != 8 && bitdepth != 16)
5916 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
5928 if (stbi__get16be(s) != 3)
5929 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5932 stbi__skip(s, stbi__get32be(s));
5935 stbi__skip(s, stbi__get32be(s));
5938 stbi__skip(s, stbi__get32be(s));
5944 compression = stbi__get16be(s);
5945 if (compression > 1)
5946 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5949 out = (stbi_uc *)stbi__malloc(4 * w * h);
5951 return stbi__errpuc(
"outofmem",
"Out of memory");
5969 stbi__skip(s, h * channelCount * 2);
5972 for (channel = 0; channel < 4; channel++) {
5976 if (channel >= channelCount) {
5978 for (i = 0; i < pixelCount; i++, p += 4)
5979 *p = (channel == 3 ? 255 : 0);
5984 while (count < pixelCount) {
5985 len = stbi__get8(s);
5989 else if (len < 128) {
5999 else if (len > 128) {
6005 val = stbi__get8(s);
6022 for (channel = 0; channel < 4; channel++) {
6026 if (channel >= channelCount) {
6028 stbi_uc val = channel == 3 ? 255 : 0;
6029 for (i = 0; i < pixelCount; i++, p += 4)
6034 if (bitdepth == 16) {
6035 for (i = 0; i < pixelCount; i++, p += 4)
6036 *p = (stbi_uc)(stbi__get16be(s) >> 8);
6039 for (i = 0; i < pixelCount; i++, p += 4)
6046 if (channelCount >= 4) {
6047 for (i = 0; i < w * h; ++i) {
6048 unsigned char *pixel = out + 4 * i;
6049 if (pixel[3] != 0 && pixel[3] != 255) {
6051 float a = pixel[3] / 255.0f;
6052 float ra = 1.0f / a;
6053 float inv_a = 255.0f * (1 - ra);
6054 pixel[0] = (
unsigned char)(pixel[0] * ra + inv_a);
6055 pixel[1] = (
unsigned char)(pixel[1] * ra + inv_a);
6056 pixel[2] = (
unsigned char)(pixel[2] * ra + inv_a);
6061 if (req_comp && req_comp != 4) {
6062 out = stbi__convert_format(out, 4, req_comp, w, h);
6084 static int stbi__pic_is4(stbi__context *s,
const char *str) {
6086 for (i = 0; i < 4; ++i)
6087 if (stbi__get8(s) != (stbi_uc)str[i])
6093 static int stbi__pic_test_core(stbi__context *s) {
6096 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
6099 for (i = 0; i < 84; ++i)
6102 if (!stbi__pic_is4(s,
"PICT"))
6108 typedef struct { stbi_uc size, type, channel; } stbi__pic_packet;
6110 static stbi_uc *stbi__readval(stbi__context *s,
int channel, stbi_uc *dest) {
6113 for (i = 0; i < 4; ++i, mask >>= 1) {
6114 if (channel & mask) {
6115 if (stbi__at_eof(s))
6116 return stbi__errpuc(
"bad file",
"PIC file too short");
6117 dest[i] = stbi__get8(s);
6124 static void stbi__copyval(
int channel, stbi_uc *dest,
const stbi_uc *src) {
6127 for (i = 0; i < 4; ++i, mask >>= 1)
6133 stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp, stbi_uc *result) {
6134 int act_comp = 0, num_packets = 0, y, chained;
6135 stbi__pic_packet packets[10];
6140 stbi__pic_packet *packet;
6142 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
6143 return stbi__errpuc(
"bad format",
"too many packets");
6145 packet = &packets[num_packets++];
6147 chained = stbi__get8(s);
6148 packet->size = stbi__get8(s);
6149 packet->type = stbi__get8(s);
6150 packet->channel = stbi__get8(s);
6152 act_comp |= packet->channel;
6154 if (stbi__at_eof(s))
6155 return stbi__errpuc(
"bad file",
"file too short (reading packets)");
6156 if (packet->size != 8)
6157 return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
6160 *comp = (act_comp & 0x10 ? 4 : 3);
6162 for (y = 0; y < height; ++y) {
6165 for (packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
6166 stbi__pic_packet *packet = &packets[packet_idx];
6167 stbi_uc *dest = result + y * width * 4;
6169 switch (packet->type) {
6170 default:
return stbi__errpuc(
"bad format",
"packet has bad compression type");
6175 for (x = 0; x < width; ++x, dest += 4)
6176 if (!stbi__readval(s, packet->channel, dest))
6183 int left = width, i;
6186 stbi_uc count, value[4];
6188 count = stbi__get8(s);
6189 if (stbi__at_eof(s))
6190 return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6193 count = (stbi_uc)left;
6195 if (!stbi__readval(s, packet->channel, value))
6198 for (i = 0; i < count; ++i, dest += 4)
6199 stbi__copyval(packet->channel, dest, value);
6207 int count = stbi__get8(s), i;
6208 if (stbi__at_eof(s))
6209 return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6215 count = stbi__get16be(s);
6219 return stbi__errpuc(
"bad file",
"scanline overrun");
6221 if (!stbi__readval(s, packet->channel, value))
6224 for (i = 0; i < count; ++i, dest += 4)
6225 stbi__copyval(packet->channel, dest, value);
6230 return stbi__errpuc(
"bad file",
"scanline overrun");
6232 for (i = 0; i < count; ++i, dest += 4)
6233 if (!stbi__readval(s, packet->channel, dest))
6247 static stbi_uc *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp) {
6251 for (i = 0; i < 92; ++i)
6254 x = stbi__get16be(s);
6255 y = stbi__get16be(s);
6256 if (stbi__at_eof(s))
6257 return stbi__errpuc(
"bad file",
"file too short (pic header)");
6258 if ((1 << 28) / x < y)
6259 return stbi__errpuc(
"too large",
"Image too large to decode");
6266 result = (stbi_uc *)stbi__malloc(x * y * 4);
6267 memset(result, 0xff, x * y * 4);
6269 if (!stbi__pic_load_core(s, x, y, comp, result)) {
6277 result = stbi__convert_format(result, 4, req_comp, x, y);
6282 static int stbi__pic_test(stbi__context *s) {
6283 int r = stbi__pic_test_core(s);
6301 stbi_uc *out, *old_out;
6302 int flags, bgindex, ratio, transparent, eflags, delay;
6303 stbi_uc pal[256][4];
6304 stbi_uc lpal[256][4];
6305 stbi__gif_lzw codes[4096];
6306 stbi_uc *color_table;
6309 int start_x, start_y;
6315 static int stbi__gif_test_raw(stbi__context *s) {
6317 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
6320 if (sz !=
'9' && sz !=
'7')
6322 if (stbi__get8(s) !=
'a')
6327 static int stbi__gif_test(stbi__context *s) {
6328 int r = stbi__gif_test_raw(s);
6334 stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4],
int num_entries,
int transp) {
6336 for (i = 0; i < num_entries; ++i) {
6337 pal[i][2] = stbi__get8(s);
6338 pal[i][1] = stbi__get8(s);
6339 pal[i][0] = stbi__get8(s);
6340 pal[i][3] = transp == i ? 0 : 255;
6344 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info) {
6346 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
6347 return stbi__err(
"not GIF",
"Corrupt GIF");
6349 version = stbi__get8(s);
6350 if (version !=
'7' && version !=
'9')
6351 return stbi__err(
"not GIF",
"Corrupt GIF");
6352 if (stbi__get8(s) !=
'a')
6353 return stbi__err(
"not GIF",
"Corrupt GIF");
6355 stbi__g_failure_reason =
"";
6356 g->w = stbi__get16le(s);
6357 g->h = stbi__get16le(s);
6358 g->flags = stbi__get8(s);
6359 g->bgindex = stbi__get8(s);
6360 g->ratio = stbi__get8(s);
6361 g->transparent = -1;
6369 if (g->flags & 0x80)
6370 stbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1);
6375 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp) {
6376 stbi__gif *g = (stbi__gif *)stbi__malloc(
sizeof(stbi__gif));
6377 if (!stbi__gif_header(s, g, comp, 1)) {
6390 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) {
6395 if (g->codes[code].prefix >= 0)
6396 stbi__out_gif_code(g, g->codes[code].prefix);
6398 if (g->cur_y >= g->max_y)
6401 p = &g->out[g->cur_x + g->cur_y];
6402 c = &g->color_table[g->codes[code].suffix * 4];
6412 if (g->cur_x >= g->max_x) {
6413 g->cur_x = g->start_x;
6414 g->cur_y += g->step;
6416 while (g->cur_y >= g->max_y && g->parse > 0) {
6417 g->step = (1 << g->parse) * g->line_size;
6418 g->cur_y = g->start_y + (g->step >> 1);
6424 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) {
6426 stbi__int32 len, init_code;
6428 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6431 lzw_cs = stbi__get8(s);
6434 clear = 1 << lzw_cs;
6436 codesize = lzw_cs + 1;
6437 codemask = (1 << codesize) - 1;
6440 for (init_code = 0; init_code < clear; init_code++) {
6441 g->codes[init_code].prefix = -1;
6442 g->codes[init_code].first = (stbi_uc)init_code;
6443 g->codes[init_code].suffix = (stbi_uc)init_code;
6452 if (valid_bits < codesize) {
6454 len = stbi__get8(s);
6459 bits |= (stbi__int32)stbi__get8(s) << valid_bits;
6463 stbi__int32 code = bits & codemask;
6465 valid_bits -= codesize;
6467 if (code == clear) {
6468 codesize = lzw_cs + 1;
6469 codemask = (1 << codesize) - 1;
6474 else if (code == clear + 1) {
6476 while ((len = stbi__get8(s)) > 0)
6480 else if (code <= avail) {
6482 return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6485 p = &g->codes[avail++];
6487 return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6488 p->prefix = (stbi__int16)oldcode;
6489 p->first = g->codes[oldcode].first;
6490 p->suffix = (code == avail) ? p->first : g->codes[code].first;
6492 else if (code == avail)
6493 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6495 stbi__out_gif_code(g, (stbi__uint16)code);
6497 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6499 codemask = (1 << codesize) - 1;
6505 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6511 static void stbi__fill_gif_background(stbi__gif *g,
int x0,
int y0,
int x1,
int y1) {
6513 stbi_uc *c = g->pal[g->bgindex];
6514 for (y = y0; y < y1; y += 4 * g->w) {
6515 for (x = x0; x < x1; x += 4) {
6516 stbi_uc *p = &g->out[y + x];
6526 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp) {
6528 stbi_uc *prev_out = 0;
6530 if (g->out == 0 && !stbi__gif_header(s, g, comp, 0))
6534 g->out = (stbi_uc *)stbi__malloc(4 * g->w * g->h);
6536 return stbi__errpuc(
"outofmem",
"Out of memory");
6538 switch ((g->eflags & 0x1C) >> 2) {
6540 stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);
6544 memcpy(g->out, prev_out, 4 * g->w * g->h);
6545 g->old_out = prev_out;
6549 memcpy(g->out, prev_out, 4 * g->w * g->h);
6550 stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
6554 for (i = g->start_y; i < g->max_y; i += 4 * g->w)
6555 memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
6561 switch (stbi__get8(s)) {
6564 int prev_trans = -1;
6565 stbi__int32 x, y, w, h;
6568 x = stbi__get16le(s);
6569 y = stbi__get16le(s);
6570 w = stbi__get16le(s);
6571 h = stbi__get16le(s);
6572 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6573 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6575 g->line_size = g->w * 4;
6577 g->start_y = y * g->line_size;
6578 g->max_x = g->start_x + w * 4;
6579 g->max_y = g->start_y + h * g->line_size;
6580 g->cur_x = g->start_x;
6581 g->cur_y = g->start_y;
6583 g->lflags = stbi__get8(s);
6585 if (g->lflags & 0x40) {
6586 g->step = 8 * g->line_size;
6590 g->step = g->line_size;
6594 if (g->lflags & 0x80) {
6595 stbi__gif_parse_colortable(
6596 s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6597 g->color_table = (stbi_uc *)g->lpal;
6599 else if (g->flags & 0x80) {
6600 if (g->transparent >= 0 && (g->eflags & 0x01)) {
6601 prev_trans = g->pal[g->transparent][3];
6602 g->pal[g->transparent][3] = 0;
6604 g->color_table = (stbi_uc *)g->pal;
6607 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6609 o = stbi__process_gif_raster(s, g);
6613 if (prev_trans != -1)
6614 g->pal[g->transparent][3] = (stbi_uc)prev_trans;
6622 if (stbi__get8(s) == 0xF9) {
6623 len = stbi__get8(s);
6625 g->eflags = stbi__get8(s);
6626 g->delay = stbi__get16le(s);
6627 g->transparent = stbi__get8(s);
6634 while ((len = stbi__get8(s)) != 0)
6640 return (stbi_uc *)s;
6642 default:
return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6646 STBI_NOTUSED(req_comp);
6649 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
6651 stbi__gif *g = (stbi__gif *)stbi__malloc(
sizeof(stbi__gif));
6652 memset(g, 0,
sizeof(*g));
6654 u = stbi__gif_load_next(s, g, comp, req_comp);
6655 if (u == (stbi_uc *)s)
6660 if (req_comp && req_comp != 4)
6661 u = stbi__convert_format(u, 4, req_comp, g->w, g->h);
6669 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp) {
6670 return stbi__gif_info_raw(s, x, y, comp);
6678 static int stbi__hdr_test_core(stbi__context *s) {
6679 const char *signature =
"#?RADIANCE\n";
6681 for (i = 0; signature[i]; ++i)
6682 if (stbi__get8(s) != signature[i])
6687 static int stbi__hdr_test(stbi__context *s) {
6688 int r = stbi__hdr_test_core(s);
6693 #define STBI__HDR_BUFLEN 1024 6694 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer) {
6698 c = (char)stbi__get8(z);
6700 while (!stbi__at_eof(z) && c !=
'\n') {
6702 if (len == STBI__HDR_BUFLEN - 1) {
6704 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
6708 c = (char)stbi__get8(z);
6715 static void stbi__hdr_convert(
float *output, stbi_uc *input,
int req_comp) {
6716 if (input[3] != 0) {
6719 f1 = (float)ldexp(1.0f, input[3] - (
int)(128 + 8));
6721 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
6723 output[0] = input[0] * f1;
6724 output[1] = input[1] * f1;
6725 output[2] = input[2] * f1;
6736 case 3: output[0] = output[1] = output[2] = 0;
break;
6739 case 1: output[0] = 0;
break;
6744 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
6745 char buffer[STBI__HDR_BUFLEN];
6752 unsigned char count, value;
6753 int i, j, k, c1, c2, z;
6756 if (strcmp(stbi__hdr_gettoken(s, buffer),
"#?RADIANCE") != 0)
6757 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
6761 token = stbi__hdr_gettoken(s, buffer);
6764 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0)
6769 return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
6773 token = stbi__hdr_gettoken(s, buffer);
6774 if (strncmp(token,
"-Y ", 3))
6775 return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6777 height = (int)strtol(token, &token, 10);
6778 while (*token ==
' ')
6780 if (strncmp(token,
"+X ", 3))
6781 return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6783 width = (int)strtol(token, NULL, 10);
6794 hdr_data = (
float *)stbi__malloc(height * width * req_comp *
sizeof(
float));
6798 if (width < 8 || width >= 32768) {
6800 for (j = 0; j < height; ++j) {
6801 for (i = 0; i < width; ++i) {
6804 stbi__getn(s, rgbe, 4);
6805 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
6813 for (j = 0; j < height; ++j) {
6816 len = stbi__get8(s);
6817 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
6821 rgbe[0] = (stbi_uc)c1;
6822 rgbe[1] = (stbi_uc)c2;
6823 rgbe[2] = (stbi_uc)len;
6824 rgbe[3] = (stbi_uc)stbi__get8(s);
6825 stbi__hdr_convert(hdr_data, rgbe, req_comp);
6828 STBI_FREE(scanline);
6829 goto main_decode_loop;
6832 len |= stbi__get8(s);
6834 STBI_FREE(hdr_data);
6835 STBI_FREE(scanline);
6836 return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR");
6838 if (scanline == NULL)
6839 scanline = (stbi_uc *)stbi__malloc(width * 4);
6841 for (k = 0; k < 4; ++k) {
6844 count = stbi__get8(s);
6847 value = stbi__get8(s);
6849 for (z = 0; z < count; ++z)
6850 scanline[i++ * 4 + k] = value;
6854 for (z = 0; z < count; ++z)
6855 scanline[i++ * 4 + k] = stbi__get8(s);
6859 for (i = 0; i < width; ++i)
6860 stbi__hdr_convert(hdr_data + (j * width + i) * req_comp, scanline + i * 4, req_comp);
6862 STBI_FREE(scanline);
6868 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp) {
6869 char buffer[STBI__HDR_BUFLEN];
6873 if (stbi__hdr_test(s) == 0) {
6879 token = stbi__hdr_gettoken(s, buffer);
6882 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0)
6890 token = stbi__hdr_gettoken(s, buffer);
6891 if (strncmp(token,
"-Y ", 3)) {
6896 *y = (int)strtol(token, &token, 10);
6897 while (*token ==
' ')
6899 if (strncmp(token,
"+X ", 3)) {
6904 *x = (int)strtol(token, NULL, 10);
6908 #endif // STBI_NO_HDR 6911 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp) {
6913 stbi__bmp_data info;
6916 p = stbi__bmp_parse_header(s, &info);
6922 *comp = info.ma ? 4 : 3;
6928 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp) {
6930 if (stbi__get32be(s) != 0x38425053) {
6934 if (stbi__get16be(s) != 1) {
6939 channelCount = stbi__get16be(s);
6940 if (channelCount < 0 || channelCount > 16) {
6944 *y = stbi__get32be(s);
6945 *x = stbi__get32be(s);
6946 if (stbi__get16be(s) != 8) {
6950 if (stbi__get16be(s) != 3) {
6960 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp) {
6961 int act_comp = 0, num_packets = 0, chained;
6962 stbi__pic_packet packets[10];
6964 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
6971 *x = stbi__get16be(s);
6972 *y = stbi__get16be(s);
6973 if (stbi__at_eof(s)) {
6977 if ((*x) != 0 && (1 << 28) / (*x) < (*y)) {
6985 stbi__pic_packet *packet;
6987 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
6990 packet = &packets[num_packets++];
6991 chained = stbi__get8(s);
6992 packet->size = stbi__get8(s);
6993 packet->type = stbi__get8(s);
6994 packet->channel = stbi__get8(s);
6995 act_comp |= packet->channel;
6997 if (stbi__at_eof(s)) {
7001 if (packet->size != 8) {
7007 *comp = (act_comp & 0x10 ? 4 : 3);
7027 static int stbi__pnm_test(stbi__context *s) {
7029 p = (char)stbi__get8(s);
7030 t = (char)stbi__get8(s);
7031 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7038 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
7040 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
7046 out = (stbi_uc *)stbi__malloc(s->img_n * s->img_x * s->img_y);
7048 return stbi__errpuc(
"outofmem",
"Out of memory");
7049 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
7051 if (req_comp && req_comp != s->img_n) {
7052 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7059 static int stbi__pnm_isspace(
char c) {
7060 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
7063 static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c) {
7065 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7066 *c = (char)stbi__get8(s);
7068 if (stbi__at_eof(s) || *c !=
'#')
7071 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r')
7072 *c = (
char)stbi__get8(s);
7076 static int stbi__pnm_isdigit(
char c) {
return c >=
'0' && c <=
'9'; }
7078 static int stbi__pnm_getinteger(stbi__context *s,
char *c) {
7081 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7082 value = value * 10 + (*c -
'0');
7083 *c = (char)stbi__get8(s);
7089 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp) {
7096 p = (char)stbi__get8(s);
7097 t = (char)stbi__get8(s);
7098 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7103 *comp = (t ==
'6') ? 3 : 1;
7105 c = (char)stbi__get8(s);
7106 stbi__pnm_skip_whitespace(s, &c);
7108 *x = stbi__pnm_getinteger(s, &c);
7109 stbi__pnm_skip_whitespace(s, &c);
7111 *y = stbi__pnm_getinteger(s, &c);
7112 stbi__pnm_skip_whitespace(s, &c);
7114 maxv = stbi__pnm_getinteger(s, &c);
7117 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
7123 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp) {
7124 #ifndef STBI_NO_JPEG 7125 if (stbi__jpeg_info(s, x, y, comp))
7130 if (stbi__png_info(s, x, y, comp))
7135 if (stbi__gif_info(s, x, y, comp))
7140 if (stbi__bmp_info(s, x, y, comp))
7145 if (stbi__psd_info(s, x, y, comp))
7150 if (stbi__pic_info(s, x, y, comp))
7155 if (stbi__pnm_info(s, x, y, comp))
7160 if (stbi__hdr_info(s, x, y, comp))
7166 if (stbi__tga_info(s, x, y, comp))
7169 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
7172 #ifndef STBI_NO_STDIO 7173 STBIDEF
int stbi_info(
char const *filename,
int *x,
int *y,
int *comp) {
7174 FILE *f = stbi__fopen(filename,
"rb");
7177 return stbi__err(
"can't fopen",
"Unable to open file");
7178 result = stbi_info_from_file(f, x, y, comp);
7183 STBIDEF
int stbi_info_from_file(FILE *f,
int *x,
int *y,
int *comp) {
7186 long pos = ftell(f);
7187 stbi__start_file(&s, f);
7188 r = stbi__info_main(&s, x, y, comp);
7189 fseek(f, pos, SEEK_SET);
7192 #endif // !STBI_NO_STDIO 7194 STBIDEF
int stbi_info_from_memory(stbi_uc
const *buffer,
int len,
int *x,
int *y,
int *comp) {
7196 stbi__start_mem(&s, buffer, len);
7197 return stbi__info_main(&s, x, y, comp);
7201 stbi_info_from_callbacks(
stbi_io_callbacks const *c,
void *user,
int *x,
int *y,
int *comp) {
7204 return stbi__info_main(&s, x, y, comp);
7207 #endif // STB_IMAGE_IMPLEMENTATION