127 #ifndef STBI_INCLUDE_STB_IMAGE_H
128 #define STBI_INCLUDE_STB_IMAGE_H
368 #ifndef STBI_NO_STDIO
370 #endif // STBI_NO_STDIO
372 #define STBI_VERSION 1
393 #ifdef STB_IMAGE_STATIC
394 #define STBIDEF static
396 #define STBIDEF extern
411 int (*read) (
void *user,
char *data,
int size);
412 void (*skip) (
void *user,
int n);
413 int (*eof) (
void *user);
424 #ifndef STBI_NO_STDIO
425 STBIDEF stbi_uc *
stbi_load (
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
434 #ifdef STBI_WINDOWS_UTF8
435 STBIDEF int stbi_convert_wchar_to_utf8(
char *buffer,
size_t bufferlen,
const wchar_t* input);
446 #ifndef STBI_NO_STDIO
455 #ifndef STBI_NO_LINEAR
459 #ifndef STBI_NO_STDIO
460 STBIDEF float *
stbi_loadf (
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
468 #endif // STBI_NO_HDR
470 #ifndef STBI_NO_LINEAR
473 #endif // STBI_NO_LINEAR
478 #ifndef STBI_NO_STDIO
481 #endif // STBI_NO_STDIO
497 #ifndef STBI_NO_STDIO
543 #endif // STBI_INCLUDE_STB_IMAGE_H
545 #ifdef STB_IMAGE_IMPLEMENTATION
547 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
548 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
549 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
550 || defined(STBI_ONLY_ZLIB)
551 #ifndef STBI_ONLY_JPEG
554 #ifndef STBI_ONLY_PNG
557 #ifndef STBI_ONLY_BMP
560 #ifndef STBI_ONLY_PSD
563 #ifndef STBI_ONLY_TGA
566 #ifndef STBI_ONLY_GIF
569 #ifndef STBI_ONLY_HDR
572 #ifndef STBI_ONLY_PIC
575 #ifndef STBI_ONLY_PNM
580 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
591 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
595 #ifndef STBI_NO_STDIO
601 #define STBI_ASSERT(x) assert(x)
605 #define STBI_EXTERN extern "C"
607 #define STBI_EXTERN extern
613 #define stbi_inline inline
618 #define stbi_inline __forceinline
621 #ifndef STBI_NO_THREAD_LOCALS
622 #if defined(__cplusplus) && __cplusplus >= 201103L
623 #define STBI_THREAD_LOCAL thread_local
624 #elif defined(__GNUC__) && __GNUC__ < 5
625 #define STBI_THREAD_LOCAL __thread
626 #elif defined(_MSC_VER)
627 #define STBI_THREAD_LOCAL __declspec(thread)
628 #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
629 #define STBI_THREAD_LOCAL _Thread_local
632 #ifndef STBI_THREAD_LOCAL
633 #if defined(__GNUC__)
634 #define STBI_THREAD_LOCAL __thread
639 #if defined(_MSC_VER) || defined(__SYMBIAN32__)
640 typedef unsigned short stbi__uint16;
641 typedef signed short stbi__int16;
642 typedef unsigned int stbi__uint32;
643 typedef signed int stbi__int32;
646 typedef uint16_t stbi__uint16;
647 typedef int16_t stbi__int16;
648 typedef uint32_t stbi__uint32;
649 typedef int32_t stbi__int32;
653 typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
656 #define STBI_NOTUSED(v) (void)(v)
658 #define STBI_NOTUSED(v) (void)sizeof(v)
662 #define STBI_HAS_LROTL
665 #ifdef STBI_HAS_LROTL
666 #define stbi_lrot(x,y) _lrotl(x,y)
668 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31)))
671 #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
673 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
676 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
680 #define STBI_MALLOC(sz) malloc(sz)
681 #define STBI_REALLOC(p,newsz) realloc(p,newsz)
682 #define STBI_FREE(p) free(p)
685 #ifndef STBI_REALLOC_SIZED
686 #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
690 #if defined(__x86_64__) || defined(_M_X64)
691 #define STBI__X64_TARGET
692 #elif defined(__i386) || defined(_M_IX86)
693 #define STBI__X86_TARGET
696 #if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
707 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
722 #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
724 #include <emmintrin.h>
728 #if _MSC_VER >= 1400 // not VC6
730 static int stbi__cpuid3(
void)
737 static int stbi__cpuid3(
void)
749 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
751 #if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
752 static int stbi__sse2_available(
void)
754 int info3 = stbi__cpuid3();
755 return ((info3 >> 26) & 1) != 0;
759 #else // assume GCC-style if not VC++
760 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
762 #if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
763 static int stbi__sse2_available(
void)
776 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)
781 #include <arm_neon.h>
783 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
785 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
789 #ifndef STBI_SIMD_ALIGN
790 #define STBI_SIMD_ALIGN(type, name) type name
793 #ifndef STBI_MAX_DIMENSIONS
794 #define STBI_MAX_DIMENSIONS (1 << 24)
805 stbi__uint32 img_x, img_y;
806 int img_n, img_out_n;
811 int read_from_callbacks;
814 int callback_already_read;
816 stbi_uc *img_buffer, *img_buffer_end;
817 stbi_uc *img_buffer_original, *img_buffer_original_end;
821 static void stbi__refill_buffer(stbi__context *
s);
824 static void stbi__start_mem(stbi__context *
s,
stbi_uc const *buffer,
int len)
827 s->read_from_callbacks = 0;
828 s->callback_already_read = 0;
829 s->img_buffer =
s->img_buffer_original = (
stbi_uc *) buffer;
830 s->img_buffer_end =
s->img_buffer_original_end = (
stbi_uc *) buffer+len;
837 s->io_user_data = user;
838 s->buflen =
sizeof(
s->buffer_start);
839 s->read_from_callbacks = 1;
840 s->callback_already_read = 0;
841 s->img_buffer =
s->img_buffer_original =
s->buffer_start;
842 stbi__refill_buffer(
s);
843 s->img_buffer_original_end =
s->img_buffer_end;
846 #ifndef STBI_NO_STDIO
848 static int stbi__stdio_read(
void *user,
char *data,
int size)
850 return (
int) fread(data,1,size,(FILE*) user);
853 static void stbi__stdio_skip(
void *user,
int n)
856 fseek((FILE*) user, n, SEEK_CUR);
857 ch = fgetc((FILE*) user);
859 ungetc(ch, (FILE *) user);
863 static int stbi__stdio_eof(
void *user)
865 return feof((FILE*) user) || ferror((FILE *) user);
875 static void stbi__start_file(stbi__context *
s, FILE *
f)
877 stbi__start_callbacks(
s, &stbi__stdio_callbacks, (
void *)
f);
882 #endif // !STBI_NO_STDIO
884 static void stbi__rewind(stbi__context *
s)
889 s->img_buffer =
s->img_buffer_original;
890 s->img_buffer_end =
s->img_buffer_original_end;
901 int bits_per_channel;
907 static int stbi__jpeg_test(stbi__context *
s);
908 static void *stbi__jpeg_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
909 static int stbi__jpeg_info(stbi__context *
s,
int *x,
int *y,
int *comp);
913 static int stbi__png_test(stbi__context *
s);
914 static void *stbi__png_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
915 static int stbi__png_info(stbi__context *
s,
int *x,
int *y,
int *comp);
916 static int stbi__png_is16(stbi__context *
s);
920 static int stbi__bmp_test(stbi__context *
s);
921 static void *stbi__bmp_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
922 static int stbi__bmp_info(stbi__context *
s,
int *x,
int *y,
int *comp);
926 static int stbi__tga_test(stbi__context *
s);
927 static void *stbi__tga_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
928 static int stbi__tga_info(stbi__context *
s,
int *x,
int *y,
int *comp);
932 static int stbi__psd_test(stbi__context *
s);
933 static void *stbi__psd_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc);
934 static int stbi__psd_info(stbi__context *
s,
int *x,
int *y,
int *comp);
935 static int stbi__psd_is16(stbi__context *
s);
939 static int stbi__hdr_test(stbi__context *
s);
940 static float *stbi__hdr_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
941 static int stbi__hdr_info(stbi__context *
s,
int *x,
int *y,
int *comp);
945 static int stbi__pic_test(stbi__context *
s);
946 static void *stbi__pic_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
947 static int stbi__pic_info(stbi__context *
s,
int *x,
int *y,
int *comp);
951 static int stbi__gif_test(stbi__context *
s);
952 static void *stbi__gif_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
953 static void *stbi__load_gif_main(stbi__context *
s,
int **delays,
int *x,
int *y,
int *z,
int *comp,
int req_comp);
954 static int stbi__gif_info(stbi__context *
s,
int *x,
int *y,
int *comp);
958 static int stbi__pnm_test(stbi__context *
s);
959 static void *stbi__pnm_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
960 static int stbi__pnm_info(stbi__context *
s,
int *x,
int *y,
int *comp);
961 static int stbi__pnm_is16(stbi__context *
s);
965 #ifdef STBI_THREAD_LOCAL
968 const char *stbi__g_failure_reason;
972 return stbi__g_failure_reason;
975 #ifndef STBI_NO_FAILURE_STRINGS
976 static int stbi__err(
const char *str)
978 stbi__g_failure_reason = str;
983 static void *stbi__malloc(
size_t size)
985 return STBI_MALLOC(size);
1000 static int stbi__addsizes_valid(
int a,
int b)
1002 if (b < 0)
return 0;
1007 return a <= INT_MAX - b;
1012 static int stbi__mul2sizes_valid(
int a,
int b)
1014 if (a < 0 || b < 0)
return 0;
1015 if (b == 0)
return 1;
1017 return a <= INT_MAX/b;
1020 #if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1022 static int stbi__mad2sizes_valid(
int a,
int b,
int add)
1024 return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
1029 static int stbi__mad3sizes_valid(
int a,
int b,
int c,
int add)
1031 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b,
c) &&
1032 stbi__addsizes_valid(a*b*
c, add);
1036 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1037 static int stbi__mad4sizes_valid(
int a,
int b,
int c,
int d,
int add)
1039 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b,
c) &&
1040 stbi__mul2sizes_valid(a*b*
c, d) && stbi__addsizes_valid(a*b*
c*d, add);
1044 #if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1046 static void *stbi__malloc_mad2(
int a,
int b,
int add)
1048 if (!stbi__mad2sizes_valid(a, b, add))
return NULL;
1049 return stbi__malloc(a*b + add);
1053 static void *stbi__malloc_mad3(
int a,
int b,
int c,
int add)
1055 if (!stbi__mad3sizes_valid(a, b,
c, add))
return NULL;
1056 return stbi__malloc(a*b*
c + add);
1059 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1060 static void *stbi__malloc_mad4(
int a,
int b,
int c,
int d,
int add)
1062 if (!stbi__mad4sizes_valid(a, b,
c, d, add))
return NULL;
1063 return stbi__malloc(a*b*
c*d + add);
1068 static int stbi__addints_valid(
int a,
int b)
1070 if ((a >= 0) != (b >= 0))
return 1;
1071 if (a < 0 && b < 0)
return a >= INT_MIN - b;
1072 return a <= INT_MAX - b;
1076 static int stbi__mul2shorts_valid(
short a,
short b)
1078 if (b == 0 || b == -1)
return 1;
1079 if ((a >= 0) == (b >= 0))
return a <= SHRT_MAX/b;
1080 if (b < 0)
return a <= SHRT_MIN / b;
1081 return a >= SHRT_MIN / b;
1088 #ifdef STBI_NO_FAILURE_STRINGS
1089 #define stbi__err(x,y) 0
1090 #elif defined(STBI_FAILURE_USERMSG)
1091 #define stbi__err(x,y) stbi__err(y)
1093 #define stbi__err(x,y) stbi__err(x)
1096 #define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
1097 #define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
1101 STBI_FREE(retval_from_stbi_load);
1104 #ifndef STBI_NO_LINEAR
1105 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp);
1109 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
1112 static int stbi__vertically_flip_on_load_global = 0;
1116 stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
1119 #ifndef STBI_THREAD_LOCAL
1120 #define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global
1122 static STBI_THREAD_LOCAL
int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
1126 stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
1127 stbi__vertically_flip_on_load_set = 1;
1130 #define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \
1131 ? stbi__vertically_flip_on_load_local \
1132 : stbi__vertically_flip_on_load_global)
1133 #endif // STBI_THREAD_LOCAL
1135 static void *stbi__load_main(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
1137 memset(ri, 0,
sizeof(*ri));
1138 ri->bits_per_channel = 8;
1139 ri->channel_order = STBI_ORDER_RGB;
1140 ri->num_channels = 0;
1145 if (stbi__png_test(
s))
return stbi__png_load(
s,x,y,comp,req_comp, ri);
1148 if (stbi__bmp_test(
s))
return stbi__bmp_load(
s,x,y,comp,req_comp, ri);
1151 if (stbi__gif_test(
s))
return stbi__gif_load(
s,x,y,comp,req_comp, ri);
1154 if (stbi__psd_test(
s))
return stbi__psd_load(
s,x,y,comp,req_comp, ri, bpc);
1159 if (stbi__pic_test(
s))
return stbi__pic_load(
s,x,y,comp,req_comp, ri);
1165 #ifndef STBI_NO_JPEG
1166 if (stbi__jpeg_test(
s))
return stbi__jpeg_load(
s,x,y,comp,req_comp, ri);
1169 if (stbi__pnm_test(
s))
return stbi__pnm_load(
s,x,y,comp,req_comp, ri);
1173 if (stbi__hdr_test(
s)) {
1174 float *hdr = stbi__hdr_load(
s, x,y,comp,req_comp, ri);
1175 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
1181 if (stbi__tga_test(
s))
1182 return stbi__tga_load(
s,x,y,comp,req_comp, ri);
1185 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
1188 static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig,
int w,
int h,
int channels)
1191 int img_len = w * h * channels;
1194 reduced = (
stbi_uc *) stbi__malloc(img_len);
1195 if (reduced == NULL)
return stbi__errpuc(
"outofmem",
"Out of memory");
1197 for (
i = 0;
i < img_len; ++
i)
1198 reduced[
i] = (
stbi_uc)((orig[
i] >> 8) & 0xFF);
1204 static stbi__uint16 *stbi__convert_8_to_16(
stbi_uc *orig,
int w,
int h,
int channels)
1207 int img_len = w * h * channels;
1208 stbi__uint16 *enlarged;
1210 enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
1211 if (enlarged == NULL)
return (stbi__uint16 *) stbi__errpuc(
"outofmem",
"Out of memory");
1213 for (
i = 0;
i < img_len; ++
i)
1214 enlarged[
i] = (stbi__uint16)((orig[
i] << 8) + orig[
i]);
1220 static void stbi__vertical_flip(
void *image,
int w,
int h,
int bytes_per_pixel)
1223 size_t bytes_per_row = (size_t)w * bytes_per_pixel;
1227 for (row = 0; row < (h>>1); row++) {
1228 stbi_uc *row0 = bytes + row*bytes_per_row;
1229 stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
1231 size_t bytes_left = bytes_per_row;
1232 while (bytes_left) {
1233 size_t bytes_copy = (bytes_left <
sizeof(temp)) ? bytes_left :
sizeof(temp);
1234 memcpy(temp, row0, bytes_copy);
1235 memcpy(row0, row1, bytes_copy);
1236 memcpy(row1, temp, bytes_copy);
1239 bytes_left -= bytes_copy;
1245 static void stbi__vertical_flip_slices(
void *image,
int w,
int h,
int z,
int bytes_per_pixel)
1248 int slice_size = w * h * bytes_per_pixel;
1251 for (slice = 0; slice < z; ++slice) {
1252 stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
1253 bytes += slice_size;
1258 static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp)
1260 stbi__result_info ri;
1261 void *result = stbi__load_main(
s, x, y, comp, req_comp, &ri, 8);
1267 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1269 if (ri.bits_per_channel != 8) {
1270 result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1271 ri.bits_per_channel = 8;
1276 if (stbi__vertically_flip_on_load) {
1277 int channels = req_comp ? req_comp : *comp;
1278 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
stbi_uc));
1281 return (
unsigned char *) result;
1284 static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp)
1286 stbi__result_info ri;
1287 void *result = stbi__load_main(
s, x, y, comp, req_comp, &ri, 16);
1293 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1295 if (ri.bits_per_channel != 16) {
1296 result = stbi__convert_8_to_16((
stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1297 ri.bits_per_channel = 16;
1303 if (stbi__vertically_flip_on_load) {
1304 int channels = req_comp ? req_comp : *comp;
1305 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi__uint16));
1308 return (stbi__uint16 *) result;
1311 #if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
1312 static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp)
1314 if (stbi__vertically_flip_on_load && result != NULL) {
1315 int channels = req_comp ? req_comp : *comp;
1316 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
float));
1321 #ifndef STBI_NO_STDIO
1323 #if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1324 STBI_EXTERN __declspec(dllimport)
int __stdcall MultiByteToWideChar(
unsigned int cp,
unsigned long flags,
const char *str,
int cbmb,
wchar_t *widestr,
int cchwide);
1325 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);
1328 #if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1329 STBIDEF int stbi_convert_wchar_to_utf8(
char *buffer,
size_t bufferlen,
const wchar_t* input)
1331 return WideCharToMultiByte(65001 , 0, input, -1, buffer, (
int) bufferlen, NULL, NULL);
1335 static FILE *stbi__fopen(
char const *filename,
char const *
mode)
1338 #if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1340 wchar_t wFilename[1024];
1341 if (0 == MultiByteToWideChar(65001 , 0, filename, -1, wFilename,
sizeof(wFilename)/
sizeof(*wFilename)))
1344 if (0 == MultiByteToWideChar(65001 , 0,
mode, -1, wMode,
sizeof(wMode)/
sizeof(*wMode)))
1347 #if defined(_MSC_VER) && _MSC_VER >= 1400
1348 if (0 != _wfopen_s(&
f, wFilename, wMode))
1351 f = _wfopen(wFilename, wMode);
1354 #elif defined(_MSC_VER) && _MSC_VER >= 1400
1355 if (0 != fopen_s(&
f, filename,
mode))
1358 f = fopen(filename,
mode);
1366 FILE *
f = stbi__fopen(filename,
"rb");
1367 unsigned char *result;
1368 if (!
f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1376 unsigned char *result;
1378 stbi__start_file(&
s,
f);
1379 result = stbi__load_and_postprocess_8bit(&
s,x,y,comp,req_comp);
1382 fseek(
f, - (
int) (
s.img_buffer_end -
s.img_buffer), SEEK_CUR);
1389 stbi__uint16 *result;
1391 stbi__start_file(&
s,
f);
1392 result = stbi__load_and_postprocess_16bit(&
s,x,y,comp,req_comp);
1395 fseek(
f, - (
int) (
s.img_buffer_end -
s.img_buffer), SEEK_CUR);
1402 FILE *
f = stbi__fopen(filename,
"rb");
1403 stbi__uint16 *result;
1404 if (!
f)
return (
stbi_us *) stbi__errpuc(
"can't fopen",
"Unable to open file");
1416 stbi__start_mem(&
s,buffer,len);
1417 return stbi__load_and_postprocess_16bit(&
s,x,y,channels_in_file,desired_channels);
1424 return stbi__load_and_postprocess_16bit(&
s,x,y,channels_in_file,desired_channels);
1430 stbi__start_mem(&
s,buffer,len);
1431 return stbi__load_and_postprocess_8bit(&
s,x,y,comp,req_comp);
1438 return stbi__load_and_postprocess_8bit(&
s,x,y,comp,req_comp);
1444 unsigned char *result;
1446 stbi__start_mem(&
s,buffer,len);
1448 result = (
unsigned char*) stbi__load_gif_main(&
s, delays, x, y, z, comp, req_comp);
1449 if (stbi__vertically_flip_on_load) {
1450 stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
1457 #ifndef STBI_NO_LINEAR
1458 static float *stbi__loadf_main(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp)
1460 unsigned char *data;
1462 if (stbi__hdr_test(
s)) {
1463 stbi__result_info ri;
1464 float *hdr_data = stbi__hdr_load(
s,x,y,comp,req_comp, &ri);
1466 stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1470 data = stbi__load_and_postprocess_8bit(
s, x, y, comp, req_comp);
1472 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1473 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1479 stbi__start_mem(&
s,buffer,len);
1480 return stbi__loadf_main(&
s,x,y,comp,req_comp);
1487 return stbi__loadf_main(&
s,x,y,comp,req_comp);
1490 #ifndef STBI_NO_STDIO
1491 STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1494 FILE *
f = stbi__fopen(filename,
"rb");
1495 if (!
f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1504 stbi__start_file(&
s,
f);
1505 return stbi__loadf_main(&
s,x,y,comp,req_comp);
1507 #endif // !STBI_NO_STDIO
1509 #endif // !STBI_NO_LINEAR
1519 stbi__start_mem(&
s,buffer,len);
1520 return stbi__hdr_test(&
s);
1522 STBI_NOTUSED(buffer);
1528 #ifndef STBI_NO_STDIO
1531 FILE *
f = stbi__fopen(filename,
"rb");
1543 long pos = ftell(
f);
1546 stbi__start_file(&
s,
f);
1547 res = stbi__hdr_test(&
s);
1548 fseek(
f, pos, SEEK_SET);
1555 #endif // !STBI_NO_STDIO
1562 return stbi__hdr_test(&
s);
1570 #ifndef STBI_NO_LINEAR
1571 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1577 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1595 static void stbi__refill_buffer(stbi__context *
s)
1597 int n = (
s->io.read)(
s->io_user_data,(
char*)
s->buffer_start,
s->buflen);
1598 s->callback_already_read += (int) (
s->img_buffer -
s->img_buffer_original);
1602 s->read_from_callbacks = 0;
1603 s->img_buffer =
s->buffer_start;
1604 s->img_buffer_end =
s->buffer_start+1;
1607 s->img_buffer =
s->buffer_start;
1608 s->img_buffer_end =
s->buffer_start + n;
1612 stbi_inline
static stbi_uc stbi__get8(stbi__context *
s)
1614 if (
s->img_buffer <
s->img_buffer_end)
1615 return *
s->img_buffer++;
1616 if (
s->read_from_callbacks) {
1617 stbi__refill_buffer(
s);
1618 return *
s->img_buffer++;
1623 #if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1626 stbi_inline
static int stbi__at_eof(stbi__context *
s)
1629 if (!(
s->io.eof)(
s->io_user_data))
return 0;
1632 if (
s->read_from_callbacks == 0)
return 1;
1635 return s->img_buffer >=
s->img_buffer_end;
1639 #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)
1642 static void stbi__skip(stbi__context *
s,
int n)
1646 s->img_buffer =
s->img_buffer_end;
1650 int blen = (int) (
s->img_buffer_end -
s->img_buffer);
1652 s->img_buffer =
s->img_buffer_end;
1653 (
s->io.skip)(
s->io_user_data, n - blen);
1661 #if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
1664 static int stbi__getn(stbi__context *
s,
stbi_uc *buffer,
int n)
1667 int blen = (int) (
s->img_buffer_end -
s->img_buffer);
1671 memcpy(buffer,
s->img_buffer, blen);
1673 count = (
s->io.read)(
s->io_user_data, (
char*) buffer + blen, n - blen);
1674 res = (count == (n-blen));
1675 s->img_buffer =
s->img_buffer_end;
1680 if (
s->img_buffer+n <= s->img_buffer_end) {
1681 memcpy(buffer,
s->img_buffer, n);
1689 #if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1692 static int stbi__get16be(stbi__context *
s)
1694 int z = stbi__get8(
s);
1695 return (z << 8) + stbi__get8(
s);
1699 #if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1702 static stbi__uint32 stbi__get32be(stbi__context *
s)
1704 stbi__uint32 z = stbi__get16be(
s);
1705 return (z << 16) + stbi__get16be(
s);
1709 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1712 static int stbi__get16le(stbi__context *
s)
1714 int z = stbi__get8(
s);
1715 return z + (stbi__get8(
s) << 8);
1720 static stbi__uint32 stbi__get32le(stbi__context *
s)
1722 stbi__uint32 z = stbi__get16le(
s);
1723 z += (stbi__uint32)stbi__get16le(
s) << 16;
1728 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
1730 #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)
1744 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1746 return (
stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
1750 #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)
1753 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1756 unsigned char *good;
1758 if (req_comp == img_n)
return data;
1759 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1761 good = (
unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
1764 return stbi__errpuc(
"outofmem",
"Out of memory");
1767 for (
j=0;
j < (int) y; ++
j) {
1768 unsigned char *
src = data +
j * x * img_n ;
1769 unsigned char *
dest = good +
j * x * req_comp;
1771 #define STBI__COMBO(a,b) ((a)*8+(b))
1772 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1775 switch (STBI__COMBO(img_n, req_comp)) {
1776 STBI__CASE(1,2) {
dest[0]=
src[0];
dest[1]=255; }
break;
1779 STBI__CASE(2,1) {
dest[0]=
src[0]; }
break;
1783 STBI__CASE(3,1) {
dest[0]=stbi__compute_y(
src[0],
src[1],
src[2]); }
break;
1784 STBI__CASE(3,2) {
dest[0]=stbi__compute_y(
src[0],
src[1],
src[2]);
dest[1] = 255; }
break;
1785 STBI__CASE(4,1) {
dest[0]=stbi__compute_y(
src[0],
src[1],
src[2]); }
break;
1788 default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good);
return stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1798 #if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1801 static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b)
1803 return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);
1807 #if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1810 static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1815 if (req_comp == img_n)
return data;
1816 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1818 good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
1821 return (stbi__uint16 *) stbi__errpuc(
"outofmem",
"Out of memory");
1824 for (
j=0;
j < (int) y; ++
j) {
1825 stbi__uint16 *
src = data +
j * x * img_n ;
1826 stbi__uint16 *
dest = good +
j * x * req_comp;
1828 #define STBI__COMBO(a,b) ((a)*8+(b))
1829 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1832 switch (STBI__COMBO(img_n, req_comp)) {
1833 STBI__CASE(1,2) {
dest[0]=
src[0];
dest[1]=0xffff; }
break;
1836 STBI__CASE(2,1) {
dest[0]=
src[0]; }
break;
1840 STBI__CASE(3,1) {
dest[0]=stbi__compute_y_16(
src[0],
src[1],
src[2]); }
break;
1841 STBI__CASE(3,2) {
dest[0]=stbi__compute_y_16(
src[0],
src[1],
src[2]);
dest[1] = 0xffff; }
break;
1842 STBI__CASE(4,1) {
dest[0]=stbi__compute_y_16(
src[0],
src[1],
src[2]); }
break;
1845 default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good);
return (stbi__uint16*) stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1855 #ifndef STBI_NO_LINEAR
1856 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp)
1860 if (!data)
return NULL;
1861 output = (
float *) stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1862 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1864 if (comp & 1) n = comp;
else n = comp-1;
1865 for (
i=0;
i < x*y; ++
i) {
1866 for (k=0; k < n; ++k) {
1867 output[
i*comp + k] = (float) (pow(data[
i*comp+k]/255.0
f, stbi__l2h_gamma) * stbi__l2h_scale);
1871 for (
i=0;
i < x*y; ++
i) {
1872 output[
i*comp + n] = data[
i*comp + n]/255.0f;
1881 #define stbi__float2int(x) ((int) (x))
1882 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1886 if (!data)
return NULL;
1887 output = (
stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
1888 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1890 if (comp & 1) n = comp;
else n = comp-1;
1891 for (
i=0;
i < x*y; ++
i) {
1892 for (k=0; k < n; ++k) {
1893 float z = (float) pow(data[
i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1895 if (z > 255) z = 255;
1896 output[
i*comp + k] = (
stbi_uc) stbi__float2int(z);
1899 float z = data[
i*comp+k] * 255 + 0.5f;
1901 if (z > 255) z = 255;
1902 output[
i*comp + k] = (
stbi_uc) stbi__float2int(z);
1931 #ifndef STBI_NO_JPEG
1934 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
1940 stbi__uint16 code[256];
1943 unsigned int maxcode[18];
1950 stbi__huffman huff_dc[4];
1951 stbi__huffman huff_ac[4];
1952 stbi__uint16 dequant[4][64];
1953 stbi__int16 fast_ac[4][1 << FAST_BITS];
1956 int img_h_max, img_v_max;
1957 int img_mcu_x, img_mcu_y;
1958 int img_mcu_w, img_mcu_h;
1971 void *raw_data, *raw_coeff;
1974 int coeff_w, coeff_h;
1977 stbi__uint32 code_buffer;
1979 unsigned char marker;
1989 int app14_color_transform;
1992 int scan_n, order[4];
1993 int restart_interval, todo;
1996 void (*idct_block_kernel)(
stbi_uc *out,
int out_stride,
short data[64]);
2001 static int stbi__build_huffman(stbi__huffman *h,
int *count)
2006 for (
i=0;
i < 16; ++
i) {
2007 for (
j=0;
j < count[
i]; ++
j) {
2009 if(k >= 257)
return stbi__err(
"bad size list",
"Corrupt JPEG");
2017 for(
j=1;
j <= 16; ++
j) {
2019 h->delta[
j] = k - code;
2020 if (h->size[k] ==
j) {
2021 while (h->size[k] ==
j)
2022 h->code[k++] = (stbi__uint16) (code++);
2023 if (code-1 >= (1u <<
j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
2026 h->maxcode[
j] = code << (16-
j);
2029 h->maxcode[
j] = 0xffffffff;
2032 memset(h->fast, 255, 1 << FAST_BITS);
2033 for (
i=0;
i < k; ++
i) {
2035 if (
s <= FAST_BITS) {
2036 int c = h->code[
i] << (FAST_BITS-
s);
2037 int m = 1 << (FAST_BITS-
s);
2038 for (
j=0;
j < m; ++
j) {
2048 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
2051 for (
i=0;
i < (1 << FAST_BITS); ++
i) {
2055 int rs = h->values[fast];
2056 int run = (rs >> 4) & 15;
2057 int magbits = rs & 15;
2058 int len = h->size[fast];
2060 if (magbits && len + magbits <= FAST_BITS) {
2062 int k = ((
i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
2063 int m = 1 << (magbits - 1);
2064 if (k < m) k += (~0U << magbits) + 1;
2066 if (k >= -128 && k <= 127)
2067 fast_ac[
i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
2073 static void stbi__grow_buffer_unsafe(stbi__jpeg *
j)
2076 unsigned int b =
j->nomore ? 0 : stbi__get8(
j->s);
2078 int c = stbi__get8(
j->s);
2079 while (
c == 0xff)
c = stbi__get8(
j->s);
2081 j->marker = (
unsigned char)
c;
2086 j->code_buffer |= b << (24 -
j->code_bits);
2088 }
while (
j->code_bits <= 24);
2092 static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
2095 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *
j, stbi__huffman *h)
2100 if (
j->code_bits < 16) stbi__grow_buffer_unsafe(
j);
2104 c = (
j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2108 if (
s >
j->code_bits)
2110 j->code_buffer <<=
s;
2112 return h->values[k];
2121 temp =
j->code_buffer >> 16;
2122 for (k=FAST_BITS+1 ; ; ++k)
2123 if (temp < h->maxcode[k])
2131 if (k >
j->code_bits)
2135 c = ((
j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
2136 if(c < 0 || c >= 256)
2138 STBI_ASSERT((((
j->code_buffer) >> (32 - h->size[
c])) & stbi__bmask[h->size[
c]]) == h->code[
c]);
2142 j->code_buffer <<= k;
2143 return h->values[
c];
2147 static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
2151 stbi_inline
static int stbi__extend_receive(stbi__jpeg *
j,
int n)
2155 if (
j->code_bits < n) stbi__grow_buffer_unsafe(
j);
2156 if (
j->code_bits < n)
return 0;
2158 sgn =
j->code_buffer >> 31;
2159 k = stbi_lrot(
j->code_buffer, n);
2160 j->code_buffer = k & ~stbi__bmask[n];
2161 k &= stbi__bmask[n];
2163 return k + (stbi__jbias[n] & (sgn - 1));
2167 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *
j,
int n)
2170 if (
j->code_bits < n) stbi__grow_buffer_unsafe(
j);
2171 if (
j->code_bits < n)
return 0;
2172 k = stbi_lrot(
j->code_buffer, n);
2173 j->code_buffer = k & ~stbi__bmask[n];
2174 k &= stbi__bmask[n];
2179 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *
j)
2182 if (
j->code_bits < 1) stbi__grow_buffer_unsafe(
j);
2183 if (
j->code_bits < 1)
return 0;
2185 j->code_buffer <<= 1;
2187 return k & 0x80000000;
2192 static const stbi_uc stbi__jpeg_dezigzag[64+15] =
2194 0, 1, 8, 16, 9, 2, 3, 10,
2195 17, 24, 32, 25, 18, 11, 4, 5,
2196 12, 19, 26, 33, 40, 48, 41, 34,
2197 27, 20, 13, 6, 7, 14, 21, 28,
2198 35, 42, 49, 56, 57, 50, 43, 36,
2199 29, 22, 15, 23, 30, 37, 44, 51,
2200 58, 59, 52, 45, 38, 31, 39, 46,
2201 53, 60, 61, 54, 47, 55, 62, 63,
2203 63, 63, 63, 63, 63, 63, 63, 63,
2204 63, 63, 63, 63, 63, 63, 63
2208 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)
2213 if (
j->code_bits < 16) stbi__grow_buffer_unsafe(
j);
2214 t = stbi__jpeg_huff_decode(
j, hdc);
2215 if (t < 0 || t > 15)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2218 memset(data,0,64*
sizeof(data[0]));
2220 diff = t ? stbi__extend_receive(
j, t) : 0;
2221 if (!stbi__addints_valid(
j->img_comp[b].dc_pred, diff))
return stbi__err(
"bad delta",
"Corrupt JPEG");
2222 dc =
j->img_comp[b].dc_pred + diff;
2223 j->img_comp[b].dc_pred = dc;
2224 if ((dc > SHRT_MAX) || (dequant[0] > SHRT_MAX) || !stbi__mul2shorts_valid((
short) dc, (
short) dequant[0]))
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2225 data[0] = (short) (dc * dequant[0]);
2232 if (
j->code_bits < 16) stbi__grow_buffer_unsafe(
j);
2233 c = (
j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2238 if (
s >
j->code_bits)
return stbi__err(
"bad huffman code",
"Combined length longer than code bits available");
2239 j->code_buffer <<=
s;
2242 zig = stbi__jpeg_dezigzag[k++];
2243 data[zig] = (short) ((r >> 8) * dequant[zig]);
2245 int rs = stbi__jpeg_huff_decode(
j, hac);
2246 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2250 if (rs != 0xf0)
break;
2255 zig = stbi__jpeg_dezigzag[k++];
2256 data[zig] = (short) (stbi__extend_receive(
j,
s) * dequant[zig]);
2263 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *
j,
short data[64], stbi__huffman *hdc,
int b)
2267 if (
j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2269 if (
j->code_bits < 16) stbi__grow_buffer_unsafe(
j);
2271 if (
j->succ_high == 0) {
2273 memset(data,0,64*
sizeof(data[0]));
2274 t = stbi__jpeg_huff_decode(
j, hdc);
2275 if (t < 0 || t > 15)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2276 diff = t ? stbi__extend_receive(
j, t) : 0;
2278 if (!stbi__addints_valid(
j->img_comp[b].dc_pred, diff))
return stbi__err(
"bad delta",
"Corrupt JPEG");
2279 dc =
j->img_comp[b].dc_pred + diff;
2280 j->img_comp[b].dc_pred = dc;
2281 if ((dc > SHRT_MAX) || !stbi__mul2shorts_valid((
short) dc, 1 <<
j->succ_low))
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2282 data[0] = (short) (dc * (1 <<
j->succ_low));
2285 if (stbi__jpeg_get_bit(
j))
2286 data[0] += (
short) (1 <<
j->succ_low);
2293 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *
j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
2296 if (
j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2298 if (
j->succ_high == 0) {
2299 int shift =
j->succ_low;
2310 if (
j->code_bits < 16) stbi__grow_buffer_unsafe(
j);
2311 c = (
j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2316 if (
s >
j->code_bits)
return stbi__err(
"bad huffman code",
"Combined length longer than code bits available");
2317 j->code_buffer <<=
s;
2319 zig = stbi__jpeg_dezigzag[k++];
2320 data[zig] = (short) ((r >> 8) * (1 << shift));
2322 int rs = stbi__jpeg_huff_decode(
j, hac);
2323 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2328 j->eob_run = (1 << r);
2330 j->eob_run += stbi__jpeg_get_bits(
j, r);
2337 zig = stbi__jpeg_dezigzag[k++];
2338 data[zig] = (short) (stbi__extend_receive(
j,
s) * (1 << shift));
2341 }
while (k <= j->spec_end);
2345 short bit = (short) (1 <<
j->succ_low);
2349 for (k =
j->spec_start; k <= j->spec_end; ++k) {
2350 short *p = &data[stbi__jpeg_dezigzag[k]];
2352 if (stbi__jpeg_get_bit(
j))
2353 if ((*p & bit)==0) {
2364 int rs = stbi__jpeg_huff_decode(
j, hac);
2365 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2370 j->eob_run = (1 << r) - 1;
2372 j->eob_run += stbi__jpeg_get_bits(
j, r);
2380 if (
s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2382 if (stbi__jpeg_get_bit(
j))
2389 while (k <= j->spec_end) {
2390 short *p = &data[stbi__jpeg_dezigzag[k++]];
2392 if (stbi__jpeg_get_bit(
j))
2393 if ((*p & bit)==0) {
2407 }
while (k <= j->spec_end);
2414 stbi_inline
static stbi_uc stbi__clamp(
int x)
2417 if ((
unsigned int) x > 255) {
2418 if (x < 0)
return 0;
2419 if (x > 255)
return 255;
2424 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
2425 #define stbi__fsh(x) ((x) * 4096)
2428 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2429 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2432 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
2433 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
2434 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
2437 t0 = stbi__fsh(p2+p3); \
2438 t1 = stbi__fsh(p2-p3); \
2451 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
2452 t0 = t0*stbi__f2f( 0.298631336f); \
2453 t1 = t1*stbi__f2f( 2.053119869f); \
2454 t2 = t2*stbi__f2f( 3.072711026f); \
2455 t3 = t3*stbi__f2f( 1.501321110f); \
2456 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
2457 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
2458 p3 = p3*stbi__f2f(-1.961570560f); \
2459 p4 = p4*stbi__f2f(-0.390180644f); \
2465 static void stbi__idct_block(
stbi_uc *out,
int out_stride,
short data[64])
2467 int i,val[64],*v=val;
2472 for (
i=0;
i < 8; ++
i,++d, ++v) {
2474 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
2475 && d[40]==0 && d[48]==0 && d[56]==0) {
2480 int dcterm = d[0]*4;
2481 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2483 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
2486 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2487 v[ 0] = (x0+t3) >> 10;
2488 v[56] = (x0-t3) >> 10;
2489 v[ 8] = (x1+t2) >> 10;
2490 v[48] = (x1-t2) >> 10;
2491 v[16] = (x2+t1) >> 10;
2492 v[40] = (x2-t1) >> 10;
2493 v[24] = (x3+t0) >> 10;
2494 v[32] = (x3-t0) >> 10;
2498 for (
i=0, v=val, o=out;
i < 8; ++
i,v+=8,o+=out_stride) {
2500 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
2507 x0 += 65536 + (128<<17);
2508 x1 += 65536 + (128<<17);
2509 x2 += 65536 + (128<<17);
2510 x3 += 65536 + (128<<17);
2513 o[0] = stbi__clamp((x0+t3) >> 17);
2514 o[7] = stbi__clamp((x0-t3) >> 17);
2515 o[1] = stbi__clamp((x1+t2) >> 17);
2516 o[6] = stbi__clamp((x1-t2) >> 17);
2517 o[2] = stbi__clamp((x2+t1) >> 17);
2518 o[5] = stbi__clamp((x2-t1) >> 17);
2519 o[3] = stbi__clamp((x3+t0) >> 17);
2520 o[4] = stbi__clamp((x3-t0) >> 17);
2528 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2531 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2535 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2539 #define dct_rot(out0,out1, x,y,c0,c1) \
2540 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2541 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2542 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2543 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2544 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2545 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2548 #define dct_widen(out, in) \
2549 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2550 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2553 #define dct_wadd(out, a, b) \
2554 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2555 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2558 #define dct_wsub(out, a, b) \
2559 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2560 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2563 #define dct_bfly32o(out0, out1, a,b,bias,s) \
2565 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2566 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2567 dct_wadd(sum, abiased, b); \
2568 dct_wsub(dif, abiased, b); \
2569 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2570 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2574 #define dct_interleave8(a, b) \
2576 a = _mm_unpacklo_epi8(a, b); \
2577 b = _mm_unpackhi_epi8(tmp, b)
2580 #define dct_interleave16(a, b) \
2582 a = _mm_unpacklo_epi16(a, b); \
2583 b = _mm_unpackhi_epi16(tmp, b)
2585 #define dct_pass(bias,shift) \
2588 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2589 __m128i sum04 = _mm_add_epi16(row0, row4); \
2590 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2591 dct_widen(t0e, sum04); \
2592 dct_widen(t1e, dif04); \
2593 dct_wadd(x0, t0e, t3e); \
2594 dct_wsub(x3, t0e, t3e); \
2595 dct_wadd(x1, t1e, t2e); \
2596 dct_wsub(x2, t1e, t2e); \
2598 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2599 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2600 __m128i sum17 = _mm_add_epi16(row1, row7); \
2601 __m128i sum35 = _mm_add_epi16(row3, row5); \
2602 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2603 dct_wadd(x4, y0o, y4o); \
2604 dct_wadd(x5, y1o, y5o); \
2605 dct_wadd(x6, y2o, y5o); \
2606 dct_wadd(x7, y3o, y4o); \
2607 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2608 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2609 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2610 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2613 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961
f), stbi__f2f(0.5411961
f) + stbi__f2f(-1.847759065
f));
2614 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961
f) + stbi__f2f( 0.765366865
f), stbi__f2f(0.5411961
f));
2615 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602
f) + stbi__f2f(-0.899976223
f), stbi__f2f(1.175875602
f));
2616 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602
f), stbi__f2f(1.175875602
f) + stbi__f2f(-2.562915447
f));
2617 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560
f) + stbi__f2f( 0.298631336
f), stbi__f2f(-1.961570560
f));
2618 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560
f), stbi__f2f(-1.961570560
f) + stbi__f2f( 3.072711026
f));
2619 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644
f) + stbi__f2f( 2.053119869
f), stbi__f2f(-0.390180644
f));
2620 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644
f), stbi__f2f(-0.390180644
f) + stbi__f2f( 1.501321110
f));
2623 __m128i bias_0 = _mm_set1_epi32(512);
2624 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2627 row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
2628 row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
2629 row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
2630 row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
2631 row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
2632 row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
2633 row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
2634 row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
2637 dct_pass(bias_0, 10);
2641 dct_interleave16(row0, row4);
2642 dct_interleave16(row1, row5);
2643 dct_interleave16(row2, row6);
2644 dct_interleave16(row3, row7);
2647 dct_interleave16(row0, row2);
2648 dct_interleave16(row1, row3);
2649 dct_interleave16(row4, row6);
2650 dct_interleave16(row5, row7);
2653 dct_interleave16(row0, row1);
2654 dct_interleave16(row2, row3);
2655 dct_interleave16(row4, row5);
2656 dct_interleave16(row6, row7);
2660 dct_pass(bias_1, 17);
2664 __m128i p0 = _mm_packus_epi16(row0, row1);
2665 __m128i p1 = _mm_packus_epi16(row2, row3);
2666 __m128i p2 = _mm_packus_epi16(row4, row5);
2667 __m128i p3 = _mm_packus_epi16(row6, row7);
2670 dct_interleave8(p0, p2);
2671 dct_interleave8(p1, p3);
2674 dct_interleave8(p0, p1);
2675 dct_interleave8(p2, p3);
2678 dct_interleave8(p0, p2);
2679 dct_interleave8(p1, p3);
2682 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2683 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2684 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2685 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2686 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2687 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2688 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2689 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2698 #undef dct_interleave8
2699 #undef dct_interleave16
2709 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2711 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2713 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961
f));
2714 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065
f));
2715 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865
f));
2716 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602
f));
2717 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223
f));
2718 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447
f));
2719 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560
f));
2720 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644
f));
2721 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336
f));
2722 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869
f));
2723 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026
f));
2724 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110
f));
2726 #define dct_long_mul(out, inq, coeff) \
2727 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2728 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2730 #define dct_long_mac(out, acc, inq, coeff) \
2731 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2732 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2734 #define dct_widen(out, inq) \
2735 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2736 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2739 #define dct_wadd(out, a, b) \
2740 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2741 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2744 #define dct_wsub(out, a, b) \
2745 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2746 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2749 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2751 dct_wadd(sum, a, b); \
2752 dct_wsub(dif, a, b); \
2753 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2754 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2757 #define dct_pass(shiftop, shift) \
2760 int16x8_t sum26 = vaddq_s16(row2, row6); \
2761 dct_long_mul(p1e, sum26, rot0_0); \
2762 dct_long_mac(t2e, p1e, row6, rot0_1); \
2763 dct_long_mac(t3e, p1e, row2, rot0_2); \
2764 int16x8_t sum04 = vaddq_s16(row0, row4); \
2765 int16x8_t dif04 = vsubq_s16(row0, row4); \
2766 dct_widen(t0e, sum04); \
2767 dct_widen(t1e, dif04); \
2768 dct_wadd(x0, t0e, t3e); \
2769 dct_wsub(x3, t0e, t3e); \
2770 dct_wadd(x1, t1e, t2e); \
2771 dct_wsub(x2, t1e, t2e); \
2773 int16x8_t sum15 = vaddq_s16(row1, row5); \
2774 int16x8_t sum17 = vaddq_s16(row1, row7); \
2775 int16x8_t sum35 = vaddq_s16(row3, row5); \
2776 int16x8_t sum37 = vaddq_s16(row3, row7); \
2777 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2778 dct_long_mul(p5o, sumodd, rot1_0); \
2779 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2780 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2781 dct_long_mul(p3o, sum37, rot2_0); \
2782 dct_long_mul(p4o, sum15, rot2_1); \
2783 dct_wadd(sump13o, p1o, p3o); \
2784 dct_wadd(sump24o, p2o, p4o); \
2785 dct_wadd(sump23o, p2o, p3o); \
2786 dct_wadd(sump14o, p1o, p4o); \
2787 dct_long_mac(x4, sump13o, row7, rot3_0); \
2788 dct_long_mac(x5, sump24o, row5, rot3_1); \
2789 dct_long_mac(x6, sump23o, row3, rot3_2); \
2790 dct_long_mac(x7, sump14o, row1, rot3_3); \
2791 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2792 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2793 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2794 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2798 row0 = vld1q_s16(data + 0*8);
2799 row1 = vld1q_s16(data + 1*8);
2800 row2 = vld1q_s16(data + 2*8);
2801 row3 = vld1q_s16(data + 3*8);
2802 row4 = vld1q_s16(data + 4*8);
2803 row5 = vld1q_s16(data + 5*8);
2804 row6 = vld1q_s16(data + 6*8);
2805 row7 = vld1q_s16(data + 7*8);
2808 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2811 dct_pass(vrshrn_n_s32, 10);
2817 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2818 #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]); }
2819 #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)); }
2822 dct_trn16(row0, row1);
2823 dct_trn16(row2, row3);
2824 dct_trn16(row4, row5);
2825 dct_trn16(row6, row7);
2828 dct_trn32(row0, row2);
2829 dct_trn32(row1, row3);
2830 dct_trn32(row4, row6);
2831 dct_trn32(row5, row7);
2834 dct_trn64(row0, row4);
2835 dct_trn64(row1, row5);
2836 dct_trn64(row2, row6);
2837 dct_trn64(row3, row7);
2848 dct_pass(vshrn_n_s32, 16);
2852 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2853 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2854 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2855 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2856 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2857 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2858 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2859 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2862 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2863 #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]); }
2864 #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]); }
2876 dct_trn8_16(p0, p2);
2877 dct_trn8_16(p1, p3);
2878 dct_trn8_16(p4, p6);
2879 dct_trn8_16(p5, p7);
2882 dct_trn8_32(p0, p4);
2883 dct_trn8_32(p1, p5);
2884 dct_trn8_32(p2, p6);
2885 dct_trn8_32(p3, p7);
2888 vst1_u8(out, p0); out += out_stride;
2889 vst1_u8(out, p1); out += out_stride;
2890 vst1_u8(out, p2); out += out_stride;
2891 vst1_u8(out, p3); out += out_stride;
2892 vst1_u8(out, p4); out += out_stride;
2893 vst1_u8(out, p5); out += out_stride;
2894 vst1_u8(out, p6); out += out_stride;
2913 #define STBI__MARKER_none 0xff
2917 static stbi_uc stbi__get_marker(stbi__jpeg *
j)
2920 if (
j->marker != STBI__MARKER_none) { x =
j->marker;
j->marker = STBI__MARKER_none;
return x; }
2921 x = stbi__get8(
j->s);
2922 if (x != 0xff)
return STBI__MARKER_none;
2924 x = stbi__get8(
j->s);
2930 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2934 static void stbi__jpeg_reset(stbi__jpeg *
j)
2939 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;
2940 j->marker = STBI__MARKER_none;
2941 j->todo =
j->restart_interval ?
j->restart_interval : 0x7fffffff;
2947 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2949 stbi__jpeg_reset(z);
2950 if (!z->progressive) {
2951 if (z->scan_n == 1) {
2953 STBI_SIMD_ALIGN(
short, data[64]);
2954 int n = z->order[0];
2959 int w = (z->img_comp[n].x+7) >> 3;
2960 int h = (z->img_comp[n].y+7) >> 3;
2961 for (
j=0;
j < h; ++
j) {
2962 for (
i=0;
i < w; ++
i) {
2963 int ha = z->img_comp[n].ha;
2964 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;
2965 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*
j*8+
i*8, z->img_comp[n].w2, data);
2967 if (--z->todo <= 0) {
2968 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2971 if (!STBI__RESTART(z->marker))
return 1;
2972 stbi__jpeg_reset(z);
2979 STBI_SIMD_ALIGN(
short, data[64]);
2980 for (
j=0;
j < z->img_mcu_y; ++
j) {
2981 for (
i=0;
i < z->img_mcu_x; ++
i) {
2983 for (k=0; k < z->scan_n; ++k) {
2984 int n = z->order[k];
2987 for (y=0; y < z->img_comp[n].v; ++y) {
2988 for (x=0; x < z->img_comp[n].h; ++x) {
2989 int x2 = (
i*z->img_comp[n].h + x)*8;
2990 int y2 = (
j*z->img_comp[n].v + y)*8;
2991 int ha = z->img_comp[n].ha;
2992 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;
2993 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2999 if (--z->todo <= 0) {
3000 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3001 if (!STBI__RESTART(z->marker))
return 1;
3002 stbi__jpeg_reset(z);
3009 if (z->scan_n == 1) {
3011 int n = z->order[0];
3016 int w = (z->img_comp[n].x+7) >> 3;
3017 int h = (z->img_comp[n].y+7) >> 3;
3018 for (
j=0;
j < h; ++
j) {
3019 for (
i=0;
i < w; ++
i) {
3020 short *data = z->img_comp[n].coeff + 64 * (
i +
j * z->img_comp[n].coeff_w);
3021 if (z->spec_start == 0) {
3022 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
3025 int ha = z->img_comp[n].ha;
3026 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
3030 if (--z->todo <= 0) {
3031 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3032 if (!STBI__RESTART(z->marker))
return 1;
3033 stbi__jpeg_reset(z);
3040 for (
j=0;
j < z->img_mcu_y; ++
j) {
3041 for (
i=0;
i < z->img_mcu_x; ++
i) {
3043 for (k=0; k < z->scan_n; ++k) {
3044 int n = z->order[k];
3047 for (y=0; y < z->img_comp[n].v; ++y) {
3048 for (x=0; x < z->img_comp[n].h; ++x) {
3049 int x2 = (
i*z->img_comp[n].h + x);
3050 int y2 = (
j*z->img_comp[n].v + y);
3051 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
3052 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
3059 if (--z->todo <= 0) {
3060 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3061 if (!STBI__RESTART(z->marker))
return 1;
3062 stbi__jpeg_reset(z);
3071 static void stbi__jpeg_dequantize(
short *data, stbi__uint16 *dequant)
3074 for (
i=0;
i < 64; ++
i)
3075 data[
i] *= dequant[
i];
3078 static void stbi__jpeg_finish(stbi__jpeg *z)
3080 if (z->progressive) {
3083 for (n=0; n < z->s->img_n; ++n) {
3084 int w = (z->img_comp[n].x+7) >> 3;
3085 int h = (z->img_comp[n].y+7) >> 3;
3086 for (
j=0;
j < h; ++
j) {
3087 for (
i=0;
i < w; ++
i) {
3088 short *data = z->img_comp[n].coeff + 64 * (
i +
j * z->img_comp[n].coeff_w);
3089 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
3090 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*
j*8+
i*8, z->img_comp[n].w2, data);
3097 static int stbi__process_marker(stbi__jpeg *z,
int m)
3101 case STBI__MARKER_none:
3102 return stbi__err(
"expected marker",
"Corrupt JPEG");
3105 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
3106 z->restart_interval = stbi__get16be(z->s);
3110 L = stbi__get16be(z->s)-2;
3112 int q = stbi__get8(z->s);
3113 int p = q >> 4, sixteen = (p != 0);
3115 if (p != 0 && p != 1)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
3116 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
3118 for (
i=0;
i < 64; ++
i)
3119 z->dequant[t][stbi__jpeg_dezigzag[
i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->
s));
3120 L -= (sixteen ? 129 : 65);
3125 L = stbi__get16be(z->s)-2;
3128 int sizes[16],
i,n=0;
3129 int q = stbi__get8(z->s);
3132 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
3133 for (
i=0;
i < 16; ++
i) {
3134 sizes[
i] = stbi__get8(z->s);
3137 if(n > 256)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
3140 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
3141 v = z->huff_dc[th].values;
3143 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
3144 v = z->huff_ac[th].values;
3146 for (
i=0;
i < n; ++
i)
3147 v[
i] = stbi__get8(z->s);
3149 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
3156 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
3157 L = stbi__get16be(z->s);
3160 return stbi__err(
"bad COM len",
"Corrupt JPEG");
3162 return stbi__err(
"bad APP len",
"Corrupt JPEG");
3166 if (m == 0xE0 && L >= 5) {
3167 static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0'};
3170 for (
i=0;
i < 5; ++
i)
3171 if (stbi__get8(z->s) != tag[
i])
3176 }
else if (m == 0xEE && L >= 12) {
3177 static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0'};
3180 for (
i=0;
i < 6; ++
i)
3181 if (stbi__get8(z->s) != tag[
i])
3186 stbi__get16be(z->s);
3187 stbi__get16be(z->s);
3188 z->app14_color_transform = stbi__get8(z->s);
3193 stbi__skip(z->s, L);
3197 return stbi__err(
"unknown marker",
"Corrupt JPEG");
3201 static int stbi__process_scan_header(stbi__jpeg *z)
3204 int Ls = stbi__get16be(z->s);
3205 z->scan_n = stbi__get8(z->s);
3206 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");
3207 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
3208 for (
i=0;
i < z->scan_n; ++
i) {
3209 int id = stbi__get8(z->s), which;
3210 int q = stbi__get8(z->s);
3211 for (which = 0; which < z->s->img_n; ++which)
3212 if (z->img_comp[which].id ==
id)
3214 if (which == z->s->img_n)
return 0;
3215 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
3216 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
3217 z->order[
i] = which;
3222 z->spec_start = stbi__get8(z->s);
3223 z->spec_end = stbi__get8(z->s);
3224 aa = stbi__get8(z->s);
3225 z->succ_high = (aa >> 4);
3226 z->succ_low = (aa & 15);
3227 if (z->progressive) {
3228 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
3229 return stbi__err(
"bad SOS",
"Corrupt JPEG");
3231 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3232 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3240 static int stbi__free_jpeg_components(stbi__jpeg *z,
int ncomp,
int why)
3243 for (
i=0;
i < ncomp; ++
i) {
3244 if (z->img_comp[
i].raw_data) {
3245 STBI_FREE(z->img_comp[
i].raw_data);
3246 z->img_comp[
i].raw_data = NULL;
3247 z->img_comp[
i].data = NULL;
3249 if (z->img_comp[
i].raw_coeff) {
3250 STBI_FREE(z->img_comp[
i].raw_coeff);
3251 z->img_comp[
i].raw_coeff = 0;
3252 z->img_comp[
i].coeff = 0;
3254 if (z->img_comp[
i].linebuf) {
3255 STBI_FREE(z->img_comp[
i].linebuf);
3256 z->img_comp[
i].linebuf = NULL;
3262 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
3264 stbi__context *
s = z->s;
3265 int Lf,p,
i,q, h_max=1,v_max=1,
c;
3266 Lf = stbi__get16be(
s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3267 p = stbi__get8(
s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
3268 s->img_y = stbi__get16be(
s);
if (
s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
3269 s->img_x = stbi__get16be(
s);
if (
s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
3270 if (
s->img_y > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
3271 if (
s->img_x > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
3273 if (
c != 3 &&
c != 1 &&
c != 4)
return stbi__err(
"bad component count",
"Corrupt JPEG");
3275 for (
i=0;
i <
c; ++
i) {
3276 z->img_comp[
i].data = NULL;
3277 z->img_comp[
i].linebuf = NULL;
3280 if (Lf != 8+3*
s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3283 for (
i=0;
i <
s->img_n; ++
i) {
3284 static const unsigned char rgb[3] = {
'R',
'G',
'B' };
3285 z->img_comp[
i].id = stbi__get8(
s);
3286 if (
s->img_n == 3 && z->img_comp[
i].id == rgb[
i])
3289 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");
3290 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");
3291 z->img_comp[
i].tq = stbi__get8(
s);
if (z->img_comp[
i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
3294 if (scan != STBI__SCAN_load)
return 1;
3296 if (!stbi__mad3sizes_valid(
s->img_x,
s->img_y,
s->img_n, 0))
return stbi__err(
"too large",
"Image too large to decode");
3298 for (
i=0;
i <
s->img_n; ++
i) {
3299 if (z->img_comp[
i].h > h_max) h_max = z->img_comp[
i].h;
3300 if (z->img_comp[
i].v > v_max) v_max = z->img_comp[
i].v;
3305 for (
i=0;
i <
s->img_n; ++
i) {
3306 if (h_max % z->img_comp[
i].h != 0)
return stbi__err(
"bad H",
"Corrupt JPEG");
3307 if (v_max % z->img_comp[
i].v != 0)
return stbi__err(
"bad V",
"Corrupt JPEG");
3311 z->img_h_max = h_max;
3312 z->img_v_max = v_max;
3313 z->img_mcu_w = h_max * 8;
3314 z->img_mcu_h = v_max * 8;
3316 z->img_mcu_x = (
s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
3317 z->img_mcu_y = (
s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
3319 for (
i=0;
i <
s->img_n; ++
i) {
3321 z->img_comp[
i].x = (
s->img_x * z->img_comp[
i].h + h_max-1) / h_max;
3322 z->img_comp[
i].y = (
s->img_y * z->img_comp[
i].v + v_max-1) / v_max;
3330 z->img_comp[
i].w2 = z->img_mcu_x * z->img_comp[
i].h * 8;
3331 z->img_comp[
i].h2 = z->img_mcu_y * z->img_comp[
i].v * 8;
3332 z->img_comp[
i].coeff = 0;
3333 z->img_comp[
i].raw_coeff = 0;
3334 z->img_comp[
i].linebuf = NULL;
3335 z->img_comp[
i].raw_data = stbi__malloc_mad2(z->img_comp[
i].w2, z->img_comp[
i].h2, 15);
3336 if (z->img_comp[
i].raw_data == NULL)
3337 return stbi__free_jpeg_components(z,
i+1, stbi__err(
"outofmem",
"Out of memory"));
3339 z->img_comp[
i].data = (
stbi_uc*) (((
size_t) z->img_comp[
i].raw_data + 15) & ~15);
3340 if (z->progressive) {
3342 z->img_comp[
i].coeff_w = z->img_comp[
i].w2 / 8;
3343 z->img_comp[
i].coeff_h = z->img_comp[
i].h2 / 8;
3344 z->img_comp[
i].raw_coeff = stbi__malloc_mad3(z->img_comp[
i].w2, z->img_comp[
i].h2,
sizeof(
short), 15);
3345 if (z->img_comp[
i].raw_coeff == NULL)
3346 return stbi__free_jpeg_components(z,
i+1, stbi__err(
"outofmem",
"Out of memory"));
3347 z->img_comp[
i].coeff = (
short*) (((
size_t) z->img_comp[
i].raw_coeff + 15) & ~15);
3355 #define stbi__DNL(x) ((x) == 0xdc)
3356 #define stbi__SOI(x) ((x) == 0xd8)
3357 #define stbi__EOI(x) ((x) == 0xd9)
3358 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3359 #define stbi__SOS(x) ((x) == 0xda)
3361 #define stbi__SOF_progressive(x) ((x) == 0xc2)
3363 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
3367 z->app14_color_transform = -1;
3368 z->marker = STBI__MARKER_none;
3369 m = stbi__get_marker(z);
3370 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
3371 if (scan == STBI__SCAN_type)
return 1;
3372 m = stbi__get_marker(z);
3373 while (!stbi__SOF(m)) {
3374 if (!stbi__process_marker(z,m))
return 0;
3375 m = stbi__get_marker(z);
3376 while (m == STBI__MARKER_none) {
3378 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
3379 m = stbi__get_marker(z);
3382 z->progressive = stbi__SOF_progressive(m);
3383 if (!stbi__process_frame_header(z, scan))
return 0;
3387 static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *
j)
3391 while (!stbi__at_eof(
j->s)) {
3394 if (stbi__at_eof(
j->s))
return STBI__MARKER_none;
3395 x = stbi__get8(
j->s);
3396 if (x != 0x00 && x != 0xff) {
3406 return STBI__MARKER_none;
3410 static int stbi__decode_jpeg_image(stbi__jpeg *
j)
3413 for (m = 0; m < 4; m++) {
3414 j->img_comp[m].raw_data = NULL;
3415 j->img_comp[m].raw_coeff = NULL;
3417 j->restart_interval = 0;
3418 if (!stbi__decode_jpeg_header(
j, STBI__SCAN_load))
return 0;
3419 m = stbi__get_marker(
j);
3420 while (!stbi__EOI(m)) {
3422 if (!stbi__process_scan_header(
j))
return 0;
3423 if (!stbi__parse_entropy_coded_data(
j))
return 0;
3424 if (
j->marker == STBI__MARKER_none ) {
3425 j->marker = stbi__skip_jpeg_junk_at_end(
j);
3428 m = stbi__get_marker(
j);
3429 if (STBI__RESTART(m))
3430 m = stbi__get_marker(
j);
3431 }
else if (stbi__DNL(m)) {
3432 int Ld = stbi__get16be(
j->s);
3433 stbi__uint32 NL = stbi__get16be(
j->s);
3434 if (Ld != 4)
return stbi__err(
"bad DNL len",
"Corrupt JPEG");
3435 if (NL !=
j->s->img_y)
return stbi__err(
"bad DNL height",
"Corrupt JPEG");
3436 m = stbi__get_marker(
j);
3438 if (!stbi__process_marker(
j, m))
return 1;
3439 m = stbi__get_marker(
j);
3443 stbi__jpeg_finish(
j);
3452 #define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3457 STBI_NOTUSED(in_far);
3468 for (
i=0;
i < w; ++
i)
3469 out[
i] = stbi__div4(3*in_near[
i] + in_far[
i] + 2);
3481 out[0] = out[1] = input[0];
3486 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
3487 for (
i=1;
i < w-1; ++
i) {
3488 int n = 3*input[
i]+2;
3489 out[
i*2+0] = stbi__div4(n+input[
i-1]);
3490 out[
i*2+1] = stbi__div4(n+input[
i+1]);
3492 out[
i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
3493 out[
i*2+1] = input[w-1];
3495 STBI_NOTUSED(in_far);
3501 #define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3508 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3512 t1 = 3*in_near[0] + in_far[0];
3513 out[0] = stbi__div4(t1+2);
3514 for (
i=1;
i < w; ++
i) {
3516 t1 = 3*in_near[
i]+in_far[
i];
3517 out[
i*2-1] = stbi__div16(3*t0 + t1 + 8);
3518 out[
i*2 ] = stbi__div16(3*t1 + t0 + 8);
3520 out[w*2-1] = stbi__div4(t1+2);
3527 #if defined(STBI_SSE2) || defined(STBI_NEON)
3534 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3538 t1 = 3*in_near[0] + in_far[0];
3542 for (;
i < ((w-1) & ~7);
i += 8) {
3543 #if defined(STBI_SSE2)
3546 __m128i zero = _mm_setzero_si128();
3547 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far +
i));
3548 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near +
i));
3549 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3550 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3551 __m128i diff = _mm_sub_epi16(farw, nearw);
3552 __m128i nears = _mm_slli_epi16(nearw, 2);
3553 __m128i curr = _mm_add_epi16(nears, diff);
3560 __m128i prv0 = _mm_slli_si128(curr, 2);
3561 __m128i nxt0 = _mm_srli_si128(curr, 2);
3562 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3563 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[
i+8] + in_far[
i+8], 7);
3569 __m128i bias = _mm_set1_epi16(8);
3570 __m128i curs = _mm_slli_epi16(curr, 2);
3571 __m128i prvd = _mm_sub_epi16(prev, curr);
3572 __m128i nxtd = _mm_sub_epi16(next, curr);
3573 __m128i curb = _mm_add_epi16(curs, bias);
3574 __m128i even = _mm_add_epi16(prvd, curb);
3575 __m128i odd = _mm_add_epi16(nxtd, curb);
3578 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3579 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3580 __m128i de0 = _mm_srli_epi16(int0, 4);
3581 __m128i de1 = _mm_srli_epi16(int1, 4);
3584 __m128i outv = _mm_packus_epi16(de0, de1);
3585 _mm_storeu_si128((__m128i *) (out +
i*2), outv);
3586 #elif defined(STBI_NEON)
3589 uint8x8_t farb = vld1_u8(in_far +
i);
3590 uint8x8_t nearb = vld1_u8(in_near +
i);
3591 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3592 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3593 int16x8_t curr = vaddq_s16(nears, diff);
3600 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3601 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3602 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3603 int16x8_t next = vsetq_lane_s16(3*in_near[
i+8] + in_far[
i+8], nxt0, 7);
3609 int16x8_t curs = vshlq_n_s16(curr, 2);
3610 int16x8_t prvd = vsubq_s16(prev, curr);
3611 int16x8_t nxtd = vsubq_s16(next, curr);
3612 int16x8_t even = vaddq_s16(curs, prvd);
3613 int16x8_t odd = vaddq_s16(curs, nxtd);
3617 o.val[0] = vqrshrun_n_s16(even, 4);
3618 o.val[1] = vqrshrun_n_s16(odd, 4);
3619 vst2_u8(out +
i*2, o);
3623 t1 = 3*in_near[
i+7] + in_far[
i+7];
3627 t1 = 3*in_near[
i] + in_far[
i];
3628 out[
i*2] = stbi__div16(3*t1 + t0 + 8);
3630 for (++
i;
i < w; ++
i) {
3632 t1 = 3*in_near[
i]+in_far[
i];
3633 out[
i*2-1] = stbi__div16(3*t0 + t1 + 8);
3634 out[
i*2 ] = stbi__div16(3*t1 + t0 + 8);
3636 out[w*2-1] = stbi__div4(t1+2);
3648 STBI_NOTUSED(in_far);
3649 for (
i=0;
i < w; ++
i)
3650 for (
j=0;
j < hs; ++
j)
3651 out[
i*hs+
j] = in_near[
i];
3657 #define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3661 for (
i=0;
i < count; ++
i) {
3662 int y_fixed = (y[
i] << 20) + (1<<19);
3664 int cr = pcr[
i] - 128;
3665 int cb = pcb[
i] - 128;
3666 r = y_fixed + cr* stbi__float2fixed(1.40200
f);
3667 g = y_fixed + (cr*-stbi__float2fixed(0.71414
f)) + ((cb*-stbi__float2fixed(0.34414
f)) & 0xffff0000);
3668 b = y_fixed + cb* stbi__float2fixed(1.77200
f);
3672 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3673 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3674 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3683 #if defined(STBI_SSE2) || defined(STBI_NEON)
3694 __m128i signflip = _mm_set1_epi8(-0x80);
3695 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200
f*4096.0
f+0.5
f));
3696 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414
f*4096.0
f+0.5
f));
3697 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414
f*4096.0
f+0.5
f));
3698 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200
f*4096.0
f+0.5
f));
3699 __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
3700 __m128i xw = _mm_set1_epi16(255);
3702 for (;
i+7 < count;
i += 8) {
3704 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+
i));
3705 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+
i));
3706 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+
i));
3707 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3708 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3711 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3712 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3713 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3716 __m128i yws = _mm_srli_epi16(yw, 4);
3717 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3718 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3719 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3720 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3721 __m128i rws = _mm_add_epi16(cr0, yws);
3722 __m128i gwt = _mm_add_epi16(cb0, yws);
3723 __m128i bws = _mm_add_epi16(yws, cb1);
3724 __m128i gws = _mm_add_epi16(gwt, cr1);
3727 __m128i rw = _mm_srai_epi16(rws, 4);
3728 __m128i bw = _mm_srai_epi16(bws, 4);
3729 __m128i gw = _mm_srai_epi16(gws, 4);
3732 __m128i brb = _mm_packus_epi16(rw, bw);
3733 __m128i gxb = _mm_packus_epi16(gw, xw);
3736 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3737 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3738 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3739 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3742 _mm_storeu_si128((__m128i *) (out + 0), o0);
3743 _mm_storeu_si128((__m128i *) (out + 16), o1);
3753 uint8x8_t signflip = vdup_n_u8(0x80);
3754 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200
f*4096.0
f+0.5
f));
3755 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414
f*4096.0
f+0.5
f));
3756 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414
f*4096.0
f+0.5
f));
3757 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200
f*4096.0
f+0.5
f));
3759 for (;
i+7 < count;
i += 8) {
3761 uint8x8_t y_bytes = vld1_u8(y +
i);
3762 uint8x8_t cr_bytes = vld1_u8(pcr +
i);
3763 uint8x8_t cb_bytes = vld1_u8(pcb +
i);
3764 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3765 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3768 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3769 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3770 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3773 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3774 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3775 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3776 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3777 int16x8_t rws = vaddq_s16(yws, cr0);
3778 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3779 int16x8_t bws = vaddq_s16(yws, cb1);
3783 o.val[0] = vqrshrun_n_s16(rws, 4);
3784 o.val[1] = vqrshrun_n_s16(gws, 4);
3785 o.val[2] = vqrshrun_n_s16(bws, 4);
3786 o.val[3] = vdup_n_u8(255);
3795 for (;
i < count; ++
i) {
3796 int y_fixed = (y[
i] << 20) + (1<<19);
3798 int cr = pcr[
i] - 128;
3799 int cb = pcb[
i] - 128;
3800 r = y_fixed + cr* stbi__float2fixed(1.40200
f);
3801 g = y_fixed + cr*-stbi__float2fixed(0.71414
f) + ((cb*-stbi__float2fixed(0.34414
f)) & 0xffff0000);
3802 b = y_fixed + cb* stbi__float2fixed(1.77200
f);
3806 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3807 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3808 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3819 static void stbi__setup_jpeg(stbi__jpeg *
j)
3821 j->idct_block_kernel = stbi__idct_block;
3822 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3823 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3826 if (stbi__sse2_available()) {
3827 j->idct_block_kernel = stbi__idct_simd;
3828 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3829 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3834 j->idct_block_kernel = stbi__idct_simd;
3835 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3836 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3841 static void stbi__cleanup_jpeg(stbi__jpeg *
j)
3843 stbi__free_jpeg_components(
j,
j->s->img_n, 0);
3848 resample_row_func resample;
3859 unsigned int t = x*y + 128;
3860 return (
stbi_uc) ((t + (t >>8)) >> 8);
3863 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3865 int n, decode_n, is_rgb;
3869 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3872 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3875 n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3877 is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3879 if (z->s->img_n == 3 && n < 3 && !is_rgb)
3882 decode_n = z->s->img_n;
3886 if (decode_n <= 0) { stbi__cleanup_jpeg(z);
return NULL; }
3893 stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
3895 stbi__resample res_comp[4];
3897 for (k=0; k < decode_n; ++k) {
3898 stbi__resample *r = &res_comp[k];
3902 z->img_comp[k].linebuf = (
stbi_uc *) stbi__malloc(z->s->img_x + 3);
3903 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3905 r->hs = z->img_h_max / z->img_comp[k].h;
3906 r->vs = z->img_v_max / z->img_comp[k].v;
3907 r->ystep = r->vs >> 1;
3908 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3910 r->line0 = r->line1 = z->img_comp[k].data;
3912 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3913 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3914 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3915 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3916 else r->resample = stbi__resample_row_generic;
3920 output = (
stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3921 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3924 for (
j=0;
j < z->s->img_y; ++
j) {
3925 stbi_uc *out = output + n * z->s->img_x *
j;
3926 for (k=0; k < decode_n; ++k) {
3927 stbi__resample *r = &res_comp[k];
3928 int y_bot = r->ystep >= (r->vs >> 1);
3929 coutput[k] = r->resample(z->img_comp[k].linebuf,
3930 y_bot ? r->line1 : r->line0,
3931 y_bot ? r->line0 : r->line1,
3933 if (++r->ystep >= r->vs) {
3935 r->line0 = r->line1;
3936 if (++r->ypos < z->img_comp[k].y)
3937 r->line1 += z->img_comp[k].w2;
3942 if (z->s->img_n == 3) {
3944 for (
i=0;
i < z->s->img_x; ++
i) {
3946 out[1] = coutput[1][
i];
3947 out[2] = coutput[2][
i];
3952 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3954 }
else if (z->s->img_n == 4) {
3955 if (z->app14_color_transform == 0) {
3956 for (
i=0;
i < z->s->img_x; ++
i) {
3958 out[0] = stbi__blinn_8x8(coutput[0][
i], m);
3959 out[1] = stbi__blinn_8x8(coutput[1][
i], m);
3960 out[2] = stbi__blinn_8x8(coutput[2][
i], m);
3964 }
else if (z->app14_color_transform == 2) {
3965 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3966 for (
i=0;
i < z->s->img_x; ++
i) {
3968 out[0] = stbi__blinn_8x8(255 - out[0], m);
3969 out[1] = stbi__blinn_8x8(255 - out[1], m);
3970 out[2] = stbi__blinn_8x8(255 - out[2], m);
3974 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3977 for (
i=0;
i < z->s->img_x; ++
i) {
3978 out[0] = out[1] = out[2] = y[
i];
3985 for (
i=0;
i < z->s->img_x; ++
i)
3986 *out++ = stbi__compute_y(coutput[0][
i], coutput[1][
i], coutput[2][
i]);
3988 for (
i=0;
i < z->s->img_x; ++
i, out += 2) {
3989 out[0] = stbi__compute_y(coutput[0][
i], coutput[1][
i], coutput[2][
i]);
3993 }
else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
3994 for (
i=0;
i < z->s->img_x; ++
i) {
3996 stbi_uc r = stbi__blinn_8x8(coutput[0][
i], m);
3997 stbi_uc g = stbi__blinn_8x8(coutput[1][
i], m);
3998 stbi_uc b = stbi__blinn_8x8(coutput[2][
i], m);
3999 out[0] = stbi__compute_y(r, g, b);
4003 }
else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
4004 for (
i=0;
i < z->s->img_x; ++
i) {
4005 out[0] = stbi__blinn_8x8(255 - coutput[0][
i], coutput[3][
i]);
4012 for (
i=0;
i < z->s->img_x; ++
i) out[
i] = y[
i];
4014 for (
i=0;
i < z->s->img_x; ++
i) { *out++ = y[
i]; *out++ = 255; }
4018 stbi__cleanup_jpeg(z);
4019 *out_x = z->s->img_x;
4020 *out_y = z->s->img_y;
4021 if (comp) *comp = z->s->img_n >= 3 ? 3 : 1;
4026 static void *stbi__jpeg_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
4028 unsigned char* result;
4029 stbi__jpeg*
j = (stbi__jpeg*) stbi__malloc(
sizeof(stbi__jpeg));
4030 if (!
j)
return stbi__errpuc(
"outofmem",
"Out of memory");
4031 memset(
j, 0,
sizeof(stbi__jpeg));
4034 stbi__setup_jpeg(
j);
4035 result = load_jpeg_image(
j, x,y,comp,req_comp);
4040 static int stbi__jpeg_test(stbi__context *
s)
4043 stbi__jpeg*
j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
4044 if (!
j)
return stbi__err(
"outofmem",
"Out of memory");
4045 memset(
j, 0,
sizeof(stbi__jpeg));
4047 stbi__setup_jpeg(
j);
4048 r = stbi__decode_jpeg_header(
j, STBI__SCAN_type);
4054 static int stbi__jpeg_info_raw(stbi__jpeg *
j,
int *x,
int *y,
int *comp)
4056 if (!stbi__decode_jpeg_header(
j, STBI__SCAN_header)) {
4057 stbi__rewind(
j->s );
4060 if (x) *x =
j->s->img_x;
4061 if (y) *y =
j->s->img_y;
4062 if (comp) *comp =
j->s->img_n >= 3 ? 3 : 1;
4066 static int stbi__jpeg_info(stbi__context *
s,
int *x,
int *y,
int *comp)
4069 stbi__jpeg*
j = (stbi__jpeg*) (stbi__malloc(
sizeof(stbi__jpeg)));
4070 if (!
j)
return stbi__err(
"outofmem",
"Out of memory");
4071 memset(
j, 0,
sizeof(stbi__jpeg));
4073 result = stbi__jpeg_info_raw(
j, x, y, comp);
4086 #ifndef STBI_NO_ZLIB
4089 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
4090 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
4091 #define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet
4097 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
4098 stbi__uint16 firstcode[16];
4100 stbi__uint16 firstsymbol[16];
4102 stbi__uint16
value[STBI__ZNSYMS];
4105 stbi_inline
static int stbi__bitreverse16(
int n)
4107 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
4108 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
4109 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
4110 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
4114 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
4116 STBI_ASSERT(bits <= 16);
4119 return stbi__bitreverse16(v) >> (16-bits);
4122 static int stbi__zbuild_huffman(stbi__zhuffman *z,
const stbi_uc *sizelist,
int num)
4125 int code, next_code[16], sizes[17];
4128 memset(sizes, 0,
sizeof(sizes));
4129 memset(z->fast, 0,
sizeof(z->fast));
4130 for (
i=0;
i < num; ++
i)
4131 ++sizes[sizelist[
i]];
4133 for (
i=1;
i < 16; ++
i)
4134 if (sizes[
i] > (1 <<
i))
4135 return stbi__err(
"bad sizes",
"Corrupt PNG");
4137 for (
i=1;
i < 16; ++
i) {
4138 next_code[
i] = code;
4139 z->firstcode[
i] = (stbi__uint16) code;
4140 z->firstsymbol[
i] = (stbi__uint16) k;
4141 code = (code + sizes[
i]);
4143 if (code-1 >= (1 <<
i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4144 z->maxcode[
i] = code << (16-
i);
4148 z->maxcode[16] = 0x10000;
4149 for (
i=0;
i < num; ++
i) {
4150 int s = sizelist[
i];
4152 int c = next_code[
s] - z->firstcode[
s] + z->firstsymbol[
s];
4153 stbi__uint16 fastv = (stbi__uint16) ((
s << 9) |
i);
4155 z->value[
c] = (stbi__uint16)
i;
4156 if (
s <= STBI__ZFAST_BITS) {
4157 int j = stbi__bit_reverse(next_code[
s],
s);
4158 while (
j < (1 << STBI__ZFAST_BITS)) {
4177 stbi_uc *zbuffer, *zbuffer_end;
4180 stbi__uint32 code_buffer;
4187 stbi__zhuffman z_length, z_distance;
4190 stbi_inline
static int stbi__zeof(stbi__zbuf *z)
4192 return (z->zbuffer >= z->zbuffer_end);
4195 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
4197 return stbi__zeof(z) ? 0 : *z->zbuffer++;
4200 static void stbi__fill_bits(stbi__zbuf *z)
4203 if (z->code_buffer >= (1U << z->num_bits)) {
4204 z->zbuffer = z->zbuffer_end;
4207 z->code_buffer |= (
unsigned int) stbi__zget8(z) << z->num_bits;
4209 }
while (z->num_bits <= 24);
4212 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
4215 if (z->num_bits < n) stbi__fill_bits(z);
4216 k = z->code_buffer & ((1 << n) - 1);
4217 z->code_buffer >>= n;
4222 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
4227 k = stbi__bit_reverse(a->code_buffer, 16);
4228 for (
s=STBI__ZFAST_BITS+1; ; ++
s)
4229 if (k < z->maxcode[
s])
4231 if (
s >= 16)
return -1;
4233 b = (k >> (16-
s)) - z->firstcode[
s] + z->firstsymbol[
s];
4234 if (b >= STBI__ZNSYMS)
return -1;
4235 if (z->size[b] !=
s)
return -1;
4236 a->code_buffer >>=
s;
4241 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
4244 if (a->num_bits < 16) {
4245 if (stbi__zeof(a)) {
4246 if (!a->hit_zeof_once) {
4250 a->hit_zeof_once = 1;
4261 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
4264 a->code_buffer >>=
s;
4268 return stbi__zhuffman_decode_slowpath(a, z);
4271 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
4274 unsigned int cur, limit, old_limit;
4276 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
4277 cur = (
unsigned int) (z->zout - z->zout_start);
4278 limit = old_limit = (unsigned) (z->zout_end - z->zout_start);
4279 if (UINT_MAX - cur < (
unsigned) n)
return stbi__err(
"outofmem",
"Out of memory");
4280 while (cur + n > limit) {
4281 if(limit > UINT_MAX / 2)
return stbi__err(
"outofmem",
"Out of memory");
4284 q = (
char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
4285 STBI_NOTUSED(old_limit);
4286 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4289 z->zout_end = q + limit;
4293 static const int stbi__zlength_base[31] = {
4294 3,4,5,6,7,8,9,10,11,13,
4295 15,17,19,23,27,31,35,43,51,59,
4296 67,83,99,115,131,163,195,227,258,0,0 };
4298 static const int stbi__zlength_extra[31]=
4299 { 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 };
4301 static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
4302 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
4304 static const int stbi__zdist_extra[32] =
4305 { 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};
4307 static int stbi__parse_huffman_block(stbi__zbuf *a)
4309 char *zout = a->zout;
4311 int z = stbi__zhuffman_decode(a, &a->z_length);
4313 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4314 if (zout >= a->zout_end) {
4315 if (!stbi__zexpand(a, zout, 1))
return 0;
4324 if (a->hit_zeof_once && a->num_bits < 16) {
4329 return stbi__err(
"unexpected end",
"Corrupt PNG");
4333 if (z >= 286)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4335 len = stbi__zlength_base[z];
4336 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
4337 z = stbi__zhuffman_decode(a, &a->z_distance);
4338 if (z < 0 || z >= 30)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4339 dist = stbi__zdist_base[z];
4340 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
4341 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
4342 if (len > a->zout_end - zout) {
4343 if (!stbi__zexpand(a, zout, len))
return 0;
4346 p = (
stbi_uc *) (zout - dist);
4349 if (len) {
do *zout++ = v;
while (--len); }
4351 if (len) {
do *zout++ = *p++;
while (--len); }
4357 static int stbi__compute_huffman_codes(stbi__zbuf *a)
4359 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 };
4360 stbi__zhuffman z_codelength;
4365 int hlit = stbi__zreceive(a,5) + 257;
4366 int hdist = stbi__zreceive(a,5) + 1;
4367 int hclen = stbi__zreceive(a,4) + 4;
4368 int ntot = hlit + hdist;
4370 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4371 for (
i=0;
i < hclen; ++
i) {
4372 int s = stbi__zreceive(a,3);
4373 codelength_sizes[length_dezigzag[
i]] = (
stbi_uc)
s;
4375 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
4379 int c = stbi__zhuffman_decode(a, &z_codelength);
4380 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4386 c = stbi__zreceive(a,2)+3;
4387 if (n == 0)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4388 fill = lencodes[n-1];
4389 }
else if (
c == 17) {
4390 c = stbi__zreceive(a,3)+3;
4391 }
else if (
c == 18) {
4392 c = stbi__zreceive(a,7)+11;
4394 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4396 if (ntot - n <
c)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4397 memset(lencodes+n, fill,
c);
4401 if (n != ntot)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4402 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
4403 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
4407 static int stbi__parse_uncompressed_block(stbi__zbuf *a)
4411 if (a->num_bits & 7)
4412 stbi__zreceive(a, a->num_bits & 7);
4415 while (a->num_bits > 0) {
4416 header[k++] = (
stbi_uc) (a->code_buffer & 255);
4417 a->code_buffer >>= 8;
4420 if (a->num_bits < 0)
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4423 header[k++] = stbi__zget8(a);
4424 len = header[1] * 256 + header[0];
4425 nlen = header[3] * 256 + header[2];
4426 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4427 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
4428 if (a->zout + len > a->zout_end)
4429 if (!stbi__zexpand(a, a->zout, len))
return 0;
4430 memcpy(a->zout, a->zbuffer, len);
4436 static int stbi__parse_zlib_header(stbi__zbuf *a)
4438 int cmf = stbi__zget8(a);
4441 int flg = stbi__zget8(a);
4442 if (stbi__zeof(a))
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4443 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4444 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
4445 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
4450 static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] =
4452 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,
4453 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,
4454 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,
4455 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,
4456 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,
4457 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,
4458 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,
4459 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,
4460 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
4462 static const stbi_uc stbi__zdefault_distance[32] =
4464 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
4479 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
4483 if (!stbi__parse_zlib_header(a))
return 0;
4486 a->hit_zeof_once = 0;
4488 final = stbi__zreceive(a,1);
4489 type = stbi__zreceive(a,2);
4491 if (!stbi__parse_uncompressed_block(a))
return 0;
4492 }
else if (
type == 3) {
4497 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS))
return 0;
4498 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
4500 if (!stbi__compute_huffman_codes(a))
return 0;
4502 if (!stbi__parse_huffman_block(a))
return 0;
4508 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
4510 a->zout_start = obuf;
4512 a->zout_end = obuf + olen;
4513 a->z_expandable = exp;
4515 return stbi__parse_zlib(a, parse_header);
4521 char *p = (
char *) stbi__malloc(initial_size);
4522 if (p == NULL)
return NULL;
4523 a.zbuffer = (
stbi_uc *) buffer;
4524 a.zbuffer_end = (
stbi_uc *) buffer + len;
4525 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4526 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4527 return a.zout_start;
4529 STBI_FREE(a.zout_start);
4542 char *p = (
char *) stbi__malloc(initial_size);
4543 if (p == NULL)
return NULL;
4544 a.zbuffer = (
stbi_uc *) buffer;
4545 a.zbuffer_end = (
stbi_uc *) buffer + len;
4546 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4547 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4548 return a.zout_start;
4550 STBI_FREE(a.zout_start);
4558 a.zbuffer = (
stbi_uc *) ibuffer;
4559 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
4560 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4561 return (
int) (a.zout - a.zout_start);
4569 char *p = (
char *) stbi__malloc(16384);
4570 if (p == NULL)
return NULL;
4571 a.zbuffer = (
stbi_uc *) buffer;
4572 a.zbuffer_end = (
stbi_uc *) buffer+len;
4573 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4574 if (outlen) *outlen = (int) (a.zout - a.zout_start);
4575 return a.zout_start;
4577 STBI_FREE(a.zout_start);
4585 a.zbuffer = (
stbi_uc *) ibuffer;
4586 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
4587 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4588 return (
int) (a.zout - a.zout_start);
4607 stbi__uint32 length;
4611 static stbi__pngchunk stbi__get_chunk_header(stbi__context *
s)
4614 c.length = stbi__get32be(
s);
4615 c.type = stbi__get32be(
s);
4619 static int stbi__check_png_header(stbi__context *
s)
4621 static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4623 for (
i=0;
i < 8; ++
i)
4624 if (stbi__get8(
s) != png_sig[
i])
return stbi__err(
"bad png sig",
"Not a PNG");
4631 stbi_uc *idata, *expanded, *out;
4647 static stbi_uc first_row_filter[5] =
4656 static int stbi__paeth(
int a,
int b,
int c)
4662 if (pa <= pb && pa <= pc)
return a;
4663 if (pb <= pc)
return b;
4667 static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4670 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)
4672 int bytes = (depth == 16? 2 : 1);
4673 stbi__context *
s = a->s;
4674 stbi__uint32
i,
j,stride = x*out_n*bytes;
4675 stbi__uint32 img_len, img_width_bytes;
4677 int img_n =
s->img_n;
4679 int output_bytes = out_n*bytes;
4680 int filter_bytes = img_n*bytes;
4683 STBI_ASSERT(out_n ==
s->img_n || out_n ==
s->img_n+1);
4684 a->out = (
stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0);
4685 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
4687 if (!stbi__mad3sizes_valid(img_n, x, depth, 7))
return stbi__err(
"too large",
"Corrupt PNG");
4688 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4689 img_len = (img_width_bytes + 1) * y;
4694 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4696 for (
j=0;
j < y; ++
j) {
4699 int filter = *raw++;
4702 return stbi__err(
"invalid filter",
"Corrupt PNG");
4705 if (img_width_bytes > x)
return stbi__err(
"invalid width",
"Corrupt PNG");
4706 cur += x*out_n - img_width_bytes;
4708 width = img_width_bytes;
4710 prior = cur - stride;
4713 if (
j == 0) filter = first_row_filter[filter];
4716 for (k=0; k < filter_bytes; ++k) {
4718 case STBI__F_none : cur[k] = raw[k];
break;
4719 case STBI__F_sub : cur[k] = raw[k];
break;
4720 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4721 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
4722 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
4723 case STBI__F_avg_first : cur[k] = raw[k];
break;
4724 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4734 }
else if (depth == 16) {
4735 if (img_n != out_n) {
4736 cur[filter_bytes] = 255;
4737 cur[filter_bytes+1] = 255;
4739 raw += filter_bytes;
4740 cur += output_bytes;
4741 prior += output_bytes;
4749 if (depth < 8 || img_n == out_n) {
4750 int nk = (width - 1)*filter_bytes;
4751 #define STBI__CASE(f) \
4753 for (k=0; k < nk; ++k)
4756 case STBI__F_none: memcpy(cur, raw, nk);
break;
4757 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); }
break;
4758 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4759 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); }
break;
4760 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); }
break;
4761 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); }
break;
4762 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); }
break;
4767 STBI_ASSERT(img_n+1 == out_n);
4768 #define STBI__CASE(f) \
4770 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4771 for (k=0; k < filter_bytes; ++k)
4773 STBI__CASE(STBI__F_none) { cur[k] = raw[k]; }
break;
4774 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); }
break;
4775 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4776 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); }
break;
4777 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); }
break;
4778 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); }
break;
4779 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); }
break;
4786 cur = a->out + stride*
j;
4787 for (
i=0;
i < x; ++
i,cur+=output_bytes) {
4788 cur[filter_bytes+1] = 255;
4798 for (
j=0;
j < y; ++
j) {
4800 stbi_uc *in = a->out + stride*
j + x*out_n - img_width_bytes;
4803 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4812 for (k=x*img_n; k >= 2; k-=2, ++in) {
4813 *cur++ = scale * ((*in >> 4) );
4814 *cur++ = scale * ((*in ) & 0x0f);
4816 if (k > 0) *cur++ = scale * ((*in >> 4) );
4817 }
else if (depth == 2) {
4818 for (k=x*img_n; k >= 4; k-=4, ++in) {
4819 *cur++ = scale * ((*in >> 6) );
4820 *cur++ = scale * ((*in >> 4) & 0x03);
4821 *cur++ = scale * ((*in >> 2) & 0x03);
4822 *cur++ = scale * ((*in ) & 0x03);
4824 if (k > 0) *cur++ = scale * ((*in >> 6) );
4825 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4826 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4827 }
else if (depth == 1) {
4828 for (k=x*img_n; k >= 8; k-=8, ++in) {
4829 *cur++ = scale * ((*in >> 7) );
4830 *cur++ = scale * ((*in >> 6) & 0x01);
4831 *cur++ = scale * ((*in >> 5) & 0x01);
4832 *cur++ = scale * ((*in >> 4) & 0x01);
4833 *cur++ = scale * ((*in >> 3) & 0x01);
4834 *cur++ = scale * ((*in >> 2) & 0x01);
4835 *cur++ = scale * ((*in >> 1) & 0x01);
4836 *cur++ = scale * ((*in ) & 0x01);
4838 if (k > 0) *cur++ = scale * ((*in >> 7) );
4839 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4840 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4841 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4842 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4843 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4844 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4846 if (img_n != out_n) {
4849 cur = a->out + stride*
j;
4851 for (q=x-1; q >= 0; --q) {
4853 cur[q*2+0] = cur[q];
4856 STBI_ASSERT(img_n == 3);
4857 for (q=x-1; q >= 0; --q) {
4859 cur[q*4+2] = cur[q*3+2];
4860 cur[q*4+1] = cur[q*3+1];
4861 cur[q*4+0] = cur[q*3+0];
4866 }
else if (depth == 16) {
4872 stbi__uint16 *cur16 = (stbi__uint16*)cur;
4874 for(
i=0;
i < x*y*out_n; ++
i,cur16++,cur+=2) {
4875 *cur16 = (cur[0] << 8) | cur[1];
4882 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)
4884 int bytes = (depth == 16 ? 2 : 1);
4885 int out_bytes = out_n * bytes;
4889 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4892 final = (
stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4893 if (!
final)
return stbi__err(
"outofmem",
"Out of memory");
4894 for (p=0; p < 7; ++p) {
4895 int xorig[] = { 0,4,0,2,0,1,0 };
4896 int yorig[] = { 0,0,4,0,2,0,1 };
4897 int xspc[] = { 8,8,4,4,2,2,1 };
4898 int yspc[] = { 8,8,8,4,4,2,2 };
4901 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4902 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4904 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4905 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4909 for (
j=0;
j < y; ++
j) {
4910 for (
i=0;
i < x; ++
i) {
4911 int out_y =
j*yspc[p]+yorig[p];
4912 int out_x =
i*xspc[p]+xorig[p];
4913 memcpy(
final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
4914 a->out + (
j*x+
i)*out_bytes, out_bytes);
4918 image_data += img_len;
4919 image_data_len -= img_len;
4927 static int stbi__compute_transparency(stbi__png *z,
stbi_uc tc[3],
int out_n)
4929 stbi__context *
s = z->s;
4930 stbi__uint32
i, pixel_count =
s->img_x *
s->img_y;
4935 STBI_ASSERT(out_n == 2 || out_n == 4);
4938 for (
i=0;
i < pixel_count; ++
i) {
4939 p[1] = (p[0] == tc[0] ? 0 : 255);
4943 for (
i=0;
i < pixel_count; ++
i) {
4944 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4952 static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3],
int out_n)
4954 stbi__context *
s = z->s;
4955 stbi__uint32
i, pixel_count =
s->img_x *
s->img_y;
4956 stbi__uint16 *p = (stbi__uint16*) z->out;
4960 STBI_ASSERT(out_n == 2 || out_n == 4);
4963 for (
i = 0;
i < pixel_count; ++
i) {
4964 p[1] = (p[0] == tc[0] ? 0 : 65535);
4968 for (
i = 0;
i < pixel_count; ++
i) {
4969 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4977 static int stbi__expand_png_palette(stbi__png *a,
stbi_uc *palette,
int len,
int pal_img_n)
4979 stbi__uint32
i, pixel_count = a->s->img_x * a->s->img_y;
4980 stbi_uc *p, *temp_out, *orig = a->out;
4982 p = (
stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4983 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4988 if (pal_img_n == 3) {
4989 for (
i=0;
i < pixel_count; ++
i) {
4992 p[1] = palette[n+1];
4993 p[2] = palette[n+2];
4997 for (
i=0;
i < pixel_count; ++
i) {
5000 p[1] = palette[n+1];
5001 p[2] = palette[n+2];
5002 p[3] = palette[n+3];
5014 static int stbi__unpremultiply_on_load_global = 0;
5015 static int stbi__de_iphone_flag_global = 0;
5019 stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;
5024 stbi__de_iphone_flag_global = flag_true_if_should_convert;
5027 #ifndef STBI_THREAD_LOCAL
5028 #define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global
5029 #define stbi__de_iphone_flag stbi__de_iphone_flag_global
5031 static STBI_THREAD_LOCAL
int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;
5032 static STBI_THREAD_LOCAL
int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;
5036 stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;
5037 stbi__unpremultiply_on_load_set = 1;
5042 stbi__de_iphone_flag_local = flag_true_if_should_convert;
5043 stbi__de_iphone_flag_set = 1;
5046 #define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \
5047 ? stbi__unpremultiply_on_load_local \
5048 : stbi__unpremultiply_on_load_global)
5049 #define stbi__de_iphone_flag (stbi__de_iphone_flag_set \
5050 ? stbi__de_iphone_flag_local \
5051 : stbi__de_iphone_flag_global)
5052 #endif // STBI_THREAD_LOCAL
5054 static void stbi__de_iphone(stbi__png *z)
5056 stbi__context *
s = z->s;
5057 stbi__uint32
i, pixel_count =
s->img_x *
s->img_y;
5060 if (
s->img_out_n == 3) {
5061 for (
i=0;
i < pixel_count; ++
i) {
5068 STBI_ASSERT(
s->img_out_n == 4);
5069 if (stbi__unpremultiply_on_load) {
5071 for (
i=0;
i < pixel_count; ++
i) {
5076 p[0] = (p[2] * 255 + half) / a;
5077 p[1] = (p[1] * 255 + half) / a;
5078 p[2] = ( t * 255 + half) / a;
5087 for (
i=0;
i < pixel_count; ++
i) {
5097 #define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
5099 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
5101 stbi_uc palette[1024], pal_img_n=0;
5102 stbi_uc has_trans=0, tc[3]={0};
5103 stbi__uint16 tc16[3];
5104 stbi__uint32 ioff=0, idata_limit=0,
i, pal_len=0;
5105 int first=1,k,interlace=0, color=0, is_iphone=0;
5106 stbi__context *
s = z->s;
5112 if (!stbi__check_png_header(
s))
return 0;
5114 if (scan == STBI__SCAN_type)
return 1;
5117 stbi__pngchunk
c = stbi__get_chunk_header(
s);
5119 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
5121 stbi__skip(
s,
c.length);
5123 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
5125 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
5127 if (
c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
5128 s->img_x = stbi__get32be(
s);
5129 s->img_y = stbi__get32be(
s);
5130 if (
s->img_y > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
5131 if (
s->img_x > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
5132 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");
5133 color = stbi__get8(
s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5134 if (color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5135 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5136 comp = stbi__get8(
s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
5137 filter= stbi__get8(
s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
5138 interlace = stbi__get8(
s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
5139 if (!
s->img_x || !
s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
5141 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
5142 if ((1 << 30) /
s->img_x /
s->img_n <
s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
5147 if ((1 << 30) /
s->img_x / 4 <
s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
5153 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
5154 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5155 if (
c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5156 pal_len =
c.length / 3;
5157 if (pal_len * 3 !=
c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5158 for (
i=0;
i < pal_len; ++
i) {
5159 palette[
i*4+0] = stbi__get8(
s);
5160 palette[
i*4+1] = stbi__get8(
s);
5161 palette[
i*4+2] = stbi__get8(
s);
5162 palette[
i*4+3] = 255;
5167 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
5168 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5169 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
5171 if (scan == STBI__SCAN_header) {
s->img_n = 4;
return 1; }
5172 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
5173 if (
c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5175 for (
i=0;
i <
c.length; ++
i)
5176 palette[
i*4+3] = stbi__get8(
s);
5178 if (!(
s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
5179 if (
c.length != (stbi__uint32)
s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5182 if (scan == STBI__SCAN_header) { ++
s->img_n;
return 1; }
5183 if (z->depth == 16) {
5184 for (k = 0; k <
s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(
s);
5186 for (k = 0; k <
s->img_n; ++k) tc[k] = (
stbi_uc)(stbi__get16be(
s) & 255) * stbi__depth_scale_table[z->depth];
5192 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
5193 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5194 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
5195 if (scan == STBI__SCAN_header) {
5198 s->img_n = pal_img_n;
5201 if (
c.length > (1u << 30))
return stbi__err(
"IDAT size limit",
"IDAT section larger than 2^30 bytes");
5202 if ((
int)(ioff +
c.length) < (
int)ioff)
return 0;
5203 if (ioff +
c.length > idata_limit) {
5204 stbi__uint32 idata_limit_old = idata_limit;
5206 if (idata_limit == 0) idata_limit =
c.length > 4096 ?
c.length : 4096;
5207 while (ioff +
c.length > idata_limit)
5209 STBI_NOTUSED(idata_limit_old);
5210 p = (
stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
5213 if (!stbi__getn(
s, z->idata+ioff,
c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
5218 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
5219 stbi__uint32 raw_len, bpl;
5220 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5221 if (scan != STBI__SCAN_load)
return 1;
5222 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
5224 bpl = (
s->img_x * z->depth + 7) / 8;
5225 raw_len = bpl *
s->img_y *
s->img_n +
s->img_y ;
5227 if (z->expanded == NULL)
return 0;
5228 STBI_FREE(z->idata); z->idata = NULL;
5229 if ((req_comp ==
s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
5230 s->img_out_n =
s->img_n+1;
5232 s->img_out_n =
s->img_n;
5233 if (!stbi__create_png_image(z, z->expanded, raw_len,
s->img_out_n, z->depth, color, interlace))
return 0;
5235 if (z->depth == 16) {
5236 if (!stbi__compute_transparency16(z, tc16,
s->img_out_n))
return 0;
5238 if (!stbi__compute_transparency(z, tc,
s->img_out_n))
return 0;
5241 if (is_iphone && stbi__de_iphone_flag &&
s->img_out_n > 2)
5245 s->img_n = pal_img_n;
5246 s->img_out_n = pal_img_n;
5247 if (req_comp >= 3)
s->img_out_n = req_comp;
5248 if (!stbi__expand_png_palette(z, palette, pal_len,
s->img_out_n))
5250 }
else if (has_trans) {
5254 STBI_FREE(z->expanded); z->expanded = NULL;
5262 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5263 if ((
c.type & (1 << 29)) == 0) {
5264 #ifndef STBI_NO_FAILURE_STRINGS
5266 static char invalid_chunk[] =
"XXXX PNG chunk not known";
5267 invalid_chunk[0] = STBI__BYTECAST(
c.type >> 24);
5268 invalid_chunk[1] = STBI__BYTECAST(
c.type >> 16);
5269 invalid_chunk[2] = STBI__BYTECAST(
c.type >> 8);
5270 invalid_chunk[3] = STBI__BYTECAST(
c.type >> 0);
5272 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
5274 stbi__skip(
s,
c.length);
5282 static void *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp, stbi__result_info *ri)
5285 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
5286 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
5288 ri->bits_per_channel = 8;
5289 else if (p->depth == 16)
5290 ri->bits_per_channel = 16;
5292 return stbi__errpuc(
"bad bits_per_channel",
"PNG not supported: unsupported color depth");
5295 if (req_comp && req_comp != p->s->img_out_n) {
5296 if (ri->bits_per_channel == 8)
5297 result = stbi__convert_format((
unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
5299 result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
5300 p->s->img_out_n = req_comp;
5301 if (result == NULL)
return result;
5305 if (n) *n = p->s->img_n;
5307 STBI_FREE(p->out); p->out = NULL;
5308 STBI_FREE(p->expanded); p->expanded = NULL;
5309 STBI_FREE(p->idata); p->idata = NULL;
5314 static void *stbi__png_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5318 return stbi__do_png(&p, x,y,comp,req_comp, ri);
5321 static int stbi__png_test(stbi__context *
s)
5324 r = stbi__check_png_header(
s);
5329 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
5331 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
5332 stbi__rewind( p->s );
5335 if (x) *x = p->s->img_x;
5336 if (y) *y = p->s->img_y;
5337 if (comp) *comp = p->s->img_n;
5341 static int stbi__png_info(stbi__context *
s,
int *x,
int *y,
int *comp)
5345 return stbi__png_info_raw(&p, x, y, comp);
5348 static int stbi__png_is16(stbi__context *
s)
5352 if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5354 if (p.depth != 16) {
5365 static int stbi__bmp_test_raw(stbi__context *
s)
5369 if (stbi__get8(
s) !=
'B')
return 0;
5370 if (stbi__get8(
s) !=
'M')
return 0;
5375 sz = stbi__get32le(
s);
5376 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5380 static int stbi__bmp_test(stbi__context *
s)
5382 int r = stbi__bmp_test_raw(
s);
5389 static int stbi__high_bit(
unsigned int z)
5392 if (z == 0)
return -1;
5393 if (z >= 0x10000) { n += 16; z >>= 16; }
5394 if (z >= 0x00100) { n += 8; z >>= 8; }
5395 if (z >= 0x00010) { n += 4; z >>= 4; }
5396 if (z >= 0x00004) { n += 2; z >>= 2; }
5397 if (z >= 0x00002) { n += 1; }
5401 static int stbi__bitcount(
unsigned int a)
5403 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
5404 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
5405 a = (a + (a >> 4)) & 0x0f0f0f0f;
5407 a = (a + (a >> 16));
5414 static int stbi__shiftsigned(
unsigned int v,
int shift,
int bits)
5416 static unsigned int mul_table[9] = {
5418 0xff, 0x55, 0x49, 0x11,
5419 0x21, 0x41, 0x81, 0x01,
5421 static unsigned int shift_table[9] = {
5428 STBI_ASSERT(v < 256);
5430 STBI_ASSERT(bits >= 0 && bits <= 8);
5431 return (
int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
5436 int bpp, offset, hsz;
5437 unsigned int mr,mg,mb,ma, all_a;
5441 static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info,
int compress)
5447 if (compress == 0) {
5448 if (info->bpp == 16) {
5449 info->mr = 31u << 10;
5450 info->mg = 31u << 5;
5451 info->mb = 31u << 0;
5452 }
else if (info->bpp == 32) {
5453 info->mr = 0xffu << 16;
5454 info->mg = 0xffu << 8;
5455 info->mb = 0xffu << 0;
5456 info->ma = 0xffu << 24;
5460 info->mr = info->mg = info->mb = info->ma = 0;
5467 static void *stbi__bmp_parse_header(stbi__context *
s, stbi__bmp_data *info)
5470 if (stbi__get8(
s) !=
'B' || stbi__get8(
s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5474 info->offset = stbi__get32le(
s);
5475 info->hsz = hsz = stbi__get32le(
s);
5476 info->mr = info->mg = info->mb = info->ma = 0;
5477 info->extra_read = 14;
5479 if (info->offset < 0)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5481 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5483 s->img_x = stbi__get16le(
s);
5484 s->img_y = stbi__get16le(
s);
5486 s->img_x = stbi__get32le(
s);
5487 s->img_y = stbi__get32le(
s);
5489 if (stbi__get16le(
s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5490 info->bpp = stbi__get16le(
s);
5492 int compress = stbi__get32le(
s);
5493 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5494 if (compress >= 4)
return stbi__errpuc(
"BMP JPEG/PNG",
"BMP type not supported: unsupported compression");
5495 if (compress == 3 && info->bpp != 16 && info->bpp != 32)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5501 if (hsz == 40 || hsz == 56) {
5508 if (info->bpp == 16 || info->bpp == 32) {
5509 if (compress == 0) {
5510 stbi__bmp_set_mask_defaults(info, compress);
5511 }
else if (compress == 3) {
5512 info->mr = stbi__get32le(
s);
5513 info->mg = stbi__get32le(
s);
5514 info->mb = stbi__get32le(
s);
5515 info->extra_read += 12;
5517 if (info->mr == info->mg && info->mg == info->mb) {
5519 return stbi__errpuc(
"bad BMP",
"bad BMP");
5522 return stbi__errpuc(
"bad BMP",
"bad BMP");
5527 if (hsz != 108 && hsz != 124)
5528 return stbi__errpuc(
"bad BMP",
"bad BMP");
5529 info->mr = stbi__get32le(
s);
5530 info->mg = stbi__get32le(
s);
5531 info->mb = stbi__get32le(
s);
5532 info->ma = stbi__get32le(
s);
5534 stbi__bmp_set_mask_defaults(info, compress);
5536 for (
i=0;
i < 12; ++
i)
5550 static void *stbi__bmp_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5553 unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
5555 int psize=0,
i,
j,width;
5556 int flip_vertically,
pad, target;
5557 stbi__bmp_data info;
5561 if (stbi__bmp_parse_header(
s, &info) == NULL)
5564 flip_vertically = ((int)
s->img_y) > 0;
5565 s->img_y = abs((
int)
s->img_y);
5567 if (
s->img_y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5568 if (
s->img_x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5576 if (info.hsz == 12) {
5578 psize = (info.offset - info.extra_read - 24) / 3;
5581 psize = (info.offset - info.extra_read - info.hsz) >> 2;
5586 int bytes_read_so_far =
s->callback_already_read + (int)(
s->img_buffer -
s->img_buffer_original);
5587 int header_limit = 1024;
5588 int extra_data_limit = 256*4;
5589 if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) {
5590 return stbi__errpuc(
"bad header",
"Corrupt BMP");
5596 if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) {
5597 return stbi__errpuc(
"bad offset",
"Corrupt BMP");
5599 stbi__skip(
s, info.offset - bytes_read_so_far);
5603 if (info.bpp == 24 && ma == 0xff000000)
5606 s->img_n = ma ? 4 : 3;
5607 if (req_comp && req_comp >= 3)
5613 if (!stbi__mad3sizes_valid(target,
s->img_x,
s->img_y, 0))
5614 return stbi__errpuc(
"too large",
"Corrupt BMP");
5616 out = (
stbi_uc *) stbi__malloc_mad3(target,
s->img_x,
s->img_y, 0);
5617 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5618 if (info.bpp < 16) {
5620 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
5621 for (
i=0;
i < psize; ++
i) {
5622 pal[
i][2] = stbi__get8(
s);
5623 pal[
i][1] = stbi__get8(
s);
5624 pal[
i][0] = stbi__get8(
s);
5625 if (info.hsz != 12) stbi__get8(
s);
5628 stbi__skip(
s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5629 if (info.bpp == 1) width = (
s->img_x + 7) >> 3;
5630 else if (info.bpp == 4) width = (
s->img_x + 1) >> 1;
5631 else if (info.bpp == 8) width =
s->img_x;
5632 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
5634 if (info.bpp == 1) {
5635 for (
j=0;
j < (int)
s->img_y; ++
j) {
5636 int bit_offset = 7, v = stbi__get8(
s);
5637 for (
i=0;
i < (int)
s->img_x; ++
i) {
5638 int color = (v>>bit_offset)&0x1;
5639 out[z++] = pal[color][0];
5640 out[z++] = pal[color][1];
5641 out[z++] = pal[color][2];
5642 if (target == 4) out[z++] = 255;
5643 if (
i+1 == (
int)
s->img_x)
break;
5644 if((--bit_offset) < 0) {
5652 for (
j=0;
j < (int)
s->img_y; ++
j) {
5653 for (
i=0;
i < (int)
s->img_x;
i += 2) {
5654 int v=stbi__get8(
s),v2=0;
5655 if (info.bpp == 4) {
5659 out[z++] = pal[v][0];
5660 out[z++] = pal[v][1];
5661 out[z++] = pal[v][2];
5662 if (target == 4) out[z++] = 255;
5663 if (
i+1 == (
int)
s->img_x)
break;
5664 v = (info.bpp == 8) ? stbi__get8(
s) : v2;
5665 out[z++] = pal[v][0];
5666 out[z++] = pal[v][1];
5667 out[z++] = pal[v][2];
5668 if (target == 4) out[z++] = 255;
5674 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
5677 stbi__skip(
s, info.offset - info.extra_read - info.hsz);
5678 if (info.bpp == 24) width = 3 *
s->img_x;
5679 else if (info.bpp == 16) width = 2*
s->img_x;
5682 if (info.bpp == 24) {
5684 }
else if (info.bpp == 32) {
5685 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5689 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5691 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
5692 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
5693 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
5694 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
5695 if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5697 for (
j=0;
j < (int)
s->img_y; ++
j) {
5699 for (
i=0;
i < (int)
s->img_x; ++
i) {
5701 out[z+2] = stbi__get8(
s);
5702 out[z+1] = stbi__get8(
s);
5703 out[z+0] = stbi__get8(
s);
5705 a = (easy == 2 ? stbi__get8(
s) : 255);
5707 if (target == 4) out[z++] = a;
5711 for (
i=0;
i < (int)
s->img_x; ++
i) {
5712 stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(
s) : stbi__get32le(
s));
5714 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5715 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5716 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5717 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5719 if (target == 4) out[z++] = STBI__BYTECAST(a);
5727 if (target == 4 && all_a == 0)
5728 for (
i=4*
s->img_x*
s->img_y-1;
i >= 0;
i -= 4)
5731 if (flip_vertically) {
5733 for (
j=0;
j < (int)
s->img_y>>1; ++
j) {
5735 stbi_uc *p2 = out + (
s->img_y-1-
j)*
s->img_x*target;
5736 for (
i=0;
i < (int)
s->img_x*target; ++
i) {
5737 t = p1[
i]; p1[
i] = p2[
i]; p2[
i] = t;
5742 if (req_comp && req_comp != target) {
5743 out = stbi__convert_format(out, target, req_comp,
s->img_x,
s->img_y);
5744 if (out == NULL)
return out;
5749 if (comp) *comp =
s->img_n;
5758 static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
5761 if (is_rgb16) *is_rgb16 = 0;
5762 switch(bits_per_pixel) {
5766 case 15:
if(is_rgb16) *is_rgb16 = 1;
5769 case 32:
return bits_per_pixel/8;
5774 static int stbi__tga_info(stbi__context *
s,
int *x,
int *y,
int *comp)
5776 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5777 int sz, tga_colormap_type;
5779 tga_colormap_type = stbi__get8(
s);
5780 if( tga_colormap_type > 1 ) {
5784 tga_image_type = stbi__get8(
s);
5785 if ( tga_colormap_type == 1 ) {
5786 if (tga_image_type != 1 && tga_image_type != 9) {
5792 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5797 tga_colormap_bpp = sz;
5799 if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5804 tga_colormap_bpp = 0;
5806 tga_w = stbi__get16le(
s);
5811 tga_h = stbi__get16le(
s);
5816 tga_bits_per_pixel = stbi__get8(
s);
5818 if (tga_colormap_bpp != 0) {
5819 if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5825 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5827 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5835 if (comp) *comp = tga_comp;
5839 static int stbi__tga_test(stbi__context *
s)
5842 int sz, tga_color_type;
5844 tga_color_type = stbi__get8(
s);
5845 if ( tga_color_type > 1 )
goto errorEnd;
5847 if ( tga_color_type == 1 ) {
5848 if (sz != 1 && sz != 9)
goto errorEnd;
5851 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5854 if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) )
goto errorEnd;
5857 if ( stbi__get16le(
s) < 1 )
goto errorEnd;
5858 if ( stbi__get16le(
s) < 1 )
goto errorEnd;
5860 if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) )
goto errorEnd;
5861 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5871 static void stbi__tga_read_rgb16(stbi__context *
s,
stbi_uc* out)
5873 stbi__uint16 px = (stbi__uint16)stbi__get16le(
s);
5874 stbi__uint16 fiveBitMask = 31;
5876 int r = (px >> 10) & fiveBitMask;
5877 int g = (px >> 5) & fiveBitMask;
5878 int b = px & fiveBitMask;
5880 out[0] = (
stbi_uc)((r * 255)/31);
5881 out[1] = (
stbi_uc)((g * 255)/31);
5882 out[2] = (
stbi_uc)((b * 255)/31);
5890 static void *stbi__tga_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5893 int tga_offset = stbi__get8(
s);
5894 int tga_indexed = stbi__get8(
s);
5895 int tga_image_type = stbi__get8(
s);
5897 int tga_palette_start = stbi__get16le(
s);
5898 int tga_palette_len = stbi__get16le(
s);
5899 int tga_palette_bits = stbi__get8(
s);
5900 int tga_x_origin = stbi__get16le(
s);
5901 int tga_y_origin = stbi__get16le(
s);
5902 int tga_width = stbi__get16le(
s);
5903 int tga_height = stbi__get16le(
s);
5904 int tga_bits_per_pixel = stbi__get8(
s);
5905 int tga_comp, tga_rgb16=0;
5906 int tga_inverted = stbi__get8(
s);
5909 unsigned char *tga_data;
5910 unsigned char *tga_palette = NULL;
5912 unsigned char raw_data[4] = {0};
5914 int RLE_repeating = 0;
5915 int read_next_pixel = 1;
5917 STBI_NOTUSED(tga_x_origin);
5918 STBI_NOTUSED(tga_y_origin);
5920 if (tga_height > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5921 if (tga_width > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5924 if ( tga_image_type >= 8 )
5926 tga_image_type -= 8;
5929 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5932 if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5933 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5936 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5941 if (comp) *comp = tga_comp;
5943 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5944 return stbi__errpuc(
"too large",
"Corrupt TGA");
5946 tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5947 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
5950 stbi__skip(
s, tga_offset );
5952 if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
5953 for (
i=0;
i < tga_height; ++
i) {
5954 int row = tga_inverted ? tga_height -
i - 1 :
i;
5955 stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5956 stbi__getn(
s, tga_row, tga_width * tga_comp);
5962 if (tga_palette_len == 0) {
5963 STBI_FREE(tga_data);
5964 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5968 stbi__skip(
s, tga_palette_start );
5970 tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5972 STBI_FREE(tga_data);
5973 return stbi__errpuc(
"outofmem",
"Out of memory");
5976 stbi_uc *pal_entry = tga_palette;
5978 for (
i=0;
i < tga_palette_len; ++
i) {
5979 stbi__tga_read_rgb16(
s, pal_entry);
5980 pal_entry += tga_comp;
5982 }
else if (!stbi__getn(
s, tga_palette, tga_palette_len * tga_comp)) {
5983 STBI_FREE(tga_data);
5984 STBI_FREE(tga_palette);
5985 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5989 for (
i=0;
i < tga_width * tga_height; ++
i)
5994 if ( RLE_count == 0 )
5997 int RLE_cmd = stbi__get8(
s);
5998 RLE_count = 1 + (RLE_cmd & 127);
5999 RLE_repeating = RLE_cmd >> 7;
6000 read_next_pixel = 1;
6001 }
else if ( !RLE_repeating )
6003 read_next_pixel = 1;
6007 read_next_pixel = 1;
6010 if ( read_next_pixel )
6016 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(
s) : stbi__get16le(
s);
6017 if ( pal_idx >= tga_palette_len ) {
6021 pal_idx *= tga_comp;
6022 for (
j = 0;
j < tga_comp; ++
j) {
6023 raw_data[
j] = tga_palette[pal_idx+
j];
6025 }
else if(tga_rgb16) {
6027 stbi__tga_read_rgb16(
s, raw_data);
6030 for (
j = 0;
j < tga_comp; ++
j) {
6031 raw_data[
j] = stbi__get8(
s);
6035 read_next_pixel = 0;
6039 for (
j = 0;
j < tga_comp; ++
j)
6040 tga_data[
i*tga_comp+
j] = raw_data[
j];
6048 for (
j = 0;
j*2 < tga_height; ++
j)
6050 int index1 =
j * tga_width * tga_comp;
6051 int index2 = (tga_height - 1 -
j) * tga_width * tga_comp;
6052 for (
i = tga_width * tga_comp;
i > 0; --
i)
6054 unsigned char temp = tga_data[index1];
6055 tga_data[index1] = tga_data[index2];
6056 tga_data[index2] = temp;
6063 if ( tga_palette != NULL )
6065 STBI_FREE( tga_palette );
6070 if (tga_comp >= 3 && !tga_rgb16)
6072 unsigned char* tga_pixel = tga_data;
6073 for (
i=0;
i < tga_width * tga_height; ++
i)
6075 unsigned char temp = tga_pixel[0];
6076 tga_pixel[0] = tga_pixel[2];
6077 tga_pixel[2] = temp;
6078 tga_pixel += tga_comp;
6083 if (req_comp && req_comp != tga_comp)
6084 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
6088 tga_palette_start = tga_palette_len = tga_palette_bits =
6089 tga_x_origin = tga_y_origin = 0;
6090 STBI_NOTUSED(tga_palette_start);
6100 static int stbi__psd_test(stbi__context *
s)
6102 int r = (stbi__get32be(
s) == 0x38425053);
6107 static int stbi__psd_decode_rle(stbi__context *
s,
stbi_uc *p,
int pixelCount)
6109 int count, nleft, len;
6112 while ((nleft = pixelCount - count) > 0) {
6113 len = stbi__get8(
s);
6116 }
else if (len < 128) {
6119 if (len > nleft)
return 0;
6126 }
else if (len > 128) {
6131 if (len > nleft)
return 0;
6132 val = stbi__get8(
s);
6145 static void *stbi__psd_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
6148 int channelCount, compression;
6156 if (stbi__get32be(
s) != 0x38425053)
6157 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
6160 if (stbi__get16be(
s) != 1)
6161 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
6167 channelCount = stbi__get16be(
s);
6168 if (channelCount < 0 || channelCount > 16)
6169 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
6172 h = stbi__get32be(
s);
6173 w = stbi__get32be(
s);
6175 if (h > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6176 if (w > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6179 bitdepth = stbi__get16be(
s);
6180 if (bitdepth != 8 && bitdepth != 16)
6181 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
6193 if (stbi__get16be(
s) != 3)
6194 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
6197 stbi__skip(
s,stbi__get32be(
s) );
6200 stbi__skip(
s, stbi__get32be(
s) );
6203 stbi__skip(
s, stbi__get32be(
s) );
6209 compression = stbi__get16be(
s);
6210 if (compression > 1)
6211 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
6214 if (!stbi__mad3sizes_valid(4, w, h, 0))
6215 return stbi__errpuc(
"too large",
"Corrupt PSD");
6219 if (!compression && bitdepth == 16 && bpc == 16) {
6220 out = (
stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
6221 ri->bits_per_channel = 16;
6223 out = (
stbi_uc *) stbi__malloc(4 * w*h);
6225 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6243 stbi__skip(
s, h * channelCount * 2 );
6246 for (channel = 0; channel < 4; channel++) {
6250 if (channel >= channelCount) {
6252 for (
i = 0;
i < pixelCount;
i++, p += 4)
6253 *p = (channel == 3 ? 255 : 0);
6256 if (!stbi__psd_decode_rle(
s, p, pixelCount)) {
6258 return stbi__errpuc(
"corrupt",
"bad RLE data");
6268 for (channel = 0; channel < 4; channel++) {
6269 if (channel >= channelCount) {
6271 if (bitdepth == 16 && bpc == 16) {
6272 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
6273 stbi__uint16 val = channel == 3 ? 65535 : 0;
6274 for (
i = 0;
i < pixelCount;
i++, q += 4)
6278 stbi_uc val = channel == 3 ? 255 : 0;
6279 for (
i = 0;
i < pixelCount;
i++, p += 4)
6283 if (ri->bits_per_channel == 16) {
6284 stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
6285 for (
i = 0;
i < pixelCount;
i++, q += 4)
6286 *q = (stbi__uint16) stbi__get16be(
s);
6289 if (bitdepth == 16) {
6290 for (
i = 0;
i < pixelCount;
i++, p += 4)
6291 *p = (
stbi_uc) (stbi__get16be(
s) >> 8);
6293 for (
i = 0;
i < pixelCount;
i++, p += 4)
6302 if (channelCount >= 4) {
6303 if (ri->bits_per_channel == 16) {
6304 for (
i=0;
i < w*h; ++
i) {
6305 stbi__uint16 *pixel = (stbi__uint16 *) out + 4*
i;
6306 if (pixel[3] != 0 && pixel[3] != 65535) {
6307 float a = pixel[3] / 65535.0f;
6308 float ra = 1.0f / a;
6309 float inv_a = 65535.0f * (1 - ra);
6310 pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
6311 pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
6312 pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
6316 for (
i=0;
i < w*h; ++
i) {
6317 unsigned char *pixel = out + 4*
i;
6318 if (pixel[3] != 0 && pixel[3] != 255) {
6319 float a = pixel[3] / 255.0f;
6320 float ra = 1.0f / a;
6321 float inv_a = 255.0f * (1 - ra);
6322 pixel[0] = (
unsigned char) (pixel[0]*ra + inv_a);
6323 pixel[1] = (
unsigned char) (pixel[1]*ra + inv_a);
6324 pixel[2] = (
unsigned char) (pixel[2]*ra + inv_a);
6331 if (req_comp && req_comp != 4) {
6332 if (ri->bits_per_channel == 16)
6333 out = (
stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
6335 out = stbi__convert_format(out, 4, req_comp, w, h);
6336 if (out == NULL)
return out;
6339 if (comp) *comp = 4;
6355 static int stbi__pic_is4(stbi__context *
s,
const char *str)
6365 static int stbi__pic_test_core(stbi__context *
s)
6369 if (!stbi__pic_is4(
s,
"\x53\x80\xF6\x34"))
6375 if (!stbi__pic_is4(
s,
"PICT"))
6390 for (
i=0; i<4; ++i, mask>>=1) {
6391 if (channel & mask) {
6392 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"PIC file too short");
6404 for (
i=0;i<4; ++i, mask>>=1)
6409 static stbi_uc *stbi__pic_load_core(stbi__context *
s,
int width,
int height,
int *comp,
stbi_uc *result)
6411 int act_comp=0,num_packets=0,y,chained;
6412 stbi__pic_packet packets[10];
6417 stbi__pic_packet *packet;
6419 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
6420 return stbi__errpuc(
"bad format",
"too many packets");
6422 packet = &packets[num_packets++];
6424 chained = stbi__get8(
s);
6425 packet->size = stbi__get8(
s);
6426 packet->type = stbi__get8(
s);
6427 packet->channel = stbi__get8(
s);
6429 act_comp |= packet->channel;
6431 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
6432 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
6435 *comp = (act_comp & 0x10 ? 4 : 3);
6437 for(y=0; y<height; ++y) {
6440 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
6441 stbi__pic_packet *packet = &packets[packet_idx];
6444 switch (packet->type) {
6446 return stbi__errpuc(
"bad format",
"packet has bad compression type");
6451 for(x=0;x<width;++x,
dest+=4)
6452 if (!stbi__readval(
s,packet->channel,
dest))
6464 count=stbi__get8(
s);
6465 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6470 if (!stbi__readval(
s,packet->channel,value))
return 0;
6472 for(
i=0;
i<count; ++
i,
dest+=4)
6473 stbi__copyval(packet->channel,
dest,value);
6482 int count = stbi__get8(
s),
i;
6483 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6489 count = stbi__get16be(
s);
6493 return stbi__errpuc(
"bad file",
"scanline overrun");
6495 if (!stbi__readval(
s,packet->channel,value))
6498 for(
i=0;
i<count;++
i,
dest += 4)
6499 stbi__copyval(packet->channel,
dest,value);
6502 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
6505 if (!stbi__readval(
s,packet->channel,
dest))
6519 static void *stbi__pic_load(stbi__context *
s,
int *px,
int *py,
int *comp,
int req_comp, stbi__result_info *ri)
6522 int i, x,y, internal_comp;
6525 if (!comp) comp = &internal_comp;
6527 for (
i=0;
i<92; ++
i)
6530 x = stbi__get16be(
s);
6531 y = stbi__get16be(
s);
6533 if (y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6534 if (x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6536 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
6537 if (!stbi__mad3sizes_valid(x, y, 4, 0))
return stbi__errpuc(
"too large",
"PIC image too large to decode");
6544 result = (
stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
6545 if (!result)
return stbi__errpuc(
"outofmem",
"Out of memory");
6546 memset(result, 0xff, x*y*4);
6548 if (!stbi__pic_load_core(
s,x,y,comp, result)) {
6554 if (req_comp == 0) req_comp = *comp;
6555 result=stbi__convert_format(result,4,req_comp,x,y);
6560 static int stbi__pic_test(stbi__context *
s)
6562 int r = stbi__pic_test_core(
s);
6585 int flags, bgindex, ratio, transparent, eflags;
6588 stbi__gif_lzw codes[8192];
6592 int start_x, start_y;
6599 static int stbi__gif_test_raw(stbi__context *
s)
6602 if (stbi__get8(
s) !=
'G' || stbi__get8(
s) !=
'I' || stbi__get8(
s) !=
'F' || stbi__get8(
s) !=
'8')
return 0;
6604 if (sz !=
'9' && sz !=
'7')
return 0;
6605 if (stbi__get8(
s) !=
'a')
return 0;
6609 static int stbi__gif_test(stbi__context *
s)
6611 int r = stbi__gif_test_raw(
s);
6616 static void stbi__gif_parse_colortable(stbi__context *
s,
stbi_uc pal[256][4],
int num_entries,
int transp)
6619 for (
i=0;
i < num_entries; ++
i) {
6620 pal[
i][2] = stbi__get8(
s);
6621 pal[
i][1] = stbi__get8(
s);
6622 pal[
i][0] = stbi__get8(
s);
6623 pal[
i][3] = transp ==
i ? 0 : 255;
6627 static int stbi__gif_header(stbi__context *
s, stbi__gif *g,
int *comp,
int is_info)
6630 if (stbi__get8(
s) !=
'G' || stbi__get8(
s) !=
'I' || stbi__get8(
s) !=
'F' || stbi__get8(
s) !=
'8')
6631 return stbi__err(
"not GIF",
"Corrupt GIF");
6633 version = stbi__get8(
s);
6634 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
6635 if (stbi__get8(
s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
6637 stbi__g_failure_reason =
"";
6638 g->w = stbi__get16le(
s);
6639 g->h = stbi__get16le(
s);
6640 g->flags = stbi__get8(
s);
6641 g->bgindex = stbi__get8(
s);
6642 g->ratio = stbi__get8(
s);
6643 g->transparent = -1;
6645 if (g->w > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
6646 if (g->h > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
6648 if (comp != 0) *comp = 4;
6650 if (is_info)
return 1;
6652 if (g->flags & 0x80)
6653 stbi__gif_parse_colortable(
s,g->pal, 2 << (g->flags & 7), -1);
6658 static int stbi__gif_info_raw(stbi__context *
s,
int *x,
int *y,
int *comp)
6660 stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
6661 if (!g)
return stbi__err(
"outofmem",
"Out of memory");
6662 if (!stbi__gif_header(
s, g, comp, 1)) {
6673 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6680 if (g->codes[code].prefix >= 0)
6681 stbi__out_gif_code(g, g->codes[code].prefix);
6683 if (g->cur_y >= g->max_y)
return;
6685 idx = g->cur_x + g->cur_y;
6687 g->history[idx / 4] = 1;
6689 c = &g->color_table[g->codes[code].suffix * 4];
6698 if (g->cur_x >= g->max_x) {
6699 g->cur_x = g->start_x;
6700 g->cur_y += g->step;
6702 while (g->cur_y >= g->max_y && g->parse > 0) {
6703 g->step = (1 << g->parse) * g->line_size;
6704 g->cur_y = g->start_y + (g->step >> 1);
6710 static stbi_uc *stbi__process_gif_raster(stbi__context *
s, stbi__gif *g)
6713 stbi__int32 len, init_code;
6715 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6718 lzw_cs = stbi__get8(
s);
6719 if (lzw_cs > 12)
return NULL;
6720 clear = 1 << lzw_cs;
6722 codesize = lzw_cs + 1;
6723 codemask = (1 << codesize) - 1;
6726 for (init_code = 0; init_code < clear; init_code++) {
6727 g->codes[init_code].prefix = -1;
6728 g->codes[init_code].first = (
stbi_uc) init_code;
6729 g->codes[init_code].suffix = (
stbi_uc) init_code;
6738 if (valid_bits < codesize) {
6740 len = stbi__get8(
s);
6745 bits |= (stbi__int32) stbi__get8(
s) << valid_bits;
6748 stbi__int32 code = bits & codemask;
6750 valid_bits -= codesize;
6752 if (code == clear) {
6753 codesize = lzw_cs + 1;
6754 codemask = (1 << codesize) - 1;
6758 }
else if (code == clear + 1) {
6760 while ((len = stbi__get8(
s)) > 0)
6763 }
else if (code <= avail) {
6765 return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6769 p = &g->codes[avail++];
6771 return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6774 p->prefix = (stbi__int16) oldcode;
6775 p->first = g->codes[oldcode].first;
6776 p->suffix = (code == avail) ? p->first : g->codes[code].first;
6777 }
else if (code == avail)
6778 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6780 stbi__out_gif_code(g, (stbi__uint16) code);
6782 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6784 codemask = (1 << codesize) - 1;
6789 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6797 static stbi_uc *stbi__gif_load_next(stbi__context *
s, stbi__gif *g,
int *comp,
int req_comp,
stbi_uc *two_back)
6803 STBI_NOTUSED(req_comp);
6808 if (!stbi__gif_header(
s, g, comp,0))
return 0;
6809 if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
6810 return stbi__errpuc(
"too large",
"GIF image is too large");
6811 pcount = g->w * g->h;
6812 g->out = (
stbi_uc *) stbi__malloc(4 * pcount);
6813 g->background = (
stbi_uc *) stbi__malloc(4 * pcount);
6814 g->history = (
stbi_uc *) stbi__malloc(pcount);
6815 if (!g->out || !g->background || !g->history)
6816 return stbi__errpuc(
"outofmem",
"Out of memory");
6821 memset(g->out, 0x00, 4 * pcount);
6822 memset(g->background, 0x00, 4 * pcount);
6823 memset(g->history, 0x00, pcount);
6827 dispose = (g->eflags & 0x1C) >> 2;
6828 pcount = g->w * g->h;
6830 if ((dispose == 3) && (two_back == 0)) {
6835 for (pi = 0; pi < pcount; ++pi) {
6836 if (g->history[pi]) {
6837 memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
6840 }
else if (dispose == 2) {
6842 for (pi = 0; pi < pcount; ++pi) {
6843 if (g->history[pi]) {
6844 memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
6855 memcpy( g->background, g->out, 4 * g->w * g->h );
6859 memset( g->history, 0x00, g->w * g->h );
6862 int tag = stbi__get8(
s);
6866 stbi__int32 x, y, w, h;
6869 x = stbi__get16le(
s);
6870 y = stbi__get16le(
s);
6871 w = stbi__get16le(
s);
6872 h = stbi__get16le(
s);
6873 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6874 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6876 g->line_size = g->w * 4;
6878 g->start_y = y * g->line_size;
6879 g->max_x = g->start_x + w * 4;
6880 g->max_y = g->start_y + h * g->line_size;
6881 g->cur_x = g->start_x;
6882 g->cur_y = g->start_y;
6889 g->cur_y = g->max_y;
6891 g->lflags = stbi__get8(
s);
6893 if (g->lflags & 0x40) {
6894 g->step = 8 * g->line_size;
6897 g->step = g->line_size;
6901 if (g->lflags & 0x80) {
6902 stbi__gif_parse_colortable(
s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6903 g->color_table = (
stbi_uc *) g->lpal;
6904 }
else if (g->flags & 0x80) {
6905 g->color_table = (
stbi_uc *) g->pal;
6907 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6909 o = stbi__process_gif_raster(
s, g);
6910 if (!o)
return NULL;
6913 pcount = g->w * g->h;
6914 if (first_frame && (g->bgindex > 0)) {
6916 for (pi = 0; pi < pcount; ++pi) {
6917 if (g->history[pi] == 0) {
6918 g->pal[g->bgindex][3] = 255;
6919 memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
6930 int ext = stbi__get8(
s);
6932 len = stbi__get8(
s);
6934 g->eflags = stbi__get8(
s);
6935 g->delay = 10 * stbi__get16le(
s);
6938 if (g->transparent >= 0) {
6939 g->pal[g->transparent][3] = 255;
6941 if (g->eflags & 0x01) {
6942 g->transparent = stbi__get8(
s);
6943 if (g->transparent >= 0) {
6944 g->pal[g->transparent][3] = 0;
6949 g->transparent = -1;
6956 while ((len = stbi__get8(
s)) != 0) {
6966 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6971 static void *stbi__load_gif_main_outofmem(stbi__gif *g,
stbi_uc *out,
int **delays)
6974 STBI_FREE(g->history);
6975 STBI_FREE(g->background);
6977 if (out) STBI_FREE(out);
6978 if (delays && *delays) STBI_FREE(*delays);
6979 return stbi__errpuc(
"outofmem",
"Out of memory");
6982 static void *stbi__load_gif_main(stbi__context *
s,
int **delays,
int *x,
int *y,
int *z,
int *comp,
int req_comp)
6984 if (stbi__gif_test(
s)) {
6992 int delays_size = 0;
6994 STBI_NOTUSED(out_size);
6995 STBI_NOTUSED(delays_size);
6997 memset(&g, 0,
sizeof(g));
7003 u = stbi__gif_load_next(
s, &g, comp, req_comp, two_back);
7010 stride = g.w * g.h * 4;
7013 void *tmp = (
stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );
7015 return stbi__load_gif_main_outofmem(&g, out, delays);
7018 out_size = layers * stride;
7022 int *new_delays = (
int*) STBI_REALLOC_SIZED( *delays, delays_size,
sizeof(
int) * layers );
7024 return stbi__load_gif_main_outofmem(&g, out, delays);
7025 *delays = new_delays;
7026 delays_size = layers *
sizeof(int);
7029 out = (
stbi_uc*)stbi__malloc( layers * stride );
7031 return stbi__load_gif_main_outofmem(&g, out, delays);
7032 out_size = layers * stride;
7034 *delays = (
int*) stbi__malloc( layers *
sizeof(
int) );
7036 return stbi__load_gif_main_outofmem(&g, out, delays);
7037 delays_size = layers *
sizeof(int);
7040 memcpy( out + ((layers - 1) * stride), u, stride );
7042 two_back = out - 2 * stride;
7046 (*delays)[layers - 1U] = g.delay;
7053 STBI_FREE(g.history);
7054 STBI_FREE(g.background);
7057 if (req_comp && req_comp != 4)
7058 out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
7063 return stbi__errpuc(
"not GIF",
"Image was not as a gif type.");
7067 static void *stbi__gif_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
7071 memset(&g, 0,
sizeof(g));
7074 u = stbi__gif_load_next(
s, &g, comp, req_comp, 0);
7082 if (req_comp && req_comp != 4)
7083 u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
7090 STBI_FREE(g.history);
7091 STBI_FREE(g.background);
7096 static int stbi__gif_info(stbi__context *
s,
int *x,
int *y,
int *comp)
7098 return stbi__gif_info_raw(
s,x,y,comp);
7106 static int stbi__hdr_test_core(stbi__context *
s,
const char *signature)
7109 for (
i=0; signature[
i]; ++
i)
7110 if (stbi__get8(
s) != signature[
i])
7116 static int stbi__hdr_test(stbi__context*
s)
7118 int r = stbi__hdr_test_core(
s,
"#?RADIANCE\n");
7121 r = stbi__hdr_test_core(
s,
"#?RGBE\n");
7127 #define STBI__HDR_BUFLEN 1024
7128 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
7133 c = (char) stbi__get8(z);
7135 while (!stbi__at_eof(z) &&
c !=
'\n') {
7137 if (len == STBI__HDR_BUFLEN-1) {
7139 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
7143 c = (char) stbi__get8(z);
7150 static void stbi__hdr_convert(
float *output,
stbi_uc *input,
int req_comp)
7152 if ( input[3] != 0 ) {
7155 f1 = (float) ldexp(1.0
f, input[3] - (
int)(128 + 8));
7157 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
7159 output[0] = input[0] * f1;
7160 output[1] = input[1] * f1;
7161 output[2] = input[2] * f1;
7163 if (req_comp == 2) output[1] = 1;
7164 if (req_comp == 4) output[3] = 1;
7167 case 4: output[3] = 1;
7168 case 3: output[0] = output[1] = output[2] = 0;
7170 case 2: output[1] = 1;
7171 case 1: output[0] = 0;
7177 static float *stbi__hdr_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
7179 char buffer[STBI__HDR_BUFLEN];
7186 unsigned char count,
value;
7187 int i,
j, k, c1,c2, z;
7188 const char *headerToken;
7192 headerToken = stbi__hdr_gettoken(
s,buffer);
7193 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
7194 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
7198 token = stbi__hdr_gettoken(
s,buffer);
7199 if (token[0] == 0)
break;
7200 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7203 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
7207 token = stbi__hdr_gettoken(
s,buffer);
7208 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7210 height = (int) strtol(token, &token, 10);
7211 while (*token ==
' ') ++token;
7212 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7214 width = (int) strtol(token, NULL, 10);
7216 if (height > STBI_MAX_DIMENSIONS)
return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7217 if (width > STBI_MAX_DIMENSIONS)
return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7222 if (comp) *comp = 3;
7223 if (req_comp == 0) req_comp = 3;
7225 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
7226 return stbi__errpf(
"too large",
"HDR image is too large");
7229 hdr_data = (
float *) stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
7231 return stbi__errpf(
"outofmem",
"Out of memory");
7235 if ( width < 8 || width >= 32768) {
7237 for (
j=0;
j < height; ++
j) {
7238 for (
i=0;
i < width; ++
i) {
7241 stbi__getn(
s, rgbe, 4);
7242 stbi__hdr_convert(hdr_data +
j * width * req_comp +
i * req_comp, rgbe, req_comp);
7249 for (
j = 0;
j < height; ++
j) {
7252 len = stbi__get8(
s);
7253 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
7261 stbi__hdr_convert(hdr_data, rgbe, req_comp);
7264 STBI_FREE(scanline);
7265 goto main_decode_loop;
7268 len |= stbi__get8(
s);
7269 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
7270 if (scanline == NULL) {
7271 scanline = (
stbi_uc *) stbi__malloc_mad2(width, 4, 0);
7273 STBI_FREE(hdr_data);
7274 return stbi__errpf(
"outofmem",
"Out of memory");
7278 for (k = 0; k < 4; ++k) {
7281 while ((nleft = width -
i) > 0) {
7282 count = stbi__get8(
s);
7287 if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
7288 for (z = 0; z < count; ++z)
7289 scanline[
i++ * 4 + k] = value;
7292 if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
7293 for (z = 0; z < count; ++z)
7294 scanline[
i++ * 4 + k] = stbi__get8(
s);
7298 for (
i=0;
i < width; ++
i)
7299 stbi__hdr_convert(hdr_data+(
j*width +
i)*req_comp, scanline +
i*4, req_comp);
7302 STBI_FREE(scanline);
7308 static int stbi__hdr_info(stbi__context *
s,
int *x,
int *y,
int *comp)
7310 char buffer[STBI__HDR_BUFLEN];
7317 if (!comp) comp = &dummy;
7319 if (stbi__hdr_test(
s) == 0) {
7325 token = stbi__hdr_gettoken(
s,buffer);
7326 if (token[0] == 0)
break;
7327 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7334 token = stbi__hdr_gettoken(
s,buffer);
7335 if (strncmp(token,
"-Y ", 3)) {
7340 *y = (int) strtol(token, &token, 10);
7341 while (*token ==
' ') ++token;
7342 if (strncmp(token,
"+X ", 3)) {
7347 *x = (int) strtol(token, NULL, 10);
7351 #endif // STBI_NO_HDR
7354 static int stbi__bmp_info(stbi__context *
s,
int *x,
int *y,
int *comp)
7357 stbi__bmp_data info;
7360 p = stbi__bmp_parse_header(
s, &info);
7365 if (x) *x =
s->img_x;
7366 if (y) *y =
s->img_y;
7368 if (info.bpp == 24 && info.ma == 0xff000000)
7371 *comp = info.ma ? 4 : 3;
7378 static int stbi__psd_info(stbi__context *
s,
int *x,
int *y,
int *comp)
7380 int channelCount, dummy, depth;
7383 if (!comp) comp = &dummy;
7384 if (stbi__get32be(
s) != 0x38425053) {
7388 if (stbi__get16be(
s) != 1) {
7393 channelCount = stbi__get16be(
s);
7394 if (channelCount < 0 || channelCount > 16) {
7398 *y = stbi__get32be(
s);
7399 *x = stbi__get32be(
s);
7400 depth = stbi__get16be(
s);
7401 if (depth != 8 && depth != 16) {
7405 if (stbi__get16be(
s) != 3) {
7413 static int stbi__psd_is16(stbi__context *
s)
7415 int channelCount, depth;
7416 if (stbi__get32be(
s) != 0x38425053) {
7420 if (stbi__get16be(
s) != 1) {
7425 channelCount = stbi__get16be(
s);
7426 if (channelCount < 0 || channelCount > 16) {
7430 STBI_NOTUSED(stbi__get32be(
s));
7431 STBI_NOTUSED(stbi__get32be(
s));
7432 depth = stbi__get16be(
s);
7442 static int stbi__pic_info(stbi__context *
s,
int *x,
int *y,
int *comp)
7444 int act_comp=0,num_packets=0,chained,dummy;
7445 stbi__pic_packet packets[10];
7449 if (!comp) comp = &dummy;
7451 if (!stbi__pic_is4(
s,
"\x53\x80\xF6\x34")) {
7458 *x = stbi__get16be(
s);
7459 *y = stbi__get16be(
s);
7460 if (stbi__at_eof(
s)) {
7464 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
7472 stbi__pic_packet *packet;
7474 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
7477 packet = &packets[num_packets++];
7478 chained = stbi__get8(
s);
7479 packet->size = stbi__get8(
s);
7480 packet->type = stbi__get8(
s);
7481 packet->channel = stbi__get8(
s);
7482 act_comp |= packet->channel;
7484 if (stbi__at_eof(
s)) {
7488 if (packet->size != 8) {
7494 *comp = (act_comp & 0x10 ? 4 : 3);
7513 static int stbi__pnm_test(stbi__context *
s)
7516 p = (char) stbi__get8(
s);
7517 t = (char) stbi__get8(
s);
7518 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7525 static void *stbi__pnm_load(stbi__context *
s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
7530 ri->bits_per_channel = stbi__pnm_info(
s, (
int *)&
s->img_x, (
int *)&
s->img_y, (
int *)&
s->img_n);
7531 if (ri->bits_per_channel == 0)
7534 if (
s->img_y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
7535 if (
s->img_x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
7539 if (comp) *comp =
s->img_n;
7541 if (!stbi__mad4sizes_valid(
s->img_n,
s->img_x,
s->img_y, ri->bits_per_channel / 8, 0))
7542 return stbi__errpuc(
"too large",
"PNM too large");
7544 out = (
stbi_uc *) stbi__malloc_mad4(
s->img_n,
s->img_x,
s->img_y, ri->bits_per_channel / 8, 0);
7545 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
7546 if (!stbi__getn(
s, out,
s->img_n *
s->img_x *
s->img_y * (ri->bits_per_channel / 8))) {
7548 return stbi__errpuc(
"bad PNM",
"PNM file truncated");
7551 if (req_comp && req_comp !=
s->img_n) {
7552 if (ri->bits_per_channel == 16) {
7553 out = (
stbi_uc *) stbi__convert_format16((stbi__uint16 *) out,
s->img_n, req_comp,
s->img_x,
s->img_y);
7555 out = stbi__convert_format(out,
s->img_n, req_comp,
s->img_x,
s->img_y);
7557 if (out == NULL)
return out;
7562 static int stbi__pnm_isspace(
char c)
7564 return c ==
' ' ||
c ==
'\t' ||
c ==
'\n' ||
c ==
'\v' ||
c ==
'\f' ||
c ==
'\r';
7567 static void stbi__pnm_skip_whitespace(stbi__context *
s,
char *
c)
7570 while (!stbi__at_eof(
s) && stbi__pnm_isspace(*
c))
7571 *
c = (char) stbi__get8(
s);
7573 if (stbi__at_eof(
s) || *
c !=
'#')
7576 while (!stbi__at_eof(
s) && *
c !=
'\n' && *
c !=
'\r' )
7577 *
c = (
char) stbi__get8(
s);
7581 static int stbi__pnm_isdigit(
char c)
7583 return c >=
'0' &&
c <=
'9';
7586 static int stbi__pnm_getinteger(stbi__context *
s,
char *
c)
7590 while (!stbi__at_eof(
s) && stbi__pnm_isdigit(*
c)) {
7592 *
c = (char) stbi__get8(
s);
7593 if((value > 214748364) || (
value == 214748364 && *
c >
'7'))
7594 return stbi__err(
"integer parse overflow",
"Parsing an integer in the PPM header overflowed a 32-bit int");
7600 static int stbi__pnm_info(stbi__context *
s,
int *x,
int *y,
int *comp)
7607 if (!comp) comp = &dummy;
7612 p = (char) stbi__get8(
s);
7613 t = (char) stbi__get8(
s);
7614 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
7619 *comp = (t ==
'6') ? 3 : 1;
7621 c = (char) stbi__get8(
s);
7622 stbi__pnm_skip_whitespace(
s, &
c);
7624 *x = stbi__pnm_getinteger(
s, &
c);
7626 return stbi__err(
"invalid width",
"PPM image header had zero or overflowing width");
7627 stbi__pnm_skip_whitespace(
s, &
c);
7629 *y = stbi__pnm_getinteger(
s, &
c);
7631 return stbi__err(
"invalid width",
"PPM image header had zero or overflowing width");
7632 stbi__pnm_skip_whitespace(
s, &
c);
7634 maxv = stbi__pnm_getinteger(
s, &
c);
7636 return stbi__err(
"max value > 65535",
"PPM image supports only 8-bit and 16-bit images");
7637 else if (maxv > 255)
7643 static int stbi__pnm_is16(stbi__context *
s)
7645 if (stbi__pnm_info(
s, NULL, NULL, NULL) == 16)
7651 static int stbi__info_main(stbi__context *
s,
int *x,
int *y,
int *comp)
7653 #ifndef STBI_NO_JPEG
7654 if (stbi__jpeg_info(
s, x, y, comp))
return 1;
7658 if (stbi__png_info(
s, x, y, comp))
return 1;
7662 if (stbi__gif_info(
s, x, y, comp))
return 1;
7666 if (stbi__bmp_info(
s, x, y, comp))
return 1;
7670 if (stbi__psd_info(
s, x, y, comp))
return 1;
7674 if (stbi__pic_info(
s, x, y, comp))
return 1;
7678 if (stbi__pnm_info(
s, x, y, comp))
return 1;
7682 if (stbi__hdr_info(
s, x, y, comp))
return 1;
7687 if (stbi__tga_info(
s, x, y, comp))
7690 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
7693 static int stbi__is_16_main(stbi__context *
s)
7696 if (stbi__png_is16(
s))
return 1;
7700 if (stbi__psd_is16(
s))
return 1;
7704 if (stbi__pnm_is16(
s))
return 1;
7709 #ifndef STBI_NO_STDIO
7712 FILE *
f = stbi__fopen(filename,
"rb");
7714 if (!
f)
return stbi__err(
"can't fopen",
"Unable to open file");
7724 long pos = ftell(
f);
7725 stbi__start_file(&
s,
f);
7726 r = stbi__info_main(&
s,x,y,comp);
7727 fseek(
f,pos,SEEK_SET);
7733 FILE *
f = stbi__fopen(filename,
"rb");
7735 if (!
f)
return stbi__err(
"can't fopen",
"Unable to open file");
7745 long pos = ftell(
f);
7746 stbi__start_file(&
s,
f);
7747 r = stbi__is_16_main(&
s);
7748 fseek(
f,pos,SEEK_SET);
7751 #endif // !STBI_NO_STDIO
7756 stbi__start_mem(&
s,buffer,len);
7757 return stbi__info_main(&
s,x,y,comp);
7764 return stbi__info_main(&
s,x,y,comp);
7770 stbi__start_mem(&
s,buffer,len);
7771 return stbi__is_16_main(&
s);
7778 return stbi__is_16_main(&
s);
7781 #endif // STB_IMAGE_IMPLEMENTATION