206 #ifndef STBI_INCLUDE_STB_IMAGE_H
207 #define STBI_INCLUDE_STB_IMAGE_H
379 #ifndef STBI_NO_STDIO
381 #endif // STBI_NO_STDIO
383 #define STBI_VERSION 1
402 #ifdef STB_IMAGE_STATIC
403 #define STBIDEF static
405 #define STBIDEF extern
419 int(*read) (
void *user,
char *data,
int size);
420 void(*
skip) (
void *user,
int n);
421 int(*eof) (
void *user);
433 #ifndef STBI_NO_STDIO
444 #ifndef STBI_NO_STDIO
453 #ifndef STBI_NO_LINEAR
454 STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *channels_in_file,
int desired_channels);
458 #ifndef STBI_NO_STDIO
466 #endif // STBI_NO_HDR
468 #ifndef STBI_NO_LINEAR
471 #endif // STBI_NO_LINEAR
476 #ifndef STBI_NO_STDIO
479 #endif // STBI_NO_STDIO
493 #ifndef STBI_NO_STDIO
531 #endif // STBI_INCLUDE_STB_IMAGE_H
533 #ifdef STB_IMAGE_IMPLEMENTATION
535 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
536 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
537 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
538 || defined(STBI_ONLY_ZLIB)
539 #ifndef STBI_ONLY_JPEG
542 #ifndef STBI_ONLY_PNG
545 #ifndef STBI_ONLY_BMP
548 #ifndef STBI_ONLY_PSD
551 #ifndef STBI_ONLY_TGA
554 #ifndef STBI_ONLY_GIF
557 #ifndef STBI_ONLY_HDR
560 #ifndef STBI_ONLY_PIC
563 #ifndef STBI_ONLY_PNM
568 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
579 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
583 #ifndef STBI_NO_STDIO
589 #define STBI_ASSERT(x) assert(x)
595 #define stbi_inline inline
600 #define stbi_inline __forceinline
605 typedef unsigned short stbi__uint16;
606 typedef signed short stbi__int16;
607 typedef unsigned int stbi__uint32;
608 typedef signed int stbi__int32;
611 typedef uint16_t stbi__uint16;
612 typedef int16_t stbi__int16;
613 typedef uint32_t stbi__uint32;
614 typedef int32_t stbi__int32;
618 typedef unsigned char validate_uint32[
sizeof(stbi__uint32) == 4 ? 1 : -1];
621 #define STBI_NOTUSED(v) (void)(v)
623 #define STBI_NOTUSED(v) (void)sizeof(v)
627 #define STBI_HAS_LROTL
630 #ifdef STBI_HAS_LROTL
631 #define stbi_lrot(x,y) _lrotl(x,y)
633 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
636 #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
638 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
641 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
645 #define STBI_MALLOC(sz) malloc(sz)
646 #define STBI_REALLOC(p,newsz) realloc(p,newsz)
647 #define STBI_FREE(p) free(p)
650 #ifndef STBI_REALLOC_SIZED
651 #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
655 #if defined(__x86_64__) || defined(_M_X64)
656 #define STBI__X64_TARGET
657 #elif defined(__i386) || defined(_M_IX86)
658 #define STBI__X86_TARGET
661 #if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
670 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
685 #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
687 #include <emmintrin.h>
691 #if _MSC_VER >= 1400 // not VC6
693 static int stbi__cpuid3(
void)
700 static int stbi__cpuid3(
void)
712 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
714 static int stbi__sse2_available()
716 int info3 = stbi__cpuid3();
717 return ((info3 >> 26) & 1) != 0;
719 #else // assume GCC-style if not VC++
720 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
722 static int stbi__sse2_available()
724 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later
726 return __builtin_cpu_supports(
"sse2");
737 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)
742 #include <arm_neon.h>
744 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
747 #ifndef STBI_SIMD_ALIGN
748 #define STBI_SIMD_ALIGN(type, name) type name
759 stbi__uint32 img_x, img_y;
760 int img_n, img_out_n;
765 int read_from_callbacks;
769 stbi_uc *img_buffer, *img_buffer_end;
770 stbi_uc *img_buffer_original, *img_buffer_original_end;
774 static void stbi__refill_buffer(stbi__context *s);
777 static void stbi__start_mem(stbi__context *s,
stbi_uc const *buffer,
int len)
780 s->read_from_callbacks = 0;
781 s->img_buffer = s->img_buffer_original = (
stbi_uc *)buffer;
782 s->img_buffer_end = s->img_buffer_original_end = (
stbi_uc *)buffer + len;
786 static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user)
789 s->io_user_data = user;
790 s->buflen =
sizeof(s->buffer_start);
791 s->read_from_callbacks = 1;
792 s->img_buffer_original = s->buffer_start;
793 stbi__refill_buffer(s);
794 s->img_buffer_original_end = s->img_buffer_end;
797 #ifndef STBI_NO_STDIO
799 static int stbi__stdio_read(
void *user,
char *data,
int size)
801 return (
int)fread(data, 1, size, (FILE*)user);
804 static void stbi__stdio_skip(
void *user,
int n)
806 fseek((FILE*)user, n, SEEK_CUR);
809 static int stbi__stdio_eof(
void *user)
811 return feof((FILE*)user);
821 static void stbi__start_file(stbi__context *s, FILE *f)
823 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *)f);
828 #endif // !STBI_NO_STDIO
830 static void stbi__rewind(stbi__context *s)
835 s->img_buffer = s->img_buffer_original;
836 s->img_buffer_end = s->img_buffer_original_end;
847 int bits_per_channel;
853 static int stbi__jpeg_test(stbi__context *s);
854 static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
855 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
859 static int stbi__png_test(stbi__context *s);
860 static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
861 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
865 static int stbi__bmp_test(stbi__context *s);
866 static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
867 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
871 static int stbi__tga_test(stbi__context *s);
872 static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
873 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
877 static int stbi__psd_test(stbi__context *s);
878 static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc);
879 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
883 static int stbi__hdr_test(stbi__context *s);
884 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
885 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
889 static int stbi__pic_test(stbi__context *s);
890 static void *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
891 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
895 static int stbi__gif_test(stbi__context *s);
896 static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
897 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
901 static int stbi__pnm_test(stbi__context *s);
902 static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri);
903 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
907 static const char *stbi__g_failure_reason;
911 return stbi__g_failure_reason;
914 static int stbi__err(
const char *str)
916 stbi__g_failure_reason = str;
920 static void *stbi__malloc(
size_t size)
922 return STBI_MALLOC(size);
937 static int stbi__addsizes_valid(
int a,
int b)
944 return a <= INT_MAX - b;
949 static int stbi__mul2sizes_valid(
int a,
int b)
951 if (a < 0 || b < 0)
return 0;
952 if (b == 0)
return 1;
954 return a <= INT_MAX / b;
958 static int stbi__mad2sizes_valid(
int a,
int b,
int add)
960 return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
964 static int stbi__mad3sizes_valid(
int a,
int b,
int c,
int add)
966 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
967 stbi__addsizes_valid(a*b*c, add);
971 static int stbi__mad4sizes_valid(
int a,
int b,
int c,
int d,
int add)
973 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
974 stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
978 static void *stbi__malloc_mad2(
int a,
int b,
int add)
980 if (!stbi__mad2sizes_valid(a, b, add))
return NULL;
981 return stbi__malloc(a*b + add);
984 static void *stbi__malloc_mad3(
int a,
int b,
int c,
int add)
986 if (!stbi__mad3sizes_valid(a, b, c, add))
return NULL;
987 return stbi__malloc(a*b*c + add);
990 static void *stbi__malloc_mad4(
int a,
int b,
int c,
int d,
int add)
992 if (!stbi__mad4sizes_valid(a, b, c, d, add))
return NULL;
993 return stbi__malloc(a*b*c*d + add);
1000 #ifdef STBI_NO_FAILURE_STRINGS
1001 #define stbi__err(x,y) 0
1002 #elif defined(STBI_FAILURE_USERMSG)
1003 #define stbi__err(x,y) stbi__err(y)
1005 #define stbi__err(x,y) stbi__err(x)
1008 #define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
1009 #define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
1013 STBI_FREE(retval_from_stbi_load);
1016 #ifndef STBI_NO_LINEAR
1017 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp);
1021 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
1025 static int stbi__vertically_flip_on_load = 0;
1027 static int stbi__vertically_flip_on_load = 1;
1032 stbi__vertically_flip_on_load = flag_true_if_should_flip;
1035 static void *stbi__load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
1037 memset(ri, 0,
sizeof(*ri));
1038 ri->bits_per_channel = 8;
1039 ri->channel_order = STBI_ORDER_RGB;
1040 ri->num_channels = 0;
1042 #ifndef STBI_NO_JPEG
1043 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s, x, y, comp, req_comp, ri);
1046 if (stbi__png_test(s))
return stbi__png_load(s, x, y, comp, req_comp, ri);
1049 if (stbi__bmp_test(s))
return stbi__bmp_load(s, x, y, comp, req_comp, ri);
1052 if (stbi__gif_test(s))
return stbi__gif_load(s, x, y, comp, req_comp, ri);
1055 if (stbi__psd_test(s))
return stbi__psd_load(s, x, y, comp, req_comp, ri, bpc);
1058 if (stbi__pic_test(s))
return stbi__pic_load(s, x, y, comp, req_comp, ri);
1061 if (stbi__pnm_test(s))
return stbi__pnm_load(s, x, y, comp, req_comp, ri);
1065 if (stbi__hdr_test(s)) {
1066 float *hdr = stbi__hdr_load(s, x, y, comp, req_comp, ri);
1067 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
1073 if (stbi__tga_test(s))
1074 return stbi__tga_load(s, x, y, comp, req_comp, ri);
1077 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
1080 static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig,
int w,
int h,
int channels)
1083 int img_len = w * h * channels;
1086 reduced = (
stbi_uc *)stbi__malloc(img_len);
1087 if (reduced == NULL)
return stbi__errpuc(
"outofmem",
"Out of memory");
1089 for (i = 0; i < img_len; ++i)
1090 reduced[i] = (
stbi_uc)((orig[i] >> 8) & 0xFF);
1096 static stbi__uint16 *stbi__convert_8_to_16(
stbi_uc *orig,
int w,
int h,
int channels)
1099 int img_len = w * h * channels;
1100 stbi__uint16 *enlarged;
1102 enlarged = (stbi__uint16 *)stbi__malloc(img_len * 2);
1103 if (enlarged == NULL)
return (stbi__uint16 *)stbi__errpuc(
"outofmem",
"Out of memory");
1105 for (i = 0; i < img_len; ++i)
1106 enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]);
1112 static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1114 stbi__result_info ri;
1115 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1120 if (ri.bits_per_channel != 8) {
1121 STBI_ASSERT(ri.bits_per_channel == 16);
1122 result = stbi__convert_16_to_8((stbi__uint16 *)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1123 ri.bits_per_channel = 8;
1128 if (stbi__vertically_flip_on_load) {
1130 int channels = req_comp ? req_comp : *comp;
1135 for (row = 0; row < (h >> 1); row++) {
1136 for (col = 0; col < w; col++) {
1137 for (z = 0; z < channels; z++) {
1138 stbi_uc temp = image[(row * w + col) * channels + z];
1139 image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z];
1140 image[((h - row - 1) * w + col) * channels + z] = temp;
1146 return (
unsigned char *)result;
1149 static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1151 stbi__result_info ri;
1152 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1157 if (ri.bits_per_channel != 16) {
1158 STBI_ASSERT(ri.bits_per_channel == 8);
1159 result = stbi__convert_8_to_16((
stbi_uc *)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1160 ri.bits_per_channel = 16;
1166 if (stbi__vertically_flip_on_load) {
1168 int channels = req_comp ? req_comp : *comp;
1170 stbi__uint16 *image = (stbi__uint16 *)result;
1173 for (row = 0; row < (h >> 1); row++) {
1174 for (col = 0; col < w; col++) {
1175 for (z = 0; z < channels; z++) {
1176 stbi__uint16 temp = image[(row * w + col) * channels + z];
1177 image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z];
1178 image[((h - row - 1) * w + col) * channels + z] = temp;
1184 return (stbi__uint16 *)result;
1188 static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp)
1190 if (stbi__vertically_flip_on_load && result != NULL) {
1192 int depth = req_comp ? req_comp : *comp;
1197 for (row = 0; row < (h >> 1); row++) {
1198 for (col = 0; col < w; col++) {
1199 for (z = 0; z < depth; z++) {
1200 temp = result[(row * w + col) * depth + z];
1201 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
1202 result[((h - row - 1) * w + col) * depth + z] = temp;
1210 #ifndef STBI_NO_STDIO
1212 static FILE *stbi__fopen(
char const *filename,
char const *mode)
1215 #if defined(_MSC_VER) && _MSC_VER >= 1400
1216 if (0 != fopen_s(&f, filename, mode))
1219 f = fopen(filename, mode);
1227 FILE *f = stbi__fopen(filename,
"rb");
1228 unsigned char *result;
1229 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1237 unsigned char *result;
1239 stbi__start_file(&s, f);
1240 result = stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1243 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
1250 stbi__uint16 *result;
1252 stbi__start_file(&s, f);
1253 result = stbi__load_and_postprocess_16bit(&s, x, y, comp, req_comp);
1256 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
1263 FILE *f = stbi__fopen(filename,
"rb");
1264 stbi__uint16 *result;
1265 if (!f)
return (
stbi_us *)stbi__errpuc(
"can't fopen",
"Unable to open file");
1277 stbi__start_mem(&s, buffer, len);
1278 return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1285 return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1288 #ifndef STBI_NO_LINEAR
1289 static float *stbi__loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1291 unsigned char *data;
1293 if (stbi__hdr_test(s)) {
1294 stbi__result_info ri;
1295 float *hdr_data = stbi__hdr_load(s, x, y, comp, req_comp, &ri);
1297 stbi__float_postprocess(hdr_data, x, y, comp, req_comp);
1301 data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
1303 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1304 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1310 stbi__start_mem(&s, buffer, len);
1311 return stbi__loadf_main(&s, x, y, comp, req_comp);
1318 return stbi__loadf_main(&s, x, y, comp, req_comp);
1321 #ifndef STBI_NO_STDIO
1322 STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1325 FILE *f = stbi__fopen(filename,
"rb");
1326 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1335 stbi__start_file(&s, f);
1336 return stbi__loadf_main(&s, x, y, comp, req_comp);
1338 #endif // !STBI_NO_STDIO
1340 #endif // !STBI_NO_LINEAR
1350 stbi__start_mem(&s, buffer, len);
1351 return stbi__hdr_test(&s);
1353 STBI_NOTUSED(buffer);
1359 #ifndef STBI_NO_STDIO
1362 FILE *f = stbi__fopen(filename,
"rb");
1375 stbi__start_file(&s, f);
1376 return stbi__hdr_test(&s);
1382 #endif // !STBI_NO_STDIO
1389 return stbi__hdr_test(&s);
1397 #ifndef STBI_NO_LINEAR
1398 static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f;
1404 static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f;
1417 STBI__SCAN_load = 0,
1422 static void stbi__refill_buffer(stbi__context *s)
1424 int n = (s->io.read)(s->io_user_data, (
char*)s->buffer_start, s->buflen);
1428 s->read_from_callbacks = 0;
1429 s->img_buffer = s->buffer_start;
1430 s->img_buffer_end = s->buffer_start + 1;
1434 s->img_buffer = s->buffer_start;
1435 s->img_buffer_end = s->buffer_start + n;
1439 stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1441 if (s->img_buffer < s->img_buffer_end)
1442 return *s->img_buffer++;
1443 if (s->read_from_callbacks) {
1444 stbi__refill_buffer(s);
1445 return *s->img_buffer++;
1450 stbi_inline
static int stbi__at_eof(stbi__context *s)
1453 if (!(s->io.eof)(s->io_user_data))
return 0;
1456 if (s->read_from_callbacks == 0)
return 1;
1459 return s->img_buffer >= s->img_buffer_end;
1462 static void stbi__skip(stbi__context *s,
int n)
1465 s->img_buffer = s->img_buffer_end;
1469 int blen = (int)(s->img_buffer_end - s->img_buffer);
1471 s->img_buffer = s->img_buffer_end;
1472 (s->io.skip)(s->io_user_data, n - blen);
1479 static int stbi__getn(stbi__context *s,
stbi_uc *buffer,
int n)
1482 int blen = (int)(s->img_buffer_end - s->img_buffer);
1486 memcpy(buffer, s->img_buffer, blen);
1488 count = (s->io.read)(s->io_user_data, (
char*)buffer + blen, n - blen);
1489 res = (count == (n - blen));
1490 s->img_buffer = s->img_buffer_end;
1495 if (s->img_buffer + n <= s->img_buffer_end) {
1496 memcpy(buffer, s->img_buffer, n);
1504 static int stbi__get16be(stbi__context *s)
1506 int z = stbi__get8(s);
1507 return (z << 8) + stbi__get8(s);
1510 static stbi__uint32 stbi__get32be(stbi__context *s)
1512 stbi__uint32 z = stbi__get16be(s);
1513 return (z << 16) + stbi__get16be(s);
1516 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1519 static int stbi__get16le(stbi__context *s)
1521 int z = stbi__get8(s);
1522 return z + (stbi__get8(s) << 8);
1527 static stbi__uint32 stbi__get32le(stbi__context *s)
1529 stbi__uint32 z = stbi__get16le(s);
1530 return z + (stbi__get16le(s) << 16);
1534 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
1548 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1550 return (
stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1553 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1556 unsigned char *good;
1558 if (req_comp == img_n)
return data;
1559 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1561 good = (
unsigned char *)stbi__malloc_mad3(req_comp, x, y, 0);
1564 return stbi__errpuc(
"outofmem",
"Out of memory");
1567 for (j = 0; j < (int)y; ++j) {
1568 unsigned char *src = data + j * x * img_n;
1569 unsigned char *dest = good + j * x * req_comp;
1571 #define STBI__COMBO(a,b) ((a)*8+(b))
1572 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1575 switch (STBI__COMBO(img_n, req_comp)) {
1576 STBI__CASE(1, 2) { dest[0] = src[0], dest[1] = 255; }
break;
1577 STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1578 STBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = 255; }
break;
1579 STBI__CASE(2, 1) { dest[0] = src[0]; }
break;
1580 STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1581 STBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = src[1]; }
break;
1582 STBI__CASE(3, 4) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2], dest[3] = 255; }
break;
1583 STBI__CASE(3, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); }
break;
1584 STBI__CASE(3, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = 255; }
break;
1585 STBI__CASE(4, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); }
break;
1586 STBI__CASE(4, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = src[3]; }
break;
1587 STBI__CASE(4, 3) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; }
break;
1588 default: STBI_ASSERT(0);
1597 static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b)
1599 return (stbi__uint16)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1602 static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1607 if (req_comp == img_n)
return data;
1608 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1610 good = (stbi__uint16 *)stbi__malloc(req_comp * x * y * 2);
1613 return (stbi__uint16 *)stbi__errpuc(
"outofmem",
"Out of memory");
1616 for (j = 0; j < (int)y; ++j) {
1617 stbi__uint16 *src = data + j * x * img_n;
1618 stbi__uint16 *dest = good + j * x * req_comp;
1620 #define STBI__COMBO(a,b) ((a)*8+(b))
1621 #define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1624 switch (STBI__COMBO(img_n, req_comp)) {
1625 STBI__CASE(1, 2) { dest[0] = src[0], dest[1] = 0xffff; }
break;
1626 STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1627 STBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = 0xffff; }
break;
1628 STBI__CASE(2, 1) { dest[0] = src[0]; }
break;
1629 STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1630 STBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0], dest[3] = src[1]; }
break;
1631 STBI__CASE(3, 4) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2], dest[3] = 0xffff; }
break;
1632 STBI__CASE(3, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); }
break;
1633 STBI__CASE(3, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]), dest[1] = 0xffff; }
break;
1634 STBI__CASE(4, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); }
break;
1635 STBI__CASE(4, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]), dest[1] = src[3]; }
break;
1636 STBI__CASE(4, 3) { dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; }
break;
1637 default: STBI_ASSERT(0);
1646 #ifndef STBI_NO_LINEAR
1647 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp)
1651 if (!data)
return NULL;
1652 output = (
float *)stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1653 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1655 if (comp & 1) n = comp;
else n = comp - 1;
1656 for (i = 0; i < x*y; ++i) {
1657 for (k = 0; k < n; ++k) {
1658 output[i*comp + k] = (float)(pow(data[i*comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1660 if (k < comp) output[i*comp + k] = data[i*comp + k] / 255.0f;
1668 #define stbi__float2int(x) ((int) (x))
1669 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1673 if (!data)
return NULL;
1674 output = (
stbi_uc *)stbi__malloc_mad3(x, y, comp, 0);
1675 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1677 if (comp & 1) n = comp;
else n = comp - 1;
1678 for (i = 0; i < x*y; ++i) {
1679 for (k = 0; k < n; ++k) {
1680 float z = (float)pow(data[i*comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1682 if (z > 255) z = 255;
1683 output[i*comp + k] = (
stbi_uc)stbi__float2int(z);
1686 float z = data[i*comp + k] * 255 + 0.5f;
1688 if (z > 255) z = 255;
1689 output[i*comp + k] = (
stbi_uc)stbi__float2int(z);
1718 #ifndef STBI_NO_JPEG
1721 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
1727 stbi__uint16 code[256];
1730 unsigned int maxcode[18];
1737 stbi__huffman huff_dc[4];
1738 stbi__huffman huff_ac[4];
1740 stbi__int16 fast_ac[4][1 << FAST_BITS];
1743 int img_h_max, img_v_max;
1744 int img_mcu_x, img_mcu_y;
1745 int img_mcu_w, img_mcu_h;
1758 void *raw_data, *raw_coeff;
1761 int coeff_w, coeff_h;
1764 stbi__uint32 code_buffer;
1766 unsigned char marker;
1777 int scan_n, order[4];
1778 int restart_interval, todo;
1781 void(*idct_block_kernel)(
stbi_uc *out,
int out_stride,
short data[64]);
1786 static int stbi__build_huffman(stbi__huffman *h,
int *count)
1788 int i, j, k = 0, code;
1790 for (i = 0; i < 16; ++i)
1791 for (j = 0; j < count[i]; ++j)
1792 h->size[k++] = (
stbi_uc)(i + 1);
1798 for (j = 1; j <= 16; ++j) {
1800 h->delta[j] = k - code;
1801 if (h->size[k] == j) {
1802 while (h->size[k] == j)
1803 h->code[k++] = (stbi__uint16)(code++);
1804 if (code - 1 >= (1 << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1807 h->maxcode[j] = code << (16 - j);
1810 h->maxcode[j] = 0xffffffff;
1813 memset(h->fast, 255, 1 << FAST_BITS);
1814 for (i = 0; i < k; ++i) {
1816 if (s <= FAST_BITS) {
1817 int c = h->code[i] << (FAST_BITS - s);
1818 int m = 1 << (FAST_BITS - s);
1819 for (j = 0; j < m; ++j) {
1829 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1832 for (i = 0; i < (1 << FAST_BITS); ++i) {
1836 int rs = h->values[fast];
1837 int run = (rs >> 4) & 15;
1838 int magbits = rs & 15;
1839 int len = h->size[fast];
1841 if (magbits && len + magbits <= FAST_BITS) {
1843 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1844 int m = 1 << (magbits - 1);
1845 if (k < m) k += (-1 << magbits) + 1;
1847 if (k >= -128 && k <= 127)
1848 fast_ac[i] = (stbi__int16)((k << 8) + (run << 4) + (len + magbits));
1854 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1857 int b = j->nomore ? 0 : stbi__get8(j->s);
1859 int c = stbi__get8(j->s);
1861 j->marker = (
unsigned char)c;
1866 j->code_buffer |= b << (24 - j->code_bits);
1868 }
while (j->code_bits <= 24);
1872 static stbi__uint32 stbi__bmask[17] = { 0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535 };
1875 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1880 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1884 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
1888 if (s > j->code_bits)
1890 j->code_buffer <<= s;
1892 return h->values[k];
1901 temp = j->code_buffer >> 16;
1902 for (k = FAST_BITS + 1; ; ++k)
1903 if (temp < h->maxcode[k])
1911 if (k > j->code_bits)
1915 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1916 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1920 j->code_buffer <<= k;
1921 return h->values[c];
1925 static int const stbi__jbias[16] = { 0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767 };
1929 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1933 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1935 sgn = (stbi__int32)j->code_buffer >> 31;
1936 k = stbi_lrot(j->code_buffer, n);
1937 STBI_ASSERT(n >= 0 && n < (
int)(
sizeof(stbi__bmask) /
sizeof(*stbi__bmask)));
1938 j->code_buffer = k & ~stbi__bmask[n];
1939 k &= stbi__bmask[n];
1941 return k + (stbi__jbias[n] & ~sgn);
1945 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
1948 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1949 k = stbi_lrot(j->code_buffer, n);
1950 j->code_buffer = k & ~stbi__bmask[n];
1951 k &= stbi__bmask[n];
1956 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
1959 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1961 j->code_buffer <<= 1;
1963 return k & 0x80000000;
1968 static stbi_uc stbi__jpeg_dezigzag[64 + 15] =
1970 0, 1, 8, 16, 9, 2, 3, 10,
1971 17, 24, 32, 25, 18, 11, 4, 5,
1972 12, 19, 26, 33, 40, 48, 41, 34,
1973 27, 20, 13, 6, 7, 14, 21, 28,
1974 35, 42, 49, 56, 57, 50, 43, 36,
1975 29, 22, 15, 23, 30, 37, 44, 51,
1976 58, 59, 52, 45, 38, 31, 39, 46,
1977 53, 60, 61, 54, 47, 55, 62, 63,
1979 63, 63, 63, 63, 63, 63, 63, 63,
1980 63, 63, 63, 63, 63, 63, 63
1984 static int stbi__jpeg_decode_block(stbi__jpeg *j,
short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac,
int b,
stbi_uc *dequant)
1989 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1990 t = stbi__jpeg_huff_decode(j, hdc);
1991 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1994 memset(data, 0, 64 *
sizeof(data[0]));
1996 diff = t ? stbi__extend_receive(j, t) : 0;
1997 dc = j->img_comp[b].dc_pred + diff;
1998 j->img_comp[b].dc_pred = dc;
1999 data[0] = (short)(dc * dequant[0]);
2006 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2007 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2012 j->code_buffer <<= s;
2015 zig = stbi__jpeg_dezigzag[k++];
2016 data[zig] = (short)((r >> 8) * dequant[zig]);
2019 int rs = stbi__jpeg_huff_decode(j, hac);
2020 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2024 if (rs != 0xf0)
break;
2030 zig = stbi__jpeg_dezigzag[k++];
2031 data[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]);
2038 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
2042 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2044 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2046 if (j->succ_high == 0) {
2048 memset(data, 0, 64 *
sizeof(data[0]));
2049 t = stbi__jpeg_huff_decode(j, hdc);
2050 diff = t ? stbi__extend_receive(j, t) : 0;
2052 dc = j->img_comp[b].dc_pred + diff;
2053 j->img_comp[b].dc_pred = dc;
2054 data[0] = (short)(dc << j->succ_low);
2058 if (stbi__jpeg_get_bit(j))
2059 data[0] += (
short)(1 << j->succ_low);
2066 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
2069 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2071 if (j->succ_high == 0) {
2072 int shift = j->succ_low;
2083 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2084 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2089 j->code_buffer <<= s;
2091 zig = stbi__jpeg_dezigzag[k++];
2092 data[zig] = (short)((r >> 8) << shift);
2095 int rs = stbi__jpeg_huff_decode(j, hac);
2096 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2101 j->eob_run = (1 << r);
2103 j->eob_run += stbi__jpeg_get_bits(j, r);
2111 zig = stbi__jpeg_dezigzag[k++];
2112 data[zig] = (short)(stbi__extend_receive(j, s) << shift);
2115 }
while (k <= j->spec_end);
2120 short bit = (short)(1 << j->succ_low);
2124 for (k = j->spec_start; k <= j->spec_end; ++k) {
2125 short *p = &data[stbi__jpeg_dezigzag[k]];
2127 if (stbi__jpeg_get_bit(j))
2128 if ((*p & bit) == 0) {
2140 int rs = stbi__jpeg_huff_decode(j, hac);
2141 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2146 j->eob_run = (1 << r) - 1;
2148 j->eob_run += stbi__jpeg_get_bits(j, r);
2158 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2160 if (stbi__jpeg_get_bit(j))
2167 while (k <= j->spec_end) {
2168 short *p = &data[stbi__jpeg_dezigzag[k++]];
2170 if (stbi__jpeg_get_bit(j))
2171 if ((*p & bit) == 0) {
2186 }
while (k <= j->spec_end);
2193 stbi_inline
static stbi_uc stbi__clamp(
int x)
2196 if ((
unsigned int)x > 255) {
2197 if (x < 0)
return 0;
2198 if (x > 255)
return 255;
2203 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
2204 #define stbi__fsh(x) ((x) << 12)
2207 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2208 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2211 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
2212 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
2213 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
2216 t0 = stbi__fsh(p2+p3); \
2217 t1 = stbi__fsh(p2-p3); \
2230 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
2231 t0 = t0*stbi__f2f( 0.298631336f); \
2232 t1 = t1*stbi__f2f( 2.053119869f); \
2233 t2 = t2*stbi__f2f( 3.072711026f); \
2234 t3 = t3*stbi__f2f( 1.501321110f); \
2235 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
2236 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
2237 p3 = p3*stbi__f2f(-1.961570560f); \
2238 p4 = p4*stbi__f2f(-0.390180644f); \
2244 static void stbi__idct_block(
stbi_uc *out,
int out_stride,
short data[64])
2246 int i, val[64], *v = val;
2251 for (i = 0; i < 8; ++i, ++d, ++v) {
2253 if (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0
2254 && d[40] == 0 && d[48] == 0 && d[56] == 0) {
2259 int dcterm = d[0] << 2;
2260 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2263 STBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56])
2266 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2267 v[0] = (x0 + t3) >> 10;
2268 v[56] = (x0 - t3) >> 10;
2269 v[8] = (x1 + t2) >> 10;
2270 v[48] = (x1 - t2) >> 10;
2271 v[16] = (x2 + t1) >> 10;
2272 v[40] = (x2 - t1) >> 10;
2273 v[24] = (x3 + t0) >> 10;
2274 v[32] = (x3 - t0) >> 10;
2278 for (i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) {
2280 STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7])
2287 x0 += 65536 + (128 << 17);
2288 x1 += 65536 + (128 << 17);
2289 x2 += 65536 + (128 << 17);
2290 x3 += 65536 + (128 << 17);
2293 o[0] = stbi__clamp((x0 + t3) >> 17);
2294 o[7] = stbi__clamp((x0 - t3) >> 17);
2295 o[1] = stbi__clamp((x1 + t2) >> 17);
2296 o[6] = stbi__clamp((x1 - t2) >> 17);
2297 o[2] = stbi__clamp((x2 + t1) >> 17);
2298 o[5] = stbi__clamp((x2 - t1) >> 17);
2299 o[3] = stbi__clamp((x3 + t0) >> 17);
2300 o[4] = stbi__clamp((x3 - t0) >> 17);
2308 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2311 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2315 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2319 #define dct_rot(out0,out1, x,y,c0,c1) \
2320 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2321 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2322 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2323 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2324 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2325 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2328 #define dct_widen(out, in) \
2329 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2330 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2333 #define dct_wadd(out, a, b) \
2334 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2335 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2338 #define dct_wsub(out, a, b) \
2339 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2340 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2343 #define dct_bfly32o(out0, out1, a,b,bias,s) \
2345 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2346 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2347 dct_wadd(sum, abiased, b); \
2348 dct_wsub(dif, abiased, b); \
2349 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2350 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2354 #define dct_interleave8(a, b) \
2356 a = _mm_unpacklo_epi8(a, b); \
2357 b = _mm_unpackhi_epi8(tmp, b)
2360 #define dct_interleave16(a, b) \
2362 a = _mm_unpacklo_epi16(a, b); \
2363 b = _mm_unpackhi_epi16(tmp, b)
2365 #define dct_pass(bias,shift) \
2368 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2369 __m128i sum04 = _mm_add_epi16(row0, row4); \
2370 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2371 dct_widen(t0e, sum04); \
2372 dct_widen(t1e, dif04); \
2373 dct_wadd(x0, t0e, t3e); \
2374 dct_wsub(x3, t0e, t3e); \
2375 dct_wadd(x1, t1e, t2e); \
2376 dct_wsub(x2, t1e, t2e); \
2378 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2379 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2380 __m128i sum17 = _mm_add_epi16(row1, row7); \
2381 __m128i sum35 = _mm_add_epi16(row3, row5); \
2382 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2383 dct_wadd(x4, y0o, y4o); \
2384 dct_wadd(x5, y1o, y5o); \
2385 dct_wadd(x6, y2o, y5o); \
2386 dct_wadd(x7, y3o, y4o); \
2387 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2388 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2389 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2390 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2393 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2394 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f));
2395 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2396 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2397 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f));
2398 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f));
2399 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f));
2400 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f));
2403 __m128i bias_0 = _mm_set1_epi32(512);
2404 __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17));
2407 row0 = _mm_load_si128((
const __m128i *) (data + 0 * 8));
2408 row1 = _mm_load_si128((
const __m128i *) (data + 1 * 8));
2409 row2 = _mm_load_si128((
const __m128i *) (data + 2 * 8));
2410 row3 = _mm_load_si128((
const __m128i *) (data + 3 * 8));
2411 row4 = _mm_load_si128((
const __m128i *) (data + 4 * 8));
2412 row5 = _mm_load_si128((
const __m128i *) (data + 5 * 8));
2413 row6 = _mm_load_si128((
const __m128i *) (data + 6 * 8));
2414 row7 = _mm_load_si128((
const __m128i *) (data + 7 * 8));
2417 dct_pass(bias_0, 10);
2421 dct_interleave16(row0, row4);
2422 dct_interleave16(row1, row5);
2423 dct_interleave16(row2, row6);
2424 dct_interleave16(row3, row7);
2427 dct_interleave16(row0, row2);
2428 dct_interleave16(row1, row3);
2429 dct_interleave16(row4, row6);
2430 dct_interleave16(row5, row7);
2433 dct_interleave16(row0, row1);
2434 dct_interleave16(row2, row3);
2435 dct_interleave16(row4, row5);
2436 dct_interleave16(row6, row7);
2440 dct_pass(bias_1, 17);
2444 __m128i p0 = _mm_packus_epi16(row0, row1);
2445 __m128i p1 = _mm_packus_epi16(row2, row3);
2446 __m128i p2 = _mm_packus_epi16(row4, row5);
2447 __m128i p3 = _mm_packus_epi16(row6, row7);
2450 dct_interleave8(p0, p2);
2451 dct_interleave8(p1, p3);
2454 dct_interleave8(p0, p1);
2455 dct_interleave8(p2, p3);
2458 dct_interleave8(p0, p2);
2459 dct_interleave8(p1, p3);
2462 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2463 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2464 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2465 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2466 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2467 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2468 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2469 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2478 #undef dct_interleave8
2479 #undef dct_interleave16
2489 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2491 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2493 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2494 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2495 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f));
2496 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f));
2497 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2498 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2499 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2500 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2501 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f));
2502 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f));
2503 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f));
2504 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f));
2506 #define dct_long_mul(out, inq, coeff) \
2507 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2508 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2510 #define dct_long_mac(out, acc, inq, coeff) \
2511 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2512 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2514 #define dct_widen(out, inq) \
2515 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2516 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2519 #define dct_wadd(out, a, b) \
2520 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2521 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2524 #define dct_wsub(out, a, b) \
2525 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2526 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2529 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2531 dct_wadd(sum, a, b); \
2532 dct_wsub(dif, a, b); \
2533 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2534 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2537 #define dct_pass(shiftop, shift) \
2540 int16x8_t sum26 = vaddq_s16(row2, row6); \
2541 dct_long_mul(p1e, sum26, rot0_0); \
2542 dct_long_mac(t2e, p1e, row6, rot0_1); \
2543 dct_long_mac(t3e, p1e, row2, rot0_2); \
2544 int16x8_t sum04 = vaddq_s16(row0, row4); \
2545 int16x8_t dif04 = vsubq_s16(row0, row4); \
2546 dct_widen(t0e, sum04); \
2547 dct_widen(t1e, dif04); \
2548 dct_wadd(x0, t0e, t3e); \
2549 dct_wsub(x3, t0e, t3e); \
2550 dct_wadd(x1, t1e, t2e); \
2551 dct_wsub(x2, t1e, t2e); \
2553 int16x8_t sum15 = vaddq_s16(row1, row5); \
2554 int16x8_t sum17 = vaddq_s16(row1, row7); \
2555 int16x8_t sum35 = vaddq_s16(row3, row5); \
2556 int16x8_t sum37 = vaddq_s16(row3, row7); \
2557 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2558 dct_long_mul(p5o, sumodd, rot1_0); \
2559 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2560 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2561 dct_long_mul(p3o, sum37, rot2_0); \
2562 dct_long_mul(p4o, sum15, rot2_1); \
2563 dct_wadd(sump13o, p1o, p3o); \
2564 dct_wadd(sump24o, p2o, p4o); \
2565 dct_wadd(sump23o, p2o, p3o); \
2566 dct_wadd(sump14o, p1o, p4o); \
2567 dct_long_mac(x4, sump13o, row7, rot3_0); \
2568 dct_long_mac(x5, sump24o, row5, rot3_1); \
2569 dct_long_mac(x6, sump23o, row3, rot3_2); \
2570 dct_long_mac(x7, sump14o, row1, rot3_3); \
2571 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2572 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2573 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2574 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2578 row0 = vld1q_s16(data + 0 * 8);
2579 row1 = vld1q_s16(data + 1 * 8);
2580 row2 = vld1q_s16(data + 2 * 8);
2581 row3 = vld1q_s16(data + 3 * 8);
2582 row4 = vld1q_s16(data + 4 * 8);
2583 row5 = vld1q_s16(data + 5 * 8);
2584 row6 = vld1q_s16(data + 6 * 8);
2585 row7 = vld1q_s16(data + 7 * 8);
2588 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2591 dct_pass(vrshrn_n_s32, 10);
2597 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2598 #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]); }
2599 #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)); }
2602 dct_trn16(row0, row1);
2603 dct_trn16(row2, row3);
2604 dct_trn16(row4, row5);
2605 dct_trn16(row6, row7);
2608 dct_trn32(row0, row2);
2609 dct_trn32(row1, row3);
2610 dct_trn32(row4, row6);
2611 dct_trn32(row5, row7);
2614 dct_trn64(row0, row4);
2615 dct_trn64(row1, row5);
2616 dct_trn64(row2, row6);
2617 dct_trn64(row3, row7);
2628 dct_pass(vshrn_n_s32, 16);
2632 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2633 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2634 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2635 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2636 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2637 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2638 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2639 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2642 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2643 #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]); }
2644 #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]); }
2656 dct_trn8_16(p0, p2);
2657 dct_trn8_16(p1, p3);
2658 dct_trn8_16(p4, p6);
2659 dct_trn8_16(p5, p7);
2662 dct_trn8_32(p0, p4);
2663 dct_trn8_32(p1, p5);
2664 dct_trn8_32(p2, p6);
2665 dct_trn8_32(p3, p7);
2668 vst1_u8(out, p0); out += out_stride;
2669 vst1_u8(out, p1); out += out_stride;
2670 vst1_u8(out, p2); out += out_stride;
2671 vst1_u8(out, p3); out += out_stride;
2672 vst1_u8(out, p4); out += out_stride;
2673 vst1_u8(out, p5); out += out_stride;
2674 vst1_u8(out, p6); out += out_stride;
2693 #define STBI__MARKER_none 0xff
2697 static stbi_uc stbi__get_marker(stbi__jpeg *j)
2700 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2701 x = stbi__get8(j->s);
2702 if (x != 0xff)
return STBI__MARKER_none;
2704 x = stbi__get8(j->s);
2710 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2714 static void stbi__jpeg_reset(stbi__jpeg *j)
2719 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
2720 j->marker = STBI__MARKER_none;
2721 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2727 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2729 stbi__jpeg_reset(z);
2730 if (!z->progressive) {
2731 if (z->scan_n == 1) {
2733 STBI_SIMD_ALIGN(
short, data[64]);
2734 int n = z->order[0];
2739 int w = (z->img_comp[n].x + 7) >> 3;
2740 int h = (z->img_comp[n].y + 7) >> 3;
2741 for (j = 0; j < h; ++j) {
2742 for (i = 0; i < w; ++i) {
2743 int ha = z->img_comp[n].ha;
2744 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;
2745 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2*j * 8 + i * 8, z->img_comp[n].w2, data);
2747 if (--z->todo <= 0) {
2748 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2751 if (!STBI__RESTART(z->marker))
return 1;
2752 stbi__jpeg_reset(z);
2760 STBI_SIMD_ALIGN(
short, data[64]);
2761 for (j = 0; j < z->img_mcu_y; ++j) {
2762 for (i = 0; i < z->img_mcu_x; ++i) {
2764 for (k = 0; k < z->scan_n; ++k) {
2765 int n = z->order[k];
2768 for (y = 0; y < z->img_comp[n].v; ++y) {
2769 for (x = 0; x < z->img_comp[n].h; ++x) {
2770 int x2 = (i*z->img_comp[n].h + x) * 8;
2771 int y2 = (j*z->img_comp[n].v + y) * 8;
2772 int ha = z->img_comp[n].ha;
2773 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;
2774 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2*y2 + x2, z->img_comp[n].w2, data);
2780 if (--z->todo <= 0) {
2781 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2782 if (!STBI__RESTART(z->marker))
return 1;
2783 stbi__jpeg_reset(z);
2791 if (z->scan_n == 1) {
2793 int n = z->order[0];
2798 int w = (z->img_comp[n].x + 7) >> 3;
2799 int h = (z->img_comp[n].y + 7) >> 3;
2800 for (j = 0; j < h; ++j) {
2801 for (i = 0; i < w; ++i) {
2802 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2803 if (z->spec_start == 0) {
2804 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2808 int ha = z->img_comp[n].ha;
2809 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2813 if (--z->todo <= 0) {
2814 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2815 if (!STBI__RESTART(z->marker))
return 1;
2816 stbi__jpeg_reset(z);
2824 for (j = 0; j < z->img_mcu_y; ++j) {
2825 for (i = 0; i < z->img_mcu_x; ++i) {
2827 for (k = 0; k < z->scan_n; ++k) {
2828 int n = z->order[k];
2831 for (y = 0; y < z->img_comp[n].v; ++y) {
2832 for (x = 0; x < z->img_comp[n].h; ++x) {
2833 int x2 = (i*z->img_comp[n].h + x);
2834 int y2 = (j*z->img_comp[n].v + y);
2835 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2836 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2843 if (--z->todo <= 0) {
2844 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2845 if (!STBI__RESTART(z->marker))
return 1;
2846 stbi__jpeg_reset(z);
2855 static void stbi__jpeg_dequantize(
short *data,
stbi_uc *dequant)
2858 for (i = 0; i < 64; ++i)
2859 data[i] *= dequant[i];
2862 static void stbi__jpeg_finish(stbi__jpeg *z)
2864 if (z->progressive) {
2867 for (n = 0; n < z->s->img_n; ++n) {
2868 int w = (z->img_comp[n].x + 7) >> 3;
2869 int h = (z->img_comp[n].y + 7) >> 3;
2870 for (j = 0; j < h; ++j) {
2871 for (i = 0; i < w; ++i) {
2872 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2873 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2874 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2*j * 8 + i * 8, z->img_comp[n].w2, data);
2881 static int stbi__process_marker(stbi__jpeg *z,
int m)
2885 case STBI__MARKER_none:
2886 return stbi__err(
"expected marker",
"Corrupt JPEG");
2889 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2890 z->restart_interval = stbi__get16be(z->s);
2894 L = stbi__get16be(z->s) - 2;
2896 int q = stbi__get8(z->s);
2899 if (p != 0)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2900 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2901 for (i = 0; i < 64; ++i)
2902 z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
2908 L = stbi__get16be(z->s) - 2;
2911 int sizes[16], i, n = 0;
2912 int q = stbi__get8(z->s);
2915 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2916 for (i = 0; i < 16; ++i) {
2917 sizes[i] = stbi__get8(z->s);
2922 if (!stbi__build_huffman(z->huff_dc + th, sizes))
return 0;
2923 v = z->huff_dc[th].values;
2926 if (!stbi__build_huffman(z->huff_ac + th, sizes))
return 0;
2927 v = z->huff_ac[th].values;
2929 for (i = 0; i < n; ++i)
2930 v[i] = stbi__get8(z->s);
2932 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2938 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2939 stbi__skip(z->s, stbi__get16be(z->s) - 2);
2946 static int stbi__process_scan_header(stbi__jpeg *z)
2949 int Ls = stbi__get16be(z->s);
2950 z->scan_n = stbi__get8(z->s);
2951 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");
2952 if (Ls != 6 + 2 * z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2953 for (i = 0; i < z->scan_n; ++i) {
2954 int id = stbi__get8(z->s), which;
2955 int q = stbi__get8(z->s);
2956 for (which = 0; which < z->s->img_n; ++which)
2957 if (z->img_comp[which].id ==
id)
2959 if (which == z->s->img_n)
return 0;
2960 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2961 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2962 z->order[i] = which;
2967 z->spec_start = stbi__get8(z->s);
2968 z->spec_end = stbi__get8(z->s);
2969 aa = stbi__get8(z->s);
2970 z->succ_high = (aa >> 4);
2971 z->succ_low = (aa & 15);
2972 if (z->progressive) {
2973 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2974 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2977 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2978 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2986 static int stbi__free_jpeg_components(stbi__jpeg *z,
int ncomp,
int why)
2989 for (i = 0; i < ncomp; ++i) {
2990 if (z->img_comp[i].raw_data) {
2991 STBI_FREE(z->img_comp[i].raw_data);
2992 z->img_comp[i].raw_data = NULL;
2993 z->img_comp[i].data = NULL;
2995 if (z->img_comp[i].raw_coeff) {
2996 STBI_FREE(z->img_comp[i].raw_coeff);
2997 z->img_comp[i].raw_coeff = 0;
2998 z->img_comp[i].coeff = 0;
3000 if (z->img_comp[i].linebuf) {
3001 STBI_FREE(z->img_comp[i].linebuf);
3002 z->img_comp[i].linebuf = NULL;
3008 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
3010 stbi__context *s = z->s;
3011 int Lf, p, i, q, h_max = 1, v_max = 1, c;
3012 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3013 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
3014 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
3015 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
3017 if (c != 3 && c != 1)
return stbi__err(
"bad component count",
"Corrupt JPEG");
3019 for (i = 0; i < c; ++i) {
3020 z->img_comp[i].data = NULL;
3021 z->img_comp[i].linebuf = NULL;
3024 if (Lf != 8 + 3 * s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3027 for (i = 0; i < s->img_n; ++i) {
3028 static unsigned char rgb[3] = {
'R',
'G',
'B' };
3029 z->img_comp[i].id = stbi__get8(s);
3030 if (z->img_comp[i].id != i + 1)
3031 if (z->img_comp[i].id != i) {
3033 if (z->img_comp[i].id != rgb[i])
3034 return stbi__err(
"bad component ID",
"Corrupt JPEG");
3038 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");
3039 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");
3040 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
3043 if (scan != STBI__SCAN_load)
return 1;
3045 if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0))
return stbi__err(
"too large",
"Image too large to decode");
3047 for (i = 0; i < s->img_n; ++i) {
3048 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
3049 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
3053 z->img_h_max = h_max;
3054 z->img_v_max = v_max;
3055 z->img_mcu_w = h_max * 8;
3056 z->img_mcu_h = v_max * 8;
3058 z->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w;
3059 z->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h;
3061 for (i = 0; i < s->img_n; ++i) {
3063 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max;
3064 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max;
3072 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3073 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3074 z->img_comp[i].coeff = 0;
3075 z->img_comp[i].raw_coeff = 0;
3076 z->img_comp[i].linebuf = NULL;
3077 z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3078 if (z->img_comp[i].raw_data == NULL)
3079 return stbi__free_jpeg_components(z, i + 1, stbi__err(
"outofmem",
"Out of memory"));
3081 z->img_comp[i].data = (
stbi_uc*)(((
size_t)z->img_comp[i].raw_data + 15) & ~15);
3082 if (z->progressive) {
3084 z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3085 z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3086 z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2,
sizeof(
short), 15);
3087 if (z->img_comp[i].raw_coeff == NULL)
3088 return stbi__free_jpeg_components(z, i + 1, stbi__err(
"outofmem",
"Out of memory"));
3089 z->img_comp[i].coeff = (
short*)(((
size_t)z->img_comp[i].raw_coeff + 15) & ~15);
3097 #define stbi__DNL(x) ((x) == 0xdc)
3098 #define stbi__SOI(x) ((x) == 0xd8)
3099 #define stbi__EOI(x) ((x) == 0xd9)
3100 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3101 #define stbi__SOS(x) ((x) == 0xda)
3103 #define stbi__SOF_progressive(x) ((x) == 0xc2)
3105 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
3108 z->marker = STBI__MARKER_none;
3109 m = stbi__get_marker(z);
3110 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
3111 if (scan == STBI__SCAN_type)
return 1;
3112 m = stbi__get_marker(z);
3113 while (!stbi__SOF(m)) {
3114 if (!stbi__process_marker(z, m))
return 0;
3115 m = stbi__get_marker(z);
3116 while (m == STBI__MARKER_none) {
3118 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
3119 m = stbi__get_marker(z);
3122 z->progressive = stbi__SOF_progressive(m);
3123 if (!stbi__process_frame_header(z, scan))
return 0;
3128 static int stbi__decode_jpeg_image(stbi__jpeg *j)
3131 for (m = 0; m < 4; m++) {
3132 j->img_comp[m].raw_data = NULL;
3133 j->img_comp[m].raw_coeff = NULL;
3135 j->restart_interval = 0;
3136 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
3137 m = stbi__get_marker(j);
3138 while (!stbi__EOI(m)) {
3140 if (!stbi__process_scan_header(j))
return 0;
3141 if (!stbi__parse_entropy_coded_data(j))
return 0;
3142 if (j->marker == STBI__MARKER_none) {
3144 while (!stbi__at_eof(j->s)) {
3145 int x = stbi__get8(j->s);
3147 j->marker = stbi__get8(j->s);
3151 return stbi__err(
"junk before marker",
"Corrupt JPEG");
3158 if (!stbi__process_marker(j, m))
return 0;
3160 m = stbi__get_marker(j);
3163 stbi__jpeg_finish(j);
3172 #define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3177 STBI_NOTUSED(in_far);
3188 for (i = 0; i < w; ++i)
3189 out[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2);
3201 out[0] = out[1] = input[0];
3206 out[1] = stbi__div4(input[0] * 3 + input[1] + 2);
3207 for (i = 1; i < w - 1; ++i) {
3208 int n = 3 * input[i] + 2;
3209 out[i * 2 + 0] = stbi__div4(n + input[i - 1]);
3210 out[i * 2 + 1] = stbi__div4(n + input[i + 1]);
3212 out[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2);
3213 out[i * 2 + 1] = input[w - 1];
3215 STBI_NOTUSED(in_far);
3221 #define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3228 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3232 t1 = 3 * in_near[0] + in_far[0];
3233 out[0] = stbi__div4(t1 + 2);
3234 for (i = 1; i < w; ++i) {
3236 t1 = 3 * in_near[i] + in_far[i];
3237 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3238 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3240 out[w * 2 - 1] = stbi__div4(t1 + 2);
3247 #if defined(STBI_SSE2) || defined(STBI_NEON)
3254 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3258 t1 = 3 * in_near[0] + in_far[0];
3262 for (; i < ((w - 1) & ~7); i += 8) {
3263 #if defined(STBI_SSE2)
3266 __m128i zero = _mm_setzero_si128();
3267 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
3268 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
3269 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3270 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3271 __m128i diff = _mm_sub_epi16(farw, nearw);
3272 __m128i nears = _mm_slli_epi16(nearw, 2);
3273 __m128i curr = _mm_add_epi16(nears, diff);
3280 __m128i prv0 = _mm_slli_si128(curr, 2);
3281 __m128i nxt0 = _mm_srli_si128(curr, 2);
3282 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3283 __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7);
3289 __m128i bias = _mm_set1_epi16(8);
3290 __m128i curs = _mm_slli_epi16(curr, 2);
3291 __m128i prvd = _mm_sub_epi16(prev, curr);
3292 __m128i nxtd = _mm_sub_epi16(next, curr);
3293 __m128i curb = _mm_add_epi16(curs, bias);
3294 __m128i even = _mm_add_epi16(prvd, curb);
3295 __m128i odd = _mm_add_epi16(nxtd, curb);
3298 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3299 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3300 __m128i de0 = _mm_srli_epi16(int0, 4);
3301 __m128i de1 = _mm_srli_epi16(int1, 4);
3304 __m128i outv = _mm_packus_epi16(de0, de1);
3305 _mm_storeu_si128((__m128i *) (out + i * 2), outv);
3306 #elif defined(STBI_NEON)
3309 uint8x8_t farb = vld1_u8(in_far + i);
3310 uint8x8_t nearb = vld1_u8(in_near + i);
3311 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3312 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3313 int16x8_t curr = vaddq_s16(nears, diff);
3320 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3321 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3322 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3323 int16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7);
3329 int16x8_t curs = vshlq_n_s16(curr, 2);
3330 int16x8_t prvd = vsubq_s16(prev, curr);
3331 int16x8_t nxtd = vsubq_s16(next, curr);
3332 int16x8_t even = vaddq_s16(curs, prvd);
3333 int16x8_t odd = vaddq_s16(curs, nxtd);
3337 o.val[0] = vqrshrun_n_s16(even, 4);
3338 o.val[1] = vqrshrun_n_s16(odd, 4);
3339 vst2_u8(out + i * 2, o);
3343 t1 = 3 * in_near[i + 7] + in_far[i + 7];
3347 t1 = 3 * in_near[i] + in_far[i];
3348 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3350 for (++i; i < w; ++i) {
3352 t1 = 3 * in_near[i] + in_far[i];
3353 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3354 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3356 out[w * 2 - 1] = stbi__div4(t1 + 2);
3368 STBI_NOTUSED(in_far);
3369 for (i = 0; i < w; ++i)
3370 for (j = 0; j < hs; ++j)
3371 out[i*hs + j] = in_near[i];
3375 #ifdef STBI_JPEG_OLD
3378 #define float2fixed(x) ((int) ((x) * 65536 + 0.5))
3382 for (i = 0; i < count; ++i) {
3383 int y_fixed = (y[i] << 16) + 32768;
3385 int cr = pcr[i] - 128;
3386 int cb = pcb[i] - 128;
3387 r = y_fixed + cr*float2fixed(1.40200f);
3388 g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
3389 b = y_fixed + cb*float2fixed(1.77200f);
3393 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3394 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3395 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
3406 #define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3410 for (i = 0; i < count; ++i) {
3411 int y_fixed = (y[i] << 20) + (1 << 19);
3413 int cr = pcr[i] - 128;
3414 int cb = pcb[i] - 128;
3415 r = y_fixed + cr* float2fixed(1.40200f);
3416 g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3417 b = y_fixed + cb* float2fixed(1.77200f);
3421 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3422 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3423 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
3433 #if defined(STBI_SSE2) || defined(STBI_NEON)
3444 __m128i signflip = _mm_set1_epi8(-0x80);
3445 __m128i cr_const0 = _mm_set1_epi16((
short)(1.40200f*4096.0f + 0.5f));
3446 __m128i cr_const1 = _mm_set1_epi16(-(
short)(0.71414f*4096.0f + 0.5f));
3447 __m128i cb_const0 = _mm_set1_epi16(-(
short)(0.34414f*4096.0f + 0.5f));
3448 __m128i cb_const1 = _mm_set1_epi16((
short)(1.77200f*4096.0f + 0.5f));
3449 __m128i y_bias = _mm_set1_epi8((
char)(
unsigned char)128);
3450 __m128i xw = _mm_set1_epi16(255);
3452 for (; i + 7 < count; i += 8) {
3454 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y + i));
3455 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr + i));
3456 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb + i));
3457 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3458 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3461 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3462 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3463 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3466 __m128i yws = _mm_srli_epi16(yw, 4);
3467 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3468 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3469 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3470 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3471 __m128i rws = _mm_add_epi16(cr0, yws);
3472 __m128i gwt = _mm_add_epi16(cb0, yws);
3473 __m128i bws = _mm_add_epi16(yws, cb1);
3474 __m128i gws = _mm_add_epi16(gwt, cr1);
3477 __m128i rw = _mm_srai_epi16(rws, 4);
3478 __m128i bw = _mm_srai_epi16(bws, 4);
3479 __m128i gw = _mm_srai_epi16(gws, 4);
3482 __m128i brb = _mm_packus_epi16(rw, bw);
3483 __m128i gxb = _mm_packus_epi16(gw, xw);
3486 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3487 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3488 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3489 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3492 _mm_storeu_si128((__m128i *) (out + 0), o0);
3493 _mm_storeu_si128((__m128i *) (out + 16), o1);
3503 uint8x8_t signflip = vdup_n_u8(0x80);
3504 int16x8_t cr_const0 = vdupq_n_s16((
short)(1.40200f*4096.0f + 0.5f));
3505 int16x8_t cr_const1 = vdupq_n_s16(-(
short)(0.71414f*4096.0f + 0.5f));
3506 int16x8_t cb_const0 = vdupq_n_s16(-(
short)(0.34414f*4096.0f + 0.5f));
3507 int16x8_t cb_const1 = vdupq_n_s16((
short)(1.77200f*4096.0f + 0.5f));
3509 for (; i + 7 < count; i += 8) {
3511 uint8x8_t y_bytes = vld1_u8(y + i);
3512 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3513 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3514 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3515 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3518 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3519 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3520 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3523 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3524 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3525 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3526 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3527 int16x8_t rws = vaddq_s16(yws, cr0);
3528 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3529 int16x8_t bws = vaddq_s16(yws, cb1);
3533 o.val[0] = vqrshrun_n_s16(rws, 4);
3534 o.val[1] = vqrshrun_n_s16(gws, 4);
3535 o.val[2] = vqrshrun_n_s16(bws, 4);
3536 o.val[3] = vdup_n_u8(255);
3545 for (; i < count; ++i) {
3546 int y_fixed = (y[i] << 20) + (1 << 19);
3548 int cr = pcr[i] - 128;
3549 int cb = pcb[i] - 128;
3550 r = y_fixed + cr* float2fixed(1.40200f);
3551 g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3552 b = y_fixed + cb* float2fixed(1.77200f);
3556 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3557 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3558 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
3569 static void stbi__setup_jpeg(stbi__jpeg *j)
3571 j->idct_block_kernel = stbi__idct_block;
3572 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3573 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3576 if (stbi__sse2_available()) {
3577 j->idct_block_kernel = stbi__idct_simd;
3578 #ifndef STBI_JPEG_OLD
3579 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3581 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3586 j->idct_block_kernel = stbi__idct_simd;
3587 #ifndef STBI_JPEG_OLD
3588 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3590 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3595 static void stbi__cleanup_jpeg(stbi__jpeg *j)
3597 stbi__free_jpeg_components(j, j->s->img_n, 0);
3602 resample_row_func resample;
3610 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3616 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3619 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3622 n = req_comp ? req_comp : z->s->img_n;
3624 if (z->s->img_n == 3 && n < 3)
3627 decode_n = z->s->img_n;
3636 stbi__resample res_comp[4];
3638 for (k = 0; k < decode_n; ++k) {
3639 stbi__resample *r = &res_comp[k];
3643 z->img_comp[k].linebuf = (
stbi_uc *)stbi__malloc(z->s->img_x + 3);
3644 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3646 r->hs = z->img_h_max / z->img_comp[k].h;
3647 r->vs = z->img_v_max / z->img_comp[k].v;
3648 r->ystep = r->vs >> 1;
3649 r->w_lores = (z->s->img_x + r->hs - 1) / r->hs;
3651 r->line0 = r->line1 = z->img_comp[k].data;
3653 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3654 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3655 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3656 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3657 else r->resample = stbi__resample_row_generic;
3661 output = (
stbi_uc *)stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3662 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3665 for (j = 0; j < z->s->img_y; ++j) {
3666 stbi_uc *out = output + n * z->s->img_x * j;
3667 for (k = 0; k < decode_n; ++k) {
3668 stbi__resample *r = &res_comp[k];
3669 int y_bot = r->ystep >= (r->vs >> 1);
3670 coutput[k] = r->resample(z->img_comp[k].linebuf,
3671 y_bot ? r->line1 : r->line0,
3672 y_bot ? r->line0 : r->line1,
3674 if (++r->ystep >= r->vs) {
3676 r->line0 = r->line1;
3677 if (++r->ypos < z->img_comp[k].y)
3678 r->line1 += z->img_comp[k].w2;
3683 if (z->s->img_n == 3) {
3685 for (i = 0; i < z->s->img_x; ++i) {
3687 out[1] = coutput[1][i];
3688 out[2] = coutput[2][i];
3694 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3698 for (i = 0; i < z->s->img_x; ++i) {
3699 out[0] = out[1] = out[2] = y[i];
3707 for (i = 0; i < z->s->img_x; ++i) out[i] = y[i];
3709 for (i = 0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3712 stbi__cleanup_jpeg(z);
3713 *out_x = z->s->img_x;
3714 *out_y = z->s->img_y;
3715 if (comp) *comp = z->s->img_n;
3720 static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
3722 unsigned char* result;
3723 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
3725 stbi__setup_jpeg(j);
3726 result = load_jpeg_image(j, x, y, comp, req_comp);
3731 static int stbi__jpeg_test(stbi__context *s)
3734 static stbi__jpeg j;
3736 stbi__setup_jpeg(&j);
3737 r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
3742 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
3744 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3748 if (x) *x = j->s->img_x;
3749 if (y) *y = j->s->img_y;
3750 if (comp) *comp = j->s->img_n;
3754 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
3757 stbi__jpeg* j = (stbi__jpeg*)(stbi__malloc(
sizeof(stbi__jpeg)));
3759 result = stbi__jpeg_info_raw(j, x, y, comp);
3772 #ifndef STBI_NO_ZLIB
3775 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
3776 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
3782 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3783 stbi__uint16 firstcode[16];
3785 stbi__uint16 firstsymbol[16];
3787 stbi__uint16 value[288];
3790 stbi_inline
static int stbi__bitreverse16(
int n)
3792 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3793 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3794 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3795 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3799 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3801 STBI_ASSERT(bits <= 16);
3804 return stbi__bitreverse16(v) >> (16 - bits);
3807 static int stbi__zbuild_huffman(stbi__zhuffman *z,
stbi_uc *sizelist,
int num)
3810 int code, next_code[16], sizes[17];
3813 memset(sizes, 0,
sizeof(sizes));
3814 memset(z->fast, 0,
sizeof(z->fast));
3815 for (i = 0; i < num; ++i)
3816 ++sizes[sizelist[i]];
3818 for (i = 1; i < 16; ++i)
3819 if (sizes[i] >(1 << i))
3820 return stbi__err(
"bad sizes",
"Corrupt PNG");
3822 for (i = 1; i < 16; ++i) {
3823 next_code[i] = code;
3824 z->firstcode[i] = (stbi__uint16)code;
3825 z->firstsymbol[i] = (stbi__uint16)k;
3826 code = (code + sizes[i]);
3828 if (code - 1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3829 z->maxcode[i] = code << (16 - i);
3833 z->maxcode[16] = 0x10000;
3834 for (i = 0; i < num; ++i) {
3835 int s = sizelist[i];
3837 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3838 stbi__uint16 fastv = (stbi__uint16)((s << 9) | i);
3840 z->value[c] = (stbi__uint16)i;
3841 if (s <= STBI__ZFAST_BITS) {
3842 int j = stbi__bit_reverse(next_code[s], s);
3843 while (j < (1 << STBI__ZFAST_BITS)) {
3862 stbi_uc *zbuffer, *zbuffer_end;
3864 stbi__uint32 code_buffer;
3871 stbi__zhuffman z_length, z_distance;
3874 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
3876 if (z->zbuffer >= z->zbuffer_end)
return 0;
3877 return *z->zbuffer++;
3880 static void stbi__fill_bits(stbi__zbuf *z)
3883 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3884 z->code_buffer |= (
unsigned int)stbi__zget8(z) << z->num_bits;
3886 }
while (z->num_bits <= 24);
3889 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
3892 if (z->num_bits < n) stbi__fill_bits(z);
3893 k = z->code_buffer & ((1 << n) - 1);
3894 z->code_buffer >>= n;
3899 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
3904 k = stbi__bit_reverse(a->code_buffer, 16);
3905 for (s = STBI__ZFAST_BITS + 1; ; ++s)
3906 if (k < z->maxcode[s])
3908 if (s == 16)
return -1;
3910 b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s];
3911 STBI_ASSERT(z->size[b] == s);
3912 a->code_buffer >>= s;
3917 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3920 if (a->num_bits < 16) stbi__fill_bits(a);
3921 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3924 a->code_buffer >>= s;
3928 return stbi__zhuffman_decode_slowpath(a, z);
3931 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
3934 int cur, limit, old_limit;
3936 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3937 cur = (int)(z->zout - z->zout_start);
3938 limit = old_limit = (int)(z->zout_end - z->zout_start);
3939 while (cur + n > limit)
3941 q = (
char *)STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
3942 STBI_NOTUSED(old_limit);
3943 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
3946 z->zout_end = q + limit;
3950 static int stbi__zlength_base[31] = {
3951 3,4,5,6,7,8,9,10,11,13,
3952 15,17,19,23,27,31,35,43,51,59,
3953 67,83,99,115,131,163,195,227,258,0,0 };
3955 static int stbi__zlength_extra[31] =
3956 { 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 };
3958 static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3959 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0 };
3961 static int stbi__zdist_extra[32] =
3962 { 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 };
3964 static int stbi__parse_huffman_block(stbi__zbuf *a)
3966 char *zout = a->zout;
3968 int z = stbi__zhuffman_decode(a, &a->z_length);
3970 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3971 if (zout >= a->zout_end) {
3972 if (!stbi__zexpand(a, zout, 1))
return 0;
3985 len = stbi__zlength_base[z];
3986 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
3987 z = stbi__zhuffman_decode(a, &a->z_distance);
3988 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3989 dist = stbi__zdist_base[z];
3990 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
3991 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
3992 if (zout + len > a->zout_end) {
3993 if (!stbi__zexpand(a, zout, len))
return 0;
3999 if (len) {
do *zout++ = v;
while (--len); }
4002 if (len) {
do *zout++ = *p++;
while (--len); }
4008 static int stbi__compute_huffman_codes(stbi__zbuf *a)
4010 static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
4011 stbi__zhuffman z_codelength;
4012 stbi_uc lencodes[286 + 32 + 137];
4016 int hlit = stbi__zreceive(a, 5) + 257;
4017 int hdist = stbi__zreceive(a, 5) + 1;
4018 int hclen = stbi__zreceive(a, 4) + 4;
4019 int ntot = hlit + hdist;
4021 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4022 for (i = 0; i < hclen; ++i) {
4023 int s = stbi__zreceive(a, 3);
4024 codelength_sizes[length_dezigzag[i]] = (
stbi_uc)s;
4026 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
4030 int c = stbi__zhuffman_decode(a, &z_codelength);
4031 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4037 c = stbi__zreceive(a, 2) + 3;
4038 if (n == 0)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4039 fill = lencodes[n - 1];
4042 c = stbi__zreceive(a, 3) + 3;
4044 STBI_ASSERT(c == 18);
4045 c = stbi__zreceive(a, 7) + 11;
4047 if (ntot - n < c)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4048 memset(lencodes + n, fill, c);
4052 if (n != ntot)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4053 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
4054 if (!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist))
return 0;
4058 static int stbi__parse_uncompressed_block(stbi__zbuf *a)
4062 if (a->num_bits & 7)
4063 stbi__zreceive(a, a->num_bits & 7);
4066 while (a->num_bits > 0) {
4067 header[k++] = (
stbi_uc)(a->code_buffer & 255);
4068 a->code_buffer >>= 8;
4071 STBI_ASSERT(a->num_bits == 0);
4074 header[k++] = stbi__zget8(a);
4075 len = header[1] * 256 + header[0];
4076 nlen = header[3] * 256 + header[2];
4077 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4078 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
4079 if (a->zout + len > a->zout_end)
4080 if (!stbi__zexpand(a, a->zout, len))
return 0;
4081 memcpy(a->zout, a->zbuffer, len);
4087 static int stbi__parse_zlib_header(stbi__zbuf *a)
4089 int cmf = stbi__zget8(a);
4092 int flg = stbi__zget8(a);
4093 if ((cmf * 256 + flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4094 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
4095 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
4101 static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
4102 static void stbi__init_zdefaults(
void)
4105 for (i = 0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
4106 for (; i <= 255; ++i) stbi__zdefault_length[i] = 9;
4107 for (; i <= 279; ++i) stbi__zdefault_length[i] = 7;
4108 for (; i <= 287; ++i) stbi__zdefault_length[i] = 8;
4110 for (i = 0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
4113 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
4117 if (!stbi__parse_zlib_header(a))
return 0;
4121 final = stbi__zreceive(a, 1);
4122 type = stbi__zreceive(a, 2);
4124 if (!stbi__parse_uncompressed_block(a))
return 0;
4126 else if (type == 3) {
4132 if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
4133 if (!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, 288))
return 0;
4134 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
4137 if (!stbi__compute_huffman_codes(a))
return 0;
4139 if (!stbi__parse_huffman_block(a))
return 0;
4145 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
4147 a->zout_start = obuf;
4149 a->zout_end = obuf + olen;
4150 a->z_expandable = exp;
4152 return stbi__parse_zlib(a, parse_header);
4158 char *p = (
char *)stbi__malloc(initial_size);
4159 if (p == NULL)
return NULL;
4160 a.zbuffer = (
stbi_uc *)buffer;
4161 a.zbuffer_end = (
stbi_uc *)buffer + len;
4162 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4163 if (outlen) *outlen = (int)(a.zout - a.zout_start);
4164 return a.zout_start;
4167 STBI_FREE(a.zout_start);
4180 char *p = (
char *)stbi__malloc(initial_size);
4181 if (p == NULL)
return NULL;
4182 a.zbuffer = (
stbi_uc *)buffer;
4183 a.zbuffer_end = (
stbi_uc *)buffer + len;
4184 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4185 if (outlen) *outlen = (int)(a.zout - a.zout_start);
4186 return a.zout_start;
4189 STBI_FREE(a.zout_start);
4197 a.zbuffer = (
stbi_uc *)ibuffer;
4198 a.zbuffer_end = (
stbi_uc *)ibuffer + ilen;
4199 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4200 return (
int)(a.zout - a.zout_start);
4208 char *p = (
char *)stbi__malloc(16384);
4209 if (p == NULL)
return NULL;
4210 a.zbuffer = (
stbi_uc *)buffer;
4211 a.zbuffer_end = (
stbi_uc *)buffer + len;
4212 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4213 if (outlen) *outlen = (int)(a.zout - a.zout_start);
4214 return a.zout_start;
4217 STBI_FREE(a.zout_start);
4225 a.zbuffer = (
stbi_uc *)ibuffer;
4226 a.zbuffer_end = (
stbi_uc *)ibuffer + ilen;
4227 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4228 return (
int)(a.zout - a.zout_start);
4247 stbi__uint32 length;
4251 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
4254 c.length = stbi__get32be(s);
4255 c.type = stbi__get32be(s);
4259 static int stbi__check_png_header(stbi__context *s)
4261 static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4263 for (i = 0; i < 8; ++i)
4264 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
4271 stbi_uc *idata, *expanded, *out;
4287 static stbi_uc first_row_filter[5] =
4296 static int stbi__paeth(
int a,
int b,
int c)
4299 int pa = abs(p - a);
4300 int pb = abs(p - b);
4301 int pc = abs(p - c);
4302 if (pa <= pb && pa <= pc)
return a;
4303 if (pb <= pc)
return b;
4307 static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4310 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)
4312 int bytes = (depth == 16 ? 2 : 1);
4313 stbi__context *s = a->s;
4314 stbi__uint32 i, j, stride = x*out_n*bytes;
4315 stbi__uint32 img_len, img_width_bytes;
4317 int img_n = s->img_n;
4319 int output_bytes = out_n*bytes;
4320 int filter_bytes = img_n*bytes;
4323 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1);
4324 a->out = (
stbi_uc *)stbi__malloc_mad3(x, y, output_bytes, 0);
4325 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
4327 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4328 img_len = (img_width_bytes + 1) * y;
4329 if (s->img_x == x && s->img_y == y) {
4330 if (raw_len != img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4333 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4336 for (j = 0; j < y; ++j) {
4337 stbi_uc *cur = a->out + stride*j;
4338 stbi_uc *prior = cur - stride;
4339 int filter = *raw++;
4342 return stbi__err(
"invalid filter",
"Corrupt PNG");
4345 STBI_ASSERT(img_width_bytes <= x);
4346 cur += x*out_n - img_width_bytes;
4348 width = img_width_bytes;
4352 if (j == 0) filter = first_row_filter[filter];
4355 for (k = 0; k < filter_bytes; ++k) {
4357 case STBI__F_none: cur[k] = raw[k];
break;
4358 case STBI__F_sub: cur[k] = raw[k];
break;
4359 case STBI__F_up: cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4360 case STBI__F_avg: cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1));
break;
4361 case STBI__F_paeth: cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0, prior[k], 0));
break;
4362 case STBI__F_avg_first: cur[k] = raw[k];
break;
4363 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4374 else if (depth == 16) {
4375 if (img_n != out_n) {
4376 cur[filter_bytes] = 255;
4377 cur[filter_bytes + 1] = 255;
4379 raw += filter_bytes;
4380 cur += output_bytes;
4381 prior += output_bytes;
4390 if (depth < 8 || img_n == out_n) {
4391 int nk = (width - 1)*filter_bytes;
4392 #define STBI__CASE(f) \
4394 for (k=0; k < nk; ++k)
4397 case STBI__F_none: memcpy(cur, raw, nk);
break;
4398 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); }
break;
4399 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4400 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); }
break;
4401 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); }
break;
4402 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); }
break;
4403 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], 0, 0)); }
break;
4409 STBI_ASSERT(img_n + 1 == out_n);
4410 #define STBI__CASE(f) \
4412 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4413 for (k=0; k < filter_bytes; ++k)
4415 STBI__CASE(STBI__F_none) { cur[k] = raw[k]; }
break;
4416 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - output_bytes]); }
break;
4417 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4418 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - output_bytes]) >> 1)); }
break;
4419 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], prior[k], prior[k - output_bytes])); }
break;
4420 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - output_bytes] >> 1)); }
break;
4421 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], 0, 0)); }
break;
4428 cur = a->out + stride*j;
4429 for (i = 0; i < x; ++i, cur += output_bytes) {
4430 cur[filter_bytes + 1] = 255;
4440 for (j = 0; j < y; ++j) {
4441 stbi_uc *cur = a->out + stride*j;
4442 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
4445 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4454 for (k = x*img_n; k >= 2; k -= 2, ++in) {
4455 *cur++ = scale * ((*in >> 4));
4456 *cur++ = scale * ((*in) & 0x0f);
4458 if (k > 0) *cur++ = scale * ((*in >> 4));
4460 else if (depth == 2) {
4461 for (k = x*img_n; k >= 4; k -= 4, ++in) {
4462 *cur++ = scale * ((*in >> 6));
4463 *cur++ = scale * ((*in >> 4) & 0x03);
4464 *cur++ = scale * ((*in >> 2) & 0x03);
4465 *cur++ = scale * ((*in) & 0x03);
4467 if (k > 0) *cur++ = scale * ((*in >> 6));
4468 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4469 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4471 else if (depth == 1) {
4472 for (k = x*img_n; k >= 8; k -= 8, ++in) {
4473 *cur++ = scale * ((*in >> 7));
4474 *cur++ = scale * ((*in >> 6) & 0x01);
4475 *cur++ = scale * ((*in >> 5) & 0x01);
4476 *cur++ = scale * ((*in >> 4) & 0x01);
4477 *cur++ = scale * ((*in >> 3) & 0x01);
4478 *cur++ = scale * ((*in >> 2) & 0x01);
4479 *cur++ = scale * ((*in >> 1) & 0x01);
4480 *cur++ = scale * ((*in) & 0x01);
4482 if (k > 0) *cur++ = scale * ((*in >> 7));
4483 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4484 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4485 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4486 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4487 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4488 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4490 if (img_n != out_n) {
4493 cur = a->out + stride*j;
4495 for (q = x - 1; q >= 0; --q) {
4496 cur[q * 2 + 1] = 255;
4497 cur[q * 2 + 0] = cur[q];
4501 STBI_ASSERT(img_n == 3);
4502 for (q = x - 1; q >= 0; --q) {
4503 cur[q * 4 + 3] = 255;
4504 cur[q * 4 + 2] = cur[q * 3 + 2];
4505 cur[q * 4 + 1] = cur[q * 3 + 1];
4506 cur[q * 4 + 0] = cur[q * 3 + 0];
4512 else if (depth == 16) {
4518 stbi__uint16 *cur16 = (stbi__uint16*)cur;
4520 for (i = 0; i < x*y*out_n; ++i, cur16++, cur += 2) {
4521 *cur16 = (cur[0] << 8) | cur[1];
4528 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)
4530 int bytes = (depth == 16 ? 2 : 1);
4531 int out_bytes = out_n * bytes;
4535 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4538 final = (
stbi_uc *)stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4539 for (p = 0; p < 7; ++p) {
4540 int xorig[] = { 0,4,0,2,0,1,0 };
4541 int yorig[] = { 0,0,4,0,2,0,1 };
4542 int xspc[] = { 8,8,4,4,2,2,1 };
4543 int yspc[] = { 8,8,8,4,4,2,2 };
4546 x = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p];
4547 y = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p];
4549 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4550 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4554 for (j = 0; j < y; ++j) {
4555 for (i = 0; i < x; ++i) {
4556 int out_y = j*yspc[p] + yorig[p];
4557 int out_x = i*xspc[p] + xorig[p];
4558 memcpy(
final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
4559 a->out + (j*x + i)*out_bytes, out_bytes);
4563 image_data += img_len;
4564 image_data_len -= img_len;
4572 static int stbi__compute_transparency(stbi__png *z,
stbi_uc tc[3],
int out_n)
4574 stbi__context *s = z->s;
4575 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4580 STBI_ASSERT(out_n == 2 || out_n == 4);
4583 for (i = 0; i < pixel_count; ++i) {
4584 p[1] = (p[0] == tc[0] ? 0 : 255);
4589 for (i = 0; i < pixel_count; ++i) {
4590 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4598 static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3],
int out_n)
4600 stbi__context *s = z->s;
4601 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4602 stbi__uint16 *p = (stbi__uint16*)z->out;
4606 STBI_ASSERT(out_n == 2 || out_n == 4);
4609 for (i = 0; i < pixel_count; ++i) {
4610 p[1] = (p[0] == tc[0] ? 0 : 65535);
4615 for (i = 0; i < pixel_count; ++i) {
4616 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4624 static int stbi__expand_png_palette(stbi__png *a,
stbi_uc *palette,
int len,
int pal_img_n)
4626 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4627 stbi_uc *p, *temp_out, *orig = a->out;
4629 p = (
stbi_uc *)stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4630 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4635 if (pal_img_n == 3) {
4636 for (i = 0; i < pixel_count; ++i) {
4637 int n = orig[i] * 4;
4639 p[1] = palette[n + 1];
4640 p[2] = palette[n + 2];
4645 for (i = 0; i < pixel_count; ++i) {
4646 int n = orig[i] * 4;
4648 p[1] = palette[n + 1];
4649 p[2] = palette[n + 2];
4650 p[3] = palette[n + 3];
4662 static int stbi__unpremultiply_on_load = 0;
4663 static int stbi__de_iphone_flag = 0;
4667 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4672 stbi__de_iphone_flag = flag_true_if_should_convert;
4675 static void stbi__de_iphone(stbi__png *z)
4677 stbi__context *s = z->s;
4678 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4681 if (s->img_out_n == 3) {
4682 for (i = 0; i < pixel_count; ++i) {
4690 STBI_ASSERT(s->img_out_n == 4);
4691 if (stbi__unpremultiply_on_load) {
4693 for (i = 0; i < pixel_count; ++i) {
4697 p[0] = p[2] * 255 / a;
4698 p[1] = p[1] * 255 / a;
4710 for (i = 0; i < pixel_count; ++i) {
4720 #define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
4722 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
4724 stbi_uc palette[1024], pal_img_n = 0;
4726 stbi__uint16 tc16[3];
4727 stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0;
4728 int first = 1, k, interlace = 0, color = 0, is_iphone = 0;
4729 stbi__context *s = z->s;
4735 if (!stbi__check_png_header(s))
return 0;
4737 if (scan == STBI__SCAN_type)
return 1;
4740 stbi__pngchunk c = stbi__get_chunk_header(s);
4742 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4744 stbi__skip(s, c.length);
4746 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4748 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4750 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4751 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4752 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4753 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");
4754 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4755 if (color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4756 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4757 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4758 filter = stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4759 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4760 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4762 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4763 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4764 if (scan == STBI__SCAN_header)
return 1;
4770 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4776 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4777 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4778 if (c.length > 256 * 3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4779 pal_len = c.length / 3;
4780 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4781 for (i = 0; i < pal_len; ++i) {
4782 palette[i * 4 + 0] = stbi__get8(s);
4783 palette[i * 4 + 1] = stbi__get8(s);
4784 palette[i * 4 + 2] = stbi__get8(s);
4785 palette[i * 4 + 3] = 255;
4790 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4791 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4792 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4794 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4795 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4796 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4798 for (i = 0; i < c.length; ++i)
4799 palette[i * 4 + 3] = stbi__get8(s);
4802 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4803 if (c.length != (stbi__uint32)s->img_n * 2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4805 if (z->depth == 16) {
4806 for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s);
4809 for (k = 0; k < s->img_n; ++k) tc[k] = (
stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth];
4815 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4816 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4817 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4818 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4819 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
4820 if (ioff + c.length > idata_limit) {
4821 stbi__uint32 idata_limit_old = idata_limit;
4823 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4824 while (ioff + c.length > idata_limit)
4826 STBI_NOTUSED(idata_limit_old);
4827 p = (
stbi_uc *)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4830 if (!stbi__getn(s, z->idata + ioff, c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4835 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4836 stbi__uint32 raw_len, bpl;
4837 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4838 if (scan != STBI__SCAN_load)
return 1;
4839 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4841 bpl = (s->img_x * z->depth + 7) / 8;
4842 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4844 if (z->expanded == NULL)
return 0;
4845 STBI_FREE(z->idata); z->idata = NULL;
4846 if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans)
4847 s->img_out_n = s->img_n + 1;
4849 s->img_out_n = s->img_n;
4850 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace))
return 0;
4852 if (z->depth == 16) {
4853 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
return 0;
4856 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4859 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4863 s->img_n = pal_img_n;
4864 s->img_out_n = pal_img_n;
4865 if (req_comp >= 3) s->img_out_n = req_comp;
4866 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4869 STBI_FREE(z->expanded); z->expanded = NULL;
4875 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4876 if ((c.type & (1 << 29)) == 0) {
4877 #ifndef STBI_NO_FAILURE_STRINGS
4879 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4880 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4881 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4882 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4883 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4885 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4887 stbi__skip(s, c.length);
4895 static void *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp, stbi__result_info *ri)
4897 void *result = NULL;
4898 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4899 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4900 ri->bits_per_channel = p->depth;
4903 if (req_comp && req_comp != p->s->img_out_n) {
4904 if (ri->bits_per_channel == 8)
4905 result = stbi__convert_format((
unsigned char *)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4907 result = stbi__convert_format16((stbi__uint16 *)result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4908 p->s->img_out_n = req_comp;
4909 if (result == NULL)
return result;
4913 if (n) *n = p->s->img_n;
4915 STBI_FREE(p->out); p->out = NULL;
4916 STBI_FREE(p->expanded); p->expanded = NULL;
4917 STBI_FREE(p->idata); p->idata = NULL;
4922 static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
4926 return stbi__do_png(&p, x, y, comp, req_comp, ri);
4929 static int stbi__png_test(stbi__context *s)
4932 r = stbi__check_png_header(s);
4937 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
4939 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
4943 if (x) *x = p->s->img_x;
4944 if (y) *y = p->s->img_y;
4945 if (comp) *comp = p->s->img_n;
4949 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
4953 return stbi__png_info_raw(&p, x, y, comp);
4960 static int stbi__bmp_test_raw(stbi__context *s)
4964 if (stbi__get8(s) !=
'B')
return 0;
4965 if (stbi__get8(s) !=
'M')
return 0;
4970 sz = stbi__get32le(s);
4971 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4975 static int stbi__bmp_test(stbi__context *s)
4977 int r = stbi__bmp_test_raw(s);
4984 static int stbi__high_bit(
unsigned int z)
4987 if (z == 0)
return -1;
4988 if (z >= 0x10000) n += 16, z >>= 16;
4989 if (z >= 0x00100) n += 8, z >>= 8;
4990 if (z >= 0x00010) n += 4, z >>= 4;
4991 if (z >= 0x00004) n += 2, z >>= 2;
4992 if (z >= 0x00002) n += 1, z >>= 1;
4996 static int stbi__bitcount(
unsigned int a)
4998 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
4999 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
5000 a = (a + (a >> 4)) & 0x0f0f0f0f;
5002 a = (a + (a >> 16));
5006 static int stbi__shiftsigned(
int v,
int shift,
int bits)
5011 if (shift < 0) v <<= -shift;
5025 int bpp, offset, hsz;
5026 unsigned int mr, mg, mb, ma, all_a;
5029 static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
5032 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5036 info->offset = stbi__get32le(s);
5037 info->hsz = hsz = stbi__get32le(s);
5038 info->mr = info->mg = info->mb = info->ma = 0;
5040 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5042 s->img_x = stbi__get16le(s);
5043 s->img_y = stbi__get16le(s);
5046 s->img_x = stbi__get32le(s);
5047 s->img_y = stbi__get32le(s);
5049 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5050 info->bpp = stbi__get16le(s);
5051 if (info->bpp == 1)
return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
5053 int compress = stbi__get32le(s);
5054 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5060 if (hsz == 40 || hsz == 56) {
5067 if (info->bpp == 16 || info->bpp == 32) {
5068 if (compress == 0) {
5069 if (info->bpp == 32) {
5070 info->mr = 0xffu << 16;
5071 info->mg = 0xffu << 8;
5072 info->mb = 0xffu << 0;
5073 info->ma = 0xffu << 24;
5077 info->mr = 31u << 10;
5078 info->mg = 31u << 5;
5079 info->mb = 31u << 0;
5082 else if (compress == 3) {
5083 info->mr = stbi__get32le(s);
5084 info->mg = stbi__get32le(s);
5085 info->mb = stbi__get32le(s);
5087 if (info->mr == info->mg && info->mg == info->mb) {
5089 return stbi__errpuc(
"bad BMP",
"bad BMP");
5093 return stbi__errpuc(
"bad BMP",
"bad BMP");
5098 if (hsz != 108 && hsz != 124)
5099 return stbi__errpuc(
"bad BMP",
"bad BMP");
5100 info->mr = stbi__get32le(s);
5101 info->mg = stbi__get32le(s);
5102 info->mb = stbi__get32le(s);
5103 info->ma = stbi__get32le(s);
5105 for (i = 0; i < 12; ++i)
5119 static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5122 unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a;
5124 int psize = 0, i, j, width;
5125 int flip_vertically, pad, target;
5126 stbi__bmp_data info;
5130 if (stbi__bmp_parse_header(s, &info) == NULL)
5133 flip_vertically = ((int)s->img_y) > 0;
5134 s->img_y = abs((
int)s->img_y);
5142 if (info.hsz == 12) {
5144 psize = (info.offset - 14 - 24) / 3;
5148 psize = (info.offset - 14 - info.hsz) >> 2;
5151 s->img_n = ma ? 4 : 3;
5152 if (req_comp && req_comp >= 3)
5158 if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5159 return stbi__errpuc(
"too large",
"Corrupt BMP");
5161 out = (
stbi_uc *)stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5162 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5163 if (info.bpp < 16) {
5165 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
5166 for (i = 0; i < psize; ++i) {
5167 pal[i][2] = stbi__get8(s);
5168 pal[i][1] = stbi__get8(s);
5169 pal[i][0] = stbi__get8(s);
5170 if (info.hsz != 12) stbi__get8(s);
5173 stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5174 if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5175 else if (info.bpp == 8) width = s->img_x;
5176 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
5178 for (j = 0; j < (int)s->img_y; ++j) {
5179 for (i = 0; i < (int)s->img_x; i += 2) {
5180 int v = stbi__get8(s), v2 = 0;
5181 if (info.bpp == 4) {
5185 out[z++] = pal[v][0];
5186 out[z++] = pal[v][1];
5187 out[z++] = pal[v][2];
5188 if (target == 4) out[z++] = 255;
5189 if (i + 1 == (
int)s->img_x)
break;
5190 v = (info.bpp == 8) ? stbi__get8(s) : v2;
5191 out[z++] = pal[v][0];
5192 out[z++] = pal[v][1];
5193 out[z++] = pal[v][2];
5194 if (target == 4) out[z++] = 255;
5200 int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0;
5203 stbi__skip(s, info.offset - 14 - info.hsz);
5204 if (info.bpp == 24) width = 3 * s->img_x;
5205 else if (info.bpp == 16) width = 2 * s->img_x;
5208 if (info.bpp == 24) {
5211 else if (info.bpp == 32) {
5212 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5216 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5218 rshift = stbi__high_bit(mr) - 7; rcount = stbi__bitcount(mr);
5219 gshift = stbi__high_bit(mg) - 7; gcount = stbi__bitcount(mg);
5220 bshift = stbi__high_bit(mb) - 7; bcount = stbi__bitcount(mb);
5221 ashift = stbi__high_bit(ma) - 7; acount = stbi__bitcount(ma);
5223 for (j = 0; j < (int)s->img_y; ++j) {
5225 for (i = 0; i < (int)s->img_x; ++i) {
5227 out[z + 2] = stbi__get8(s);
5228 out[z + 1] = stbi__get8(s);
5229 out[z + 0] = stbi__get8(s);
5231 a = (easy == 2 ? stbi__get8(s) : 255);
5233 if (target == 4) out[z++] = a;
5238 for (i = 0; i < (int)s->img_x; ++i) {
5239 stbi__uint32 v = (bpp == 16 ? (stbi__uint32)stbi__get16le(s) : stbi__get32le(s));
5241 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5242 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5243 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5244 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5246 if (target == 4) out[z++] = STBI__BYTECAST(a);
5254 if (target == 4 && all_a == 0)
5255 for (i = 4 * s->img_x*s->img_y - 1; i >= 0; i -= 4)
5258 if (flip_vertically) {
5260 for (j = 0; j < (int)s->img_y >> 1; ++j) {
5261 stbi_uc *p1 = out + j *s->img_x*target;
5262 stbi_uc *p2 = out + (s->img_y - 1 - j)*s->img_x*target;
5263 for (i = 0; i < (int)s->img_x*target; ++i) {
5264 t = p1[i], p1[i] = p2[i], p2[i] = t;
5269 if (req_comp && req_comp != target) {
5270 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
5271 if (out == NULL)
return out;
5276 if (comp) *comp = s->img_n;
5285 static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
5288 if (is_rgb16) *is_rgb16 = 0;
5289 switch (bits_per_pixel) {
5293 case 15:
if (is_rgb16) *is_rgb16 = 1;
5296 case 32:
return bits_per_pixel / 8;
5301 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
5303 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5304 int sz, tga_colormap_type;
5306 tga_colormap_type = stbi__get8(s);
5307 if (tga_colormap_type > 1) {
5311 tga_image_type = stbi__get8(s);
5312 if (tga_colormap_type == 1) {
5313 if (tga_image_type != 1 && tga_image_type != 9) {
5319 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) {
5324 tga_colormap_bpp = sz;
5327 if ((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11)) {
5332 tga_colormap_bpp = 0;
5334 tga_w = stbi__get16le(s);
5339 tga_h = stbi__get16le(s);
5344 tga_bits_per_pixel = stbi__get8(s);
5346 if (tga_colormap_bpp != 0) {
5347 if ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5353 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5356 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5364 if (comp) *comp = tga_comp;
5368 static int stbi__tga_test(stbi__context *s)
5371 int sz, tga_color_type;
5373 tga_color_type = stbi__get8(s);
5374 if (tga_color_type > 1)
goto errorEnd;
5376 if (tga_color_type == 1) {
5377 if (sz != 1 && sz != 9)
goto errorEnd;
5380 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
goto errorEnd;
5384 if ((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11))
goto errorEnd;
5387 if (stbi__get16le(s) < 1)
goto errorEnd;
5388 if (stbi__get16le(s) < 1)
goto errorEnd;
5390 if ((tga_color_type == 1) && (sz != 8) && (sz != 16))
goto errorEnd;
5391 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
goto errorEnd;
5401 static void stbi__tga_read_rgb16(stbi__context *s,
stbi_uc* out)
5403 stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5404 stbi__uint16 fiveBitMask = 31;
5406 int r = (px >> 10) & fiveBitMask;
5407 int g = (px >> 5) & fiveBitMask;
5408 int b = px & fiveBitMask;
5410 out[0] = (
stbi_uc)((r * 255) / 31);
5411 out[1] = (
stbi_uc)((g * 255) / 31);
5412 out[2] = (
stbi_uc)((b * 255) / 31);
5420 static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
5423 int tga_offset = stbi__get8(s);
5424 int tga_indexed = stbi__get8(s);
5425 int tga_image_type = stbi__get8(s);
5427 int tga_palette_start = stbi__get16le(s);
5428 int tga_palette_len = stbi__get16le(s);
5429 int tga_palette_bits = stbi__get8(s);
5430 int tga_x_origin = stbi__get16le(s);
5431 int tga_y_origin = stbi__get16le(s);
5432 int tga_width = stbi__get16le(s);
5433 int tga_height = stbi__get16le(s);
5434 int tga_bits_per_pixel = stbi__get8(s);
5435 int tga_comp, tga_rgb16 = 0;
5436 int tga_inverted = stbi__get8(s);
5439 unsigned char *tga_data;
5440 unsigned char *tga_palette = NULL;
5442 unsigned char raw_data[4];
5444 int RLE_repeating = 0;
5445 int read_next_pixel = 1;
5449 if (tga_image_type >= 8)
5451 tga_image_type -= 8;
5454 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5457 if (tga_indexed) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5458 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5461 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5466 if (comp) *comp = tga_comp;
5468 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5469 return stbi__errpuc(
"too large",
"Corrupt TGA");
5471 tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5472 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
5475 stbi__skip(s, tga_offset);
5477 if (!tga_indexed && !tga_is_RLE && !tga_rgb16) {
5478 for (i = 0; i < tga_height; ++i) {
5479 int row = tga_inverted ? tga_height - i - 1 : i;
5480 stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5481 stbi__getn(s, tga_row, tga_width * tga_comp);
5489 stbi__skip(s, tga_palette_start);
5491 tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5493 STBI_FREE(tga_data);
5494 return stbi__errpuc(
"outofmem",
"Out of memory");
5497 stbi_uc *pal_entry = tga_palette;
5499 for (i = 0; i < tga_palette_len; ++i) {
5500 stbi__tga_read_rgb16(s, pal_entry);
5501 pal_entry += tga_comp;
5504 else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5505 STBI_FREE(tga_data);
5506 STBI_FREE(tga_palette);
5507 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5511 for (i = 0; i < tga_width * tga_height; ++i)
5519 int RLE_cmd = stbi__get8(s);
5520 RLE_count = 1 + (RLE_cmd & 127);
5521 RLE_repeating = RLE_cmd >> 7;
5522 read_next_pixel = 1;
5524 else if (!RLE_repeating)
5526 read_next_pixel = 1;
5531 read_next_pixel = 1;
5534 if (read_next_pixel)
5540 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5541 if (pal_idx >= tga_palette_len) {
5545 pal_idx *= tga_comp;
5546 for (j = 0; j < tga_comp; ++j) {
5547 raw_data[j] = tga_palette[pal_idx + j];
5550 else if (tga_rgb16) {
5552 stbi__tga_read_rgb16(s, raw_data);
5556 for (j = 0; j < tga_comp; ++j) {
5557 raw_data[j] = stbi__get8(s);
5561 read_next_pixel = 0;
5565 for (j = 0; j < tga_comp; ++j)
5566 tga_data[i*tga_comp + j] = raw_data[j];
5574 for (j = 0; j * 2 < tga_height; ++j)
5576 int index1 = j * tga_width * tga_comp;
5577 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5578 for (i = tga_width * tga_comp; i > 0; --i)
5580 unsigned char temp = tga_data[index1];
5581 tga_data[index1] = tga_data[index2];
5582 tga_data[index2] = temp;
5589 if (tga_palette != NULL)
5591 STBI_FREE(tga_palette);
5597 if (tga_comp >= 3 && !tga_rgb16)
5599 unsigned char* tga_pixel = tga_data;
5600 for (i = 0; i < tga_width * tga_height; ++i)
5602 unsigned char temp = tga_pixel[0];
5603 tga_pixel[0] = tga_pixel[2];
5604 tga_pixel[2] = temp;
5605 tga_pixel += tga_comp;
5611 if (req_comp && req_comp != tga_comp)
5612 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5616 tga_palette_start = tga_palette_len = tga_palette_bits =
5617 tga_x_origin = tga_y_origin = 0;
5627 static int stbi__psd_test(stbi__context *s)
5629 int r = (stbi__get32be(s) == 0x38425053);
5634 static int stbi__psd_decode_rle(stbi__context *s,
stbi_uc *p,
int pixelCount)
5636 int count, nleft, len;
5639 while ((nleft = pixelCount - count) > 0) {
5640 len = stbi__get8(s);
5644 else if (len < 128) {
5647 if (len > nleft)
return 0;
5655 else if (len > 128) {
5660 if (len > nleft)
return 0;
5661 val = stbi__get8(s);
5674 static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri,
int bpc)
5677 int channelCount, compression;
5685 if (stbi__get32be(s) != 0x38425053)
5686 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5689 if (stbi__get16be(s) != 1)
5690 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5696 channelCount = stbi__get16be(s);
5697 if (channelCount < 0 || channelCount > 16)
5698 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5701 h = stbi__get32be(s);
5702 w = stbi__get32be(s);
5705 bitdepth = stbi__get16be(s);
5706 if (bitdepth != 8 && bitdepth != 16)
5707 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
5719 if (stbi__get16be(s) != 3)
5720 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5723 stbi__skip(s, stbi__get32be(s));
5726 stbi__skip(s, stbi__get32be(s));
5729 stbi__skip(s, stbi__get32be(s));
5735 compression = stbi__get16be(s);
5736 if (compression > 1)
5737 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5740 if (!stbi__mad3sizes_valid(4, w, h, 0))
5741 return stbi__errpuc(
"too large",
"Corrupt PSD");
5745 if (!compression && bitdepth == 16 && bpc == 16) {
5746 out = (
stbi_uc *)stbi__malloc_mad3(8, w, h, 0);
5747 ri->bits_per_channel = 16;
5750 out = (
stbi_uc *)stbi__malloc(4 * w*h);
5752 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5770 stbi__skip(s, h * channelCount * 2);
5773 for (channel = 0; channel < 4; channel++) {
5777 if (channel >= channelCount) {
5779 for (i = 0; i < pixelCount; i++, p += 4)
5780 *p = (channel == 3 ? 255 : 0);
5784 if (!stbi__psd_decode_rle(s, p, pixelCount)) {
5786 return stbi__errpuc(
"corrupt",
"bad RLE data");
5797 for (channel = 0; channel < 4; channel++) {
5798 if (channel >= channelCount) {
5800 if (bitdepth == 16 && bpc == 16) {
5801 stbi__uint16 *q = ((stbi__uint16 *)out) + channel;
5802 stbi__uint16 val = channel == 3 ? 65535 : 0;
5803 for (i = 0; i < pixelCount; i++, q += 4)
5808 stbi_uc val = channel == 3 ? 255 : 0;
5809 for (i = 0; i < pixelCount; i++, p += 4)
5814 if (ri->bits_per_channel == 16) {
5815 stbi__uint16 *q = ((stbi__uint16 *)out) + channel;
5816 for (i = 0; i < pixelCount; i++, q += 4)
5817 *q = (stbi__uint16)stbi__get16be(s);
5821 if (bitdepth == 16) {
5822 for (i = 0; i < pixelCount; i++, p += 4)
5823 *p = (
stbi_uc)(stbi__get16be(s) >> 8);
5826 for (i = 0; i < pixelCount; i++, p += 4)
5835 if (channelCount >= 4) {
5836 if (ri->bits_per_channel == 16) {
5837 for (i = 0; i < w*h; ++i) {
5838 stbi__uint16 *pixel = (stbi__uint16 *)out + 4 * i;
5839 if (pixel[3] != 0 && pixel[3] != 65535) {
5840 float a = pixel[3] / 65535.0f;
5841 float ra = 1.0f / a;
5842 float inv_a = 65535.0f * (1 - ra);
5843 pixel[0] = (stbi__uint16)(pixel[0] * ra + inv_a);
5844 pixel[1] = (stbi__uint16)(pixel[1] * ra + inv_a);
5845 pixel[2] = (stbi__uint16)(pixel[2] * ra + inv_a);
5850 for (i = 0; i < w*h; ++i) {
5851 unsigned char *pixel = out + 4 * i;
5852 if (pixel[3] != 0 && pixel[3] != 255) {
5853 float a = pixel[3] / 255.0f;
5854 float ra = 1.0f / a;
5855 float inv_a = 255.0f * (1 - ra);
5856 pixel[0] = (
unsigned char)(pixel[0] * ra + inv_a);
5857 pixel[1] = (
unsigned char)(pixel[1] * ra + inv_a);
5858 pixel[2] = (
unsigned char)(pixel[2] * ra + inv_a);
5865 if (req_comp && req_comp != 4) {
5866 if (ri->bits_per_channel == 16)
5867 out = (
stbi_uc *)stbi__convert_format16((stbi__uint16 *)out, 4, req_comp, w, h);
5869 out = stbi__convert_format(out, 4, req_comp, w, h);
5870 if (out == NULL)
return out;
5873 if (comp) *comp = 4;
5889 static int stbi__pic_is4(stbi__context *s,
const char *str)
5892 for (i = 0; i<4; ++i)
5893 if (stbi__get8(s) != (
stbi_uc)str[i])
5899 static int stbi__pic_test_core(stbi__context *s)
5903 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
5906 for (i = 0; i<84; ++i)
5909 if (!stbi__pic_is4(s,
"PICT"))
5920 static stbi_uc *stbi__readval(stbi__context *s,
int channel,
stbi_uc *dest)
5924 for (i = 0; i<4; ++i, mask >>= 1) {
5925 if (channel & mask) {
5926 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
5927 dest[i] = stbi__get8(s);
5934 static void stbi__copyval(
int channel,
stbi_uc *dest,
const stbi_uc *src)
5938 for (i = 0; i<4; ++i, mask >>= 1)
5943 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp,
stbi_uc *result)
5945 int act_comp = 0, num_packets = 0, y, chained;
5946 stbi__pic_packet packets[10];
5951 stbi__pic_packet *packet;
5953 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
5954 return stbi__errpuc(
"bad format",
"too many packets");
5956 packet = &packets[num_packets++];
5958 chained = stbi__get8(s);
5959 packet->size = stbi__get8(s);
5960 packet->type = stbi__get8(s);
5961 packet->channel = stbi__get8(s);
5963 act_comp |= packet->channel;
5965 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
5966 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
5969 *comp = (act_comp & 0x10 ? 4 : 3);
5971 for (y = 0; y<height; ++y) {
5974 for (packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
5975 stbi__pic_packet *packet = &packets[packet_idx];
5976 stbi_uc *dest = result + y*width * 4;
5978 switch (packet->type) {
5980 return stbi__errpuc(
"bad format",
"packet has bad compression type");
5985 for (x = 0; x<width; ++x, dest += 4)
5986 if (!stbi__readval(s, packet->channel, dest))
5993 int left = width, i;
5998 count = stbi__get8(s);
5999 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6004 if (!stbi__readval(s, packet->channel, value))
return 0;
6006 for (i = 0; i<count; ++i, dest += 4)
6007 stbi__copyval(packet->channel, dest, value);
6016 int count = stbi__get8(s), i;
6017 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6023 count = stbi__get16be(s);
6027 return stbi__errpuc(
"bad file",
"scanline overrun");
6029 if (!stbi__readval(s, packet->channel, value))
6032 for (i = 0; i<count; ++i, dest += 4)
6033 stbi__copyval(packet->channel, dest, value);
6037 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
6039 for (i = 0; i<count; ++i, dest += 4)
6040 if (!stbi__readval(s, packet->channel, dest))
6054 static void *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp, stbi__result_info *ri)
6060 for (i = 0; i<92; ++i)
6063 x = stbi__get16be(s);
6064 y = stbi__get16be(s);
6065 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
6066 if (!stbi__mad3sizes_valid(x, y, 4, 0))
return stbi__errpuc(
"too large",
"PIC image too large to decode");
6073 result = (
stbi_uc *)stbi__malloc_mad3(x, y, 4, 0);
6074 memset(result, 0xff, x*y * 4);
6076 if (!stbi__pic_load_core(s, x, y, comp, result)) {
6082 if (req_comp == 0) req_comp = *comp;
6083 result = stbi__convert_format(result, 4, req_comp, x, y);
6088 static int stbi__pic_test(stbi__context *s)
6090 int r = stbi__pic_test_core(s);
6111 int flags, bgindex, ratio, transparent, eflags, delay;
6114 stbi__gif_lzw codes[4096];
6118 int start_x, start_y;
6124 static int stbi__gif_test_raw(stbi__context *s)
6127 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
6129 if (sz !=
'9' && sz !=
'7')
return 0;
6130 if (stbi__get8(s) !=
'a')
return 0;
6134 static int stbi__gif_test(stbi__context *s)
6136 int r = stbi__gif_test_raw(s);
6141 static void stbi__gif_parse_colortable(stbi__context *s,
stbi_uc pal[256][4],
int num_entries,
int transp)
6144 for (i = 0; i < num_entries; ++i) {
6145 pal[i][2] = stbi__get8(s);
6146 pal[i][1] = stbi__get8(s);
6147 pal[i][0] = stbi__get8(s);
6148 pal[i][3] = transp == i ? 0 : 255;
6152 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
6155 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
6156 return stbi__err(
"not GIF",
"Corrupt GIF");
6158 version = stbi__get8(s);
6159 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
6160 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
6162 stbi__g_failure_reason =
"";
6163 g->w = stbi__get16le(s);
6164 g->h = stbi__get16le(s);
6165 g->flags = stbi__get8(s);
6166 g->bgindex = stbi__get8(s);
6167 g->ratio = stbi__get8(s);
6168 g->transparent = -1;
6170 if (comp != 0) *comp = 4;
6172 if (is_info)
return 1;
6174 if (g->flags & 0x80)
6175 stbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1);
6180 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
6182 stbi__gif* g = (stbi__gif*)stbi__malloc(
sizeof(stbi__gif));
6183 if (!stbi__gif_header(s, g, comp, 1)) {
6194 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6200 if (g->codes[code].prefix >= 0)
6201 stbi__out_gif_code(g, g->codes[code].prefix);
6203 if (g->cur_y >= g->max_y)
return;
6205 p = &g->out[g->cur_x + g->cur_y];
6206 c = &g->color_table[g->codes[code].suffix * 4];
6216 if (g->cur_x >= g->max_x) {
6217 g->cur_x = g->start_x;
6218 g->cur_y += g->step;
6220 while (g->cur_y >= g->max_y && g->parse > 0) {
6221 g->step = (1 << g->parse) * g->line_size;
6222 g->cur_y = g->start_y + (g->step >> 1);
6228 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
6231 stbi__int32 len, init_code;
6233 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6236 lzw_cs = stbi__get8(s);
6237 if (lzw_cs > 12)
return NULL;
6238 clear = 1 << lzw_cs;
6240 codesize = lzw_cs + 1;
6241 codemask = (1 << codesize) - 1;
6244 for (init_code = 0; init_code < clear; init_code++) {
6245 g->codes[init_code].prefix = -1;
6246 g->codes[init_code].first = (
stbi_uc)init_code;
6247 g->codes[init_code].suffix = (
stbi_uc)init_code;
6256 if (valid_bits < codesize) {
6258 len = stbi__get8(s);
6263 bits |= (stbi__int32)stbi__get8(s) << valid_bits;
6267 stbi__int32 code = bits & codemask;
6269 valid_bits -= codesize;
6271 if (code == clear) {
6272 codesize = lzw_cs + 1;
6273 codemask = (1 << codesize) - 1;
6278 else if (code == clear + 1) {
6280 while ((len = stbi__get8(s)) > 0)
6284 else if (code <= avail) {
6285 if (first)
return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6288 p = &g->codes[avail++];
6289 if (avail > 4096)
return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6290 p->prefix = (stbi__int16)oldcode;
6291 p->first = g->codes[oldcode].first;
6292 p->suffix = (code == avail) ? p->first : g->codes[code].first;
6294 else if (code == avail)
6295 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6297 stbi__out_gif_code(g, (stbi__uint16)code);
6299 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6301 codemask = (1 << codesize) - 1;
6307 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6313 static void stbi__fill_gif_background(stbi__gif *g,
int x0,
int y0,
int x1,
int y1)
6316 stbi_uc *c = g->pal[g->bgindex];
6317 for (y = y0; y < y1; y += 4 * g->w) {
6318 for (x = x0; x < x1; x += 4) {
6329 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp)
6334 if (g->out == 0 && !stbi__gif_header(s, g, comp, 0))
6337 if (!stbi__mad3sizes_valid(g->w, g->h, 4, 0))
6338 return stbi__errpuc(
"too large",
"GIF too large");
6341 g->out = (
stbi_uc *)stbi__malloc_mad3(4, g->w, g->h, 0);
6342 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
6344 switch ((g->eflags & 0x1C) >> 2) {
6346 stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);
6349 if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
6350 g->old_out = prev_out;
6353 if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
6354 stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
6358 for (i = g->start_y; i < g->max_y; i += 4 * g->w)
6359 memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
6365 switch (stbi__get8(s)) {
6368 int prev_trans = -1;
6369 stbi__int32 x, y, w, h;
6372 x = stbi__get16le(s);
6373 y = stbi__get16le(s);
6374 w = stbi__get16le(s);
6375 h = stbi__get16le(s);
6376 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6377 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6379 g->line_size = g->w * 4;
6381 g->start_y = y * g->line_size;
6382 g->max_x = g->start_x + w * 4;
6383 g->max_y = g->start_y + h * g->line_size;
6384 g->cur_x = g->start_x;
6385 g->cur_y = g->start_y;
6387 g->lflags = stbi__get8(s);
6389 if (g->lflags & 0x40) {
6390 g->step = 8 * g->line_size;
6394 g->step = g->line_size;
6398 if (g->lflags & 0x80) {
6399 stbi__gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6400 g->color_table = (
stbi_uc *)g->lpal;
6402 else if (g->flags & 0x80) {
6403 if (g->transparent >= 0 && (g->eflags & 0x01)) {
6404 prev_trans = g->pal[g->transparent][3];
6405 g->pal[g->transparent][3] = 0;
6407 g->color_table = (
stbi_uc *)g->pal;
6410 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6412 o = stbi__process_gif_raster(s, g);
6413 if (o == NULL)
return NULL;
6415 if (prev_trans != -1)
6416 g->pal[g->transparent][3] = (
stbi_uc)prev_trans;
6424 if (stbi__get8(s) == 0xF9) {
6425 len = stbi__get8(s);
6427 g->eflags = stbi__get8(s);
6428 g->delay = stbi__get16le(s);
6429 g->transparent = stbi__get8(s);
6436 while ((len = stbi__get8(s)) != 0)
6445 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6449 STBI_NOTUSED(req_comp);
6452 static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6455 stbi__gif* g = (stbi__gif*)stbi__malloc(
sizeof(stbi__gif));
6456 memset(g, 0,
sizeof(*g));
6459 u = stbi__gif_load_next(s, g, comp, req_comp);
6464 if (req_comp && req_comp != 4)
6465 u = stbi__convert_format(u, 4, req_comp, g->w, g->h);
6473 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
6475 return stbi__gif_info_raw(s, x, y, comp);
6483 static int stbi__hdr_test_core(stbi__context *s,
const char *signature)
6486 for (i = 0; signature[i]; ++i)
6487 if (stbi__get8(s) != signature[i])
6493 static int stbi__hdr_test(stbi__context* s)
6495 int r = stbi__hdr_test_core(s,
"#?RADIANCE\n");
6498 r = stbi__hdr_test_core(s,
"#?RGBE\n");
6504 #define STBI__HDR_BUFLEN 1024
6505 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
6510 c = (char)stbi__get8(z);
6512 while (!stbi__at_eof(z) && c !=
'\n') {
6514 if (len == STBI__HDR_BUFLEN - 1) {
6516 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
6520 c = (char)stbi__get8(z);
6527 static void stbi__hdr_convert(
float *output,
stbi_uc *input,
int req_comp)
6529 if (input[3] != 0) {
6532 f1 = (float)ldexp(1.0f, input[3] - (
int)(128 + 8));
6534 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
6536 output[0] = input[0] * f1;
6537 output[1] = input[1] * f1;
6538 output[2] = input[2] * f1;
6540 if (req_comp == 2) output[1] = 1;
6541 if (req_comp == 4) output[3] = 1;
6545 case 4: output[3] = 1;
6546 case 3: output[0] = output[1] = output[2] = 0;
6548 case 2: output[1] = 1;
6549 case 1: output[0] = 0;
6555 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6557 char buffer[STBI__HDR_BUFLEN];
6564 unsigned char count, value;
6565 int i, j, k, c1, c2, z;
6566 const char *headerToken;
6570 headerToken = stbi__hdr_gettoken(s, buffer);
6571 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
6572 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
6576 token = stbi__hdr_gettoken(s, buffer);
6577 if (token[0] == 0)
break;
6578 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6581 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
6585 token = stbi__hdr_gettoken(s, buffer);
6586 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6588 height = (int)strtol(token, &token, 10);
6589 while (*token ==
' ') ++token;
6590 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6592 width = (int)strtol(token, NULL, 10);
6597 if (comp) *comp = 3;
6598 if (req_comp == 0) req_comp = 3;
6600 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
6601 return stbi__errpf(
"too large",
"HDR image is too large");
6604 hdr_data = (
float *)stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
6606 return stbi__errpf(
"outofmem",
"Out of memory");
6610 if (width < 8 || width >= 32768) {
6612 for (j = 0; j < height; ++j) {
6613 for (i = 0; i < width; ++i) {
6616 stbi__getn(s, rgbe, 4);
6617 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
6625 for (j = 0; j < height; ++j) {
6628 len = stbi__get8(s);
6629 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
6636 rgbe[3] = (
stbi_uc)stbi__get8(s);
6637 stbi__hdr_convert(hdr_data, rgbe, req_comp);
6640 STBI_FREE(scanline);
6641 goto main_decode_loop;
6644 len |= stbi__get8(s);
6645 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
6646 if (scanline == NULL) {
6647 scanline = (
stbi_uc *)stbi__malloc_mad2(width, 4, 0);
6649 STBI_FREE(hdr_data);
6650 return stbi__errpf(
"outofmem",
"Out of memory");
6654 for (k = 0; k < 4; ++k) {
6657 while ((nleft = width - i) > 0) {
6658 count = stbi__get8(s);
6661 value = stbi__get8(s);
6663 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6664 for (z = 0; z < count; ++z)
6665 scanline[i++ * 4 + k] = value;
6669 if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
6670 for (z = 0; z < count; ++z)
6671 scanline[i++ * 4 + k] = stbi__get8(s);
6675 for (i = 0; i < width; ++i)
6676 stbi__hdr_convert(hdr_data + (j*width + i)*req_comp, scanline + i * 4, req_comp);
6679 STBI_FREE(scanline);
6685 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
6687 char buffer[STBI__HDR_BUFLEN];
6691 if (stbi__hdr_test(s) == 0) {
6697 token = stbi__hdr_gettoken(s, buffer);
6698 if (token[0] == 0)
break;
6699 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6706 token = stbi__hdr_gettoken(s, buffer);
6707 if (strncmp(token,
"-Y ", 3)) {
6712 *y = (int)strtol(token, &token, 10);
6713 while (*token ==
' ') ++token;
6714 if (strncmp(token,
"+X ", 3)) {
6719 *x = (int)strtol(token, NULL, 10);
6723 #endif // STBI_NO_HDR
6726 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
6729 stbi__bmp_data info;
6732 p = stbi__bmp_parse_header(s, &info);
6738 *comp = info.ma ? 4 : 3;
6744 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
6747 if (stbi__get32be(s) != 0x38425053) {
6751 if (stbi__get16be(s) != 1) {
6756 channelCount = stbi__get16be(s);
6757 if (channelCount < 0 || channelCount > 16) {
6761 *y = stbi__get32be(s);
6762 *x = stbi__get32be(s);
6763 if (stbi__get16be(s) != 8) {
6767 if (stbi__get16be(s) != 3) {
6777 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
6779 int act_comp = 0, num_packets = 0, chained;
6780 stbi__pic_packet packets[10];
6782 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
6789 *x = stbi__get16be(s);
6790 *y = stbi__get16be(s);
6791 if (stbi__at_eof(s)) {
6795 if ((*x) != 0 && (1 << 28) / (*x) < (*y)) {
6803 stbi__pic_packet *packet;
6805 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
6808 packet = &packets[num_packets++];
6809 chained = stbi__get8(s);
6810 packet->size = stbi__get8(s);
6811 packet->type = stbi__get8(s);
6812 packet->channel = stbi__get8(s);
6813 act_comp |= packet->channel;
6815 if (stbi__at_eof(s)) {
6819 if (packet->size != 8) {
6825 *comp = (act_comp & 0x10 ? 4 : 3);
6845 static int stbi__pnm_test(stbi__context *s)
6848 p = (char)stbi__get8(s);
6849 t = (char)stbi__get8(s);
6850 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6857 static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp, stbi__result_info *ri)
6862 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
6869 if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
6870 return stbi__errpuc(
"too large",
"PNM too large");
6872 out = (
stbi_uc *)stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
6873 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6874 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
6876 if (req_comp && req_comp != s->img_n) {
6877 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
6878 if (out == NULL)
return out;
6883 static int stbi__pnm_isspace(
char c)
6885 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
6888 static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
6891 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
6892 *c = (char)stbi__get8(s);
6894 if (stbi__at_eof(s) || *c !=
'#')
6897 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r')
6898 *c = (
char)stbi__get8(s);
6902 static int stbi__pnm_isdigit(
char c)
6904 return c >=
'0' && c <=
'9';
6907 static int stbi__pnm_getinteger(stbi__context *s,
char *c)
6911 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
6912 value = value * 10 + (*c -
'0');
6913 *c = (char)stbi__get8(s);
6919 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
6927 p = (char)stbi__get8(s);
6928 t = (char)stbi__get8(s);
6929 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6934 *comp = (t ==
'6') ? 3 : 1;
6936 c = (char)stbi__get8(s);
6937 stbi__pnm_skip_whitespace(s, &c);
6939 *x = stbi__pnm_getinteger(s, &c);
6940 stbi__pnm_skip_whitespace(s, &c);
6942 *y = stbi__pnm_getinteger(s, &c);
6943 stbi__pnm_skip_whitespace(s, &c);
6945 maxv = stbi__pnm_getinteger(s, &c);
6948 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
6954 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
6956 #ifndef STBI_NO_JPEG
6957 if (stbi__jpeg_info(s, x, y, comp))
return 1;
6961 if (stbi__png_info(s, x, y, comp))
return 1;
6965 if (stbi__gif_info(s, x, y, comp))
return 1;
6969 if (stbi__bmp_info(s, x, y, comp))
return 1;
6973 if (stbi__psd_info(s, x, y, comp))
return 1;
6977 if (stbi__pic_info(s, x, y, comp))
return 1;
6981 if (stbi__pnm_info(s, x, y, comp))
return 1;
6985 if (stbi__hdr_info(s, x, y, comp))
return 1;
6990 if (stbi__tga_info(s, x, y, comp))
6993 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
6996 #ifndef STBI_NO_STDIO
6999 FILE *f = stbi__fopen(filename,
"rb");
7001 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7011 long pos = ftell(f);
7012 stbi__start_file(&s, f);
7013 r = stbi__info_main(&s, x, y, comp);
7014 fseek(f, pos, SEEK_SET);
7017 #endif // !STBI_NO_STDIO
7022 stbi__start_mem(&s, buffer, len);
7023 return stbi__info_main(&s, x, y, comp);
7030 return stbi__info_main(&s, x, y, comp);
7033 #endif // STB_IMAGE_IMPLEMENTATION