126 #ifndef STBI_INCLUDE_STB_IMAGE_H
127 #define STBI_INCLUDE_STB_IMAGE_H
367 #ifndef STBI_NO_STDIO
371 #define STBI_VERSION 1
392 #ifdef STB_IMAGE_STATIC
393 #define STBIDEF static
395 #define STBIDEF extern
410 int (*read) (
void *user,
char *data,
int size);
411 void (*skip) (
void *user,
int n);
412 int (*eof) (
void *user);
423 #ifndef STBI_NO_STDIO
433 #ifdef STBI_WINDOWS_UTF8
434 STBIDEF int stbi_convert_wchar_to_utf8(
char *buffer,
size_t bufferlen,
const wchar_t* input);
445 #ifndef STBI_NO_STDIO
454 #ifndef STBI_NO_LINEAR
458 #ifndef STBI_NO_STDIO
459 STBIDEF float *
stbi_loadf (
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
469 #ifndef STBI_NO_LINEAR
477 #ifndef STBI_NO_STDIO
496 #ifndef STBI_NO_STDIO
544 #ifdef STB_IMAGE_IMPLEMENTATION
546 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
547 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
548 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
549 || defined(STBI_ONLY_ZLIB)
550 #ifndef STBI_ONLY_JPEG
553 #ifndef STBI_ONLY_PNG
556 #ifndef STBI_ONLY_BMP
559 #ifndef STBI_ONLY_PSD
562 #ifndef STBI_ONLY_TGA
565 #ifndef STBI_ONLY_GIF
568 #ifndef STBI_ONLY_HDR
571 #ifndef STBI_ONLY_PIC
574 #ifndef STBI_ONLY_PNM
579 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
590 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
594 #ifndef STBI_NO_STDIO
600 #define STBI_ASSERT(x) assert(x)
604 #define STBI_EXTERN extern "C"
606 #define STBI_EXTERN extern
612 #define stbi_inline inline
617 #define stbi_inline __forceinline
620 #ifndef STBI_NO_THREAD_LOCALS
621 #if defined(__cplusplus) && __cplusplus >= 201103L
622 #define STBI_THREAD_LOCAL thread_local
623 #elif defined(__GNUC__) && __GNUC__ < 5
624 #define STBI_THREAD_LOCAL __thread
625 #elif defined(_MSC_VER)
626 #define STBI_THREAD_LOCAL __declspec(thread)
627 #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
628 #define STBI_THREAD_LOCAL _Thread_local
631 #ifndef STBI_THREAD_LOCAL
632 #if defined(__GNUC__)
633 #define STBI_THREAD_LOCAL __thread
639 typedef unsigned short stbi__uint16;
640 typedef signed short stbi__int16;
641 typedef unsigned int stbi__uint32;
642 typedef signed int stbi__int32;
645 typedef uint16_t stbi__uint16;
646 typedef int16_t stbi__int16;
647 typedef uint32_t stbi__uint32;
648 typedef int32_t stbi__int32;
652 typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
655 #define STBI_NOTUSED(v) (void)(v)
657 #define STBI_NOTUSED(v) (void)sizeof(v)
661 #define STBI_HAS_LROTL
664 #ifdef STBI_HAS_LROTL
665 #define stbi_lrot(x,y) _lrotl(x,y)
667 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31)))
670 #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
672 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
675 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
679 #define STBI_MALLOC(sz) malloc(sz)
680 #define STBI_REALLOC(p,newsz) realloc(p,newsz)
681 #define STBI_FREE(p) free(p)
684 #ifndef STBI_REALLOC_SIZED
685 #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
689 #if defined(__x86_64__) || defined(_M_X64)
690 #define STBI__X64_TARGET
691 #elif defined(__i386) || defined(_M_IX86)
692 #define STBI__X86_TARGET
695 #if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
706 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
721 #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
723 #include <emmintrin.h>
729 static int stbi__cpuid3(
void)
736 static int stbi__cpuid3(
void)
748 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
750 #if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
751 static int stbi__sse2_available(
void)
753 int info3 = stbi__cpuid3();
754 return ((info3 >> 26) & 1) != 0;
759 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
761 #if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
762 static int stbi__sse2_available(
void)
775 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)
780 #include <arm_neon.h>
782 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
784 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
788 #ifndef STBI_SIMD_ALIGN
789 #define STBI_SIMD_ALIGN(type, name) type name
792 #ifndef STBI_MAX_DIMENSIONS
793 #define STBI_MAX_DIMENSIONS (1 << 24)
804 stbi__uint32 img_x, img_y;
805 int img_n, img_out_n;
810 int read_from_callbacks;
813 int callback_already_read;
815 stbi_uc *img_buffer, *img_buffer_end;
816 stbi_uc *img_buffer_original, *img_buffer_original_end;
820 static void stbi__refill_buffer(stbi__context *s);
823 static void stbi__start_mem(stbi__context *s,
stbi_uc const *buffer,
int len)
826 s->read_from_callbacks = 0;
827 s->callback_already_read = 0;
828 s->img_buffer = s->img_buffer_original = (
stbi_uc *) buffer;
829 s->img_buffer_end = s->img_buffer_original_end = (
stbi_uc *) buffer+len;
833 static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user)
836 s->io_user_data = user;
837 s->buflen =
sizeof(s->buffer_start);
838 s->read_from_callbacks = 1;
839 s->callback_already_read = 0;
840 s->img_buffer = s->img_buffer_original = s->buffer_start;
841 stbi__refill_buffer(s);
842 s->img_buffer_original_end = s->img_buffer_end;
845 #ifndef STBI_NO_STDIO
847 static int stbi__stdio_read(
void *user,
char *data,
int size)
849 return (
int) fread(data,1,size,(FILE*) user);
852 static void stbi__stdio_skip(
void *user,
int n)
855 fseek((FILE*) user, n, SEEK_CUR);
856 ch = fgetc((FILE*) user);
858 ungetc(ch, (FILE *) user);
862 static int stbi__stdio_eof(
void *user)
864 return feof((FILE*) user) || ferror((FILE *) user);
874 static void stbi__start_file(stbi__context *s, FILE *f)
876 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *) f);
883 static void stbi__rewind(stbi__context *s)
888 s->img_buffer = s->img_buffer_original;
889 s->img_buffer_end = s->img_buffer_original_end;
900 int bits_per_channel;
906 static int stbi__jpeg_test(stbi__context *s);
907 static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
908 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
912 static int stbi__png_test(stbi__context *s);
913 static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
914 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
915 static int stbi__png_is16(stbi__context *s);
919 static int stbi__bmp_test(stbi__context *s);
920 static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
921 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
925 static int stbi__tga_test(stbi__context *s);
926 static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
927 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
931 static int stbi__psd_test(stbi__context *s);
932 static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc);
933 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
934 static int stbi__psd_is16(stbi__context *s);
938 static int stbi__hdr_test(stbi__context *s);
939 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
940 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
944 static int stbi__pic_test(stbi__context *s);
945 static void *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
946 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
950 static int stbi__gif_test(stbi__context *s);
951 static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
952 static void *stbi__load_gif_main(stbi__context *s,
int **delays,
int *x,
int *y,
int *z,
int *comp,
int req_comp);
953 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
957 static int stbi__pnm_test(stbi__context *s);
958 static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
959 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
960 static int stbi__pnm_is16(stbi__context *s);
964 #ifdef STBI_THREAD_LOCAL
967 const char *stbi__g_failure_reason;
971 return stbi__g_failure_reason;
974 #ifndef STBI_NO_FAILURE_STRINGS
975 static int stbi__err(
const char *str)
977 stbi__g_failure_reason = str;
982 static void *stbi__malloc(
size_t size)
984 return STBI_MALLOC(size);
999 static int stbi__addsizes_valid(
int a,
int b)
1001 if (b < 0)
return 0;
1006 return a <= INT_MAX - b;
1011 static int stbi__mul2sizes_valid(
int a,
int b)
1013 if (a < 0 || b < 0)
return 0;
1014 if (b == 0)
return 1;
1016 return a <= INT_MAX/b;
1019 #if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1021 static int stbi__mad2sizes_valid(
int a,
int b,
int add)
1023 return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
1028 static int stbi__mad3sizes_valid(
int a,
int b,
int c,
int add)
1030 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
1031 stbi__addsizes_valid(a*b*c, add);
1035 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1036 static int stbi__mad4sizes_valid(
int a,
int b,
int c,
int d,
int add)
1038 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
1039 stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
1043 #if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1045 static void *stbi__malloc_mad2(
int a,
int b,
int add)
1047 if (!stbi__mad2sizes_valid(a, b, add))
return NULL;
1048 return stbi__malloc(a*b + add);
1052 static void *stbi__malloc_mad3(
int a,
int b,
int c,
int add)
1054 if (!stbi__mad3sizes_valid(a, b, c, add))
return NULL;
1055 return stbi__malloc(a*b*c + add);
1058 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1059 static void *stbi__malloc_mad4(
int a,
int b,
int c,
int d,
int add)
1061 if (!stbi__mad4sizes_valid(a, b, c, d, add))
return NULL;
1062 return stbi__malloc(a*b*c*d + add);
1070 #ifdef STBI_NO_FAILURE_STRINGS
1071 #define stbi__err(x,y) 0
1072 #elif defined(STBI_FAILURE_USERMSG)
1073 #define stbi__err(x,y) stbi__err(y)
1075 #define stbi__err(x,y) stbi__err(x)
1078 #define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
1079 #define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
1083 STBI_FREE(retval_from_stbi_load);
1086 #ifndef STBI_NO_LINEAR
1087 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp);
1091 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
1094 static int stbi__vertically_flip_on_load_global = 0;
1098 stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
1101 #ifndef STBI_THREAD_LOCAL
1102 #define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global
1104 static STBI_THREAD_LOCAL
int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
1108 stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
1109 stbi__vertically_flip_on_load_set = 1;
1112 #define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \
1113 ? stbi__vertically_flip_on_load_local \
1114 : stbi__vertically_flip_on_load_global)
1117 static void *stbi__load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
1119 memset(ri, 0,
sizeof(*ri));
1120 ri->bits_per_channel = 8;
1121 ri->channel_order = STBI_ORDER_RGB;
1122 ri->num_channels = 0;
1127 if (stbi__png_test(s))
return stbi__png_load(s,x,y,comp,req_comp, ri);
1130 if (stbi__bmp_test(s))
return stbi__bmp_load(s,x,y,comp,req_comp, ri);
1133 if (stbi__gif_test(s))
return stbi__gif_load(s,x,y,comp,req_comp, ri);
1136 if (stbi__psd_test(s))
return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
1141 if (stbi__pic_test(s))
return stbi__pic_load(s,x,y,comp,req_comp, ri);
1147 #ifndef STBI_NO_JPEG
1148 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
1151 if (stbi__pnm_test(s))
return stbi__pnm_load(s,x,y,comp,req_comp, ri);
1155 if (stbi__hdr_test(s)) {
1156 float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
1157 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
1163 if (stbi__tga_test(s))
1164 return stbi__tga_load(s,x,y,comp,req_comp, ri);
1167 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
1170 static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig,
int w,
int h,
int channels)
1173 int img_len = w * h * channels;
1176 reduced = (
stbi_uc *) stbi__malloc(img_len);
1177 if (reduced == NULL)
return stbi__errpuc(
"outofmem",
"Out of memory");
1179 for (i = 0; i < img_len; ++i)
1180 reduced[i] = (
stbi_uc)((orig[i] >> 8) & 0xFF);
1186 static stbi__uint16 *stbi__convert_8_to_16(
stbi_uc *orig,
int w,
int h,
int channels)
1189 int img_len = w * h * channels;
1190 stbi__uint16 *enlarged;
1192 enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
1193 if (enlarged == NULL)
return (stbi__uint16 *) stbi__errpuc(
"outofmem",
"Out of memory");
1195 for (i = 0; i < img_len; ++i)
1196 enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]);
1202 static void stbi__vertical_flip(
void *image,
int w,
int h,
int bytes_per_pixel)
1205 size_t bytes_per_row = (size_t)w * bytes_per_pixel;
1209 for (row = 0; row < (h>>1); row++) {
1210 stbi_uc *row0 = bytes + row*bytes_per_row;
1211 stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
1213 size_t bytes_left = bytes_per_row;
1214 while (bytes_left) {
1215 size_t bytes_copy = (bytes_left <
sizeof(temp)) ? bytes_left :
sizeof(temp);
1216 memcpy(temp, row0, bytes_copy);
1217 memcpy(row0, row1, bytes_copy);
1218 memcpy(row1, temp, bytes_copy);
1221 bytes_left -= bytes_copy;
1227 static void stbi__vertical_flip_slices(
void *image,
int w,
int h,
int z,
int bytes_per_pixel)
1230 int slice_size = w * h * bytes_per_pixel;
1233 for (slice = 0; slice < z; ++slice) {
1234 stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
1235 bytes += slice_size;
1240 static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1242 stbi__result_info ri;
1243 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1249 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1251 if (ri.bits_per_channel != 8) {
1252 result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1253 ri.bits_per_channel = 8;
1258 if (stbi__vertically_flip_on_load) {
1259 int channels = req_comp ? req_comp : *comp;
1260 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
stbi_uc));
1263 return (
unsigned char *) result;
1266 static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1268 stbi__result_info ri;
1269 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1275 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1277 if (ri.bits_per_channel != 16) {
1278 result = stbi__convert_8_to_16((
stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1279 ri.bits_per_channel = 16;
1285 if (stbi__vertically_flip_on_load) {
1286 int channels = req_comp ? req_comp : *comp;
1287 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi__uint16));
1290 return (stbi__uint16 *) result;
1293 #if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
1294 static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp)
1296 if (stbi__vertically_flip_on_load && result != NULL) {
1297 int channels = req_comp ? req_comp : *comp;
1298 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
float));
1303 #ifndef STBI_NO_STDIO
1305 #if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1306 STBI_EXTERN __declspec(dllimport)
int __stdcall MultiByteToWideChar(
unsigned int cp,
unsigned long flags,
const char *str,
int cbmb,
wchar_t *widestr,
int cchwide);
1307 STBI_EXTERN __declspec(dllimport)
int __stdcall WideCharToMultiByte(
unsigned int cp,
unsigned long flags,
const wchar_t *widestr,
int cchwide,
char *str,
int cbmb,
const char *defchar,
int *used_default);
1310 #if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1311 STBIDEF int stbi_convert_wchar_to_utf8(
char *buffer,
size_t bufferlen,
const wchar_t* input)
1313 return WideCharToMultiByte(65001 , 0, input, -1, buffer, (
int) bufferlen, NULL, NULL);
1317 static FILE *stbi__fopen(
char const *filename,
char const *mode)
1320 #if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1322 wchar_t wFilename[1024];
1323 if (0 == MultiByteToWideChar(65001 , 0, filename, -1, wFilename,
sizeof(wFilename)/
sizeof(*wFilename)))
1326 if (0 == MultiByteToWideChar(65001 , 0, mode, -1, wMode,
sizeof(wMode)/
sizeof(*wMode)))
1329 #if defined(_MSC_VER) && _MSC_VER >= 1400
1330 if (0 != _wfopen_s(&f, wFilename, wMode))
1333 f = _wfopen(wFilename, wMode);
1336 #elif defined(_MSC_VER) && _MSC_VER >= 1400
1337 if (0 != fopen_s(&f, filename, mode))
1340 f = fopen(filename, mode);
1348 FILE *f = stbi__fopen(filename,
"rb");
1349 unsigned char *result;
1350 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1358 unsigned char *result;
1360 stbi__start_file(&s,f);
1361 result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1364 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1371 stbi__uint16 *result;
1373 stbi__start_file(&s,f);
1374 result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
1377 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1384 FILE *f = stbi__fopen(filename,
"rb");
1385 stbi__uint16 *result;
1386 if (!f)
return (
stbi_us *) stbi__errpuc(
"can't fopen",
"Unable to open file");
1398 stbi__start_mem(&s,buffer,len);
1399 return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1406 return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1412 stbi__start_mem(&s,buffer,len);
1413 return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1420 return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1426 unsigned char *result;
1428 stbi__start_mem(&s,buffer,len);
1430 result = (
unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
1431 if (stbi__vertically_flip_on_load) {
1432 stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
1439 #ifndef STBI_NO_LINEAR
1440 static float *stbi__loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1442 unsigned char *data;
1444 if (stbi__hdr_test(s)) {
1445 stbi__result_info ri;
1446 float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
1448 stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1452 data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
1454 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1455 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1461 stbi__start_mem(&s,buffer,len);
1462 return stbi__loadf_main(&s,x,y,comp,req_comp);
1469 return stbi__loadf_main(&s,x,y,comp,req_comp);
1472 #ifndef STBI_NO_STDIO
1473 STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1476 FILE *f = stbi__fopen(filename,
"rb");
1477 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1486 stbi__start_file(&s,f);
1487 return stbi__loadf_main(&s,x,y,comp,req_comp);
1501 stbi__start_mem(&s,buffer,len);
1502 return stbi__hdr_test(&s);
1504 STBI_NOTUSED(buffer);
1510 #ifndef STBI_NO_STDIO
1513 FILE *f = stbi__fopen(filename,
"rb");
1525 long pos = ftell(f);
1528 stbi__start_file(&s,f);
1529 res = stbi__hdr_test(&s);
1530 fseek(f, pos, SEEK_SET);
1544 return stbi__hdr_test(&s);
1552 #ifndef STBI_NO_LINEAR
1553 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1559 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1577 static void stbi__refill_buffer(stbi__context *s)
1579 int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
1580 s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original);
1584 s->read_from_callbacks = 0;
1585 s->img_buffer = s->buffer_start;
1586 s->img_buffer_end = s->buffer_start+1;
1589 s->img_buffer = s->buffer_start;
1590 s->img_buffer_end = s->buffer_start + n;
1594 stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1596 if (s->img_buffer < s->img_buffer_end)
1597 return *s->img_buffer++;
1598 if (s->read_from_callbacks) {
1599 stbi__refill_buffer(s);
1600 return *s->img_buffer++;
1605 #if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1608 stbi_inline
static int stbi__at_eof(stbi__context *s)
1611 if (!(s->io.eof)(s->io_user_data))
return 0;
1614 if (s->read_from_callbacks == 0)
return 1;
1617 return s->img_buffer >= s->img_buffer_end;
1621 #if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)
1624 static void stbi__skip(stbi__context *s,
int n)
1628 s->img_buffer = s->img_buffer_end;
1632 int blen = (int) (s->img_buffer_end - s->img_buffer);
1634 s->img_buffer = s->img_buffer_end;
1635 (s->io.skip)(s->io_user_data, n - blen);
1643 #if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
1646 static int stbi__getn(stbi__context *s,
stbi_uc *buffer,
int n)
1649 int blen = (int) (s->img_buffer_end - s->img_buffer);
1653 memcpy(buffer, s->img_buffer, blen);
1655 count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
1656 res = (count == (n-blen));
1657 s->img_buffer = s->img_buffer_end;
1662 if (s->img_buffer+n <= s->img_buffer_end) {
1663 memcpy(buffer, s->img_buffer, n);
1671 #if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1674 static int stbi__get16be(stbi__context *s)
1676 int z = stbi__get8(s);
1677 return (z << 8) + stbi__get8(s);
1681 #if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1684 static stbi__uint32 stbi__get32be(stbi__context *s)
1686 stbi__uint32 z = stbi__get16be(s);
1687 return (z << 16) + stbi__get16be(s);
1691 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1694 static int stbi__get16le(stbi__context *s)
1696 int z = stbi__get8(s);
1697 return z + (stbi__get8(s) << 8);
1702 static stbi__uint32 stbi__get32le(stbi__context *s)
1704 stbi__uint32 z = stbi__get16le(s);
1705 z += (stbi__uint32)stbi__get16le(s) << 16;
1710 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255))
1712 #if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1726 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1728 return (
stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
1732 #if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1735 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1738 unsigned char *good;
1740 if (req_comp == img_n)
return data;
1741 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1743 good = (
unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
1746 return stbi__errpuc(
"outofmem",
"Out of memory");
1749 for (j=0; j < (int) y; ++j) {
1750 unsigned char *src = data + j * x * img_n ;
1751 unsigned char *dest = good + j * x * req_comp;
1753 #define STBI__COMBO(a,b) ((a)*8+(b))
1754 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1757 switch (STBI__COMBO(img_n, req_comp)) {
1758 STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; }
break;
1759 STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1760 STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; }
break;
1761 STBI__CASE(2,1) { dest[0]=src[0]; }
break;
1762 STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1763 STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; }
break;
1764 STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; }
break;
1765 STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); }
break;
1766 STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; }
break;
1767 STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); }
break;
1768 STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; }
break;
1769 STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; }
break;
1770 default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good);
return stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1780 #if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1783 static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b)
1785 return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
1789 #if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1792 static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1797 if (req_comp == img_n)
return data;
1798 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1800 good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
1803 return (stbi__uint16 *) stbi__errpuc(
"outofmem",
"Out of memory");
1806 for (j=0; j < (int) y; ++j) {
1807 stbi__uint16 *src = data + j * x * img_n ;
1808 stbi__uint16 *dest = good + j * x * req_comp;
1810 #define STBI__COMBO(a,b) ((a)*8+(b))
1811 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1814 switch (STBI__COMBO(img_n, req_comp)) {
1815 STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; }
break;
1816 STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1817 STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; }
break;
1818 STBI__CASE(2,1) { dest[0]=src[0]; }
break;
1819 STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; }
break;
1820 STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; }
break;
1821 STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; }
break;
1822 STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); }
break;
1823 STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; }
break;
1824 STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); }
break;
1825 STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; }
break;
1826 STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; }
break;
1827 default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good);
return (stbi__uint16*) stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1837 #ifndef STBI_NO_LINEAR
1838 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp)
1842 if (!data)
return NULL;
1843 output = (
float *) stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1844 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1846 if (comp & 1) n = comp;
else n = comp-1;
1847 for (i=0; i < x*y; ++i) {
1848 for (k=0; k < n; ++k) {
1849 output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1853 for (i=0; i < x*y; ++i) {
1854 output[i*comp + n] = data[i*comp + n]/255.0f;
1863 #define stbi__float2int(x) ((int) (x))
1864 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1868 if (!data)
return NULL;
1869 output = (
stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
1870 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1872 if (comp & 1) n = comp;
else n = comp-1;
1873 for (i=0; i < x*y; ++i) {
1874 for (k=0; k < n; ++k) {
1875 float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1877 if (z > 255) z = 255;
1878 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1881 float z = data[i*comp+k] * 255 + 0.5f;
1883 if (z > 255) z = 255;
1884 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1913 #ifndef STBI_NO_JPEG
1922 stbi__uint16 code[256];
1925 unsigned int maxcode[18];
1932 stbi__huffman huff_dc[4];
1933 stbi__huffman huff_ac[4];
1934 stbi__uint16 dequant[4][64];
1935 stbi__int16 fast_ac[4][1 << FAST_BITS];
1938 int img_h_max, img_v_max;
1939 int img_mcu_x, img_mcu_y;
1940 int img_mcu_w, img_mcu_h;
1953 void *raw_data, *raw_coeff;
1956 int coeff_w, coeff_h;
1959 stbi__uint32 code_buffer;
1961 unsigned char marker;
1971 int app14_color_transform;
1974 int scan_n, order[4];
1975 int restart_interval, todo;
1978 void (*idct_block_kernel)(
stbi_uc *out,
int out_stride,
short data[64]);
1983 static int stbi__build_huffman(stbi__huffman *h,
int *count)
1988 for (i=0; i < 16; ++i)
1989 for (j=0; j < count[i]; ++j)
1990 h->size[k++] = (
stbi_uc) (i+1);
1996 for(j=1; j <= 16; ++j) {
1998 h->delta[j] = k - code;
1999 if (h->size[k] == j) {
2000 while (h->size[k] == j)
2001 h->code[k++] = (stbi__uint16) (code++);
2002 if (code-1 >= (1u << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
2005 h->maxcode[j] = code << (16-j);
2008 h->maxcode[j] = 0xffffffff;
2011 memset(h->fast, 255, 1 << FAST_BITS);
2012 for (i=0; i < k; ++i) {
2014 if (s <= FAST_BITS) {
2015 int c = h->code[i] << (FAST_BITS-s);
2016 int m = 1 << (FAST_BITS-s);
2017 for (j=0; j < m; ++j) {
2027 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
2030 for (i=0; i < (1 << FAST_BITS); ++i) {
2034 int rs = h->values[fast];
2035 int run = (rs >> 4) & 15;
2036 int magbits = rs & 15;
2037 int len = h->size[fast];
2039 if (magbits && len + magbits <= FAST_BITS) {
2041 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
2042 int m = 1 << (magbits - 1);
2043 if (k < m) k += (~0U << magbits) + 1;
2045 if (k >= -128 && k <= 127)
2046 fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
2052 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
2055 unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
2057 int c = stbi__get8(j->s);
2058 while (c == 0xff) c = stbi__get8(j->s);
2060 j->marker = (
unsigned char) c;
2065 j->code_buffer |= b << (24 - j->code_bits);
2067 }
while (j->code_bits <= 24);
2071 static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
2074 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
2079 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2083 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2087 if (s > j->code_bits)
2089 j->code_buffer <<= s;
2091 return h->values[k];
2100 temp = j->code_buffer >> 16;
2101 for (k=FAST_BITS+1 ; ; ++k)
2102 if (temp < h->maxcode[k])
2110 if (k > j->code_bits)
2114 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
2115 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
2119 j->code_buffer <<= k;
2120 return h->values[c];
2124 static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
2128 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
2132 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
2134 sgn = j->code_buffer >> 31;
2135 k = stbi_lrot(j->code_buffer, n);
2136 j->code_buffer = k & ~stbi__bmask[n];
2137 k &= stbi__bmask[n];
2139 return k + (stbi__jbias[n] & (sgn - 1));
2143 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
2146 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
2147 k = stbi_lrot(j->code_buffer, n);
2148 j->code_buffer = k & ~stbi__bmask[n];
2149 k &= stbi__bmask[n];
2154 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
2157 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
2159 j->code_buffer <<= 1;
2161 return k & 0x80000000;
2166 static const stbi_uc stbi__jpeg_dezigzag[64+15] =
2168 0, 1, 8, 16, 9, 2, 3, 10,
2169 17, 24, 32, 25, 18, 11, 4, 5,
2170 12, 19, 26, 33, 40, 48, 41, 34,
2171 27, 20, 13, 6, 7, 14, 21, 28,
2172 35, 42, 49, 56, 57, 50, 43, 36,
2173 29, 22, 15, 23, 30, 37, 44, 51,
2174 58, 59, 52, 45, 38, 31, 39, 46,
2175 53, 60, 61, 54, 47, 55, 62, 63,
2177 63, 63, 63, 63, 63, 63, 63, 63,
2178 63, 63, 63, 63, 63, 63, 63
2182 static int stbi__jpeg_decode_block(stbi__jpeg *j,
short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac,
int b, stbi__uint16 *dequant)
2187 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2188 t = stbi__jpeg_huff_decode(j, hdc);
2189 if (t < 0 || t > 15)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2192 memset(data,0,64*
sizeof(data[0]));
2194 diff = t ? stbi__extend_receive(j, t) : 0;
2195 dc = j->img_comp[b].dc_pred + diff;
2196 j->img_comp[b].dc_pred = dc;
2197 data[0] = (short) (dc * dequant[0]);
2204 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2205 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2210 j->code_buffer <<= s;
2213 zig = stbi__jpeg_dezigzag[k++];
2214 data[zig] = (short) ((r >> 8) * dequant[zig]);
2216 int rs = stbi__jpeg_huff_decode(j, hac);
2217 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2221 if (rs != 0xf0)
break;
2226 zig = stbi__jpeg_dezigzag[k++];
2227 data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
2234 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
2238 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2240 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2242 if (j->succ_high == 0) {
2244 memset(data,0,64*
sizeof(data[0]));
2245 t = stbi__jpeg_huff_decode(j, hdc);
2246 if (t < 0 || t > 15)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2247 diff = t ? stbi__extend_receive(j, t) : 0;
2249 dc = j->img_comp[b].dc_pred + diff;
2250 j->img_comp[b].dc_pred = dc;
2251 data[0] = (short) (dc * (1 << j->succ_low));
2254 if (stbi__jpeg_get_bit(j))
2255 data[0] += (
short) (1 << j->succ_low);
2262 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
2265 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2267 if (j->succ_high == 0) {
2268 int shift = j->succ_low;
2279 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2280 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2285 j->code_buffer <<= s;
2287 zig = stbi__jpeg_dezigzag[k++];
2288 data[zig] = (short) ((r >> 8) * (1 << shift));
2290 int rs = stbi__jpeg_huff_decode(j, hac);
2291 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2296 j->eob_run = (1 << r);
2298 j->eob_run += stbi__jpeg_get_bits(j, r);
2305 zig = stbi__jpeg_dezigzag[k++];
2306 data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift));
2309 }
while (k <= j->spec_end);
2313 short bit = (short) (1 << j->succ_low);
2317 for (k = j->spec_start; k <= j->spec_end; ++k) {
2318 short *p = &data[stbi__jpeg_dezigzag[k]];
2320 if (stbi__jpeg_get_bit(j))
2321 if ((*p & bit)==0) {
2332 int rs = stbi__jpeg_huff_decode(j, hac);
2333 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2338 j->eob_run = (1 << r) - 1;
2340 j->eob_run += stbi__jpeg_get_bits(j, r);
2348 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2350 if (stbi__jpeg_get_bit(j))
2357 while (k <= j->spec_end) {
2358 short *p = &data[stbi__jpeg_dezigzag[k++]];
2360 if (stbi__jpeg_get_bit(j))
2361 if ((*p & bit)==0) {
2375 }
while (k <= j->spec_end);
2382 stbi_inline
static stbi_uc stbi__clamp(
int x)
2385 if ((
unsigned int) x > 255) {
2386 if (x < 0)
return 0;
2387 if (x > 255)
return 255;
2392 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
2393 #define stbi__fsh(x) ((x) * 4096)
2396 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2397 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2400 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
2401 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
2402 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
2405 t0 = stbi__fsh(p2+p3); \
2406 t1 = stbi__fsh(p2-p3); \
2419 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
2420 t0 = t0*stbi__f2f( 0.298631336f); \
2421 t1 = t1*stbi__f2f( 2.053119869f); \
2422 t2 = t2*stbi__f2f( 3.072711026f); \
2423 t3 = t3*stbi__f2f( 1.501321110f); \
2424 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
2425 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
2426 p3 = p3*stbi__f2f(-1.961570560f); \
2427 p4 = p4*stbi__f2f(-0.390180644f); \
2433 static void stbi__idct_block(
stbi_uc *out,
int out_stride,
short data[64])
2435 int i,val[64],*v=val;
2440 for (i=0; i < 8; ++i,++d, ++v) {
2442 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
2443 && d[40]==0 && d[48]==0 && d[56]==0) {
2448 int dcterm = d[0]*4;
2449 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2451 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
2454 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2455 v[ 0] = (x0+t3) >> 10;
2456 v[56] = (x0-t3) >> 10;
2457 v[ 8] = (x1+t2) >> 10;
2458 v[48] = (x1-t2) >> 10;
2459 v[16] = (x2+t1) >> 10;
2460 v[40] = (x2-t1) >> 10;
2461 v[24] = (x3+t0) >> 10;
2462 v[32] = (x3-t0) >> 10;
2466 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
2468 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
2475 x0 += 65536 + (128<<17);
2476 x1 += 65536 + (128<<17);
2477 x2 += 65536 + (128<<17);
2478 x3 += 65536 + (128<<17);
2481 o[0] = stbi__clamp((x0+t3) >> 17);
2482 o[7] = stbi__clamp((x0-t3) >> 17);
2483 o[1] = stbi__clamp((x1+t2) >> 17);
2484 o[6] = stbi__clamp((x1-t2) >> 17);
2485 o[2] = stbi__clamp((x2+t1) >> 17);
2486 o[5] = stbi__clamp((x2-t1) >> 17);
2487 o[3] = stbi__clamp((x3+t0) >> 17);
2488 o[4] = stbi__clamp((x3-t0) >> 17);
2496 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2499 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2503 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2507 #define dct_rot(out0,out1, x,y,c0,c1) \
2508 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2509 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2510 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2511 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2512 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2513 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2516 #define dct_widen(out, in) \
2517 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2518 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2521 #define dct_wadd(out, a, b) \
2522 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2523 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2526 #define dct_wsub(out, a, b) \
2527 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2528 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2531 #define dct_bfly32o(out0, out1, a,b,bias,s) \
2533 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2534 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2535 dct_wadd(sum, abiased, b); \
2536 dct_wsub(dif, abiased, b); \
2537 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2538 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2542 #define dct_interleave8(a, b) \
2544 a = _mm_unpacklo_epi8(a, b); \
2545 b = _mm_unpackhi_epi8(tmp, b)
2548 #define dct_interleave16(a, b) \
2550 a = _mm_unpacklo_epi16(a, b); \
2551 b = _mm_unpackhi_epi16(tmp, b)
2553 #define dct_pass(bias,shift) \
2556 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2557 __m128i sum04 = _mm_add_epi16(row0, row4); \
2558 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2559 dct_widen(t0e, sum04); \
2560 dct_widen(t1e, dif04); \
2561 dct_wadd(x0, t0e, t3e); \
2562 dct_wsub(x3, t0e, t3e); \
2563 dct_wadd(x1, t1e, t2e); \
2564 dct_wsub(x2, t1e, t2e); \
2566 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2567 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2568 __m128i sum17 = _mm_add_epi16(row1, row7); \
2569 __m128i sum35 = _mm_add_epi16(row3, row5); \
2570 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2571 dct_wadd(x4, y0o, y4o); \
2572 dct_wadd(x5, y1o, y5o); \
2573 dct_wadd(x6, y2o, y5o); \
2574 dct_wadd(x7, y3o, y4o); \
2575 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2576 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2577 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2578 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2581 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2582 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2583 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2584 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2585 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2586 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2587 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2588 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
2591 __m128i bias_0 = _mm_set1_epi32(512);
2592 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2595 row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
2596 row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
2597 row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
2598 row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
2599 row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
2600 row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
2601 row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
2602 row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
2605 dct_pass(bias_0, 10);
2609 dct_interleave16(row0, row4);
2610 dct_interleave16(row1, row5);
2611 dct_interleave16(row2, row6);
2612 dct_interleave16(row3, row7);
2615 dct_interleave16(row0, row2);
2616 dct_interleave16(row1, row3);
2617 dct_interleave16(row4, row6);
2618 dct_interleave16(row5, row7);
2621 dct_interleave16(row0, row1);
2622 dct_interleave16(row2, row3);
2623 dct_interleave16(row4, row5);
2624 dct_interleave16(row6, row7);
2628 dct_pass(bias_1, 17);
2632 __m128i p0 = _mm_packus_epi16(row0, row1);
2633 __m128i p1 = _mm_packus_epi16(row2, row3);
2634 __m128i p2 = _mm_packus_epi16(row4, row5);
2635 __m128i p3 = _mm_packus_epi16(row6, row7);
2638 dct_interleave8(p0, p2);
2639 dct_interleave8(p1, p3);
2642 dct_interleave8(p0, p1);
2643 dct_interleave8(p2, p3);
2646 dct_interleave8(p0, p2);
2647 dct_interleave8(p1, p3);
2650 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2651 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2652 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2653 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2654 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2655 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2656 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2657 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2666 #undef dct_interleave8
2667 #undef dct_interleave16
2677 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2679 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2681 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2682 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2683 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2684 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2685 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2686 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2687 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2688 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2689 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2690 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2691 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2692 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2694 #define dct_long_mul(out, inq, coeff) \
2695 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2696 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2698 #define dct_long_mac(out, acc, inq, coeff) \
2699 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2700 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2702 #define dct_widen(out, inq) \
2703 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2704 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2707 #define dct_wadd(out, a, b) \
2708 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2709 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2712 #define dct_wsub(out, a, b) \
2713 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2714 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2717 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2719 dct_wadd(sum, a, b); \
2720 dct_wsub(dif, a, b); \
2721 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2722 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2725 #define dct_pass(shiftop, shift) \
2728 int16x8_t sum26 = vaddq_s16(row2, row6); \
2729 dct_long_mul(p1e, sum26, rot0_0); \
2730 dct_long_mac(t2e, p1e, row6, rot0_1); \
2731 dct_long_mac(t3e, p1e, row2, rot0_2); \
2732 int16x8_t sum04 = vaddq_s16(row0, row4); \
2733 int16x8_t dif04 = vsubq_s16(row0, row4); \
2734 dct_widen(t0e, sum04); \
2735 dct_widen(t1e, dif04); \
2736 dct_wadd(x0, t0e, t3e); \
2737 dct_wsub(x3, t0e, t3e); \
2738 dct_wadd(x1, t1e, t2e); \
2739 dct_wsub(x2, t1e, t2e); \
2741 int16x8_t sum15 = vaddq_s16(row1, row5); \
2742 int16x8_t sum17 = vaddq_s16(row1, row7); \
2743 int16x8_t sum35 = vaddq_s16(row3, row5); \
2744 int16x8_t sum37 = vaddq_s16(row3, row7); \
2745 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2746 dct_long_mul(p5o, sumodd, rot1_0); \
2747 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2748 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2749 dct_long_mul(p3o, sum37, rot2_0); \
2750 dct_long_mul(p4o, sum15, rot2_1); \
2751 dct_wadd(sump13o, p1o, p3o); \
2752 dct_wadd(sump24o, p2o, p4o); \
2753 dct_wadd(sump23o, p2o, p3o); \
2754 dct_wadd(sump14o, p1o, p4o); \
2755 dct_long_mac(x4, sump13o, row7, rot3_0); \
2756 dct_long_mac(x5, sump24o, row5, rot3_1); \
2757 dct_long_mac(x6, sump23o, row3, rot3_2); \
2758 dct_long_mac(x7, sump14o, row1, rot3_3); \
2759 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2760 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2761 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2762 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2766 row0 = vld1q_s16(data + 0*8);
2767 row1 = vld1q_s16(data + 1*8);
2768 row2 = vld1q_s16(data + 2*8);
2769 row3 = vld1q_s16(data + 3*8);
2770 row4 = vld1q_s16(data + 4*8);
2771 row5 = vld1q_s16(data + 5*8);
2772 row6 = vld1q_s16(data + 6*8);
2773 row7 = vld1q_s16(data + 7*8);
2776 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2779 dct_pass(vrshrn_n_s32, 10);
2785 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2786 #define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }
2787 #define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }
2790 dct_trn16(row0, row1);
2791 dct_trn16(row2, row3);
2792 dct_trn16(row4, row5);
2793 dct_trn16(row6, row7);
2796 dct_trn32(row0, row2);
2797 dct_trn32(row1, row3);
2798 dct_trn32(row4, row6);
2799 dct_trn32(row5, row7);
2802 dct_trn64(row0, row4);
2803 dct_trn64(row1, row5);
2804 dct_trn64(row2, row6);
2805 dct_trn64(row3, row7);
2816 dct_pass(vshrn_n_s32, 16);
2820 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2821 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2822 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2823 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2824 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2825 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2826 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2827 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2830 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2831 #define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }
2832 #define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }
2844 dct_trn8_16(p0, p2);
2845 dct_trn8_16(p1, p3);
2846 dct_trn8_16(p4, p6);
2847 dct_trn8_16(p5, p7);
2850 dct_trn8_32(p0, p4);
2851 dct_trn8_32(p1, p5);
2852 dct_trn8_32(p2, p6);
2853 dct_trn8_32(p3, p7);
2856 vst1_u8(out, p0); out += out_stride;
2857 vst1_u8(out, p1); out += out_stride;
2858 vst1_u8(out, p2); out += out_stride;
2859 vst1_u8(out, p3); out += out_stride;
2860 vst1_u8(out, p4); out += out_stride;
2861 vst1_u8(out, p5); out += out_stride;
2862 vst1_u8(out, p6); out += out_stride;
2881 #define STBI__MARKER_none 0xff
2885 static stbi_uc stbi__get_marker(stbi__jpeg *j)
2888 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2889 x = stbi__get8(j->s);
2890 if (x != 0xff)
return STBI__MARKER_none;
2892 x = stbi__get8(j->s);
2898 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2902 static void stbi__jpeg_reset(stbi__jpeg *j)
2907 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
2908 j->marker = STBI__MARKER_none;
2909 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2915 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2917 stbi__jpeg_reset(z);
2918 if (!z->progressive) {
2919 if (z->scan_n == 1) {
2921 STBI_SIMD_ALIGN(
short, data[64]);
2922 int n = z->order[0];
2927 int w = (z->img_comp[n].x+7) >> 3;
2928 int h = (z->img_comp[n].y+7) >> 3;
2929 for (j=0; j < h; ++j) {
2930 for (i=0; i < w; ++i) {
2931 int ha = z->img_comp[n].ha;
2932 if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
return 0;
2933 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2935 if (--z->todo <= 0) {
2936 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2939 if (!STBI__RESTART(z->marker))
return 1;
2940 stbi__jpeg_reset(z);
2947 STBI_SIMD_ALIGN(
short, data[64]);
2948 for (j=0; j < z->img_mcu_y; ++j) {
2949 for (i=0; i < z->img_mcu_x; ++i) {
2951 for (k=0; k < z->scan_n; ++k) {
2952 int n = z->order[k];
2955 for (y=0; y < z->img_comp[n].v; ++y) {
2956 for (x=0; x < z->img_comp[n].h; ++x) {
2957 int x2 = (i*z->img_comp[n].h + x)*8;
2958 int y2 = (j*z->img_comp[n].v + y)*8;
2959 int ha = z->img_comp[n].ha;
2960 if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
return 0;
2961 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2967 if (--z->todo <= 0) {
2968 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2969 if (!STBI__RESTART(z->marker))
return 1;
2970 stbi__jpeg_reset(z);
2977 if (z->scan_n == 1) {
2979 int n = z->order[0];
2984 int w = (z->img_comp[n].x+7) >> 3;
2985 int h = (z->img_comp[n].y+7) >> 3;
2986 for (j=0; j < h; ++j) {
2987 for (i=0; i < w; ++i) {
2988 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2989 if (z->spec_start == 0) {
2990 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2993 int ha = z->img_comp[n].ha;
2994 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2998 if (--z->todo <= 0) {
2999 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3000 if (!STBI__RESTART(z->marker))
return 1;
3001 stbi__jpeg_reset(z);
3008 for (j=0; j < z->img_mcu_y; ++j) {
3009 for (i=0; i < z->img_mcu_x; ++i) {
3011 for (k=0; k < z->scan_n; ++k) {
3012 int n = z->order[k];
3015 for (y=0; y < z->img_comp[n].v; ++y) {
3016 for (x=0; x < z->img_comp[n].h; ++x) {
3017 int x2 = (i*z->img_comp[n].h + x);
3018 int y2 = (j*z->img_comp[n].v + y);
3019 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
3020 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
3027 if (--z->todo <= 0) {
3028 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3029 if (!STBI__RESTART(z->marker))
return 1;
3030 stbi__jpeg_reset(z);
3039 static void stbi__jpeg_dequantize(
short *data, stbi__uint16 *dequant)
3042 for (i=0; i < 64; ++i)
3043 data[i] *= dequant[i];
3046 static void stbi__jpeg_finish(stbi__jpeg *z)
3048 if (z->progressive) {
3051 for (n=0; n < z->s->img_n; ++n) {
3052 int w = (z->img_comp[n].x+7) >> 3;
3053 int h = (z->img_comp[n].y+7) >> 3;
3054 for (j=0; j < h; ++j) {
3055 for (i=0; i < w; ++i) {
3056 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
3057 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
3058 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
3065 static int stbi__process_marker(stbi__jpeg *z,
int m)
3069 case STBI__MARKER_none:
3070 return stbi__err(
"expected marker",
"Corrupt JPEG");
3073 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
3074 z->restart_interval = stbi__get16be(z->s);
3078 L = stbi__get16be(z->s)-2;
3080 int q = stbi__get8(z->s);
3081 int p = q >> 4, sixteen = (p != 0);
3083 if (p != 0 && p != 1)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
3084 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
3086 for (i=0; i < 64; ++i)
3087 z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
3088 L -= (sixteen ? 129 : 65);
3093 L = stbi__get16be(z->s)-2;
3096 int sizes[16],i,n=0;
3097 int q = stbi__get8(z->s);
3100 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
3101 for (i=0; i < 16; ++i) {
3102 sizes[i] = stbi__get8(z->s);
3107 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
3108 v = z->huff_dc[th].values;
3110 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
3111 v = z->huff_ac[th].values;
3113 for (i=0; i < n; ++i)
3114 v[i] = stbi__get8(z->s);
3116 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
3123 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
3124 L = stbi__get16be(z->s);
3127 return stbi__err(
"bad COM len",
"Corrupt JPEG");
3129 return stbi__err(
"bad APP len",
"Corrupt JPEG");
3133 if (m == 0xE0 &&
L >= 5) {
3134 static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0'};
3137 for (i=0; i < 5; ++i)
3138 if (stbi__get8(z->s) != tag[i])
3143 }
else if (m == 0xEE &&
L >= 12) {
3144 static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0'};
3147 for (i=0; i < 6; ++i)
3148 if (stbi__get8(z->s) != tag[i])
3153 stbi__get16be(z->s);
3154 stbi__get16be(z->s);
3155 z->app14_color_transform = stbi__get8(z->s);
3160 stbi__skip(z->s,
L);
3164 return stbi__err(
"unknown marker",
"Corrupt JPEG");
3168 static int stbi__process_scan_header(stbi__jpeg *z)
3171 int Ls = stbi__get16be(z->s);
3172 z->scan_n = stbi__get8(z->s);
3173 if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (
int) z->s->img_n)
return stbi__err(
"bad SOS component count",
"Corrupt JPEG");
3174 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
3175 for (i=0; i < z->scan_n; ++i) {
3176 int id = stbi__get8(z->s), which;
3177 int q = stbi__get8(z->s);
3178 for (which = 0; which < z->s->img_n; ++which)
3179 if (z->img_comp[which].id ==
id)
3181 if (which == z->s->img_n)
return 0;
3182 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
3183 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
3184 z->order[i] = which;
3189 z->spec_start = stbi__get8(z->s);
3190 z->spec_end = stbi__get8(z->s);
3191 aa = stbi__get8(z->s);
3192 z->succ_high = (aa >> 4);
3193 z->succ_low = (aa & 15);
3194 if (z->progressive) {
3195 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
3196 return stbi__err(
"bad SOS",
"Corrupt JPEG");
3198 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3199 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3207 static int stbi__free_jpeg_components(stbi__jpeg *z,
int ncomp,
int why)
3210 for (i=0; i < ncomp; ++i) {
3211 if (z->img_comp[i].raw_data) {
3212 STBI_FREE(z->img_comp[i].raw_data);
3213 z->img_comp[i].raw_data = NULL;
3214 z->img_comp[i].data = NULL;
3216 if (z->img_comp[i].raw_coeff) {
3217 STBI_FREE(z->img_comp[i].raw_coeff);
3218 z->img_comp[i].raw_coeff = 0;
3219 z->img_comp[i].coeff = 0;
3221 if (z->img_comp[i].linebuf) {
3222 STBI_FREE(z->img_comp[i].linebuf);
3223 z->img_comp[i].linebuf = NULL;
3229 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
3231 stbi__context *s = z->s;
3232 int Lf,p,i,q, h_max=1,v_max=1,c;
3233 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3234 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
3235 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
3236 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
3237 if (s->img_y > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
3238 if (s->img_x > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
3240 if (c != 3 && c != 1 && c != 4)
return stbi__err(
"bad component count",
"Corrupt JPEG");
3242 for (i=0; i < c; ++i) {
3243 z->img_comp[i].data = NULL;
3244 z->img_comp[i].linebuf = NULL;
3247 if (Lf != 8+3*s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3250 for (i=0; i < s->img_n; ++i) {
3251 static const unsigned char rgb[3] = {
'R',
'G',
'B' };
3252 z->img_comp[i].id = stbi__get8(s);
3253 if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3256 z->img_comp[i].h = (q >> 4);
if (!z->img_comp[i].h || z->img_comp[i].h > 4)
return stbi__err(
"bad H",
"Corrupt JPEG");
3257 z->img_comp[i].v = q & 15;
if (!z->img_comp[i].v || z->img_comp[i].v > 4)
return stbi__err(
"bad V",
"Corrupt JPEG");
3258 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
3261 if (scan != STBI__SCAN_load)
return 1;
3263 if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0))
return stbi__err(
"too large",
"Image too large to decode");
3265 for (i=0; i < s->img_n; ++i) {
3266 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
3267 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
3272 for (i=0; i < s->img_n; ++i) {
3273 if (h_max % z->img_comp[i].h != 0)
return stbi__err(
"bad H",
"Corrupt JPEG");
3274 if (v_max % z->img_comp[i].v != 0)
return stbi__err(
"bad V",
"Corrupt JPEG");
3278 z->img_h_max = h_max;
3279 z->img_v_max = v_max;
3280 z->img_mcu_w = h_max * 8;
3281 z->img_mcu_h = v_max * 8;
3283 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
3284 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
3286 for (i=0; i < s->img_n; ++i) {
3288 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
3289 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
3297 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3298 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3299 z->img_comp[i].coeff = 0;
3300 z->img_comp[i].raw_coeff = 0;
3301 z->img_comp[i].linebuf = NULL;
3302 z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3303 if (z->img_comp[i].raw_data == NULL)
3304 return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem",
"Out of memory"));
3306 z->img_comp[i].data = (
stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
3307 if (z->progressive) {
3309 z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3310 z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3311 z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2,
sizeof(
short), 15);
3312 if (z->img_comp[i].raw_coeff == NULL)
3313 return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem",
"Out of memory"));
3314 z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
3322 #define stbi__DNL(x) ((x) == 0xdc)
3323 #define stbi__SOI(x) ((x) == 0xd8)
3324 #define stbi__EOI(x) ((x) == 0xd9)
3325 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3326 #define stbi__SOS(x) ((x) == 0xda)
3328 #define stbi__SOF_progressive(x) ((x) == 0xc2)
3330 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
3334 z->app14_color_transform = -1;
3335 z->marker = STBI__MARKER_none;
3336 m = stbi__get_marker(z);
3337 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
3338 if (scan == STBI__SCAN_type)
return 1;
3339 m = stbi__get_marker(z);
3340 while (!stbi__SOF(m)) {
3341 if (!stbi__process_marker(z,m))
return 0;
3342 m = stbi__get_marker(z);
3343 while (m == STBI__MARKER_none) {
3345 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
3346 m = stbi__get_marker(z);
3349 z->progressive = stbi__SOF_progressive(m);
3350 if (!stbi__process_frame_header(z, scan))
return 0;
3355 static int stbi__decode_jpeg_image(stbi__jpeg *j)
3358 for (m = 0; m < 4; m++) {
3359 j->img_comp[m].raw_data = NULL;
3360 j->img_comp[m].raw_coeff = NULL;
3362 j->restart_interval = 0;
3363 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
3364 m = stbi__get_marker(j);
3365 while (!stbi__EOI(m)) {
3367 if (!stbi__process_scan_header(j))
return 0;
3368 if (!stbi__parse_entropy_coded_data(j))
return 0;
3369 if (j->marker == STBI__MARKER_none ) {
3371 while (!stbi__at_eof(j->s)) {
3372 int x = stbi__get8(j->s);
3374 j->marker = stbi__get8(j->s);
3380 }
else if (stbi__DNL(m)) {
3381 int Ld = stbi__get16be(j->s);
3382 stbi__uint32 NL = stbi__get16be(j->s);
3383 if (Ld != 4)
return stbi__err(
"bad DNL len",
"Corrupt JPEG");
3384 if (NL != j->s->img_y)
return stbi__err(
"bad DNL height",
"Corrupt JPEG");
3386 if (!stbi__process_marker(j, m))
return 0;
3388 m = stbi__get_marker(j);
3391 stbi__jpeg_finish(j);
3400 #define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3405 STBI_NOTUSED(in_far);
3416 for (i=0; i < w; ++i)
3417 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
3429 out[0] = out[1] = input[0];
3434 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
3435 for (i=1; i < w-1; ++i) {
3436 int n = 3*input[i]+2;
3437 out[i*2+0] = stbi__div4(n+input[i-1]);
3438 out[i*2+1] = stbi__div4(n+input[i+1]);
3440 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
3441 out[i*2+1] = input[w-1];
3443 STBI_NOTUSED(in_far);
3449 #define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3456 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3460 t1 = 3*in_near[0] + in_far[0];
3461 out[0] = stbi__div4(t1+2);
3462 for (i=1; i < w; ++i) {
3464 t1 = 3*in_near[i]+in_far[i];
3465 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3466 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3468 out[w*2-1] = stbi__div4(t1+2);
3475 #if defined(STBI_SSE2) || defined(STBI_NEON)
3482 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3486 t1 = 3*in_near[0] + in_far[0];
3490 for (; i < ((w-1) & ~7); i += 8) {
3491 #if defined(STBI_SSE2)
3494 __m128i zero = _mm_setzero_si128();
3495 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
3496 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
3497 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3498 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3499 __m128i diff = _mm_sub_epi16(farw, nearw);
3500 __m128i nears = _mm_slli_epi16(nearw, 2);
3501 __m128i curr = _mm_add_epi16(nears, diff);
3508 __m128i prv0 = _mm_slli_si128(curr, 2);
3509 __m128i nxt0 = _mm_srli_si128(curr, 2);
3510 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3511 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
3517 __m128i bias = _mm_set1_epi16(8);
3518 __m128i curs = _mm_slli_epi16(curr, 2);
3519 __m128i prvd = _mm_sub_epi16(prev, curr);
3520 __m128i nxtd = _mm_sub_epi16(next, curr);
3521 __m128i curb = _mm_add_epi16(curs, bias);
3522 __m128i even = _mm_add_epi16(prvd, curb);
3523 __m128i odd = _mm_add_epi16(nxtd, curb);
3526 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3527 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3528 __m128i de0 = _mm_srli_epi16(int0, 4);
3529 __m128i de1 = _mm_srli_epi16(int1, 4);
3532 __m128i outv = _mm_packus_epi16(de0, de1);
3533 _mm_storeu_si128((__m128i *) (out + i*2), outv);
3534 #elif defined(STBI_NEON)
3537 uint8x8_t farb = vld1_u8(in_far + i);
3538 uint8x8_t nearb = vld1_u8(in_near + i);
3539 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3540 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3541 int16x8_t curr = vaddq_s16(nears, diff);
3548 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3549 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3550 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3551 int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3557 int16x8_t curs = vshlq_n_s16(curr, 2);
3558 int16x8_t prvd = vsubq_s16(prev, curr);
3559 int16x8_t nxtd = vsubq_s16(next, curr);
3560 int16x8_t even = vaddq_s16(curs, prvd);
3561 int16x8_t odd = vaddq_s16(curs, nxtd);
3565 o.val[0] = vqrshrun_n_s16(even, 4);
3566 o.val[1] = vqrshrun_n_s16(odd, 4);
3567 vst2_u8(out + i*2, o);
3571 t1 = 3*in_near[i+7] + in_far[i+7];
3575 t1 = 3*in_near[i] + in_far[i];
3576 out[i*2] = stbi__div16(3*t1 + t0 + 8);
3578 for (++i; i < w; ++i) {
3580 t1 = 3*in_near[i]+in_far[i];
3581 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3582 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3584 out[w*2-1] = stbi__div4(t1+2);
3596 STBI_NOTUSED(in_far);
3597 for (i=0; i < w; ++i)
3598 for (j=0; j < hs; ++j)
3599 out[i*hs+j] = in_near[i];
3605 #define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3609 for (i=0; i < count; ++i) {
3610 int y_fixed = (y[i] << 20) + (1<<19);
3612 int cr = pcr[i] - 128;
3613 int cb = pcb[i] - 128;
3614 r = y_fixed + cr* stbi__float2fixed(1.40200f);
3615 g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3616 b = y_fixed + cb* stbi__float2fixed(1.77200f);
3620 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3621 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3622 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3631 #if defined(STBI_SSE2) || defined(STBI_NEON)
3642 __m128i signflip = _mm_set1_epi8(-0x80);
3643 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200f*4096.0f+0.5f));
3644 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
3645 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
3646 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200f*4096.0f+0.5f));
3647 __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
3648 __m128i xw = _mm_set1_epi16(255);
3650 for (; i+7 < count; i += 8) {
3652 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3653 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3654 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3655 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3656 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3659 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3660 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3661 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3664 __m128i yws = _mm_srli_epi16(yw, 4);
3665 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3666 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3667 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3668 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3669 __m128i rws = _mm_add_epi16(cr0, yws);
3670 __m128i gwt = _mm_add_epi16(cb0, yws);
3671 __m128i bws = _mm_add_epi16(yws, cb1);
3672 __m128i gws = _mm_add_epi16(gwt, cr1);
3675 __m128i rw = _mm_srai_epi16(rws, 4);
3676 __m128i bw = _mm_srai_epi16(bws, 4);
3677 __m128i gw = _mm_srai_epi16(gws, 4);
3680 __m128i brb = _mm_packus_epi16(rw, bw);
3681 __m128i gxb = _mm_packus_epi16(gw, xw);
3684 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3685 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3686 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3687 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3690 _mm_storeu_si128((__m128i *) (out + 0), o0);
3691 _mm_storeu_si128((__m128i *) (out + 16), o1);
3701 uint8x8_t signflip = vdup_n_u8(0x80);
3702 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200f*4096.0f+0.5f));
3703 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
3704 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
3705 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200f*4096.0f+0.5f));
3707 for (; i+7 < count; i += 8) {
3709 uint8x8_t y_bytes = vld1_u8(y + i);
3710 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3711 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3712 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3713 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3716 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3717 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3718 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3721 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3722 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3723 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3724 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3725 int16x8_t rws = vaddq_s16(yws, cr0);
3726 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3727 int16x8_t bws = vaddq_s16(yws, cb1);
3731 o.val[0] = vqrshrun_n_s16(rws, 4);
3732 o.val[1] = vqrshrun_n_s16(gws, 4);
3733 o.val[2] = vqrshrun_n_s16(bws, 4);
3734 o.val[3] = vdup_n_u8(255);
3743 for (; i < count; ++i) {
3744 int y_fixed = (y[i] << 20) + (1<<19);
3746 int cr = pcr[i] - 128;
3747 int cb = pcb[i] - 128;
3748 r = y_fixed + cr* stbi__float2fixed(1.40200f);
3749 g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3750 b = y_fixed + cb* stbi__float2fixed(1.77200f);
3754 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3755 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3756 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3767 static void stbi__setup_jpeg(stbi__jpeg *j)
3769 j->idct_block_kernel = stbi__idct_block;
3770 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3771 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3774 if (stbi__sse2_available()) {
3775 j->idct_block_kernel = stbi__idct_simd;
3776 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3777 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3782 j->idct_block_kernel = stbi__idct_simd;
3783 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3784 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3789 static void stbi__cleanup_jpeg(stbi__jpeg *j)
3791 stbi__free_jpeg_components(j, j->s->img_n, 0);
3796 resample_row_func resample;
3807 unsigned int t = x*y + 128;
3808 return (
stbi_uc) ((t + (t >>8)) >> 8);
3811 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3813 int n, decode_n, is_rgb;
3817 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3820 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3823 n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3825 is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3827 if (z->s->img_n == 3 && n < 3 && !is_rgb)
3830 decode_n = z->s->img_n;
3834 if (decode_n <= 0) { stbi__cleanup_jpeg(z);
return NULL; }
3841 stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
3843 stbi__resample res_comp[4];
3845 for (k=0; k < decode_n; ++k) {
3846 stbi__resample *r = &res_comp[k];
3850 z->img_comp[k].linebuf = (
stbi_uc *) stbi__malloc(z->s->img_x + 3);
3851 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3853 r->hs = z->img_h_max / z->img_comp[k].h;
3854 r->vs = z->img_v_max / z->img_comp[k].v;
3855 r->ystep = r->vs >> 1;
3856 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3858 r->line0 = r->line1 = z->img_comp[k].data;
3860 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3861 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3862 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3863 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3864 else r->resample = stbi__resample_row_generic;
3868 output = (
stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3869 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3872 for (j=0; j < z->s->img_y; ++j) {
3873 stbi_uc *out = output + n * z->s->img_x * j;
3874 for (k=0; k < decode_n; ++k) {
3875 stbi__resample *r = &res_comp[k];
3876 int y_bot = r->ystep >= (r->vs >> 1);
3877 coutput[k] = r->resample(z->img_comp[k].linebuf,
3878 y_bot ? r->line1 : r->line0,
3879 y_bot ? r->line0 : r->line1,
3881 if (++r->ystep >= r->vs) {
3883 r->line0 = r->line1;
3884 if (++r->ypos < z->img_comp[k].y)
3885 r->line1 += z->img_comp[k].w2;
3890 if (z->s->img_n == 3) {
3892 for (i=0; i < z->s->img_x; ++i) {
3894 out[1] = coutput[1][i];
3895 out[2] = coutput[2][i];
3900 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3902 }
else if (z->s->img_n == 4) {
3903 if (z->app14_color_transform == 0) {
3904 for (i=0; i < z->s->img_x; ++i) {
3906 out[0] = stbi__blinn_8x8(coutput[0][i], m);
3907 out[1] = stbi__blinn_8x8(coutput[1][i], m);
3908 out[2] = stbi__blinn_8x8(coutput[2][i], m);
3912 }
else if (z->app14_color_transform == 2) {
3913 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3914 for (i=0; i < z->s->img_x; ++i) {
3916 out[0] = stbi__blinn_8x8(255 - out[0], m);
3917 out[1] = stbi__blinn_8x8(255 - out[1], m);
3918 out[2] = stbi__blinn_8x8(255 - out[2], m);
3922 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3925 for (i=0; i < z->s->img_x; ++i) {
3926 out[0] = out[1] = out[2] = y[i];
3933 for (i=0; i < z->s->img_x; ++i)
3934 *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3936 for (i=0; i < z->s->img_x; ++i, out += 2) {
3937 out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3941 }
else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
3942 for (i=0; i < z->s->img_x; ++i) {
3944 stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
3945 stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
3946 stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
3947 out[0] = stbi__compute_y(r, g, b);
3951 }
else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
3952 for (i=0; i < z->s->img_x; ++i) {
3953 out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
3960 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3962 for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
3966 stbi__cleanup_jpeg(z);
3967 *out_x = z->s->img_x;
3968 *out_y = z->s->img_y;
3969 if (comp) *comp = z->s->img_n >= 3 ? 3 : 1;
3974 static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
3976 unsigned char* result;
3977 stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(
sizeof(stbi__jpeg));
3978 if (!j)
return stbi__errpuc(
"outofmem",
"Out of memory");
3981 stbi__setup_jpeg(j);
3982 result = load_jpeg_image(j, x,y,comp,req_comp);
3987 static int stbi__jpeg_test(stbi__context *s)
3990 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
3991 if (!j)
return stbi__err(
"outofmem",
"Out of memory");
3993 stbi__setup_jpeg(j);
3994 r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
4000 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
4002 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
4003 stbi__rewind( j->s );
4006 if (x) *x = j->s->img_x;
4007 if (y) *y = j->s->img_y;
4008 if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
4012 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
4015 stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(
sizeof(stbi__jpeg)));
4016 if (!j)
return stbi__err(
"outofmem",
"Out of memory");
4018 result = stbi__jpeg_info_raw(j, x, y, comp);
4031 #ifndef STBI_NO_ZLIB
4034 #define STBI__ZFAST_BITS 9
4035 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
4036 #define STBI__ZNSYMS 288
4042 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
4043 stbi__uint16 firstcode[16];
4045 stbi__uint16 firstsymbol[16];
4047 stbi__uint16 value[STBI__ZNSYMS];
4050 stbi_inline
static int stbi__bitreverse16(
int n)
4052 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
4053 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
4054 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
4055 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
4059 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
4061 STBI_ASSERT(bits <= 16);
4064 return stbi__bitreverse16(v) >> (16-bits);
4067 static int stbi__zbuild_huffman(stbi__zhuffman *z,
const stbi_uc *sizelist,
int num)
4070 int code, next_code[16], sizes[17];
4073 memset(sizes, 0,
sizeof(sizes));
4074 memset(z->fast, 0,
sizeof(z->fast));
4075 for (i=0; i < num; ++i)
4076 ++sizes[sizelist[i]];
4078 for (i=1; i < 16; ++i)
4079 if (sizes[i] > (1 << i))
4080 return stbi__err(
"bad sizes",
"Corrupt PNG");
4082 for (i=1; i < 16; ++i) {
4083 next_code[i] = code;
4084 z->firstcode[i] = (stbi__uint16) code;
4085 z->firstsymbol[i] = (stbi__uint16) k;
4086 code = (code + sizes[i]);
4088 if (code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4089 z->maxcode[i] = code << (16-i);
4093 z->maxcode[16] = 0x10000;
4094 for (i=0; i < num; ++i) {
4095 int s = sizelist[i];
4097 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
4098 stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
4100 z->value[c] = (stbi__uint16) i;
4101 if (s <= STBI__ZFAST_BITS) {
4102 int j = stbi__bit_reverse(next_code[s],s);
4103 while (j < (1 << STBI__ZFAST_BITS)) {
4122 stbi_uc *zbuffer, *zbuffer_end;
4124 stbi__uint32 code_buffer;
4131 stbi__zhuffman z_length, z_distance;
4134 stbi_inline
static int stbi__zeof(stbi__zbuf *z)
4136 return (z->zbuffer >= z->zbuffer_end);
4139 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
4141 return stbi__zeof(z) ? 0 : *z->zbuffer++;
4144 static void stbi__fill_bits(stbi__zbuf *z)
4147 if (z->code_buffer >= (1U << z->num_bits)) {
4148 z->zbuffer = z->zbuffer_end;
4151 z->code_buffer |= (
unsigned int) stbi__zget8(z) << z->num_bits;
4153 }
while (z->num_bits <= 24);
4156 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
4159 if (z->num_bits < n) stbi__fill_bits(z);
4160 k = z->code_buffer & ((1 << n) - 1);
4161 z->code_buffer >>= n;
4166 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
4171 k = stbi__bit_reverse(a->code_buffer, 16);
4172 for (s=STBI__ZFAST_BITS+1; ; ++s)
4173 if (k < z->maxcode[s])
4175 if (s >= 16)
return -1;
4177 b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
4178 if (b >= STBI__ZNSYMS)
return -1;
4179 if (z->size[b] != s)
return -1;
4180 a->code_buffer >>= s;
4185 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
4188 if (a->num_bits < 16) {
4189 if (stbi__zeof(a)) {
4194 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
4197 a->code_buffer >>= s;
4201 return stbi__zhuffman_decode_slowpath(a, z);
4204 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
4207 unsigned int cur, limit, old_limit;
4209 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
4210 cur = (
unsigned int) (z->zout - z->zout_start);
4211 limit = old_limit = (unsigned) (z->zout_end - z->zout_start);
4212 if (UINT_MAX - cur < (
unsigned) n)
return stbi__err(
"outofmem",
"Out of memory");
4213 while (cur + n > limit) {
4214 if(limit > UINT_MAX / 2)
return stbi__err(
"outofmem",
"Out of memory");
4217 q = (
char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
4218 STBI_NOTUSED(old_limit);
4219 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4222 z->zout_end = q + limit;
4226 static const int stbi__zlength_base[31] = {
4227 3,4,5,6,7,8,9,10,11,13,
4228 15,17,19,23,27,31,35,43,51,59,
4229 67,83,99,115,131,163,195,227,258,0,0 };
4231 static const int stbi__zlength_extra[31]=
4232 { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
4234 static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
4235 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
4237 static const int stbi__zdist_extra[32] =
4238 { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
4240 static int stbi__parse_huffman_block(stbi__zbuf *a)
4242 char *zout = a->zout;
4244 int z = stbi__zhuffman_decode(a, &a->z_length);
4246 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4247 if (zout >= a->zout_end) {
4248 if (!stbi__zexpand(a, zout, 1))
return 0;
4260 len = stbi__zlength_base[z];
4261 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
4262 z = stbi__zhuffman_decode(a, &a->z_distance);
4263 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4264 dist = stbi__zdist_base[z];
4265 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
4266 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
4267 if (zout + len > a->zout_end) {
4268 if (!stbi__zexpand(a, zout, len))
return 0;
4271 p = (
stbi_uc *) (zout - dist);
4274 if (len) {
do *zout++ = v;
while (--len); }
4276 if (len) {
do *zout++ = *p++;
while (--len); }
4282 static int stbi__compute_huffman_codes(stbi__zbuf *a)
4284 static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
4285 stbi__zhuffman z_codelength;
4290 int hlit = stbi__zreceive(a,5) + 257;
4291 int hdist = stbi__zreceive(a,5) + 1;
4292 int hclen = stbi__zreceive(a,4) + 4;
4293 int ntot = hlit + hdist;
4295 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4296 for (i=0; i < hclen; ++i) {
4297 int s = stbi__zreceive(a,3);
4298 codelength_sizes[length_dezigzag[i]] = (
stbi_uc) s;
4300 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
4304 int c = stbi__zhuffman_decode(a, &z_codelength);
4305 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4311 c = stbi__zreceive(a,2)+3;
4312 if (n == 0)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4313 fill = lencodes[n-1];
4314 }
else if (c == 17) {
4315 c = stbi__zreceive(a,3)+3;
4316 }
else if (c == 18) {
4317 c = stbi__zreceive(a,7)+11;
4319 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4321 if (ntot - n < c)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4322 memset(lencodes+n, fill, c);
4326 if (n != ntot)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4327 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
4328 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
4332 static int stbi__parse_uncompressed_block(stbi__zbuf *a)
4336 if (a->num_bits & 7)
4337 stbi__zreceive(a, a->num_bits & 7);
4340 while (a->num_bits > 0) {
4341 header[k++] = (
stbi_uc) (a->code_buffer & 255);
4342 a->code_buffer >>= 8;
4345 if (a->num_bits < 0)
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4348 header[k++] = stbi__zget8(a);
4349 len = header[1] * 256 + header[0];
4350 nlen = header[3] * 256 + header[2];
4351 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4352 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
4353 if (a->zout + len > a->zout_end)
4354 if (!stbi__zexpand(a, a->zout, len))
return 0;
4355 memcpy(a->zout, a->zbuffer, len);
4361 static int stbi__parse_zlib_header(stbi__zbuf *a)
4363 int cmf = stbi__zget8(a);
4366 int flg = stbi__zget8(a);
4367 if (stbi__zeof(a))
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4368 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4369 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
4370 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
4375 static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] =
4377 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4378 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4379 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4380 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4381 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4382 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4383 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4384 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4385 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8
4387 static const stbi_uc stbi__zdefault_distance[32] =
4389 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
4404 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
4408 if (!stbi__parse_zlib_header(a))
return 0;
4412 final = stbi__zreceive(a,1);
4413 type = stbi__zreceive(a,2);
4415 if (!stbi__parse_uncompressed_block(a))
return 0;
4416 }
else if (type == 3) {
4421 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS))
return 0;
4422 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
4424 if (!stbi__compute_huffman_codes(a))
return 0;
4426 if (!stbi__parse_huffman_block(a))
return 0;
4432 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
4434 a->zout_start = obuf;
4436 a->zout_end = obuf + olen;
4437 a->z_expandable = exp;
4439 return stbi__parse_zlib(a, parse_header);
4445 char *p = (
char *) stbi__malloc(initial_size);
4446 if (p == NULL)
return NULL;
4447 a.zbuffer = (
stbi_uc *) buffer;
4448 a.zbuffer_end = (
stbi_uc *) buffer + len;
4449 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4450 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4451 return a.zout_start;
4453 STBI_FREE(a.zout_start);
4466 char *p = (
char *) stbi__malloc(initial_size);
4467 if (p == NULL)
return NULL;
4468 a.zbuffer = (
stbi_uc *) buffer;
4469 a.zbuffer_end = (
stbi_uc *) buffer + len;
4470 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4471 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4472 return a.zout_start;
4474 STBI_FREE(a.zout_start);
4482 a.zbuffer = (
stbi_uc *) ibuffer;
4483 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
4484 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4485 return (
int) (a.zout - a.zout_start);
4493 char *p = (
char *) stbi__malloc(16384);
4494 if (p == NULL)
return NULL;
4495 a.zbuffer = (
stbi_uc *) buffer;
4496 a.zbuffer_end = (
stbi_uc *) buffer+len;
4497 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4498 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4499 return a.zout_start;
4501 STBI_FREE(a.zout_start);
4509 a.zbuffer = (
stbi_uc *) ibuffer;
4510 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
4511 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4512 return (
int) (a.zout - a.zout_start);
4531 stbi__uint32 length;
4535 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
4538 c.length = stbi__get32be(s);
4539 c.type = stbi__get32be(s);
4543 static int stbi__check_png_header(stbi__context *s)
4545 static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4547 for (i=0; i < 8; ++i)
4548 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
4555 stbi_uc *idata, *expanded, *out;
4571 static stbi_uc first_row_filter[5] =
4580 static int stbi__paeth(
int a,
int b,
int c)
4586 if (pa <= pb && pa <= pc)
return a;
4587 if (pb <= pc)
return b;
4591 static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4594 static int stbi__create_png_image_raw(stbi__png *a,
stbi_uc *raw, stbi__uint32 raw_len,
int out_n, stbi__uint32 x, stbi__uint32 y,
int depth,
int color)
4596 int bytes = (depth == 16? 2 : 1);
4597 stbi__context *s = a->s;
4598 stbi__uint32 i,j,stride = x*out_n*bytes;
4599 stbi__uint32 img_len, img_width_bytes;
4601 int img_n = s->img_n;
4603 int output_bytes = out_n*bytes;
4604 int filter_bytes = img_n*bytes;
4607 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
4608 a->out = (
stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0);
4609 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
4611 if (!stbi__mad3sizes_valid(img_n, x, depth, 7))
return stbi__err(
"too large",
"Corrupt PNG");
4612 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4613 img_len = (img_width_bytes + 1) * y;
4618 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4620 for (j=0; j < y; ++j) {
4621 stbi_uc *cur = a->out + stride*j;
4623 int filter = *raw++;
4626 return stbi__err(
"invalid filter",
"Corrupt PNG");
4629 if (img_width_bytes > x)
return stbi__err(
"invalid width",
"Corrupt PNG");
4630 cur += x*out_n - img_width_bytes;
4632 width = img_width_bytes;
4634 prior = cur - stride;
4637 if (j == 0) filter = first_row_filter[filter];
4640 for (k=0; k < filter_bytes; ++k) {
4642 case STBI__F_none : cur[k] = raw[k];
break;
4643 case STBI__F_sub : cur[k] = raw[k];
break;
4644 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4645 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
4646 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
4647 case STBI__F_avg_first : cur[k] = raw[k];
break;
4648 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4658 }
else if (depth == 16) {
4659 if (img_n != out_n) {
4660 cur[filter_bytes] = 255;
4661 cur[filter_bytes+1] = 255;
4663 raw += filter_bytes;
4664 cur += output_bytes;
4665 prior += output_bytes;
4673 if (depth < 8 || img_n == out_n) {
4674 int nk = (width - 1)*filter_bytes;
4675 #define STBI__CASE(f) \
4677 for (k=0; k < nk; ++k)
4680 case STBI__F_none: memcpy(cur, raw, nk);
break;
4681 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); }
break;
4682 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4683 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); }
break;
4684 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); }
break;
4685 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); }
break;
4686 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); }
break;
4691 STBI_ASSERT(img_n+1 == out_n);
4692 #define STBI__CASE(f) \
4694 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4695 for (k=0; k < filter_bytes; ++k)
4697 STBI__CASE(STBI__F_none) { cur[k] = raw[k]; }
break;
4698 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); }
break;
4699 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4700 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); }
break;
4701 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); }
break;
4702 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); }
break;
4703 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); }
break;
4710 cur = a->out + stride*j;
4711 for (i=0; i < x; ++i,cur+=output_bytes) {
4712 cur[filter_bytes+1] = 255;
4722 for (j=0; j < y; ++j) {
4723 stbi_uc *cur = a->out + stride*j;
4724 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
4727 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4736 for (k=x*img_n; k >= 2; k-=2, ++in) {
4737 *cur++ = scale * ((*in >> 4) );
4738 *cur++ = scale * ((*in ) & 0x0f);
4740 if (k > 0) *cur++ = scale * ((*in >> 4) );
4741 }
else if (depth == 2) {
4742 for (k=x*img_n; k >= 4; k-=4, ++in) {
4743 *cur++ = scale * ((*in >> 6) );
4744 *cur++ = scale * ((*in >> 4) & 0x03);
4745 *cur++ = scale * ((*in >> 2) & 0x03);
4746 *cur++ = scale * ((*in ) & 0x03);
4748 if (k > 0) *cur++ = scale * ((*in >> 6) );
4749 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4750 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4751 }
else if (depth == 1) {
4752 for (k=x*img_n; k >= 8; k-=8, ++in) {
4753 *cur++ = scale * ((*in >> 7) );
4754 *cur++ = scale * ((*in >> 6) & 0x01);
4755 *cur++ = scale * ((*in >> 5) & 0x01);
4756 *cur++ = scale * ((*in >> 4) & 0x01);
4757 *cur++ = scale * ((*in >> 3) & 0x01);
4758 *cur++ = scale * ((*in >> 2) & 0x01);
4759 *cur++ = scale * ((*in >> 1) & 0x01);
4760 *cur++ = scale * ((*in ) & 0x01);
4762 if (k > 0) *cur++ = scale * ((*in >> 7) );
4763 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4764 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4765 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4766 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4767 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4768 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4770 if (img_n != out_n) {
4773 cur = a->out + stride*j;
4775 for (q=x-1; q >= 0; --q) {
4777 cur[q*2+0] = cur[q];
4780 STBI_ASSERT(img_n == 3);
4781 for (q=x-1; q >= 0; --q) {
4783 cur[q*4+2] = cur[q*3+2];
4784 cur[q*4+1] = cur[q*3+1];
4785 cur[q*4+0] = cur[q*3+0];
4790 }
else if (depth == 16) {
4796 stbi__uint16 *cur16 = (stbi__uint16*)cur;
4798 for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
4799 *cur16 = (cur[0] << 8) | cur[1];
4806 static int stbi__create_png_image(stbi__png *a,
stbi_uc *image_data, stbi__uint32 image_data_len,
int out_n,
int depth,
int color,
int interlaced)
4808 int bytes = (depth == 16 ? 2 : 1);
4809 int out_bytes = out_n * bytes;
4813 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4816 final = (
stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4817 if (!
final)
return stbi__err(
"outofmem",
"Out of memory");
4818 for (p=0; p < 7; ++p) {
4819 int xorig[] = { 0,4,0,2,0,1,0 };
4820 int yorig[] = { 0,0,4,0,2,0,1 };
4821 int xspc[] = { 8,8,4,4,2,2,1 };
4822 int yspc[] = { 8,8,8,4,4,2,2 };
4825 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4826 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4828 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4829 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4833 for (j=0; j < y; ++j) {
4834 for (i=0; i < x; ++i) {
4835 int out_y = j*yspc[p]+yorig[p];
4836 int out_x = i*xspc[p]+xorig[p];
4837 memcpy(
final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
4838 a->out + (j*x+i)*out_bytes, out_bytes);
4842 image_data += img_len;
4843 image_data_len -= img_len;
4851 static int stbi__compute_transparency(stbi__png *z,
stbi_uc tc[3],
int out_n)
4853 stbi__context *s = z->s;
4854 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4859 STBI_ASSERT(out_n == 2 || out_n == 4);
4862 for (i=0; i < pixel_count; ++i) {
4863 p[1] = (p[0] == tc[0] ? 0 : 255);
4867 for (i=0; i < pixel_count; ++i) {
4868 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4876 static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3],
int out_n)
4878 stbi__context *s = z->s;
4879 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4880 stbi__uint16 *p = (stbi__uint16*) z->out;
4884 STBI_ASSERT(out_n == 2 || out_n == 4);
4887 for (i = 0; i < pixel_count; ++i) {
4888 p[1] = (p[0] == tc[0] ? 0 : 65535);
4892 for (i = 0; i < pixel_count; ++i) {
4893 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4901 static int stbi__expand_png_palette(stbi__png *a,
stbi_uc *palette,
int len,
int pal_img_n)
4903 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4904 stbi_uc *p, *temp_out, *orig = a->out;
4906 p = (
stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4907 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4912 if (pal_img_n == 3) {
4913 for (i=0; i < pixel_count; ++i) {
4916 p[1] = palette[n+1];
4917 p[2] = palette[n+2];
4921 for (i=0; i < pixel_count; ++i) {
4924 p[1] = palette[n+1];
4925 p[2] = palette[n+2];
4926 p[3] = palette[n+3];
4938 static int stbi__unpremultiply_on_load_global = 0;
4939 static int stbi__de_iphone_flag_global = 0;
4943 stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;
4948 stbi__de_iphone_flag_global = flag_true_if_should_convert;
4951 #ifndef STBI_THREAD_LOCAL
4952 #define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global
4953 #define stbi__de_iphone_flag stbi__de_iphone_flag_global
4955 static STBI_THREAD_LOCAL
int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;
4956 static STBI_THREAD_LOCAL
int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;
4958 STBIDEF void stbi__unpremultiply_on_load_thread(
int flag_true_if_should_unpremultiply)
4960 stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;
4961 stbi__unpremultiply_on_load_set = 1;
4966 stbi__de_iphone_flag_local = flag_true_if_should_convert;
4967 stbi__de_iphone_flag_set = 1;
4970 #define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \
4971 ? stbi__unpremultiply_on_load_local \
4972 : stbi__unpremultiply_on_load_global)
4973 #define stbi__de_iphone_flag (stbi__de_iphone_flag_set \
4974 ? stbi__de_iphone_flag_local \
4975 : stbi__de_iphone_flag_global)
4978 static void stbi__de_iphone(stbi__png *z)
4980 stbi__context *s = z->s;
4981 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4984 if (s->img_out_n == 3) {
4985 for (i=0; i < pixel_count; ++i) {
4992 STBI_ASSERT(s->img_out_n == 4);
4993 if (stbi__unpremultiply_on_load) {
4995 for (i=0; i < pixel_count; ++i) {
5000 p[0] = (p[2] * 255 + half) / a;
5001 p[1] = (p[1] * 255 + half) / a;
5002 p[2] = ( t * 255 + half) / a;
5011 for (i=0; i < pixel_count; ++i) {
5021 #define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
5023 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
5025 stbi_uc palette[1024], pal_img_n=0;
5026 stbi_uc has_trans=0, tc[3]={0};
5027 stbi__uint16 tc16[3];
5028 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
5029 int first=1,k,interlace=0, color=0, is_iphone=0;
5030 stbi__context *s = z->s;
5036 if (!stbi__check_png_header(s))
return 0;
5038 if (scan == STBI__SCAN_type)
return 1;
5041 stbi__pngchunk c = stbi__get_chunk_header(s);
5043 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
5045 stbi__skip(s, c.length);
5047 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
5049 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
5051 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
5052 s->img_x = stbi__get32be(s);
5053 s->img_y = stbi__get32be(s);
5054 if (s->img_y > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
5055 if (s->img_x > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
5056 z->depth = stbi__get8(s);
if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)
return stbi__err(
"1/2/4/8/16-bit only",
"PNG not supported: 1/2/4/8/16-bit only");
5057 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5058 if (color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5059 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5060 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
5061 filter= stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
5062 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
5063 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
5065 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
5066 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
5067 if (scan == STBI__SCAN_header)
return 1;
5072 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
5078 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
5079 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5080 if (c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5081 pal_len = c.length / 3;
5082 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5083 for (i=0; i < pal_len; ++i) {
5084 palette[i*4+0] = stbi__get8(s);
5085 palette[i*4+1] = stbi__get8(s);
5086 palette[i*4+2] = stbi__get8(s);
5087 palette[i*4+3] = 255;
5092 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
5093 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5094 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
5096 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
5097 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
5098 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5100 for (i=0; i < c.length; ++i)
5101 palette[i*4+3] = stbi__get8(s);
5103 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
5104 if (c.length != (stbi__uint32) s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5106 if (z->depth == 16) {
5107 for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s);
5109 for (k = 0; k < s->img_n; ++k) tc[k] = (
stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth];
5115 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
5116 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5117 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
5118 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
5119 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
5120 if (ioff + c.length > idata_limit) {
5121 stbi__uint32 idata_limit_old = idata_limit;
5123 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
5124 while (ioff + c.length > idata_limit)
5126 STBI_NOTUSED(idata_limit_old);
5127 p = (
stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
5130 if (!stbi__getn(s, z->idata+ioff,c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
5135 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
5136 stbi__uint32 raw_len, bpl;
5137 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5138 if (scan != STBI__SCAN_load)
return 1;
5139 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
5141 bpl = (s->img_x * z->depth + 7) / 8;
5142 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
5144 if (z->expanded == NULL)
return 0;
5145 STBI_FREE(z->idata); z->idata = NULL;
5146 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
5147 s->img_out_n = s->img_n+1;
5149 s->img_out_n = s->img_n;
5150 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace))
return 0;
5152 if (z->depth == 16) {
5153 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
return 0;
5155 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
5158 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
5162 s->img_n = pal_img_n;
5163 s->img_out_n = pal_img_n;
5164 if (req_comp >= 3) s->img_out_n = req_comp;
5165 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
5167 }
else if (has_trans) {
5171 STBI_FREE(z->expanded); z->expanded = NULL;
5179 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5180 if ((c.type & (1 << 29)) == 0) {
5181 #ifndef STBI_NO_FAILURE_STRINGS
5183 static char invalid_chunk[] =
"XXXX PNG chunk not known";
5184 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
5185 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
5186 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
5187 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
5189 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
5191 stbi__skip(s, c.length);
5199 static void *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp, stbi__result_info *ri)
5202 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
5203 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
5205 ri->bits_per_channel = 8;
5206 else if (p->depth == 16)
5207 ri->bits_per_channel = 16;
5209 return stbi__errpuc(
"bad bits_per_channel",
"PNG not supported: unsupported color depth");
5212 if (req_comp && req_comp != p->s->img_out_n) {
5213 if (ri->bits_per_channel == 8)
5214 result = stbi__convert_format((
unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
5216 result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
5217 p->s->img_out_n = req_comp;
5218 if (result == NULL)
return result;
5222 if (n) *n = p->s->img_n;
5224 STBI_FREE(p->out); p->out = NULL;
5225 STBI_FREE(p->expanded); p->expanded = NULL;
5226 STBI_FREE(p->idata); p->idata = NULL;
5231 static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5235 return stbi__do_png(&p, x,y,comp,req_comp, ri);
5238 static int stbi__png_test(stbi__context *s)
5241 r = stbi__check_png_header(s);
5246 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
5248 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
5249 stbi__rewind( p->s );
5252 if (x) *x = p->s->img_x;
5253 if (y) *y = p->s->img_y;
5254 if (comp) *comp = p->s->img_n;
5258 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
5262 return stbi__png_info_raw(&p, x, y, comp);
5265 static int stbi__png_is16(stbi__context *s)
5269 if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5271 if (p.depth != 16) {
5282 static int stbi__bmp_test_raw(stbi__context *s)
5286 if (stbi__get8(s) !=
'B')
return 0;
5287 if (stbi__get8(s) !=
'M')
return 0;
5292 sz = stbi__get32le(s);
5293 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5297 static int stbi__bmp_test(stbi__context *s)
5299 int r = stbi__bmp_test_raw(s);
5306 static int stbi__high_bit(
unsigned int z)
5309 if (z == 0)
return -1;
5310 if (z >= 0x10000) { n += 16; z >>= 16; }
5311 if (z >= 0x00100) { n += 8; z >>= 8; }
5312 if (z >= 0x00010) { n += 4; z >>= 4; }
5313 if (z >= 0x00004) { n += 2; z >>= 2; }
5314 if (z >= 0x00002) { n += 1; }
5318 static int stbi__bitcount(
unsigned int a)
5320 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
5321 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
5322 a = (a + (a >> 4)) & 0x0f0f0f0f;
5324 a = (a + (a >> 16));
5331 static int stbi__shiftsigned(
unsigned int v,
int shift,
int bits)
5333 static unsigned int mul_table[9] = {
5335 0xff, 0x55, 0x49, 0x11,
5336 0x21, 0x41, 0x81, 0x01,
5338 static unsigned int shift_table[9] = {
5345 STBI_ASSERT(v < 256);
5347 STBI_ASSERT(bits >= 0 && bits <= 8);
5348 return (
int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
5353 int bpp, offset, hsz;
5354 unsigned int mr,mg,mb,ma, all_a;
5358 static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info,
int compress)
5365 if (info->bpp == 16) {
5366 info->mr = 31u << 10;
5367 info->mg = 31u << 5;
5368 info->mb = 31u << 0;
5369 }
else if (info->bpp == 32) {
5370 info->mr = 0xffu << 16;
5371 info->mg = 0xffu << 8;
5372 info->mb = 0xffu << 0;
5373 info->ma = 0xffu << 24;
5377 info->mr = info->mg = info->mb = info->ma = 0;
5384 static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
5387 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5391 info->offset = stbi__get32le(s);
5392 info->hsz = hsz = stbi__get32le(s);
5393 info->mr = info->mg = info->mb = info->ma = 0;
5394 info->extra_read = 14;
5396 if (info->offset < 0)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5398 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5400 s->img_x = stbi__get16le(s);
5401 s->img_y = stbi__get16le(s);
5403 s->img_x = stbi__get32le(s);
5404 s->img_y = stbi__get32le(s);
5406 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5407 info->bpp = stbi__get16le(s);
5410 if (
compress == 1 ||
compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5411 if (
compress >= 4)
return stbi__errpuc(
"BMP JPEG/PNG",
"BMP type not supported: unsupported compression");
5412 if (
compress == 3 && info->bpp != 16 && info->bpp != 32)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5418 if (hsz == 40 || hsz == 56) {
5425 if (info->bpp == 16 || info->bpp == 32) {
5427 stbi__bmp_set_mask_defaults(info,
compress);
5429 info->mr = stbi__get32le(s);
5430 info->mg = stbi__get32le(s);
5431 info->mb = stbi__get32le(s);
5432 info->extra_read += 12;
5434 if (info->mr == info->mg && info->mg == info->mb) {
5436 return stbi__errpuc(
"bad BMP",
"bad BMP");
5439 return stbi__errpuc(
"bad BMP",
"bad BMP");
5444 if (hsz != 108 && hsz != 124)
5445 return stbi__errpuc(
"bad BMP",
"bad BMP");
5446 info->mr = stbi__get32le(s);
5447 info->mg = stbi__get32le(s);
5448 info->mb = stbi__get32le(s);
5449 info->ma = stbi__get32le(s);
5451 stbi__bmp_set_mask_defaults(info,
compress);
5453 for (i=0; i < 12; ++i)
5467 static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5470 unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
5472 int psize=0,i,j,width;
5473 int flip_vertically, pad, target;
5474 stbi__bmp_data info;
5478 if (stbi__bmp_parse_header(s, &info) == NULL)
5481 flip_vertically = ((int) s->img_y) > 0;
5482 s->img_y = abs((
int) s->img_y);
5484 if (s->img_y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5485 if (s->img_x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5493 if (info.hsz == 12) {
5495 psize = (info.offset - info.extra_read - 24) / 3;
5498 psize = (info.offset - info.extra_read - info.hsz) >> 2;
5501 if (info.offset != s->callback_already_read + (s->img_buffer - s->img_buffer_original)) {
5502 return stbi__errpuc(
"bad offset",
"Corrupt BMP");
5506 if (info.bpp == 24 && ma == 0xff000000)
5509 s->img_n = ma ? 4 : 3;
5510 if (req_comp && req_comp >= 3)
5516 if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5517 return stbi__errpuc(
"too large",
"Corrupt BMP");
5519 out = (
stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5520 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5521 if (info.bpp < 16) {
5523 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
5524 for (i=0; i < psize; ++i) {
5525 pal[i][2] = stbi__get8(s);
5526 pal[i][1] = stbi__get8(s);
5527 pal[i][0] = stbi__get8(s);
5528 if (info.hsz != 12) stbi__get8(s);
5531 stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5532 if (info.bpp == 1) width = (s->img_x + 7) >> 3;
5533 else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5534 else if (info.bpp == 8) width = s->img_x;
5535 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
5537 if (info.bpp == 1) {
5538 for (j=0; j < (int) s->img_y; ++j) {
5539 int bit_offset = 7, v = stbi__get8(s);
5540 for (i=0; i < (int) s->img_x; ++i) {
5541 int color = (v>>bit_offset)&0x1;
5542 out[z++] = pal[color][0];
5543 out[z++] = pal[color][1];
5544 out[z++] = pal[color][2];
5545 if (target == 4) out[z++] = 255;
5546 if (i+1 == (
int) s->img_x)
break;
5547 if((--bit_offset) < 0) {
5555 for (j=0; j < (int) s->img_y; ++j) {
5556 for (i=0; i < (int) s->img_x; i += 2) {
5557 int v=stbi__get8(s),v2=0;
5558 if (info.bpp == 4) {
5562 out[z++] = pal[v][0];
5563 out[z++] = pal[v][1];
5564 out[z++] = pal[v][2];
5565 if (target == 4) out[z++] = 255;
5566 if (i+1 == (
int) s->img_x)
break;
5567 v = (info.bpp == 8) ? stbi__get8(s) : v2;
5568 out[z++] = pal[v][0];
5569 out[z++] = pal[v][1];
5570 out[z++] = pal[v][2];
5571 if (target == 4) out[z++] = 255;
5577 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
5580 stbi__skip(s, info.offset - info.extra_read - info.hsz);
5581 if (info.bpp == 24) width = 3 * s->img_x;
5582 else if (info.bpp == 16) width = 2*s->img_x;
5585 if (info.bpp == 24) {
5587 }
else if (info.bpp == 32) {
5588 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5592 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5594 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
5595 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
5596 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
5597 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
5598 if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5600 for (j=0; j < (int) s->img_y; ++j) {
5602 for (i=0; i < (int) s->img_x; ++i) {
5604 out[z+2] = stbi__get8(s);
5605 out[z+1] = stbi__get8(s);
5606 out[z+0] = stbi__get8(s);
5608 a = (easy == 2 ? stbi__get8(s) : 255);
5610 if (target == 4) out[z++] = a;
5614 for (i=0; i < (int) s->img_x; ++i) {
5615 stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
5617 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5618 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5619 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5620 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5622 if (target == 4) out[z++] = STBI__BYTECAST(a);
5630 if (target == 4 && all_a == 0)
5631 for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
5634 if (flip_vertically) {
5636 for (j=0; j < (int) s->img_y>>1; ++j) {
5637 stbi_uc *p1 = out + j *s->img_x*target;
5638 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
5639 for (i=0; i < (int) s->img_x*target; ++i) {
5640 t = p1[i]; p1[i] = p2[i]; p2[i] = t;
5645 if (req_comp && req_comp != target) {
5646 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
5647 if (out == NULL)
return out;
5652 if (comp) *comp = s->img_n;
5661 static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
5664 if (is_rgb16) *is_rgb16 = 0;
5665 switch(bits_per_pixel) {
5669 case 15:
if(is_rgb16) *is_rgb16 = 1;
5672 case 32:
return bits_per_pixel/8;
5677 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
5679 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5680 int sz, tga_colormap_type;
5682 tga_colormap_type = stbi__get8(s);
5683 if( tga_colormap_type > 1 ) {
5687 tga_image_type = stbi__get8(s);
5688 if ( tga_colormap_type == 1 ) {
5689 if (tga_image_type != 1 && tga_image_type != 9) {
5695 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5700 tga_colormap_bpp = sz;
5702 if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5707 tga_colormap_bpp = 0;
5709 tga_w = stbi__get16le(s);
5714 tga_h = stbi__get16le(s);
5719 tga_bits_per_pixel = stbi__get8(s);
5721 if (tga_colormap_bpp != 0) {
5722 if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5728 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5730 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5738 if (comp) *comp = tga_comp;
5742 static int stbi__tga_test(stbi__context *s)
5745 int sz, tga_color_type;
5747 tga_color_type = stbi__get8(s);
5748 if ( tga_color_type > 1 )
goto errorEnd;
5750 if ( tga_color_type == 1 ) {
5751 if (sz != 1 && sz != 9)
goto errorEnd;
5754 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5757 if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) )
goto errorEnd;
5760 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5761 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5763 if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) )
goto errorEnd;
5764 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5774 static void stbi__tga_read_rgb16(stbi__context *s,
stbi_uc* out)
5776 stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5777 stbi__uint16 fiveBitMask = 31;
5779 int r = (px >> 10) & fiveBitMask;
5780 int g = (px >> 5) & fiveBitMask;
5781 int b = px & fiveBitMask;
5783 out[0] = (
stbi_uc)((r * 255)/31);
5784 out[1] = (
stbi_uc)((g * 255)/31);
5785 out[2] = (
stbi_uc)((b * 255)/31);
5793 static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5796 int tga_offset = stbi__get8(s);
5797 int tga_indexed = stbi__get8(s);
5798 int tga_image_type = stbi__get8(s);
5800 int tga_palette_start = stbi__get16le(s);
5801 int tga_palette_len = stbi__get16le(s);
5802 int tga_palette_bits = stbi__get8(s);
5803 int tga_x_origin = stbi__get16le(s);
5804 int tga_y_origin = stbi__get16le(s);
5805 int tga_width = stbi__get16le(s);
5806 int tga_height = stbi__get16le(s);
5807 int tga_bits_per_pixel = stbi__get8(s);
5808 int tga_comp, tga_rgb16=0;
5809 int tga_inverted = stbi__get8(s);
5812 unsigned char *tga_data;
5813 unsigned char *tga_palette = NULL;
5815 unsigned char raw_data[4] = {0};
5817 int RLE_repeating = 0;
5818 int read_next_pixel = 1;
5820 STBI_NOTUSED(tga_x_origin);
5821 STBI_NOTUSED(tga_y_origin);
5823 if (tga_height > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5824 if (tga_width > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5827 if ( tga_image_type >= 8 )
5829 tga_image_type -= 8;
5832 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5835 if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5836 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5839 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5844 if (comp) *comp = tga_comp;
5846 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5847 return stbi__errpuc(
"too large",
"Corrupt TGA");
5849 tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5850 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
5853 stbi__skip(s, tga_offset );
5855 if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
5856 for (i=0; i < tga_height; ++i) {
5857 int row = tga_inverted ? tga_height -i - 1 : i;
5858 stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5859 stbi__getn(s, tga_row, tga_width * tga_comp);
5865 if (tga_palette_len == 0) {
5866 STBI_FREE(tga_data);
5867 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5871 stbi__skip(s, tga_palette_start );
5873 tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5875 STBI_FREE(tga_data);
5876 return stbi__errpuc(
"outofmem",
"Out of memory");
5879 stbi_uc *pal_entry = tga_palette;
5881 for (i=0; i < tga_palette_len; ++i) {
5882 stbi__tga_read_rgb16(s, pal_entry);
5883 pal_entry += tga_comp;
5885 }
else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5886 STBI_FREE(tga_data);
5887 STBI_FREE(tga_palette);
5888 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5892 for (i=0; i < tga_width * tga_height; ++i)
5897 if ( RLE_count == 0 )
5900 int RLE_cmd = stbi__get8(s);
5901 RLE_count = 1 + (RLE_cmd & 127);
5902 RLE_repeating = RLE_cmd >> 7;
5903 read_next_pixel = 1;
5904 }
else if ( !RLE_repeating )
5906 read_next_pixel = 1;
5910 read_next_pixel = 1;
5913 if ( read_next_pixel )
5919 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5920 if ( pal_idx >= tga_palette_len ) {
5924 pal_idx *= tga_comp;
5925 for (j = 0; j < tga_comp; ++j) {
5926 raw_data[j] = tga_palette[pal_idx+j];
5928 }
else if(tga_rgb16) {
5930 stbi__tga_read_rgb16(s, raw_data);
5933 for (j = 0; j < tga_comp; ++j) {
5934 raw_data[j] = stbi__get8(s);
5938 read_next_pixel = 0;
5942 for (j = 0; j < tga_comp; ++j)
5943 tga_data[i*tga_comp+j] = raw_data[j];
5951 for (j = 0; j*2 < tga_height; ++j)
5953 int index1 = j * tga_width * tga_comp;
5954 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5955 for (i = tga_width * tga_comp; i > 0; --i)
5957 unsigned char temp = tga_data[index1];
5958 tga_data[index1] = tga_data[index2];
5959 tga_data[index2] = temp;
5966 if ( tga_palette != NULL )
5968 STBI_FREE( tga_palette );
5973 if (tga_comp >= 3 && !tga_rgb16)
5975 unsigned char* tga_pixel = tga_data;
5976 for (i=0; i < tga_width * tga_height; ++i)
5978 unsigned char temp = tga_pixel[0];
5979 tga_pixel[0] = tga_pixel[2];
5980 tga_pixel[2] = temp;
5981 tga_pixel += tga_comp;
5986 if (req_comp && req_comp != tga_comp)
5987 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5991 tga_palette_start = tga_palette_len = tga_palette_bits =
5992 tga_x_origin = tga_y_origin = 0;
5993 STBI_NOTUSED(tga_palette_start);
6003 static int stbi__psd_test(stbi__context *s)
6005 int r = (stbi__get32be(s) == 0x38425053);
6010 static int stbi__psd_decode_rle(stbi__context *s,
stbi_uc *p,
int pixelCount)
6012 int count, nleft, len;
6015 while ((nleft = pixelCount - count) > 0) {
6016 len = stbi__get8(s);
6019 }
else if (len < 128) {
6022 if (len > nleft)
return 0;
6029 }
else if (len > 128) {
6034 if (len > nleft)
return 0;
6035 val = stbi__get8(s);
6048 static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
6051 int channelCount, compression;
6059 if (stbi__get32be(s) != 0x38425053)
6060 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
6063 if (stbi__get16be(s) != 1)
6064 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
6070 channelCount = stbi__get16be(s);
6071 if (channelCount < 0 || channelCount > 16)
6072 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
6075 h = stbi__get32be(s);
6076 w = stbi__get32be(s);
6078 if (h > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6079 if (w > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6082 bitdepth = stbi__get16be(s);
6083 if (bitdepth != 8 && bitdepth != 16)
6084 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
6096 if (stbi__get16be(s) != 3)
6097 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
6100 stbi__skip(s,stbi__get32be(s) );
6103 stbi__skip(s, stbi__get32be(s) );
6106 stbi__skip(s, stbi__get32be(s) );
6112 compression = stbi__get16be(s);
6113 if (compression > 1)
6114 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
6117 if (!stbi__mad3sizes_valid(4, w, h, 0))
6118 return stbi__errpuc(
"too large",
"Corrupt PSD");
6122 if (!compression && bitdepth == 16 && bpc == 16) {
6123 out = (
stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
6124 ri->bits_per_channel = 16;
6126 out = (
stbi_uc *) stbi__malloc(4 * w*h);
6128 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6146 stbi__skip(s, h * channelCount * 2 );
6149 for (channel = 0; channel < 4; channel++) {
6153 if (channel >= channelCount) {
6155 for (i = 0; i < pixelCount; i++, p += 4)
6156 *p = (channel == 3 ? 255 : 0);
6159 if (!stbi__psd_decode_rle(s, p, pixelCount)) {
6161 return stbi__errpuc(
"corrupt",
"bad RLE data");
6171 for (channel = 0; channel < 4; channel++) {
6172 if (channel >= channelCount) {
6174 if (bitdepth == 16 && bpc == 16) {
6175 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
6176 stbi__uint16 val = channel == 3 ? 65535 : 0;
6177 for (i = 0; i < pixelCount; i++, q += 4)
6181 stbi_uc val = channel == 3 ? 255 : 0;
6182 for (i = 0; i < pixelCount; i++, p += 4)
6186 if (ri->bits_per_channel == 16) {
6187 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
6188 for (i = 0; i < pixelCount; i++, q += 4)
6189 *q = (stbi__uint16) stbi__get16be(s);
6192 if (bitdepth == 16) {
6193 for (i = 0; i < pixelCount; i++, p += 4)
6194 *p = (
stbi_uc) (stbi__get16be(s) >> 8);
6196 for (i = 0; i < pixelCount; i++, p += 4)
6205 if (channelCount >= 4) {
6206 if (ri->bits_per_channel == 16) {
6207 for (i=0; i < w*h; ++i) {
6208 stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
6209 if (pixel[3] != 0 && pixel[3] != 65535) {
6210 float a = pixel[3] / 65535.0f;
6211 float ra = 1.0f / a;
6212 float inv_a = 65535.0f * (1 - ra);
6213 pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
6214 pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
6215 pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
6219 for (i=0; i < w*h; ++i) {
6220 unsigned char *pixel = out + 4*i;
6221 if (pixel[3] != 0 && pixel[3] != 255) {
6222 float a = pixel[3] / 255.0f;
6223 float ra = 1.0f / a;
6224 float inv_a = 255.0f * (1 - ra);
6225 pixel[0] = (
unsigned char) (pixel[0]*ra + inv_a);
6226 pixel[1] = (
unsigned char) (pixel[1]*ra + inv_a);
6227 pixel[2] = (
unsigned char) (pixel[2]*ra + inv_a);
6234 if (req_comp && req_comp != 4) {
6235 if (ri->bits_per_channel == 16)
6236 out = (
stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
6238 out = stbi__convert_format(out, 4, req_comp, w, h);
6239 if (out == NULL)
return out;
6242 if (comp) *comp = 4;
6258 static int stbi__pic_is4(stbi__context *s,
const char *str)
6262 if (stbi__get8(s) != (
stbi_uc)str[i])
6268 static int stbi__pic_test_core(stbi__context *s)
6272 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
6278 if (!stbi__pic_is4(s,
"PICT"))
6289 static stbi_uc *stbi__readval(stbi__context *s,
int channel,
stbi_uc *dest)
6293 for (i=0; i<4; ++i, mask>>=1) {
6294 if (channel & mask) {
6295 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
6296 dest[i]=stbi__get8(s);
6303 static void stbi__copyval(
int channel,
stbi_uc *dest,
const stbi_uc *src)
6307 for (i=0;i<4; ++i, mask>>=1)
6312 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp,
stbi_uc *result)
6314 int act_comp=0,num_packets=0,y,chained;
6315 stbi__pic_packet packets[10];
6320 stbi__pic_packet *packet;
6322 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
6323 return stbi__errpuc(
"bad format",
"too many packets");
6325 packet = &packets[num_packets++];
6327 chained = stbi__get8(s);
6328 packet->size = stbi__get8(s);
6329 packet->type = stbi__get8(s);
6330 packet->channel = stbi__get8(s);
6332 act_comp |= packet->channel;
6334 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
6335 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
6338 *comp = (act_comp & 0x10 ? 4 : 3);
6340 for(y=0; y<height; ++y) {
6343 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
6344 stbi__pic_packet *packet = &packets[packet_idx];
6345 stbi_uc *dest = result+y*width*4;
6347 switch (packet->type) {
6349 return stbi__errpuc(
"bad format",
"packet has bad compression type");
6354 for(x=0;x<width;++x, dest+=4)
6355 if (!stbi__readval(s,packet->channel,dest))
6367 count=stbi__get8(s);
6368 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6373 if (!stbi__readval(s,packet->channel,value))
return 0;
6375 for(i=0; i<count; ++i,dest+=4)
6376 stbi__copyval(packet->channel,dest,value);
6385 int count = stbi__get8(s), i;
6386 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6392 count = stbi__get16be(s);
6396 return stbi__errpuc(
"bad file",
"scanline overrun");
6398 if (!stbi__readval(s,packet->channel,value))
6401 for(i=0;i<count;++i, dest += 4)
6402 stbi__copyval(packet->channel,dest,value);
6405 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
6407 for(i=0;i<count;++i, dest+=4)
6408 if (!stbi__readval(s,packet->channel,dest))
6422 static void *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp, stbi__result_info *ri)
6425 int i, x,y, internal_comp;
6428 if (!comp) comp = &internal_comp;
6430 for (i=0; i<92; ++i)
6433 x = stbi__get16be(s);
6434 y = stbi__get16be(s);
6436 if (y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6437 if (x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6439 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
6440 if (!stbi__mad3sizes_valid(x, y, 4, 0))
return stbi__errpuc(
"too large",
"PIC image too large to decode");
6447 result = (
stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
6448 if (!result)
return stbi__errpuc(
"outofmem",
"Out of memory");
6449 memset(result, 0xff, x*y*4);
6451 if (!stbi__pic_load_core(s,x,y,comp, result)) {
6457 if (req_comp == 0) req_comp = *comp;
6458 result=stbi__convert_format(result,4,req_comp,x,y);
6463 static int stbi__pic_test(stbi__context *s)
6465 int r = stbi__pic_test_core(s);
6488 int flags, bgindex, ratio, transparent, eflags;
6491 stbi__gif_lzw codes[8192];
6495 int start_x, start_y;
6502 static int stbi__gif_test_raw(stbi__context *s)
6505 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
6507 if (sz !=
'9' && sz !=
'7')
return 0;
6508 if (stbi__get8(s) !=
'a')
return 0;
6512 static int stbi__gif_test(stbi__context *s)
6514 int r = stbi__gif_test_raw(s);
6519 static void stbi__gif_parse_colortable(stbi__context *s,
stbi_uc pal[256][4],
int num_entries,
int transp)
6522 for (i=0; i < num_entries; ++i) {
6523 pal[i][2] = stbi__get8(s);
6524 pal[i][1] = stbi__get8(s);
6525 pal[i][0] = stbi__get8(s);
6526 pal[i][3] = transp == i ? 0 : 255;
6530 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
6533 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
6534 return stbi__err(
"not GIF",
"Corrupt GIF");
6536 version = stbi__get8(s);
6537 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
6538 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
6540 stbi__g_failure_reason =
"";
6541 g->w = stbi__get16le(s);
6542 g->h = stbi__get16le(s);
6543 g->flags = stbi__get8(s);
6544 g->bgindex = stbi__get8(s);
6545 g->ratio = stbi__get8(s);
6546 g->transparent = -1;
6548 if (g->w > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
6549 if (g->h > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
6551 if (comp != 0) *comp = 4;
6553 if (is_info)
return 1;
6555 if (g->flags & 0x80)
6556 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
6561 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
6563 stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
6564 if (!g)
return stbi__err(
"outofmem",
"Out of memory");
6565 if (!stbi__gif_header(s, g, comp, 1)) {
6576 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6583 if (g->codes[code].prefix >= 0)
6584 stbi__out_gif_code(g, g->codes[code].prefix);
6586 if (g->cur_y >= g->max_y)
return;
6588 idx = g->cur_x + g->cur_y;
6590 g->history[idx / 4] = 1;
6592 c = &g->color_table[g->codes[code].suffix * 4];
6601 if (g->cur_x >= g->max_x) {
6602 g->cur_x = g->start_x;
6603 g->cur_y += g->step;
6605 while (g->cur_y >= g->max_y && g->parse > 0) {
6606 g->step = (1 << g->parse) * g->line_size;
6607 g->cur_y = g->start_y + (g->step >> 1);
6613 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
6616 stbi__int32 len, init_code;
6618 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6621 lzw_cs = stbi__get8(s);
6622 if (lzw_cs > 12)
return NULL;
6623 clear = 1 << lzw_cs;
6625 codesize = lzw_cs + 1;
6626 codemask = (1 << codesize) - 1;
6629 for (init_code = 0; init_code < clear; init_code++) {
6630 g->codes[init_code].prefix = -1;
6631 g->codes[init_code].first = (
stbi_uc) init_code;
6632 g->codes[init_code].suffix = (
stbi_uc) init_code;
6641 if (valid_bits < codesize) {
6643 len = stbi__get8(s);
6648 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
6651 stbi__int32 code = bits & codemask;
6653 valid_bits -= codesize;
6655 if (code == clear) {
6656 codesize = lzw_cs + 1;
6657 codemask = (1 << codesize) - 1;
6661 }
else if (code == clear + 1) {
6663 while ((len = stbi__get8(s)) > 0)
6666 }
else if (code <= avail) {
6668 return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6672 p = &g->codes[avail++];
6674 return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6677 p->prefix = (stbi__int16) oldcode;
6678 p->first = g->codes[oldcode].first;
6679 p->suffix = (code == avail) ? p->first : g->codes[code].first;
6680 }
else if (code == avail)
6681 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6683 stbi__out_gif_code(g, (stbi__uint16) code);
6685 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6687 codemask = (1 << codesize) - 1;
6692 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6700 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp,
stbi_uc *two_back)
6706 STBI_NOTUSED(req_comp);
6711 if (!stbi__gif_header(s, g, comp,0))
return 0;
6712 if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
6713 return stbi__errpuc(
"too large",
"GIF image is too large");
6714 pcount = g->w * g->h;
6715 g->out = (
stbi_uc *) stbi__malloc(4 * pcount);
6716 g->background = (
stbi_uc *) stbi__malloc(4 * pcount);
6717 g->history = (
stbi_uc *) stbi__malloc(pcount);
6718 if (!g->out || !g->background || !g->history)
6719 return stbi__errpuc(
"outofmem",
"Out of memory");
6724 memset(g->out, 0x00, 4 * pcount);
6725 memset(g->background, 0x00, 4 * pcount);
6726 memset(g->history, 0x00, pcount);
6730 dispose = (g->eflags & 0x1C) >> 2;
6731 pcount = g->w * g->h;
6733 if ((dispose == 3) && (two_back == 0)) {
6738 for (pi = 0; pi < pcount; ++pi) {
6739 if (g->history[pi]) {
6740 memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
6743 }
else if (dispose == 2) {
6745 for (pi = 0; pi < pcount; ++pi) {
6746 if (g->history[pi]) {
6747 memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
6758 memcpy( g->background, g->out, 4 * g->w * g->h );
6762 memset( g->history, 0x00, g->w * g->h );
6765 int tag = stbi__get8(s);
6769 stbi__int32 x, y, w, h;
6772 x = stbi__get16le(s);
6773 y = stbi__get16le(s);
6774 w = stbi__get16le(s);
6775 h = stbi__get16le(s);
6776 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6777 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6779 g->line_size = g->w * 4;
6781 g->start_y = y * g->line_size;
6782 g->max_x = g->start_x + w * 4;
6783 g->max_y = g->start_y + h * g->line_size;
6784 g->cur_x = g->start_x;
6785 g->cur_y = g->start_y;
6792 g->cur_y = g->max_y;
6794 g->lflags = stbi__get8(s);
6796 if (g->lflags & 0x40) {
6797 g->step = 8 * g->line_size;
6800 g->step = g->line_size;
6804 if (g->lflags & 0x80) {
6805 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6806 g->color_table = (
stbi_uc *) g->lpal;
6807 }
else if (g->flags & 0x80) {
6808 g->color_table = (
stbi_uc *) g->pal;
6810 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6812 o = stbi__process_gif_raster(s, g);
6813 if (!o)
return NULL;
6816 pcount = g->w * g->h;
6817 if (first_frame && (g->bgindex > 0)) {
6819 for (pi = 0; pi < pcount; ++pi) {
6820 if (g->history[pi] == 0) {
6821 g->pal[g->bgindex][3] = 255;
6822 memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
6833 int ext = stbi__get8(s);
6835 len = stbi__get8(s);
6837 g->eflags = stbi__get8(s);
6838 g->delay = 10 * stbi__get16le(s);
6841 if (g->transparent >= 0) {
6842 g->pal[g->transparent][3] = 255;
6844 if (g->eflags & 0x01) {
6845 g->transparent = stbi__get8(s);
6846 if (g->transparent >= 0) {
6847 g->pal[g->transparent][3] = 0;
6852 g->transparent = -1;
6859 while ((len = stbi__get8(s)) != 0) {
6869 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6874 static void *stbi__load_gif_main_outofmem(stbi__gif *g,
stbi_uc *out,
int **delays)
6877 STBI_FREE(g->history);
6878 STBI_FREE(g->background);
6880 if (out) STBI_FREE(out);
6881 if (delays && *delays) STBI_FREE(*delays);
6882 return stbi__errpuc(
"outofmem",
"Out of memory");
6885 static void *stbi__load_gif_main(stbi__context *s,
int **delays,
int *x,
int *y,
int *z,
int *comp,
int req_comp)
6887 if (stbi__gif_test(s)) {
6895 int delays_size = 0;
6897 STBI_NOTUSED(out_size);
6898 STBI_NOTUSED(delays_size);
6900 memset(&g, 0,
sizeof(g));
6906 u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
6907 if (u == (
stbi_uc *) s) u = 0;
6913 stride = g.w * g.h * 4;
6916 void *tmp = (
stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );
6918 return stbi__load_gif_main_outofmem(&g, out, delays);
6921 out_size = layers * stride;
6925 int *new_delays = (
int*) STBI_REALLOC_SIZED( *delays, delays_size,
sizeof(
int) * layers );
6927 return stbi__load_gif_main_outofmem(&g, out, delays);
6928 *delays = new_delays;
6929 delays_size = layers *
sizeof(int);
6932 out = (
stbi_uc*)stbi__malloc( layers * stride );
6934 return stbi__load_gif_main_outofmem(&g, out, delays);
6935 out_size = layers * stride;
6937 *delays = (
int*) stbi__malloc( layers *
sizeof(
int) );
6939 return stbi__load_gif_main_outofmem(&g, out, delays);
6940 delays_size = layers *
sizeof(int);
6943 memcpy( out + ((layers - 1) * stride), u, stride );
6945 two_back = out - 2 * stride;
6949 (*delays)[layers - 1U] = g.delay;
6956 STBI_FREE(g.history);
6957 STBI_FREE(g.background);
6960 if (req_comp && req_comp != 4)
6961 out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
6966 return stbi__errpuc(
"not GIF",
"Image was not as a gif type.");
6970 static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6974 memset(&g, 0,
sizeof(g));
6977 u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
6978 if (u == (
stbi_uc *) s) u = 0;
6985 if (req_comp && req_comp != 4)
6986 u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
6993 STBI_FREE(g.history);
6994 STBI_FREE(g.background);
6999 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
7001 return stbi__gif_info_raw(s,x,y,comp);
7009 static int stbi__hdr_test_core(stbi__context *s,
const char *signature)
7012 for (i=0; signature[i]; ++i)
7013 if (stbi__get8(s) != signature[i])
7019 static int stbi__hdr_test(stbi__context* s)
7021 int r = stbi__hdr_test_core(s,
"#?RADIANCE\n");
7024 r = stbi__hdr_test_core(s,
"#?RGBE\n");
7030 #define STBI__HDR_BUFLEN 1024
7031 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
7036 c = (char) stbi__get8(z);
7038 while (!stbi__at_eof(z) && c !=
'\n') {
7040 if (len == STBI__HDR_BUFLEN-1) {
7042 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
7046 c = (char) stbi__get8(z);
7053 static void stbi__hdr_convert(
float *output,
stbi_uc *input,
int req_comp)
7055 if ( input[3] != 0 ) {
7058 f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
7060 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
7062 output[0] = input[0] * f1;
7063 output[1] = input[1] * f1;
7064 output[2] = input[2] * f1;
7066 if (req_comp == 2) output[1] = 1;
7067 if (req_comp == 4) output[3] = 1;
7070 case 4: output[3] = 1;
7071 case 3: output[0] = output[1] = output[2] = 0;
7073 case 2: output[1] = 1;
7074 case 1: output[0] = 0;
7080 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
7082 char buffer[STBI__HDR_BUFLEN];
7089 unsigned char count, value;
7090 int i, j, k, c1,c2, z;
7091 const char *headerToken;
7095 headerToken = stbi__hdr_gettoken(s,buffer);
7096 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
7097 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
7101 token = stbi__hdr_gettoken(s,buffer);
7102 if (token[0] == 0)
break;
7103 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7106 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
7110 token = stbi__hdr_gettoken(s,buffer);
7111 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7113 height = (int) strtol(token, &token, 10);
7114 while (*token ==
' ') ++token;
7115 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7117 width = (int) strtol(token, NULL, 10);
7119 if (height > STBI_MAX_DIMENSIONS)
return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7120 if (width > STBI_MAX_DIMENSIONS)
return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7125 if (comp) *comp = 3;
7126 if (req_comp == 0) req_comp = 3;
7128 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
7129 return stbi__errpf(
"too large",
"HDR image is too large");
7132 hdr_data = (
float *) stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
7134 return stbi__errpf(
"outofmem",
"Out of memory");
7138 if ( width < 8 || width >= 32768) {
7140 for (j=0; j < height; ++j) {
7141 for (i=0; i < width; ++i) {
7144 stbi__getn(s, rgbe, 4);
7145 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
7152 for (j = 0; j < height; ++j) {
7155 len = stbi__get8(s);
7156 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
7163 rgbe[3] = (
stbi_uc) stbi__get8(s);
7164 stbi__hdr_convert(hdr_data, rgbe, req_comp);
7167 STBI_FREE(scanline);
7168 goto main_decode_loop;
7171 len |= stbi__get8(s);
7172 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
7173 if (scanline == NULL) {
7174 scanline = (
stbi_uc *) stbi__malloc_mad2(width, 4, 0);
7176 STBI_FREE(hdr_data);
7177 return stbi__errpf(
"outofmem",
"Out of memory");
7181 for (k = 0; k < 4; ++k) {
7184 while ((nleft = width - i) > 0) {
7185 count = stbi__get8(s);
7188 value = stbi__get8(s);
7190 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
7191 for (z = 0; z < count; ++z)
7192 scanline[i++ * 4 + k] = value;
7195 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
7196 for (z = 0; z < count; ++z)
7197 scanline[i++ * 4 + k] = stbi__get8(s);
7201 for (i=0; i < width; ++i)
7202 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
7205 STBI_FREE(scanline);
7211 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
7213 char buffer[STBI__HDR_BUFLEN];
7220 if (!comp) comp = &dummy;
7222 if (stbi__hdr_test(s) == 0) {
7228 token = stbi__hdr_gettoken(s,buffer);
7229 if (token[0] == 0)
break;
7230 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7237 token = stbi__hdr_gettoken(s,buffer);
7238 if (strncmp(token,
"-Y ", 3)) {
7243 *y = (int) strtol(token, &token, 10);
7244 while (*token ==
' ') ++token;
7245 if (strncmp(token,
"+X ", 3)) {
7250 *x = (int) strtol(token, NULL, 10);
7257 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
7260 stbi__bmp_data info;
7263 p = stbi__bmp_parse_header(s, &info);
7268 if (x) *x = s->img_x;
7269 if (y) *y = s->img_y;
7271 if (info.bpp == 24 && info.ma == 0xff000000)
7274 *comp = info.ma ? 4 : 3;
7281 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
7283 int channelCount, dummy, depth;
7286 if (!comp) comp = &dummy;
7287 if (stbi__get32be(s) != 0x38425053) {
7291 if (stbi__get16be(s) != 1) {
7296 channelCount = stbi__get16be(s);
7297 if (channelCount < 0 || channelCount > 16) {
7301 *y = stbi__get32be(s);
7302 *x = stbi__get32be(s);
7303 depth = stbi__get16be(s);
7304 if (depth != 8 && depth != 16) {
7308 if (stbi__get16be(s) != 3) {
7316 static int stbi__psd_is16(stbi__context *s)
7318 int channelCount, depth;
7319 if (stbi__get32be(s) != 0x38425053) {
7323 if (stbi__get16be(s) != 1) {
7328 channelCount = stbi__get16be(s);
7329 if (channelCount < 0 || channelCount > 16) {
7333 STBI_NOTUSED(stbi__get32be(s));
7334 STBI_NOTUSED(stbi__get32be(s));
7335 depth = stbi__get16be(s);
7345 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
7347 int act_comp=0,num_packets=0,chained,dummy;
7348 stbi__pic_packet packets[10];
7352 if (!comp) comp = &dummy;
7354 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
7361 *x = stbi__get16be(s);
7362 *y = stbi__get16be(s);
7363 if (stbi__at_eof(s)) {
7367 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
7375 stbi__pic_packet *packet;
7377 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
7380 packet = &packets[num_packets++];
7381 chained = stbi__get8(s);
7382 packet->size = stbi__get8(s);
7383 packet->type = stbi__get8(s);
7384 packet->channel = stbi__get8(s);
7385 act_comp |= packet->channel;
7387 if (stbi__at_eof(s)) {
7391 if (packet->size != 8) {
7397 *comp = (act_comp & 0x10 ? 4 : 3);
7416 static int stbi__pnm_test(stbi__context *s)
7419 p = (char) stbi__get8(s);
7420 t = (char) stbi__get8(s);
7421 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7428 static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
7433 ri->bits_per_channel = stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n);
7434 if (ri->bits_per_channel == 0)
7437 if (s->img_y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
7438 if (s->img_x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
7442 if (comp) *comp = s->img_n;
7444 if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))
7445 return stbi__errpuc(
"too large",
"PNM too large");
7447 out = (
stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);
7448 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
7449 stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8));
7451 if (req_comp && req_comp != s->img_n) {
7452 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7453 if (out == NULL)
return out;
7458 static int stbi__pnm_isspace(
char c)
7460 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
7463 static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
7466 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7467 *c = (char) stbi__get8(s);
7469 if (stbi__at_eof(s) || *c !=
'#')
7472 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r' )
7473 *c = (
char) stbi__get8(s);
7477 static int stbi__pnm_isdigit(
char c)
7479 return c >=
'0' && c <=
'9';
7482 static int stbi__pnm_getinteger(stbi__context *s,
char *c)
7486 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7487 value = value*10 + (*c -
'0');
7488 *c = (char) stbi__get8(s);
7494 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
7501 if (!comp) comp = &dummy;
7506 p = (char) stbi__get8(s);
7507 t = (char) stbi__get8(s);
7508 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7513 *comp = (t ==
'6') ? 3 : 1;
7515 c = (char) stbi__get8(s);
7516 stbi__pnm_skip_whitespace(s, &c);
7518 *x = stbi__pnm_getinteger(s, &c);
7519 stbi__pnm_skip_whitespace(s, &c);
7521 *y = stbi__pnm_getinteger(s, &c);
7522 stbi__pnm_skip_whitespace(s, &c);
7524 maxv = stbi__pnm_getinteger(s, &c);
7526 return stbi__err(
"max value > 65535",
"PPM image supports only 8-bit and 16-bit images");
7527 else if (maxv > 255)
7533 static int stbi__pnm_is16(stbi__context *s)
7535 if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)
7541 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
7543 #ifndef STBI_NO_JPEG
7544 if (stbi__jpeg_info(s, x, y, comp))
return 1;
7548 if (stbi__png_info(s, x, y, comp))
return 1;
7552 if (stbi__gif_info(s, x, y, comp))
return 1;
7556 if (stbi__bmp_info(s, x, y, comp))
return 1;
7560 if (stbi__psd_info(s, x, y, comp))
return 1;
7564 if (stbi__pic_info(s, x, y, comp))
return 1;
7568 if (stbi__pnm_info(s, x, y, comp))
return 1;
7572 if (stbi__hdr_info(s, x, y, comp))
return 1;
7577 if (stbi__tga_info(s, x, y, comp))
7580 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
7583 static int stbi__is_16_main(stbi__context *s)
7586 if (stbi__png_is16(s))
return 1;
7590 if (stbi__psd_is16(s))
return 1;
7594 if (stbi__pnm_is16(s))
return 1;
7599 #ifndef STBI_NO_STDIO
7602 FILE *f = stbi__fopen(filename,
"rb");
7604 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7614 long pos = ftell(f);
7615 stbi__start_file(&s, f);
7616 r = stbi__info_main(&s,x,y,comp);
7617 fseek(f,pos,SEEK_SET);
7623 FILE *f = stbi__fopen(filename,
"rb");
7625 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7635 long pos = ftell(f);
7636 stbi__start_file(&s, f);
7637 r = stbi__is_16_main(&s);
7638 fseek(f,pos,SEEK_SET);
7646 stbi__start_mem(&s,buffer,len);
7647 return stbi__info_main(&s,x,y,comp);
7654 return stbi__info_main(&s,x,y,comp);
7660 stbi__start_mem(&s,buffer,len);
7661 return stbi__is_16_main(&s);
7668 return stbi__is_16_main(&s);
size_t compress(const void *src, size_t src_len, void *dest, size_t dest_len)
STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma)
STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
STBIDEF int stbi_is_16_bit_from_file(FILE *f)
STBIDEF char * stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen)
STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
STBIDEF float * stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_is_16_bit(char const *filename)
STBIDEF char * stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen)
STBIDEF stbi_us * stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp)
STBIDEF stbi_us * stbi_load_16(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user)
STBIDEF stbi_us * stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF const char * stbi_failure_reason(void)
STBIDEF stbi_uc * stbi_load_from_file(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
STBIDEF int stbi_is_hdr_from_file(FILE *f)
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma)
STBIDEF stbi_uc * stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF float * stbi_loadf_from_file(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply)
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
STBIDEF stbi_us * stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF void stbi_image_free(void *retval_from_stbi_load)
STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)
STBIDEF void stbi_hdr_to_ldr_scale(float scale)
STBIDEF int stbi_is_hdr(char const *filename)
STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
STBIDEF stbi_uc * stbi_load(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
STBIDEF float * stbi_loadf(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF void stbi_ldr_to_hdr_scale(float scale)
STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert)