129#ifndef STBI_INCLUDE_STB_IMAGE_H
130#define STBI_INCLUDE_STB_IMAGE_H
374#define STBI_VERSION 1
394#ifdef STB_IMAGE_STATIC
395#define STBIDEF static
397#define STBIDEF extern
411 int (*read)(
void *user,
char *data,
413 void (*skip)(
void *user,
415 int (*eof)(
void *user);
424 int *channels_in_file,
int desired_channels);
426 int *channels_in_file,
int desired_channels);
430 int desired_channels);
432 int desired_channels);
438 int *y,
int *z,
int *comp,
int req_comp);
441#ifdef STBI_WINDOWS_UTF8
442STBIDEF int stbi_convert_wchar_to_utf8(
char *buffer,
size_t bufferlen,
const wchar_t *input);
451 int *channels_in_file,
int desired_channels);
453 int *y,
int *channels_in_file,
int desired_channels);
457 int desired_channels);
459 int desired_channels);
466#ifndef STBI_NO_LINEAR
468 int *channels_in_file,
int desired_channels);
470 int *channels_in_file,
int desired_channels);
474 int desired_channels);
476 int desired_channels);
485#ifndef STBI_NO_LINEAR
543 int initial_size,
int *outlen,
561#ifdef STB_IMAGE_IMPLEMENTATION
563#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) || \
564 defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) || \
565 defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) || \
566 defined(STBI_ONLY_ZLIB)
567#ifndef STBI_ONLY_JPEG
596#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
606#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
616#define STBI_ASSERT(x) assert(x)
620#define STBI_EXTERN extern "C"
622#define STBI_EXTERN extern
627#define stbi_inline inline
632#define stbi_inline __forceinline
635#ifndef STBI_NO_THREAD_LOCALS
636#if defined(__cplusplus) && __cplusplus >= 201103L
637#define STBI_THREAD_LOCAL thread_local
638#elif defined(__GNUC__) && __GNUC__ < 5
639#define STBI_THREAD_LOCAL __thread
640#elif defined(_MSC_VER)
641#define STBI_THREAD_LOCAL __declspec(thread)
642#elif defined(__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
643#define STBI_THREAD_LOCAL _Thread_local
646#ifndef STBI_THREAD_LOCAL
648#define STBI_THREAD_LOCAL __thread
653#if defined(_MSC_VER) || defined(__SYMBIAN32__)
654typedef unsigned short stbi__uint16;
655typedef signed short stbi__int16;
656typedef unsigned int stbi__uint32;
657typedef signed int stbi__int32;
660typedef uint16_t stbi__uint16;
661typedef int16_t stbi__int16;
662typedef uint32_t stbi__uint32;
663typedef int32_t stbi__int32;
667typedef unsigned char validate_uint32[
sizeof(stbi__uint32) == 4 ? 1 : -1];
670#define STBI_NOTUSED(v) (void)(v)
672#define STBI_NOTUSED(v) (void)sizeof(v)
676#define STBI_HAS_LROTL
680#define stbi_lrot(x, y) _lrotl(x, y)
682#define stbi_lrot(x, y) (((x) << (y)) | ((x) >> (-(y) & 31)))
685#if defined(STBI_MALLOC) && defined(STBI_FREE) && \
686 (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
688#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && \
689 !defined(STBI_REALLOC_SIZED)
693 "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
697#define STBI_MALLOC(sz) malloc(sz)
698#define STBI_REALLOC(p, newsz) realloc(p, newsz)
699#define STBI_FREE(p) free(p)
702#ifndef STBI_REALLOC_SIZED
703#define STBI_REALLOC_SIZED(p, oldsz, newsz) STBI_REALLOC(p, newsz)
707#if defined(__x86_64__) || defined(_M_X64)
708#define STBI__X64_TARGET
709#elif defined(__i386) || defined(_M_IX86)
710#define STBI__X86_TARGET
713#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
724#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && \
725 !defined(STBI_NO_SIMD)
740#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
742#include <emmintrin.h>
748static int stbi__cpuid3(
void) {
754static int stbi__cpuid3(
void) {
765#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
767#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
768static int stbi__sse2_available(
void) {
769 int info3 = stbi__cpuid3();
770 return ((info3 >> 26) & 1) != 0;
775#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
777#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
778static int stbi__sse2_available(
void) {
790#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
797#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
799#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
803#ifndef STBI_SIMD_ALIGN
804#define STBI_SIMD_ALIGN(type, name) type name
807#ifndef STBI_MAX_DIMENSIONS
808#define STBI_MAX_DIMENSIONS (1 << 24)
818 stbi__uint32 img_x, img_y;
819 int img_n, img_out_n;
824 int read_from_callbacks;
827 int callback_already_read;
829 stbi_uc *img_buffer, *img_buffer_end;
830 stbi_uc *img_buffer_original, *img_buffer_original_end;
833static void stbi__refill_buffer(stbi__context *s);
836static void stbi__start_mem(stbi__context *s,
stbi_uc const *buffer,
int len) {
838 s->read_from_callbacks = 0;
839 s->callback_already_read = 0;
840 s->img_buffer = s->img_buffer_original = (
stbi_uc *)buffer;
841 s->img_buffer_end = s->img_buffer_original_end = (
stbi_uc *)buffer + len;
845static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user) {
847 s->io_user_data = user;
848 s->buflen =
sizeof(s->buffer_start);
849 s->read_from_callbacks = 1;
850 s->callback_already_read = 0;
851 s->img_buffer = s->img_buffer_original = s->buffer_start;
852 stbi__refill_buffer(s);
853 s->img_buffer_original_end = s->img_buffer_end;
858static int stbi__stdio_read(
void *user,
char *data,
int size) {
859 return (
int)fread(data, 1, size, (FILE *)user);
862static void stbi__stdio_skip(
void *user,
int n) {
864 fseek((FILE *)user, n, SEEK_CUR);
865 ch = fgetc((FILE *)user);
867 ungetc(ch, (FILE *)user);
871static int stbi__stdio_eof(
void *user) {
872 return feof((FILE *)user) || ferror((FILE *)user);
881static void stbi__start_file(stbi__context *s, FILE *f) {
882 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *)f);
889static void stbi__rewind(stbi__context *s) {
893 s->img_buffer = s->img_buffer_original;
894 s->img_buffer_end = s->img_buffer_original_end;
897enum { STBI_ORDER_RGB, STBI_ORDER_BGR };
900 int bits_per_channel;
906static int stbi__jpeg_test(stbi__context *s);
907static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
908 stbi__result_info *ri);
909static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
913static int stbi__png_test(stbi__context *s);
914static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
915 stbi__result_info *ri);
916static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
917static int stbi__png_is16(stbi__context *s);
921static int stbi__bmp_test(stbi__context *s);
922static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
923 stbi__result_info *ri);
924static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
928static int stbi__tga_test(stbi__context *s);
929static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
930 stbi__result_info *ri);
931static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
935static int stbi__psd_test(stbi__context *s);
936static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
937 stbi__result_info *ri,
int bpc);
938static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
939static int stbi__psd_is16(stbi__context *s);
943static int stbi__hdr_test(stbi__context *s);
944static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
945 stbi__result_info *ri);
946static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
950static int stbi__pic_test(stbi__context *s);
951static void *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
952 stbi__result_info *ri);
953static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
957static int stbi__gif_test(stbi__context *s);
958static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
959 stbi__result_info *ri);
960static void *stbi__load_gif_main(stbi__context *s,
int **delays,
int *x,
int *y,
int *z,
int *comp,
962static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
966static int stbi__pnm_test(stbi__context *s);
967static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
968 stbi__result_info *ri);
969static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
970static int stbi__pnm_is16(stbi__context *s);
974#ifdef STBI_THREAD_LOCAL
977 const char *stbi__g_failure_reason;
980 return stbi__g_failure_reason;
983#ifndef STBI_NO_FAILURE_STRINGS
984static int stbi__err(
const char *str) {
985 stbi__g_failure_reason = str;
990static void *stbi__malloc(
size_t size) {
991 return STBI_MALLOC(size);
1006static int stbi__addsizes_valid(
int a,
int b) {
1013 return a <= INT_MAX - b;
1018static int stbi__mul2sizes_valid(
int a,
int b) {
1024 return a <= INT_MAX / b;
1027#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || \
1028 !defined(STBI_NO_HDR)
1030static int stbi__mad2sizes_valid(
int a,
int b,
int add) {
1031 return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a * b, add);
1036static int stbi__mad3sizes_valid(
int a,
int b,
int c,
int add) {
1037 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) &&
1038 stbi__addsizes_valid(a * b * c, add);
1042#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1043static int stbi__mad4sizes_valid(
int a,
int b,
int c,
int d,
int add) {
1044 return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a * b, c) &&
1045 stbi__mul2sizes_valid(a * b * c, d) && stbi__addsizes_valid(a * b * c * d, add);
1049#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || \
1050 !defined(STBI_NO_HDR)
1052static void *stbi__malloc_mad2(
int a,
int b,
int add) {
1053 if (!stbi__mad2sizes_valid(a, b, add))
1055 return stbi__malloc(a * b + add);
1059static void *stbi__malloc_mad3(
int a,
int b,
int c,
int add) {
1060 if (!stbi__mad3sizes_valid(a, b, c, add))
1062 return stbi__malloc(a * b * c + add);
1065#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1066static void *stbi__malloc_mad4(
int a,
int b,
int c,
int d,
int add) {
1067 if (!stbi__mad4sizes_valid(a, b, c, d, add))
1069 return stbi__malloc(a * b * c * d + add);
1075static int stbi__addints_valid(
int a,
int b) {
1076 if ((a >= 0) != (b >= 0))
1079 return a >= INT_MIN - b;
1080 return a <= INT_MAX - b;
1084static int stbi__mul2shorts_valid(
int a,
int b) {
1085 if (b == 0 || b == -1)
1087 if ((a >= 0) == (b >= 0))
1088 return a <= SHRT_MAX / b;
1090 return a <= SHRT_MIN / b;
1091 return a >= SHRT_MIN / b;
1098#ifdef STBI_NO_FAILURE_STRINGS
1099#define stbi__err(x, y) 0
1100#elif defined(STBI_FAILURE_USERMSG)
1101#define stbi__err(x, y) stbi__err(y)
1103#define stbi__err(x, y) stbi__err(x)
1106#define stbi__errpf(x, y) ((float *)(size_t)(stbi__err(x, y) ? NULL : NULL))
1107#define stbi__errpuc(x, y) ((unsigned char *)(size_t)(stbi__err(x, y) ? NULL : NULL))
1110 STBI_FREE(retval_from_stbi_load);
1113#ifndef STBI_NO_LINEAR
1114static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp);
1118static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
1121static int stbi__vertically_flip_on_load_global = 0;
1124 stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
1127#ifndef STBI_THREAD_LOCAL
1128#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global
1130static STBI_THREAD_LOCAL
int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
1133 stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
1134 stbi__vertically_flip_on_load_set = 1;
1137#define stbi__vertically_flip_on_load \
1138 (stbi__vertically_flip_on_load_set ? stbi__vertically_flip_on_load_local \
1139 : stbi__vertically_flip_on_load_global)
1142static void *stbi__load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
1143 stbi__result_info *ri,
int bpc) {
1144 memset(ri, 0,
sizeof(*ri));
1145 ri->bits_per_channel = 8;
1146 ri->channel_order = STBI_ORDER_RGB;
1148 ri->num_channels = 0;
1153 if (stbi__png_test(s))
1154 return stbi__png_load(s, x, y, comp, req_comp, ri);
1157 if (stbi__bmp_test(s))
1158 return stbi__bmp_load(s, x, y, comp, req_comp, ri);
1161 if (stbi__gif_test(s))
1162 return stbi__gif_load(s, x, y, comp, req_comp, ri);
1165 if (stbi__psd_test(s))
1166 return stbi__psd_load(s, x, y, comp, req_comp, ri, bpc);
1171 if (stbi__pic_test(s))
1172 return stbi__pic_load(s, x, y, comp, req_comp, ri);
1179 if (stbi__jpeg_test(s))
1180 return stbi__jpeg_load(s, x, y, comp, req_comp, ri);
1183 if (stbi__pnm_test(s))
1184 return stbi__pnm_load(s, x, y, comp, req_comp, ri);
1188 if (stbi__hdr_test(s)) {
1189 float *hdr = stbi__hdr_load(s, x, y, comp, req_comp, ri);
1190 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
1196 if (stbi__tga_test(s))
1197 return stbi__tga_load(s, x, y, comp, req_comp, ri);
1200 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
1203static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig,
int w,
int h,
int channels) {
1205 int img_len = w * h * channels;
1208 reduced = (
stbi_uc *)stbi__malloc(img_len);
1209 if (reduced == NULL)
1210 return stbi__errpuc(
"outofmem",
"Out of memory");
1212 for (i = 0; i < img_len; ++i)
1221static stbi__uint16 *stbi__convert_8_to_16(
stbi_uc *orig,
int w,
int h,
int channels) {
1223 int img_len = w * h * channels;
1224 stbi__uint16 *enlarged;
1226 enlarged = (stbi__uint16 *)stbi__malloc(img_len * 2);
1227 if (enlarged == NULL)
1228 return (stbi__uint16 *)stbi__errpuc(
"outofmem",
"Out of memory");
1230 for (i = 0; i < img_len; ++i)
1232 (stbi__uint16)((orig[i] << 8) +
1239static void stbi__vertical_flip(
void *image,
int w,
int h,
int bytes_per_pixel) {
1241 size_t bytes_per_row = (size_t)w * bytes_per_pixel;
1245 for (row = 0; row < (h >> 1); row++) {
1246 stbi_uc *row0 = bytes + row * bytes_per_row;
1247 stbi_uc *row1 = bytes + (h - row - 1) * bytes_per_row;
1249 size_t bytes_left = bytes_per_row;
1250 while (bytes_left) {
1251 size_t bytes_copy = (bytes_left <
sizeof(temp)) ? bytes_left :
sizeof(temp);
1252 memcpy(temp, row0, bytes_copy);
1253 memcpy(row0, row1, bytes_copy);
1254 memcpy(row1, temp, bytes_copy);
1257 bytes_left -= bytes_copy;
1263static void stbi__vertical_flip_slices(
void *image,
int w,
int h,
int z,
int bytes_per_pixel) {
1265 int slice_size = w * h * bytes_per_pixel;
1268 for (slice = 0; slice < z; ++slice) {
1269 stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
1270 bytes += slice_size;
1275static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s,
int *x,
int *y,
int *comp,
1277 stbi__result_info ri;
1278 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1284 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1286 if (ri.bits_per_channel != 8) {
1288 stbi__convert_16_to_8((stbi__uint16 *)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1289 ri.bits_per_channel = 8;
1294 if (stbi__vertically_flip_on_load) {
1295 int channels = req_comp ? req_comp : *comp;
1296 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
stbi_uc));
1299 return (
unsigned char *)result;
1302static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s,
int *x,
int *y,
int *comp,
1304 stbi__result_info ri;
1305 void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1311 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1313 if (ri.bits_per_channel != 16) {
1314 result = stbi__convert_8_to_16((
stbi_uc *)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1315 ri.bits_per_channel = 16;
1321 if (stbi__vertically_flip_on_load) {
1322 int channels = req_comp ? req_comp : *comp;
1323 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi__uint16));
1326 return (stbi__uint16 *)result;
1329#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
1330static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp) {
1331 if (stbi__vertically_flip_on_load && result != NULL) {
1332 int channels = req_comp ? req_comp : *comp;
1333 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
float));
1338#ifndef STBI_NO_STDIO
1340#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1342__declspec(dllimport)
int __stdcall MultiByteToWideChar(
unsigned int cp,
unsigned long flags,
1343 const char *str,
int cbmb,
wchar_t *widestr,
1346__declspec(dllimport)
int __stdcall WideCharToMultiByte(
unsigned int cp,
unsigned long flags,
1347 const wchar_t *widestr,
int cchwide,
1348 char *str,
int cbmb,
const char *defchar,
1352#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1353STBIDEF int stbi_convert_wchar_to_utf8(
char *buffer,
size_t bufferlen,
const wchar_t *input) {
1354 return WideCharToMultiByte(65001 , 0, input, -1, buffer, (
int)bufferlen, NULL, NULL);
1358static FILE *stbi__fopen(
char const *filename,
char const *mode) {
1360#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1362 wchar_t wFilename[1024];
1363 if (0 == MultiByteToWideChar(65001 , 0, filename, -1, wFilename,
1364 sizeof(wFilename) /
sizeof(*wFilename)))
1368 MultiByteToWideChar(65001 , 0, mode, -1, wMode,
sizeof(wMode) /
sizeof(*wMode)))
1371#if defined(_MSC_VER) && _MSC_VER >= 1400
1372 if (0 != _wfopen_s(&f, wFilename, wMode))
1375 f = _wfopen(wFilename, wMode);
1378#elif defined(_MSC_VER) && _MSC_VER >= 1400
1379 if (0 != fopen_s(&f, filename, mode))
1382 f = fopen(filename, mode);
1388 FILE *f = stbi__fopen(filename,
"rb");
1389 unsigned char *result;
1391 return stbi__errpuc(
"can't fopen",
"Unable to open file");
1398 unsigned char *result;
1400 stbi__start_file(&s, f);
1401 result = stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1404 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
1410 stbi__uint16 *result;
1412 stbi__start_file(&s, f);
1413 result = stbi__load_and_postprocess_16bit(&s, x, y, comp, req_comp);
1416 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
1422 FILE *f = stbi__fopen(filename,
"rb");
1423 stbi__uint16 *result;
1425 return (
stbi_us *)stbi__errpuc(
"can't fopen",
"Unable to open file");
1434 int *channels_in_file,
int desired_channels) {
1436 stbi__start_mem(&s, buffer, len);
1437 return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels);
1441 int *y,
int *channels_in_file,
int desired_channels) {
1444 return stbi__load_and_postprocess_16bit(&s, x, y, channels_in_file, desired_channels);
1450 stbi__start_mem(&s, buffer, len);
1451 return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1455 int *comp,
int req_comp) {
1458 return stbi__load_and_postprocess_8bit(&s, x, y, comp, req_comp);
1463 int *y,
int *z,
int *comp,
int req_comp) {
1464 unsigned char *result;
1466 stbi__start_mem(&s, buffer, len);
1468 result = (
unsigned char *)stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
1469 if (stbi__vertically_flip_on_load) {
1470 stbi__vertical_flip_slices(result, *x, *y, *z, *comp);
1477#ifndef STBI_NO_LINEAR
1478static float *stbi__loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp) {
1479 unsigned char *data;
1481 if (stbi__hdr_test(s)) {
1482 stbi__result_info ri;
1483 float *hdr_data = stbi__hdr_load(s, x, y, comp, req_comp, &ri);
1485 stbi__float_postprocess(hdr_data, x, y, comp, req_comp);
1489 data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
1491 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1492 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1498 stbi__start_mem(&s, buffer, len);
1499 return stbi__loadf_main(&s, x, y, comp, req_comp);
1503 int *comp,
int req_comp) {
1506 return stbi__loadf_main(&s, x, y, comp, req_comp);
1509#ifndef STBI_NO_STDIO
1510STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp) {
1512 FILE *f = stbi__fopen(filename,
"rb");
1514 return stbi__errpf(
"can't fopen",
"Unable to open file");
1522 stbi__start_file(&s, f);
1523 return stbi__loadf_main(&s, x, y, comp, req_comp);
1536 stbi__start_mem(&s, buffer, len);
1537 return stbi__hdr_test(&s);
1539 STBI_NOTUSED(buffer);
1545#ifndef STBI_NO_STDIO
1547 FILE *f = stbi__fopen(filename,
"rb");
1558 long pos = ftell(f);
1561 stbi__start_file(&s, f);
1562 res = stbi__hdr_test(&s);
1563 fseek(f, pos, SEEK_SET);
1576 return stbi__hdr_test(&s);
1584#ifndef STBI_NO_LINEAR
1585static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f;
1588 stbi__l2h_gamma = gamma;
1591 stbi__l2h_scale = scale;
1595static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f;
1598 stbi__h2l_gamma_i = 1 / gamma;
1601 stbi__h2l_scale_i = 1 / scale;
1609enum { STBI__SCAN_load = 0, STBI__SCAN_type, STBI__SCAN_header };
1611static void stbi__refill_buffer(stbi__context *s) {
1612 int n = (s->io.read)(s->io_user_data, (
char *)s->buffer_start, s->buflen);
1613 s->callback_already_read += (int)(s->img_buffer - s->img_buffer_original);
1617 s->read_from_callbacks = 0;
1618 s->img_buffer = s->buffer_start;
1619 s->img_buffer_end = s->buffer_start + 1;
1622 s->img_buffer = s->buffer_start;
1623 s->img_buffer_end = s->buffer_start + n;
1627stbi_inline
static stbi_uc stbi__get8(stbi__context *s) {
1628 if (s->img_buffer < s->img_buffer_end)
1629 return *s->img_buffer++;
1630 if (s->read_from_callbacks) {
1631 stbi__refill_buffer(s);
1632 return *s->img_buffer++;
1637#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1640stbi_inline
static int stbi__at_eof(stbi__context *s) {
1642 if (!(s->io.eof)(s->io_user_data))
1646 if (s->read_from_callbacks == 0)
1650 return s->img_buffer >= s->img_buffer_end;
1654#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && \
1655 defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)
1658static void stbi__skip(stbi__context *s,
int n) {
1662 s->img_buffer = s->img_buffer_end;
1666 int blen = (int)(s->img_buffer_end - s->img_buffer);
1668 s->img_buffer = s->img_buffer_end;
1669 (s->io.skip)(s->io_user_data, n - blen);
1677#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
1680static int stbi__getn(stbi__context *s,
stbi_uc *buffer,
int n) {
1682 int blen = (int)(s->img_buffer_end - s->img_buffer);
1686 memcpy(buffer, s->img_buffer, blen);
1688 count = (s->io.read)(s->io_user_data, (
char *)buffer + blen, n - blen);
1689 res = (count == (n - blen));
1690 s->img_buffer = s->img_buffer_end;
1695 if (s->img_buffer + n <= s->img_buffer_end) {
1696 memcpy(buffer, s->img_buffer, n);
1704#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1707static int stbi__get16be(stbi__context *s) {
1708 int z = stbi__get8(s);
1709 return (z << 8) + stbi__get8(s);
1713#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1716static stbi__uint32 stbi__get32be(stbi__context *s) {
1717 stbi__uint32 z = stbi__get16be(s);
1718 return (z << 16) + stbi__get16be(s);
1722#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1725static int stbi__get16le(stbi__context *s) {
1726 int z = stbi__get8(s);
1727 return z + (stbi__get8(s) << 8);
1732static stbi__uint32 stbi__get32le(stbi__context *s) {
1733 stbi__uint32 z = stbi__get16le(s);
1734 z += (stbi__uint32)stbi__get16le(s) << 16;
1739#define STBI__BYTECAST(x) ((stbi_uc)((x) & 255))
1741#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && \
1742 defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && \
1743 defined(STBI_NO_PNM)
1757static stbi_uc stbi__compute_y(
int r,
int g,
int b) {
1758 return (
stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1762#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && \
1763 defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1766static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
1767 unsigned int x,
unsigned int y) {
1769 unsigned char *good;
1771 if (req_comp == img_n)
1773 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1775 good = (
unsigned char *)stbi__malloc_mad3(req_comp, x, y, 0);
1778 return stbi__errpuc(
"outofmem",
"Out of memory");
1781 for (j = 0; j < (int)y; ++j) {
1782 unsigned char *src = data + j * x * img_n;
1783 unsigned char *dest = good + j * x * req_comp;
1785#define STBI__COMBO(a, b) ((a) * 8 + (b))
1786#define STBI__CASE(a, b) \
1787 case STBI__COMBO(a, b): \
1788 for (i = x - 1; i >= 0; --i, src += a, dest += b)
1791 switch (STBI__COMBO(img_n, req_comp)) {
1798 dest[0] = dest[1] = dest[2] = src[0];
1802 dest[0] = dest[1] = dest[2] = src[0];
1811 dest[0] = dest[1] = dest[2] = src[0];
1815 dest[0] = dest[1] = dest[2] = src[0];
1827 dest[0] = stbi__compute_y(src[0], src[1], src[2]);
1831 dest[0] = stbi__compute_y(src[0], src[1], src[2]);
1836 dest[0] = stbi__compute_y(src[0], src[1], src[2]);
1840 dest[0] = stbi__compute_y(src[0], src[1], src[2]);
1854 return stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1864#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1867static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b) {
1868 return (stbi__uint16)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1872#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1875static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data,
int img_n,
int req_comp,
1876 unsigned int x,
unsigned int y) {
1880 if (req_comp == img_n)
1882 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1884 good = (stbi__uint16 *)stbi__malloc(req_comp * x * y * 2);
1887 return (stbi__uint16 *)stbi__errpuc(
"outofmem",
"Out of memory");
1890 for (j = 0; j < (int)y; ++j) {
1891 stbi__uint16 *src = data + j * x * img_n;
1892 stbi__uint16 *dest = good + j * x * req_comp;
1894#define STBI__COMBO(a, b) ((a) * 8 + (b))
1895#define STBI__CASE(a, b) \
1896 case STBI__COMBO(a, b): \
1897 for (i = x - 1; i >= 0; --i, src += a, dest += b)
1900 switch (STBI__COMBO(img_n, req_comp)) {
1907 dest[0] = dest[1] = dest[2] = src[0];
1911 dest[0] = dest[1] = dest[2] = src[0];
1920 dest[0] = dest[1] = dest[2] = src[0];
1924 dest[0] = dest[1] = dest[2] = src[0];
1936 dest[0] = stbi__compute_y_16(src[0], src[1], src[2]);
1940 dest[0] = stbi__compute_y_16(src[0], src[1], src[2]);
1945 dest[0] = stbi__compute_y_16(src[0], src[1], src[2]);
1949 dest[0] = stbi__compute_y_16(src[0], src[1], src[2]);
1963 return (stbi__uint16 *)stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1973#ifndef STBI_NO_LINEAR
1974static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp) {
1979 output = (
float *)stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1980 if (output == NULL) {
1982 return stbi__errpf(
"outofmem",
"Out of memory");
1989 for (i = 0; i < x * y; ++i) {
1990 for (k = 0; k < n; ++k) {
1991 output[i * comp + k] =
1992 (float)(pow(data[i * comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1996 for (i = 0; i < x * y; ++i) {
1997 output[i * comp + n] = data[i * comp + n] / 255.0f;
2006#define stbi__float2int(x) ((int)(x))
2007static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp) {
2012 output = (
stbi_uc *)stbi__malloc_mad3(x, y, comp, 0);
2013 if (output == NULL) {
2015 return stbi__errpuc(
"outofmem",
"Out of memory");
2022 for (i = 0; i < x * y; ++i) {
2023 for (k = 0; k < n; ++k) {
2024 float z = (float)pow(data[i * comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
2029 output[i * comp + k] = (
stbi_uc)stbi__float2int(z);
2032 float z = data[i * comp + k] * 255 + 0.5f;
2037 output[i * comp + k] = (
stbi_uc)stbi__float2int(z);
2074 stbi__uint16 code[256];
2077 unsigned int maxcode[18];
2083 stbi__huffman huff_dc[4];
2084 stbi__huffman huff_ac[4];
2085 stbi__uint16 dequant[4][64];
2086 stbi__int16 fast_ac[4][1 << FAST_BITS];
2089 int img_h_max, img_v_max;
2090 int img_mcu_x, img_mcu_y;
2091 int img_mcu_w, img_mcu_h;
2103 void *raw_data, *raw_coeff;
2106 int coeff_w, coeff_h;
2109 stbi__uint32 code_buffer;
2111 unsigned char marker;
2121 int app14_color_transform;
2124 int scan_n, order[4];
2125 int restart_interval, todo;
2128 void (*idct_block_kernel)(
stbi_uc *out,
int out_stride,
short data[64]);
2130 const stbi_uc *pcr,
int count,
int step);
2135static int stbi__build_huffman(stbi__huffman *h,
int *count) {
2139 for (i = 0; i < 16; ++i) {
2140 for (j = 0; j < count[i]; ++j) {
2141 h->size[k++] = (
stbi_uc)(i + 1);
2143 return stbi__err(
"bad size list",
"Corrupt JPEG");
2151 for (j = 1; j <= 16; ++j) {
2153 h->delta[j] = k - code;
2154 if (h->size[k] == j) {
2155 while (h->size[k] == j) h->code[k++] = (stbi__uint16)(code++);
2156 if (code - 1 >= (1u << j))
2157 return stbi__err(
"bad code lengths",
"Corrupt JPEG");
2160 h->maxcode[j] = code << (16 - j);
2163 h->maxcode[j] = 0xffffffff;
2166 memset(h->fast, 255, 1 << FAST_BITS);
2167 for (i = 0; i < k; ++i) {
2169 if (s <= FAST_BITS) {
2170 int c = h->code[i] << (FAST_BITS - s);
2171 int m = 1 << (FAST_BITS - s);
2172 for (j = 0; j < m; ++j) {
2182static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) {
2184 for (i = 0; i < (1 << FAST_BITS); ++i) {
2188 int rs = h->values[fast];
2189 int run = (rs >> 4) & 15;
2190 int magbits = rs & 15;
2191 int len = h->size[fast];
2193 if (magbits && len + magbits <= FAST_BITS) {
2195 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
2196 int m = 1 << (magbits - 1);
2198 k += (~0U << magbits) + 1;
2200 if (k >= -128 && k <= 127)
2201 fast_ac[i] = (stbi__int16)((k * 256) + (run * 16) + (len + magbits));
2207static void stbi__grow_buffer_unsafe(stbi__jpeg *j) {
2209 unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
2211 int c = stbi__get8(j->s);
2212 while (c == 0xff) c = stbi__get8(j->s);
2214 j->marker = (
unsigned char)c;
2219 j->code_buffer |= b << (24 - j->code_bits);
2221 }
while (j->code_bits <= 24);
2225static const stbi__uint32 stbi__bmask[17] = {0, 1, 3, 7, 15, 31, 63, 127, 255,
2226 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535};
2229stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) {
2233 if (j->code_bits < 16)
2234 stbi__grow_buffer_unsafe(j);
2238 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2242 if (s > j->code_bits)
2244 j->code_buffer <<= s;
2246 return h->values[k];
2255 temp = j->code_buffer >> 16;
2256 for (k = FAST_BITS + 1;; ++k)
2257 if (temp < h->maxcode[k])
2265 if (k > j->code_bits)
2269 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
2270 if (c < 0 || c >= 256)
2272 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
2276 j->code_buffer <<= k;
2277 return h->values[c];
2281static const int stbi__jbias[16] = {0, -1, -3, -7, -15, -31, -63, -127,
2282 -255, -511, -1023, -2047, -4095, -8191, -16383, -32767};
2286stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n) {
2289 if (j->code_bits < n)
2290 stbi__grow_buffer_unsafe(j);
2291 if (j->code_bits < n)
2294 sgn = j->code_buffer >>
2296 k = stbi_lrot(j->code_buffer, n);
2297 j->code_buffer = k & ~stbi__bmask[n];
2298 k &= stbi__bmask[n];
2300 return k + (stbi__jbias[n] & (sgn - 1));
2304stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n) {
2306 if (j->code_bits < n)
2307 stbi__grow_buffer_unsafe(j);
2308 if (j->code_bits < n)
2310 k = stbi_lrot(j->code_buffer, n);
2311 j->code_buffer = k & ~stbi__bmask[n];
2312 k &= stbi__bmask[n];
2317stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j) {
2319 if (j->code_bits < 1)
2320 stbi__grow_buffer_unsafe(j);
2321 if (j->code_bits < 1)
2324 j->code_buffer <<= 1;
2326 return k & 0x80000000;
2331static const stbi_uc stbi__jpeg_dezigzag[64 + 15] = {
2332 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, 12, 19, 26, 33, 40, 48, 41, 34, 27, 20,
2333 13, 6, 7, 14, 21, 28, 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, 58, 59, 52,
2334 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63,
2336 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63};
2339static int stbi__jpeg_decode_block(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
2340 stbi__huffman *hac, stbi__int16 *fac,
int b,
2341 stbi__uint16 *dequant) {
2345 if (j->code_bits < 16)
2346 stbi__grow_buffer_unsafe(j);
2347 t = stbi__jpeg_huff_decode(j, hdc);
2348 if (t < 0 || t > 15)
2349 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2352 memset(data, 0, 64 *
sizeof(data[0]));
2354 diff = t ? stbi__extend_receive(j, t) : 0;
2355 if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff))
2356 return stbi__err(
"bad delta",
"Corrupt JPEG");
2357 dc = j->img_comp[b].dc_pred + diff;
2358 j->img_comp[b].dc_pred = dc;
2359 if (!stbi__mul2shorts_valid(dc, dequant[0]))
2360 return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2361 data[0] = (short)(dc * dequant[0]);
2368 if (j->code_bits < 16)
2369 stbi__grow_buffer_unsafe(j);
2370 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2375 if (s > j->code_bits)
2376 return stbi__err(
"bad huffman code",
"Combined length longer than code bits available");
2377 j->code_buffer <<= s;
2380 zig = stbi__jpeg_dezigzag[k++];
2381 data[zig] = (short)((r >> 8) * dequant[zig]);
2383 int rs = stbi__jpeg_huff_decode(j, hac);
2385 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2395 zig = stbi__jpeg_dezigzag[k++];
2396 data[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]);
2403static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
2407 if (j->spec_end != 0)
2408 return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2410 if (j->code_bits < 16)
2411 stbi__grow_buffer_unsafe(j);
2413 if (j->succ_high == 0) {
2415 memset(data, 0, 64 *
sizeof(data[0]));
2416 t = stbi__jpeg_huff_decode(j, hdc);
2417 if (t < 0 || t > 15)
2418 return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2419 diff = t ? stbi__extend_receive(j, t) : 0;
2421 if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff))
2422 return stbi__err(
"bad delta",
"Corrupt JPEG");
2423 dc = j->img_comp[b].dc_pred + diff;
2424 j->img_comp[b].dc_pred = dc;
2425 if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low))
2426 return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2427 data[0] = (short)(dc * (1 << j->succ_low));
2430 if (stbi__jpeg_get_bit(j))
2431 data[0] += (
short)(1 << j->succ_low);
2438static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac,
2441 if (j->spec_start == 0)
2442 return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2444 if (j->succ_high == 0) {
2445 int shift = j->succ_low;
2456 if (j->code_bits < 16)
2457 stbi__grow_buffer_unsafe(j);
2458 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2463 if (s > j->code_bits)
2464 return stbi__err(
"bad huffman code",
"Combined length longer than code bits available");
2465 j->code_buffer <<= s;
2467 zig = stbi__jpeg_dezigzag[k++];
2468 data[zig] = (short)((r >> 8) * (1 << shift));
2470 int rs = stbi__jpeg_huff_decode(j, hac);
2472 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2477 j->eob_run = (1 << r);
2479 j->eob_run += stbi__jpeg_get_bits(j, r);
2486 zig = stbi__jpeg_dezigzag[k++];
2487 data[zig] = (short)(stbi__extend_receive(j, s) * (1 << shift));
2490 }
while (k <= j->spec_end);
2494 short bit = (short)(1 << j->succ_low);
2498 for (k = j->spec_start; k <= j->spec_end; ++k) {
2499 short *p = &data[stbi__jpeg_dezigzag[k]];
2501 if (stbi__jpeg_get_bit(j))
2502 if ((*p & bit) == 0) {
2513 int rs = stbi__jpeg_huff_decode(
2516 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2521 j->eob_run = (1 << r) - 1;
2523 j->eob_run += stbi__jpeg_get_bits(j, r);
2532 return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2534 if (stbi__jpeg_get_bit(j))
2541 while (k <= j->spec_end) {
2542 short *p = &data[stbi__jpeg_dezigzag[k++]];
2544 if (stbi__jpeg_get_bit(j))
2545 if ((*p & bit) == 0) {
2559 }
while (k <= j->spec_end);
2566stbi_inline
static stbi_uc stbi__clamp(
int x) {
2568 if ((
unsigned int)x > 255) {
2577#define stbi__f2f(x) ((int)(((x) * 4096 + 0.5)))
2578#define stbi__fsh(x) ((x) * 4096)
2581#define STBI__IDCT_1D(s0, s1, s2, s3, s4, s5, s6, s7) \
2582 int t0, t1, t2, t3, p1, p2, p3, p4, p5, x0, x1, x2, x3; \
2585 p1 = (p2 + p3) * stbi__f2f(0.5411961f); \
2586 t2 = p1 + p3 * stbi__f2f(-1.847759065f); \
2587 t3 = p1 + p2 * stbi__f2f(0.765366865f); \
2590 t0 = stbi__fsh(p2 + p3); \
2591 t1 = stbi__fsh(p2 - p3); \
2604 p5 = (p3 + p4) * stbi__f2f(1.175875602f); \
2605 t0 = t0 * stbi__f2f(0.298631336f); \
2606 t1 = t1 * stbi__f2f(2.053119869f); \
2607 t2 = t2 * stbi__f2f(3.072711026f); \
2608 t3 = t3 * stbi__f2f(1.501321110f); \
2609 p1 = p5 + p1 * stbi__f2f(-0.899976223f); \
2610 p2 = p5 + p2 * stbi__f2f(-2.562915447f); \
2611 p3 = p3 * stbi__f2f(-1.961570560f); \
2612 p4 = p4 * stbi__f2f(-0.390180644f); \
2618static void stbi__idct_block(
stbi_uc *out,
int out_stride,
short data[64]) {
2619 int i, val[64], *v = val;
2624 for (i = 0; i < 8; ++i, ++d, ++v) {
2626 if (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0 && d[40] == 0 && d[48] == 0 &&
2632 int dcterm = d[0] * 4;
2633 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2635 STBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56])
2642 v[0] = (x0 + t3) >> 10;
2643 v[56] = (x0 - t3) >> 10;
2644 v[8] = (x1 + t2) >> 10;
2645 v[48] = (x1 - t2) >> 10;
2646 v[16] = (x2 + t1) >> 10;
2647 v[40] = (x2 - t1) >> 10;
2648 v[24] = (x3 + t0) >> 10;
2649 v[32] = (x3 - t0) >> 10;
2653 for (i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) {
2655 STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7])
2662 x0 += 65536 + (128 << 17);
2663 x1 += 65536 + (128 << 17);
2664 x2 += 65536 + (128 << 17);
2665 x3 += 65536 + (128 << 17);
2668 o[0] = stbi__clamp((x0 + t3) >> 17);
2669 o[7] = stbi__clamp((x0 - t3) >> 17);
2670 o[1] = stbi__clamp((x1 + t2) >> 17);
2671 o[6] = stbi__clamp((x1 - t2) >> 17);
2672 o[2] = stbi__clamp((x2 + t1) >> 17);
2673 o[5] = stbi__clamp((x2 - t1) >> 17);
2674 o[3] = stbi__clamp((x3 + t0) >> 17);
2675 o[4] = stbi__clamp((x3 - t0) >> 17);
2683static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64]) {
2685 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2689#define dct_const(x, y) _mm_setr_epi16((x), (y), (x), (y), (x), (y), (x), (y))
2693#define dct_rot(out0, out1, x, y, c0, c1) \
2694 __m128i c0##lo = _mm_unpacklo_epi16((x), (y)); \
2695 __m128i c0##hi = _mm_unpackhi_epi16((x), (y)); \
2696 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2697 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2698 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2699 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2702#define dct_widen(out, in) \
2703 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2704 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2707#define dct_wadd(out, a, b) \
2708 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2709 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2712#define dct_wsub(out, a, b) \
2713 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2714 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2717#define dct_bfly32o(out0, out1, a, b, bias, s) \
2719 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2720 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2721 dct_wadd(sum, abiased, b); \
2722 dct_wsub(dif, abiased, b); \
2723 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2724 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2728#define dct_interleave8(a, b) \
2730 a = _mm_unpacklo_epi8(a, b); \
2731 b = _mm_unpackhi_epi8(tmp, b)
2734#define dct_interleave16(a, b) \
2736 a = _mm_unpacklo_epi16(a, b); \
2737 b = _mm_unpackhi_epi16(tmp, b)
2739#define dct_pass(bias, shift) \
2742 dct_rot(t2e, t3e, row2, row6, rot0_0, rot0_1); \
2743 __m128i sum04 = _mm_add_epi16(row0, row4); \
2744 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2745 dct_widen(t0e, sum04); \
2746 dct_widen(t1e, dif04); \
2747 dct_wadd(x0, t0e, t3e); \
2748 dct_wsub(x3, t0e, t3e); \
2749 dct_wadd(x1, t1e, t2e); \
2750 dct_wsub(x2, t1e, t2e); \
2752 dct_rot(y0o, y2o, row7, row3, rot2_0, rot2_1); \
2753 dct_rot(y1o, y3o, row5, row1, rot3_0, rot3_1); \
2754 __m128i sum17 = _mm_add_epi16(row1, row7); \
2755 __m128i sum35 = _mm_add_epi16(row3, row5); \
2756 dct_rot(y4o, y5o, sum17, sum35, rot1_0, rot1_1); \
2757 dct_wadd(x4, y0o, y4o); \
2758 dct_wadd(x5, y1o, y5o); \
2759 dct_wadd(x6, y2o, y5o); \
2760 dct_wadd(x7, y3o, y4o); \
2761 dct_bfly32o(row0, row7, x0, x7, bias, shift); \
2762 dct_bfly32o(row1, row6, x1, x6, bias, shift); \
2763 dct_bfly32o(row2, row5, x2, x5, bias, shift); \
2764 dct_bfly32o(row3, row4, x3, x4, bias, shift); \
2768 dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2770 dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f));
2772 dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2774 dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2776 dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f));
2778 dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f));
2780 dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f));
2782 dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f));
2785 __m128i bias_0 = _mm_set1_epi32(512);
2786 __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17));
2789 row0 = _mm_load_si128((
const __m128i *)(data + 0 * 8));
2790 row1 = _mm_load_si128((
const __m128i *)(data + 1 * 8));
2791 row2 = _mm_load_si128((
const __m128i *)(data + 2 * 8));
2792 row3 = _mm_load_si128((
const __m128i *)(data + 3 * 8));
2793 row4 = _mm_load_si128((
const __m128i *)(data + 4 * 8));
2794 row5 = _mm_load_si128((
const __m128i *)(data + 5 * 8));
2795 row6 = _mm_load_si128((
const __m128i *)(data + 6 * 8));
2796 row7 = _mm_load_si128((
const __m128i *)(data + 7 * 8));
2799 dct_pass(bias_0, 10);
2803 dct_interleave16(row0, row4);
2804 dct_interleave16(row1, row5);
2805 dct_interleave16(row2, row6);
2806 dct_interleave16(row3, row7);
2809 dct_interleave16(row0, row2);
2810 dct_interleave16(row1, row3);
2811 dct_interleave16(row4, row6);
2812 dct_interleave16(row5, row7);
2815 dct_interleave16(row0, row1);
2816 dct_interleave16(row2, row3);
2817 dct_interleave16(row4, row5);
2818 dct_interleave16(row6, row7);
2822 dct_pass(bias_1, 17);
2826 __m128i p0 = _mm_packus_epi16(row0, row1);
2827 __m128i p1 = _mm_packus_epi16(row2, row3);
2828 __m128i p2 = _mm_packus_epi16(row4, row5);
2829 __m128i p3 = _mm_packus_epi16(row6, row7);
2832 dct_interleave8(p0, p2);
2833 dct_interleave8(p1, p3);
2836 dct_interleave8(p0, p1);
2837 dct_interleave8(p2, p3);
2840 dct_interleave8(p0, p2);
2841 dct_interleave8(p1, p3);
2844 _mm_storel_epi64((__m128i *)out, p0);
2846 _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p0, 0x4e));
2848 _mm_storel_epi64((__m128i *)out, p2);
2850 _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p2, 0x4e));
2852 _mm_storel_epi64((__m128i *)out, p1);
2854 _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p1, 0x4e));
2856 _mm_storel_epi64((__m128i *)out, p3);
2858 _mm_storel_epi64((__m128i *)out, _mm_shuffle_epi32(p3, 0x4e));
2867#undef dct_interleave8
2868#undef dct_interleave16
2878static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64]) {
2879 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2881 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2882 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2883 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f));
2884 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f));
2885 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2886 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2887 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2888 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2889 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f));
2890 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f));
2891 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f));
2892 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f));
2894#define dct_long_mul(out, inq, coeff) \
2895 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2896 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2898#define dct_long_mac(out, acc, inq, coeff) \
2899 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2900 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2902#define dct_widen(out, inq) \
2903 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2904 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2907#define dct_wadd(out, a, b) \
2908 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2909 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2912#define dct_wsub(out, a, b) \
2913 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2914 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2917#define dct_bfly32o(out0, out1, a, b, shiftop, s) \
2919 dct_wadd(sum, a, b); \
2920 dct_wsub(dif, a, b); \
2921 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2922 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2925#define dct_pass(shiftop, shift) \
2928 int16x8_t sum26 = vaddq_s16(row2, row6); \
2929 dct_long_mul(p1e, sum26, rot0_0); \
2930 dct_long_mac(t2e, p1e, row6, rot0_1); \
2931 dct_long_mac(t3e, p1e, row2, rot0_2); \
2932 int16x8_t sum04 = vaddq_s16(row0, row4); \
2933 int16x8_t dif04 = vsubq_s16(row0, row4); \
2934 dct_widen(t0e, sum04); \
2935 dct_widen(t1e, dif04); \
2936 dct_wadd(x0, t0e, t3e); \
2937 dct_wsub(x3, t0e, t3e); \
2938 dct_wadd(x1, t1e, t2e); \
2939 dct_wsub(x2, t1e, t2e); \
2941 int16x8_t sum15 = vaddq_s16(row1, row5); \
2942 int16x8_t sum17 = vaddq_s16(row1, row7); \
2943 int16x8_t sum35 = vaddq_s16(row3, row5); \
2944 int16x8_t sum37 = vaddq_s16(row3, row7); \
2945 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2946 dct_long_mul(p5o, sumodd, rot1_0); \
2947 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2948 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2949 dct_long_mul(p3o, sum37, rot2_0); \
2950 dct_long_mul(p4o, sum15, rot2_1); \
2951 dct_wadd(sump13o, p1o, p3o); \
2952 dct_wadd(sump24o, p2o, p4o); \
2953 dct_wadd(sump23o, p2o, p3o); \
2954 dct_wadd(sump14o, p1o, p4o); \
2955 dct_long_mac(x4, sump13o, row7, rot3_0); \
2956 dct_long_mac(x5, sump24o, row5, rot3_1); \
2957 dct_long_mac(x6, sump23o, row3, rot3_2); \
2958 dct_long_mac(x7, sump14o, row1, rot3_3); \
2959 dct_bfly32o(row0, row7, x0, x7, shiftop, shift); \
2960 dct_bfly32o(row1, row6, x1, x6, shiftop, shift); \
2961 dct_bfly32o(row2, row5, x2, x5, shiftop, shift); \
2962 dct_bfly32o(row3, row4, x3, x4, shiftop, shift); \
2966 row0 = vld1q_s16(data + 0 * 8);
2967 row1 = vld1q_s16(data + 1 * 8);
2968 row2 = vld1q_s16(data + 2 * 8);
2969 row3 = vld1q_s16(data + 3 * 8);
2970 row4 = vld1q_s16(data + 4 * 8);
2971 row5 = vld1q_s16(data + 5 * 8);
2972 row6 = vld1q_s16(data + 6 * 8);
2973 row7 = vld1q_s16(data + 7 * 8);
2976 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2979 dct_pass(vrshrn_n_s32, 10);
2985#define dct_trn16(x, y) \
2987 int16x8x2_t t = vtrnq_s16(x, y); \
2991#define dct_trn32(x, y) \
2993 int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); \
2994 x = vreinterpretq_s16_s32(t.val[0]); \
2995 y = vreinterpretq_s16_s32(t.val[1]); \
2997#define dct_trn64(x, y) \
3001 x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); \
3002 y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); \
3006 dct_trn16(row0, row1);
3007 dct_trn16(row2, row3);
3008 dct_trn16(row4, row5);
3009 dct_trn16(row6, row7);
3012 dct_trn32(row0, row2);
3013 dct_trn32(row1, row3);
3014 dct_trn32(row4, row6);
3015 dct_trn32(row5, row7);
3018 dct_trn64(row0, row4);
3019 dct_trn64(row1, row5);
3020 dct_trn64(row2, row6);
3021 dct_trn64(row3, row7);
3032 dct_pass(vshrn_n_s32, 16);
3036 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
3037 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
3038 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
3039 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
3040 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
3041 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
3042 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
3043 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
3046#define dct_trn8_8(x, y) \
3048 uint8x8x2_t t = vtrn_u8(x, y); \
3052#define dct_trn8_16(x, y) \
3054 uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); \
3055 x = vreinterpret_u8_u16(t.val[0]); \
3056 y = vreinterpret_u8_u16(t.val[1]); \
3058#define dct_trn8_32(x, y) \
3060 uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); \
3061 x = vreinterpret_u8_u32(t.val[0]); \
3062 y = vreinterpret_u8_u32(t.val[1]); \
3075 dct_trn8_16(p0, p2);
3076 dct_trn8_16(p1, p3);
3077 dct_trn8_16(p4, p6);
3078 dct_trn8_16(p5, p7);
3081 dct_trn8_32(p0, p4);
3082 dct_trn8_32(p1, p5);
3083 dct_trn8_32(p2, p6);
3084 dct_trn8_32(p3, p7);
3119#define STBI__MARKER_none 0xff
3123static stbi_uc stbi__get_marker(stbi__jpeg *j) {
3125 if (j->marker != STBI__MARKER_none) {
3127 j->marker = STBI__MARKER_none;
3130 x = stbi__get8(j->s);
3132 return STBI__MARKER_none;
3133 while (x == 0xff) x = stbi__get8(j->s);
3139#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
3143static void stbi__jpeg_reset(stbi__jpeg *j) {
3147 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred =
3148 j->img_comp[3].dc_pred = 0;
3149 j->marker = STBI__MARKER_none;
3150 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
3156static int stbi__parse_entropy_coded_data(stbi__jpeg *z) {
3157 stbi__jpeg_reset(z);
3158 if (!z->progressive) {
3159 if (z->scan_n == 1) {
3161 STBI_SIMD_ALIGN(
short, data[64]);
3162 int n = z->order[0];
3167 int w = (z->img_comp[n].x + 7) >> 3;
3168 int h = (z->img_comp[n].y + 7) >> 3;
3169 for (j = 0; j < h; ++j) {
3170 for (i = 0; i < w; ++i) {
3171 int ha = z->img_comp[n].ha;
3172 if (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha,
3173 z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
3175 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8,
3176 z->img_comp[n].w2, data);
3178 if (--z->todo <= 0) {
3179 if (z->code_bits < 24)
3180 stbi__grow_buffer_unsafe(z);
3183 if (!STBI__RESTART(z->marker))
3185 stbi__jpeg_reset(z);
3192 STBI_SIMD_ALIGN(
short, data[64]);
3193 for (j = 0; j < z->img_mcu_y; ++j) {
3194 for (i = 0; i < z->img_mcu_x; ++i) {
3196 for (k = 0; k < z->scan_n; ++k) {
3197 int n = z->order[k];
3200 for (y = 0; y < z->img_comp[n].v; ++y) {
3201 for (x = 0; x < z->img_comp[n].h; ++x) {
3202 int x2 = (i * z->img_comp[n].h + x) * 8;
3203 int y2 = (j * z->img_comp[n].v + y) * 8;
3204 int ha = z->img_comp[n].ha;
3205 if (!stbi__jpeg_decode_block(z, data, z->huff_dc + z->img_comp[n].hd,
3206 z->huff_ac + ha, z->fast_ac[ha], n,
3207 z->dequant[z->img_comp[n].tq]))
3209 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * y2 + x2,
3210 z->img_comp[n].w2, data);
3216 if (--z->todo <= 0) {
3217 if (z->code_bits < 24)
3218 stbi__grow_buffer_unsafe(z);
3219 if (!STBI__RESTART(z->marker))
3221 stbi__jpeg_reset(z);
3228 if (z->scan_n == 1) {
3230 int n = z->order[0];
3235 int w = (z->img_comp[n].x + 7) >> 3;
3236 int h = (z->img_comp[n].y + 7) >> 3;
3237 for (j = 0; j < h; ++j) {
3238 for (i = 0; i < w; ++i) {
3239 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
3240 if (z->spec_start == 0) {
3241 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
3244 int ha = z->img_comp[n].ha;
3245 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
3249 if (--z->todo <= 0) {
3250 if (z->code_bits < 24)
3251 stbi__grow_buffer_unsafe(z);
3252 if (!STBI__RESTART(z->marker))
3254 stbi__jpeg_reset(z);
3261 for (j = 0; j < z->img_mcu_y; ++j) {
3262 for (i = 0; i < z->img_mcu_x; ++i) {
3264 for (k = 0; k < z->scan_n; ++k) {
3265 int n = z->order[k];
3268 for (y = 0; y < z->img_comp[n].v; ++y) {
3269 for (x = 0; x < z->img_comp[n].h; ++x) {
3270 int x2 = (i * z->img_comp[n].h + x);
3271 int y2 = (j * z->img_comp[n].v + y);
3272 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
3273 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
3280 if (--z->todo <= 0) {
3281 if (z->code_bits < 24)
3282 stbi__grow_buffer_unsafe(z);
3283 if (!STBI__RESTART(z->marker))
3285 stbi__jpeg_reset(z);
3294static void stbi__jpeg_dequantize(
short *data, stbi__uint16 *dequant) {
3296 for (i = 0; i < 64; ++i) data[i] *= dequant[i];
3299static void stbi__jpeg_finish(stbi__jpeg *z) {
3300 if (z->progressive) {
3303 for (n = 0; n < z->s->img_n; ++n) {
3304 int w = (z->img_comp[n].x + 7) >> 3;
3305 int h = (z->img_comp[n].y + 7) >> 3;
3306 for (j = 0; j < h; ++j) {
3307 for (i = 0; i < w; ++i) {
3308 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
3309 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
3310 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 + i * 8,
3311 z->img_comp[n].w2, data);
3318static int stbi__process_marker(stbi__jpeg *z,
int m) {
3321 case STBI__MARKER_none:
3322 return stbi__err(
"expected marker",
"Corrupt JPEG");
3325 if (stbi__get16be(z->s) != 4)
3326 return stbi__err(
"bad DRI len",
"Corrupt JPEG");
3327 z->restart_interval = stbi__get16be(z->s);
3331 L = stbi__get16be(z->s) - 2;
3333 int q = stbi__get8(z->s);
3334 int p = q >> 4, sixteen = (p != 0);
3336 if (p != 0 && p != 1)
3337 return stbi__err(
"bad DQT type",
"Corrupt JPEG");
3339 return stbi__err(
"bad DQT table",
"Corrupt JPEG");
3341 for (i = 0; i < 64; ++i)
3342 z->dequant[t][stbi__jpeg_dezigzag[i]] =
3343 (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
3344 L -= (sixteen ? 129 : 65);
3349 L = stbi__get16be(z->s) - 2;
3352 int sizes[16], i, n = 0;
3353 int q = stbi__get8(z->s);
3356 if (tc > 1 || th > 3)
3357 return stbi__err(
"bad DHT header",
"Corrupt JPEG");
3358 for (i = 0; i < 16; ++i) {
3359 sizes[i] = stbi__get8(z->s);
3363 return stbi__err(
"bad DHT header",
3367 if (!stbi__build_huffman(z->huff_dc + th, sizes))
3369 v = z->huff_dc[th].values;
3371 if (!stbi__build_huffman(z->huff_ac + th, sizes))
3373 v = z->huff_ac[th].values;
3375 for (i = 0; i < n; ++i) v[i] = stbi__get8(z->s);
3377 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
3384 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
3385 L = stbi__get16be(z->s);
3388 return stbi__err(
"bad COM len",
"Corrupt JPEG");
3390 return stbi__err(
"bad APP len",
"Corrupt JPEG");
3394 if (m == 0xE0 && L >= 5) {
3395 static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0'};
3398 for (i = 0; i < 5; ++i)
3399 if (stbi__get8(z->s) != tag[i])
3404 }
else if (m == 0xEE && L >= 12) {
3405 static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0'};
3408 for (i = 0; i < 6; ++i)
3409 if (stbi__get8(z->s) != tag[i])
3414 stbi__get16be(z->s);
3415 stbi__get16be(z->s);
3416 z->app14_color_transform = stbi__get8(z->s);
3421 stbi__skip(z->s, L);
3425 return stbi__err(
"unknown marker",
"Corrupt JPEG");
3429static int stbi__process_scan_header(stbi__jpeg *z) {
3431 int Ls = stbi__get16be(z->s);
3432 z->scan_n = stbi__get8(z->s);
3433 if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (
int)z->s->img_n)
3434 return stbi__err(
"bad SOS component count",
"Corrupt JPEG");
3435 if (Ls != 6 + 2 * z->scan_n)
3436 return stbi__err(
"bad SOS len",
"Corrupt JPEG");
3437 for (i = 0; i < z->scan_n; ++i) {
3438 int id = stbi__get8(z->s), which;
3439 int q = stbi__get8(z->s);
3440 for (which = 0; which < z->s->img_n; ++which)
3441 if (z->img_comp[which].id ==
id)
3443 if (which == z->s->img_n)
3445 z->img_comp[which].hd = q >> 4;
3446 if (z->img_comp[which].hd > 3)
3447 return stbi__err(
"bad DC huff",
"Corrupt JPEG");
3448 z->img_comp[which].ha = q & 15;
3449 if (z->img_comp[which].ha > 3)
3450 return stbi__err(
"bad AC huff",
"Corrupt JPEG");
3451 z->order[i] = which;
3456 z->spec_start = stbi__get8(z->s);
3457 z->spec_end = stbi__get8(z->s);
3458 aa = stbi__get8(z->s);
3459 z->succ_high = (aa >> 4);
3460 z->succ_low = (aa & 15);
3461 if (z->progressive) {
3462 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end ||
3463 z->succ_high > 13 || z->succ_low > 13)
3464 return stbi__err(
"bad SOS",
"Corrupt JPEG");
3466 if (z->spec_start != 0)
3467 return stbi__err(
"bad SOS",
"Corrupt JPEG");
3468 if (z->succ_high != 0 || z->succ_low != 0)
3469 return stbi__err(
"bad SOS",
"Corrupt JPEG");
3477static int stbi__free_jpeg_components(stbi__jpeg *z,
int ncomp,
int why) {
3479 for (i = 0; i < ncomp; ++i) {
3480 if (z->img_comp[i].raw_data) {
3481 STBI_FREE(z->img_comp[i].raw_data);
3482 z->img_comp[i].raw_data = NULL;
3483 z->img_comp[i].data = NULL;
3485 if (z->img_comp[i].raw_coeff) {
3486 STBI_FREE(z->img_comp[i].raw_coeff);
3487 z->img_comp[i].raw_coeff = 0;
3488 z->img_comp[i].coeff = 0;
3490 if (z->img_comp[i].linebuf) {
3491 STBI_FREE(z->img_comp[i].linebuf);
3492 z->img_comp[i].linebuf = NULL;
3498static int stbi__process_frame_header(stbi__jpeg *z,
int scan) {
3499 stbi__context *s = z->s;
3500 int Lf, p, i, q, h_max = 1, v_max = 1, c;
3501 Lf = stbi__get16be(s);
3503 return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3506 return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
3507 s->img_y = stbi__get16be(s);
3509 return stbi__err(
"no header height",
3510 "JPEG format not supported: delayed height");
3512 s->img_x = stbi__get16be(s);
3514 return stbi__err(
"0 width",
"Corrupt JPEG");
3515 if (s->img_y > STBI_MAX_DIMENSIONS)
3516 return stbi__err(
"too large",
"Very large image (corrupt?)");
3517 if (s->img_x > STBI_MAX_DIMENSIONS)
3518 return stbi__err(
"too large",
"Very large image (corrupt?)");
3520 if (c != 3 && c != 1 && c != 4)
3521 return stbi__err(
"bad component count",
"Corrupt JPEG");
3523 for (i = 0; i < c; ++i) {
3524 z->img_comp[i].data = NULL;
3525 z->img_comp[i].linebuf = NULL;
3528 if (Lf != 8 + 3 * s->img_n)
3529 return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3532 for (i = 0; i < s->img_n; ++i) {
3533 static const unsigned char rgb[3] = {
'R',
'G',
'B'};
3534 z->img_comp[i].id = stbi__get8(s);
3535 if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3538 z->img_comp[i].h = (q >> 4);
3539 if (!z->img_comp[i].h || z->img_comp[i].h > 4)
3540 return stbi__err(
"bad H",
"Corrupt JPEG");
3541 z->img_comp[i].v = q & 15;
3542 if (!z->img_comp[i].v || z->img_comp[i].v > 4)
3543 return stbi__err(
"bad V",
"Corrupt JPEG");
3544 z->img_comp[i].tq = stbi__get8(s);
3545 if (z->img_comp[i].tq > 3)
3546 return stbi__err(
"bad TQ",
"Corrupt JPEG");
3549 if (scan != STBI__SCAN_load)
3552 if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0))
3553 return stbi__err(
"too large",
"Image too large to decode");
3555 for (i = 0; i < s->img_n; ++i) {
3556 if (z->img_comp[i].h > h_max)
3557 h_max = z->img_comp[i].h;
3558 if (z->img_comp[i].v > v_max)
3559 v_max = z->img_comp[i].v;
3564 for (i = 0; i < s->img_n; ++i) {
3565 if (h_max % z->img_comp[i].h != 0)
3566 return stbi__err(
"bad H",
"Corrupt JPEG");
3567 if (v_max % z->img_comp[i].v != 0)
3568 return stbi__err(
"bad V",
"Corrupt JPEG");
3572 z->img_h_max = h_max;
3573 z->img_v_max = v_max;
3574 z->img_mcu_w = h_max * 8;
3575 z->img_mcu_h = v_max * 8;
3577 z->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w;
3578 z->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h;
3580 for (i = 0; i < s->img_n; ++i) {
3582 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max;
3583 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max;
3591 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3592 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3593 z->img_comp[i].coeff = 0;
3594 z->img_comp[i].raw_coeff = 0;
3595 z->img_comp[i].linebuf = NULL;
3596 z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3597 if (z->img_comp[i].raw_data == NULL)
3598 return stbi__free_jpeg_components(z, i + 1, stbi__err(
"outofmem",
"Out of memory"));
3600 z->img_comp[i].data = (
stbi_uc *)(((
size_t)z->img_comp[i].raw_data + 15) & ~15);
3601 if (z->progressive) {
3603 z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3604 z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3605 z->img_comp[i].raw_coeff =
3606 stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2,
sizeof(
short), 15);
3607 if (z->img_comp[i].raw_coeff == NULL)
3608 return stbi__free_jpeg_components(z, i + 1, stbi__err(
"outofmem",
"Out of memory"));
3609 z->img_comp[i].coeff = (
short *)(((
size_t)z->img_comp[i].raw_coeff + 15) & ~15);
3617#define stbi__DNL(x) ((x) == 0xdc)
3618#define stbi__SOI(x) ((x) == 0xd8)
3619#define stbi__EOI(x) ((x) == 0xd9)
3620#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3621#define stbi__SOS(x) ((x) == 0xda)
3623#define stbi__SOF_progressive(x) ((x) == 0xc2)
3625static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan) {
3628 z->app14_color_transform = -1;
3629 z->marker = STBI__MARKER_none;
3630 m = stbi__get_marker(z);
3632 return stbi__err(
"no SOI",
"Corrupt JPEG");
3633 if (scan == STBI__SCAN_type)
3635 m = stbi__get_marker(z);
3636 while (!stbi__SOF(m)) {
3637 if (!stbi__process_marker(z, m))
3639 m = stbi__get_marker(z);
3640 while (m == STBI__MARKER_none) {
3642 if (stbi__at_eof(z->s))
3643 return stbi__err(
"no SOF",
"Corrupt JPEG");
3644 m = stbi__get_marker(z);
3647 z->progressive = stbi__SOF_progressive(m);
3648 if (!stbi__process_frame_header(z, scan))
3653static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) {
3656 while (!stbi__at_eof(j->s)) {
3659 if (stbi__at_eof(j->s))
3660 return STBI__MARKER_none;
3661 x = stbi__get8(j->s);
3662 if (x != 0x00 && x != 0xff) {
3672 return STBI__MARKER_none;
3676static int stbi__decode_jpeg_image(stbi__jpeg *j) {
3678 for (m = 0; m < 4; m++) {
3679 j->img_comp[m].raw_data = NULL;
3680 j->img_comp[m].raw_coeff = NULL;
3682 j->restart_interval = 0;
3683 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
3685 m = stbi__get_marker(j);
3686 while (!stbi__EOI(m)) {
3688 if (!stbi__process_scan_header(j))
3690 if (!stbi__parse_entropy_coded_data(j))
3692 if (j->marker == STBI__MARKER_none) {
3693 j->marker = stbi__skip_jpeg_junk_at_end(j);
3697 m = stbi__get_marker(j);
3698 if (STBI__RESTART(m))
3699 m = stbi__get_marker(j);
3700 }
else if (stbi__DNL(m)) {
3701 int Ld = stbi__get16be(j->s);
3702 stbi__uint32 NL = stbi__get16be(j->s);
3704 return stbi__err(
"bad DNL len",
"Corrupt JPEG");
3705 if (NL != j->s->img_y)
3706 return stbi__err(
"bad DNL height",
"Corrupt JPEG");
3707 m = stbi__get_marker(j);
3709 if (!stbi__process_marker(j, m))
3711 m = stbi__get_marker(j);
3715 stbi__jpeg_finish(j);
3723#define stbi__div4(x) ((stbi_uc)((x) >> 2))
3727 STBI_NOTUSED(in_far);
3738 for (i = 0; i < w; ++i) out[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2);
3750 out[0] = out[1] = input[0];
3755 out[1] = stbi__div4(input[0] * 3 + input[1] + 2);
3756 for (i = 1; i < w - 1; ++i) {
3757 int n = 3 * input[i] + 2;
3758 out[i * 2 + 0] = stbi__div4(n + input[i - 1]);
3759 out[i * 2 + 1] = stbi__div4(n + input[i + 1]);
3761 out[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2);
3762 out[i * 2 + 1] = input[w - 1];
3764 STBI_NOTUSED(in_far);
3770#define stbi__div16(x) ((stbi_uc)((x) >> 4))
3777 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3781 t1 = 3 * in_near[0] + in_far[0];
3782 out[0] = stbi__div4(t1 + 2);
3783 for (i = 1; i < w; ++i) {
3785 t1 = 3 * in_near[i] + in_far[i];
3786 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3787 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3789 out[w * 2 - 1] = stbi__div4(t1 + 2);
3796#if defined(STBI_SSE2) || defined(STBI_NEON)
3803 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3807 t1 = 3 * in_near[0] + in_far[0];
3811 for (; i < ((w - 1) & ~7); i += 8) {
3812#if defined(STBI_SSE2)
3815 __m128i zero = _mm_setzero_si128();
3816 __m128i farb = _mm_loadl_epi64((__m128i *)(in_far + i));
3817 __m128i nearb = _mm_loadl_epi64((__m128i *)(in_near + i));
3818 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3819 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3820 __m128i diff = _mm_sub_epi16(farw, nearw);
3821 __m128i nears = _mm_slli_epi16(nearw, 2);
3822 __m128i curr = _mm_add_epi16(nears, diff);
3829 __m128i prv0 = _mm_slli_si128(curr, 2);
3830 __m128i nxt0 = _mm_srli_si128(curr, 2);
3831 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3832 __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7);
3838 __m128i bias = _mm_set1_epi16(8);
3839 __m128i curs = _mm_slli_epi16(curr, 2);
3840 __m128i prvd = _mm_sub_epi16(prev, curr);
3841 __m128i nxtd = _mm_sub_epi16(next, curr);
3842 __m128i curb = _mm_add_epi16(curs, bias);
3843 __m128i even = _mm_add_epi16(prvd, curb);
3844 __m128i odd = _mm_add_epi16(nxtd, curb);
3847 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3848 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3849 __m128i de0 = _mm_srli_epi16(int0, 4);
3850 __m128i de1 = _mm_srli_epi16(int1, 4);
3853 __m128i outv = _mm_packus_epi16(de0, de1);
3854 _mm_storeu_si128((__m128i *)(out + i * 2), outv);
3855#elif defined(STBI_NEON)
3858 uint8x8_t farb = vld1_u8(in_far + i);
3859 uint8x8_t nearb = vld1_u8(in_near + i);
3860 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3861 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3862 int16x8_t curr = vaddq_s16(nears, diff);
3869 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3870 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3871 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3872 int16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7);
3878 int16x8_t curs = vshlq_n_s16(curr, 2);
3879 int16x8_t prvd = vsubq_s16(prev, curr);
3880 int16x8_t nxtd = vsubq_s16(next, curr);
3881 int16x8_t even = vaddq_s16(curs, prvd);
3882 int16x8_t odd = vaddq_s16(curs, nxtd);
3886 o.val[0] = vqrshrun_n_s16(even, 4);
3887 o.val[1] = vqrshrun_n_s16(odd, 4);
3888 vst2_u8(out + i * 2, o);
3892 t1 = 3 * in_near[i + 7] + in_far[i + 7];
3896 t1 = 3 * in_near[i] + in_far[i];
3897 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3899 for (++i; i < w; ++i) {
3901 t1 = 3 * in_near[i] + in_far[i];
3902 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3903 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
3905 out[w * 2 - 1] = stbi__div4(t1 + 2);
3917 STBI_NOTUSED(in_far);
3918 for (i = 0; i < w; ++i)
3919 for (j = 0; j < hs; ++j) out[i * hs + j] = in_near[i];
3925#define stbi__float2fixed(x) (((int)((x) * 4096.0f + 0.5f)) << 8)
3927 const stbi_uc *pcr,
int count,
int step) {
3929 for (i = 0; i < count; ++i) {
3930 int y_fixed = (y[i] << 20) + (1 << 19);
3932 int cr = pcr[i] - 128;
3933 int cb = pcb[i] - 128;
3934 r = y_fixed + cr * stbi__float2fixed(1.40200f);
3935 g = y_fixed + (cr * -stbi__float2fixed(0.71414f)) +
3936 ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000);
3937 b = y_fixed + cb * stbi__float2fixed(1.77200f);
3941 if ((
unsigned)r > 255) {
3947 if ((
unsigned)g > 255) {
3953 if ((
unsigned)b > 255) {
3967#if defined(STBI_SSE2) || defined(STBI_NEON)
3969 stbi_uc const *pcr,
int count,
int step) {
3978 __m128i signflip = _mm_set1_epi8(-0x80);
3979 __m128i cr_const0 = _mm_set1_epi16((
short)(1.40200f * 4096.0f + 0.5f));
3980 __m128i cr_const1 = _mm_set1_epi16(-(
short)(0.71414f * 4096.0f + 0.5f));
3981 __m128i cb_const0 = _mm_set1_epi16(-(
short)(0.34414f * 4096.0f + 0.5f));
3982 __m128i cb_const1 = _mm_set1_epi16((
short)(1.77200f * 4096.0f + 0.5f));
3983 __m128i y_bias = _mm_set1_epi8((
char)(
unsigned char)128);
3984 __m128i xw = _mm_set1_epi16(255);
3986 for (; i + 7 < count; i += 8) {
3988 __m128i y_bytes = _mm_loadl_epi64((__m128i *)(y + i));
3989 __m128i cr_bytes = _mm_loadl_epi64((__m128i *)(pcr + i));
3990 __m128i cb_bytes = _mm_loadl_epi64((__m128i *)(pcb + i));
3991 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3992 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3995 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3996 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3997 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
4000 __m128i yws = _mm_srli_epi16(yw, 4);
4001 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
4002 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
4003 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
4004 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
4005 __m128i rws = _mm_add_epi16(cr0, yws);
4006 __m128i gwt = _mm_add_epi16(cb0, yws);
4007 __m128i bws = _mm_add_epi16(yws, cb1);
4008 __m128i gws = _mm_add_epi16(gwt, cr1);
4011 __m128i rw = _mm_srai_epi16(rws, 4);
4012 __m128i bw = _mm_srai_epi16(bws, 4);
4013 __m128i gw = _mm_srai_epi16(gws, 4);
4016 __m128i brb = _mm_packus_epi16(rw, bw);
4017 __m128i gxb = _mm_packus_epi16(gw, xw);
4020 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
4021 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
4022 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
4023 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
4026 _mm_storeu_si128((__m128i *)(out + 0), o0);
4027 _mm_storeu_si128((__m128i *)(out + 16), o1);
4037 uint8x8_t signflip = vdup_n_u8(0x80);
4038 int16x8_t cr_const0 = vdupq_n_s16((
short)(1.40200f * 4096.0f + 0.5f));
4039 int16x8_t cr_const1 = vdupq_n_s16(-(
short)(0.71414f * 4096.0f + 0.5f));
4040 int16x8_t cb_const0 = vdupq_n_s16(-(
short)(0.34414f * 4096.0f + 0.5f));
4041 int16x8_t cb_const1 = vdupq_n_s16((
short)(1.77200f * 4096.0f + 0.5f));
4043 for (; i + 7 < count; i += 8) {
4045 uint8x8_t y_bytes = vld1_u8(y + i);
4046 uint8x8_t cr_bytes = vld1_u8(pcr + i);
4047 uint8x8_t cb_bytes = vld1_u8(pcb + i);
4048 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
4049 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
4052 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
4053 int16x8_t crw = vshll_n_s8(cr_biased, 7);
4054 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
4057 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
4058 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
4059 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
4060 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
4061 int16x8_t rws = vaddq_s16(yws, cr0);
4062 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
4063 int16x8_t bws = vaddq_s16(yws, cb1);
4067 o.val[0] = vqrshrun_n_s16(rws, 4);
4068 o.val[1] = vqrshrun_n_s16(gws, 4);
4069 o.val[2] = vqrshrun_n_s16(bws, 4);
4070 o.val[3] = vdup_n_u8(255);
4079 for (; i < count; ++i) {
4080 int y_fixed = (y[i] << 20) + (1 << 19);
4082 int cr = pcr[i] - 128;
4083 int cb = pcb[i] - 128;
4084 r = y_fixed + cr * stbi__float2fixed(1.40200f);
4085 g = y_fixed + cr * -stbi__float2fixed(0.71414f) +
4086 ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000);
4087 b = y_fixed + cb * stbi__float2fixed(1.77200f);
4091 if ((
unsigned)r > 255) {
4097 if ((
unsigned)g > 255) {
4103 if ((
unsigned)b > 255) {
4119static void stbi__setup_jpeg(stbi__jpeg *j) {
4120 j->idct_block_kernel = stbi__idct_block;
4121 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
4122 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
4125 if (stbi__sse2_available()) {
4126 j->idct_block_kernel = stbi__idct_simd;
4127 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
4128 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
4133 j->idct_block_kernel = stbi__idct_simd;
4134 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
4135 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
4140static void stbi__cleanup_jpeg(stbi__jpeg *j) {
4141 stbi__free_jpeg_components(j, j->s->img_n, 0);
4145 resample_row_func resample;
4155 unsigned int t = x * y + 128;
4156 return (
stbi_uc)((t + (t >> 8)) >> 8);
4159static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp) {
4160 int n, decode_n, is_rgb;
4164 if (req_comp < 0 || req_comp > 4)
4165 return stbi__errpuc(
"bad req_comp",
"Internal error");
4168 if (!stbi__decode_jpeg_image(z)) {
4169 stbi__cleanup_jpeg(z);
4174 n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
4176 is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
4178 if (z->s->img_n == 3 && n < 3 && !is_rgb)
4181 decode_n = z->s->img_n;
4185 if (decode_n <= 0) {
4186 stbi__cleanup_jpeg(z);
4195 stbi_uc *coutput[4] = {NULL, NULL, NULL, NULL};
4197 stbi__resample res_comp[4];
4199 for (k = 0; k < decode_n; ++k) {
4200 stbi__resample *r = &res_comp[k];
4204 z->img_comp[k].linebuf = (
stbi_uc *)stbi__malloc(z->s->img_x + 3);
4205 if (!z->img_comp[k].linebuf) {
4206 stbi__cleanup_jpeg(z);
4207 return stbi__errpuc(
"outofmem",
"Out of memory");
4210 r->hs = z->img_h_max / z->img_comp[k].h;
4211 r->vs = z->img_v_max / z->img_comp[k].v;
4212 r->ystep = r->vs >> 1;
4213 r->w_lores = (z->s->img_x + r->hs - 1) / r->hs;
4215 r->line0 = r->line1 = z->img_comp[k].data;
4217 if (r->hs == 1 && r->vs == 1)
4218 r->resample = resample_row_1;
4219 else if (r->hs == 1 && r->vs == 2)
4220 r->resample = stbi__resample_row_v_2;
4221 else if (r->hs == 2 && r->vs == 1)
4222 r->resample = stbi__resample_row_h_2;
4223 else if (r->hs == 2 && r->vs == 2)
4224 r->resample = z->resample_row_hv_2_kernel;
4226 r->resample = stbi__resample_row_generic;
4230 output = (
stbi_uc *)stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
4232 stbi__cleanup_jpeg(z);
4233 return stbi__errpuc(
"outofmem",
"Out of memory");
4237 for (j = 0; j < z->s->img_y; ++j) {
4238 stbi_uc *out = output + n * z->s->img_x * j;
4239 for (k = 0; k < decode_n; ++k) {
4240 stbi__resample *r = &res_comp[k];
4241 int y_bot = r->ystep >= (r->vs >> 1);
4242 coutput[k] = r->resample(z->img_comp[k].linebuf, y_bot ? r->line1 : r->line0,
4243 y_bot ? r->line0 : r->line1, r->w_lores, r->hs);
4244 if (++r->ystep >= r->vs) {
4246 r->line0 = r->line1;
4247 if (++r->ypos < z->img_comp[k].y)
4248 r->line1 += z->img_comp[k].w2;
4253 if (z->s->img_n == 3) {
4255 for (i = 0; i < z->s->img_x; ++i) {
4257 out[1] = coutput[1][i];
4258 out[2] = coutput[2][i];
4263 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
4265 }
else if (z->s->img_n == 4) {
4266 if (z->app14_color_transform == 0) {
4267 for (i = 0; i < z->s->img_x; ++i) {
4269 out[0] = stbi__blinn_8x8(coutput[0][i], m);
4270 out[1] = stbi__blinn_8x8(coutput[1][i], m);
4271 out[2] = stbi__blinn_8x8(coutput[2][i], m);
4275 }
else if (z->app14_color_transform == 2) {
4276 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
4277 for (i = 0; i < z->s->img_x; ++i) {
4279 out[0] = stbi__blinn_8x8(255 - out[0], m);
4280 out[1] = stbi__blinn_8x8(255 - out[1], m);
4281 out[2] = stbi__blinn_8x8(255 - out[2], m);
4285 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
4288 for (i = 0; i < z->s->img_x; ++i) {
4289 out[0] = out[1] = out[2] = y[i];
4296 for (i = 0; i < z->s->img_x; ++i)
4297 *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
4299 for (i = 0; i < z->s->img_x; ++i, out += 2) {
4300 out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
4304 }
else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
4305 for (i = 0; i < z->s->img_x; ++i) {
4307 stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
4308 stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
4309 stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
4310 out[0] = stbi__compute_y(r, g, b);
4314 }
else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
4315 for (i = 0; i < z->s->img_x; ++i) {
4316 out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
4323 for (i = 0; i < z->s->img_x; ++i) out[i] = y[i];
4325 for (i = 0; i < z->s->img_x; ++i) {
4332 stbi__cleanup_jpeg(z);
4333 *out_x = z->s->img_x;
4334 *out_y = z->s->img_y;
4336 *comp = z->s->img_n >= 3 ? 3 : 1;
4341static void *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
4342 stbi__result_info *ri) {
4343 unsigned char *result;
4344 stbi__jpeg *j = (stbi__jpeg *)stbi__malloc(
sizeof(stbi__jpeg));
4346 return stbi__errpuc(
"outofmem",
"Out of memory");
4347 memset(j, 0,
sizeof(stbi__jpeg));
4350 stbi__setup_jpeg(j);
4351 result = load_jpeg_image(j, x, y, comp, req_comp);
4356static int stbi__jpeg_test(stbi__context *s) {
4358 stbi__jpeg *j = (stbi__jpeg *)stbi__malloc(
sizeof(stbi__jpeg));
4360 return stbi__err(
"outofmem",
"Out of memory");
4361 memset(j, 0,
sizeof(stbi__jpeg));
4363 stbi__setup_jpeg(j);
4364 r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
4370static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp) {
4371 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
4380 *comp = j->s->img_n >= 3 ? 3 : 1;
4384static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp) {
4386 stbi__jpeg *j = (stbi__jpeg *)(stbi__malloc(
sizeof(stbi__jpeg)));
4388 return stbi__err(
"outofmem",
"Out of memory");
4389 memset(j, 0,
sizeof(stbi__jpeg));
4391 result = stbi__jpeg_info_raw(j, x, y, comp);
4407#define STBI__ZFAST_BITS 9
4408#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
4409#define STBI__ZNSYMS 288
4414 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
4415 stbi__uint16 firstcode[16];
4417 stbi__uint16 firstsymbol[16];
4419 stbi__uint16 value[STBI__ZNSYMS];
4422stbi_inline
static int stbi__bitreverse16(
int n) {
4423 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
4424 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
4425 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
4426 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
4430stbi_inline
static int stbi__bit_reverse(
int v,
int bits) {
4431 STBI_ASSERT(bits <= 16);
4434 return stbi__bitreverse16(v) >> (16 - bits);
4437static int stbi__zbuild_huffman(stbi__zhuffman *z,
const stbi_uc *sizelist,
int num) {
4439 int code, next_code[16], sizes[17];
4442 memset(sizes, 0,
sizeof(sizes));
4443 memset(z->fast, 0,
sizeof(z->fast));
4444 for (i = 0; i < num; ++i) ++sizes[sizelist[i]];
4446 for (i = 1; i < 16; ++i)
4447 if (sizes[i] > (1 << i))
4448 return stbi__err(
"bad sizes",
"Corrupt PNG");
4450 for (i = 1; i < 16; ++i) {
4451 next_code[i] = code;
4452 z->firstcode[i] = (stbi__uint16)code;
4453 z->firstsymbol[i] = (stbi__uint16)k;
4454 code = (code + sizes[i]);
4456 if (code - 1 >= (1 << i))
4457 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4458 z->maxcode[i] = code << (16 - i);
4462 z->maxcode[16] = 0x10000;
4463 for (i = 0; i < num; ++i) {
4464 int s = sizelist[i];
4466 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
4467 stbi__uint16 fastv = (stbi__uint16)((s << 9) | i);
4469 z->value[c] = (stbi__uint16)i;
4470 if (s <= STBI__ZFAST_BITS) {
4471 int j = stbi__bit_reverse(next_code[s], s);
4472 while (j < (1 << STBI__ZFAST_BITS)) {
4490 stbi_uc *zbuffer, *zbuffer_end;
4493 stbi__uint32 code_buffer;
4500 stbi__zhuffman z_length, z_distance;
4503stbi_inline
static int stbi__zeof(stbi__zbuf *z) {
4504 return (z->zbuffer >= z->zbuffer_end);
4507stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z) {
4508 return stbi__zeof(z) ? 0 : *z->zbuffer++;
4511static void stbi__fill_bits(stbi__zbuf *z) {
4513 if (z->code_buffer >= (1U << z->num_bits)) {
4514 z->zbuffer = z->zbuffer_end;
4517 z->code_buffer |= (
unsigned int)stbi__zget8(z) << z->num_bits;
4519 }
while (z->num_bits <= 24);
4522stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n) {
4524 if (z->num_bits < n)
4526 k = z->code_buffer & ((1 << n) - 1);
4527 z->code_buffer >>= n;
4532static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) {
4536 k = stbi__bit_reverse(a->code_buffer, 16);
4537 for (s = STBI__ZFAST_BITS + 1;; ++s)
4538 if (k < z->maxcode[s])
4543 b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s];
4544 if (b >= STBI__ZNSYMS)
4546 if (z->size[b] != s)
4548 a->code_buffer >>= s;
4553stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) {
4555 if (a->num_bits < 16) {
4556 if (stbi__zeof(a)) {
4557 if (!a->hit_zeof_once) {
4561 a->hit_zeof_once = 1;
4572 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
4575 a->code_buffer >>= s;
4579 return stbi__zhuffman_decode_slowpath(a, z);
4582static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
4585 unsigned int cur, limit, old_limit;
4587 if (!z->z_expandable)
4588 return stbi__err(
"output buffer limit",
"Corrupt PNG");
4589 cur = (
unsigned int)(z->zout - z->zout_start);
4590 limit = old_limit = (unsigned)(z->zout_end - z->zout_start);
4591 if (UINT_MAX - cur < (
unsigned)n)
4592 return stbi__err(
"outofmem",
"Out of memory");
4593 while (cur + n > limit) {
4594 if (limit > UINT_MAX / 2)
4595 return stbi__err(
"outofmem",
"Out of memory");
4598 q = (
char *)STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
4599 STBI_NOTUSED(old_limit);
4601 return stbi__err(
"outofmem",
"Out of memory");
4604 z->zout_end = q + limit;
4608static const int stbi__zlength_base[31] = {3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15,
4609 17, 19, 23, 27, 31, 35, 43, 51, 59, 67, 83,
4610 99, 115, 131, 163, 195, 227, 258, 0, 0};
4612static const int stbi__zlength_extra[31] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2,
4613 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 0, 0, 0};
4615static const int stbi__zdist_base[32] = {
4616 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
4617 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0};
4619static const int stbi__zdist_extra[32] = {0, 0, 0, 0, 1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6,
4620 6, 7, 7, 8, 8, 9, 9, 10, 10, 11, 11, 12, 12, 13, 13};
4622static int stbi__parse_huffman_block(stbi__zbuf *a) {
4623 char *zout = a->zout;
4625 int z = stbi__zhuffman_decode(a, &a->z_length);
4628 return stbi__err(
"bad huffman code",
"Corrupt PNG");
4629 if (zout >= a->zout_end) {
4630 if (!stbi__zexpand(a, zout, 1))
4640 if (a->hit_zeof_once && a->num_bits < 16) {
4645 return stbi__err(
"unexpected end",
"Corrupt PNG");
4650 return stbi__err(
"bad huffman code",
4654 len = stbi__zlength_base[z];
4655 if (stbi__zlength_extra[z])
4656 len += stbi__zreceive(a, stbi__zlength_extra[z]);
4657 z = stbi__zhuffman_decode(a, &a->z_distance);
4658 if (z < 0 || z >= 30)
4659 return stbi__err(
"bad huffman code",
4662 dist = stbi__zdist_base[z];
4663 if (stbi__zdist_extra[z])
4664 dist += stbi__zreceive(a, stbi__zdist_extra[z]);
4665 if (zout - a->zout_start < dist)
4666 return stbi__err(
"bad dist",
"Corrupt PNG");
4667 if (len > a->zout_end - zout) {
4668 if (!stbi__zexpand(a, zout, len))
4689static int stbi__compute_huffman_codes(stbi__zbuf *a) {
4690 static const stbi_uc length_dezigzag[19] = {16, 17, 18, 0, 8, 7, 9, 6, 10, 5,
4691 11, 4, 12, 3, 13, 2, 14, 1, 15};
4692 stbi__zhuffman z_codelength;
4693 stbi_uc lencodes[286 + 32 + 137];
4697 int hlit = stbi__zreceive(a, 5) + 257;
4698 int hdist = stbi__zreceive(a, 5) + 1;
4699 int hclen = stbi__zreceive(a, 4) + 4;
4700 int ntot = hlit + hdist;
4702 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4703 for (i = 0; i < hclen; ++i) {
4704 int s = stbi__zreceive(a, 3);
4705 codelength_sizes[length_dezigzag[i]] = (
stbi_uc)s;
4707 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
4712 int c = stbi__zhuffman_decode(a, &z_codelength);
4713 if (c < 0 || c >= 19)
4714 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4720 c = stbi__zreceive(a, 2) + 3;
4722 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4723 fill = lencodes[n - 1];
4724 }
else if (c == 17) {
4725 c = stbi__zreceive(a, 3) + 3;
4726 }
else if (c == 18) {
4727 c = stbi__zreceive(a, 7) + 11;
4729 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4732 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4733 memset(lencodes + n, fill, c);
4738 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4739 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
4741 if (!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist))
4746static int stbi__parse_uncompressed_block(stbi__zbuf *a) {
4749 if (a->num_bits & 7)
4750 stbi__zreceive(a, a->num_bits & 7);
4753 while (a->num_bits > 0) {
4754 header[k++] = (
stbi_uc)(a->code_buffer & 255);
4755 a->code_buffer >>= 8;
4758 if (a->num_bits < 0)
4759 return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4761 while (k < 4) header[k++] = stbi__zget8(a);
4762 len = header[1] * 256 + header[0];
4763 nlen = header[3] * 256 + header[2];
4764 if (nlen != (len ^ 0xffff))
4765 return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4766 if (a->zbuffer + len > a->zbuffer_end)
4767 return stbi__err(
"read past buffer",
"Corrupt PNG");
4768 if (a->zout + len > a->zout_end)
4769 if (!stbi__zexpand(a, a->zout, len))
4771 memcpy(a->zout, a->zbuffer, len);
4777static int stbi__parse_zlib_header(stbi__zbuf *a) {
4778 int cmf = stbi__zget8(a);
4781 int flg = stbi__zget8(a);
4783 return stbi__err(
"bad zlib header",
"Corrupt PNG");
4784 if ((cmf * 256 + flg) % 31 != 0)
4785 return stbi__err(
"bad zlib header",
"Corrupt PNG");
4787 return stbi__err(
"no preset dict",
"Corrupt PNG");
4789 return stbi__err(
"bad compression",
"Corrupt PNG");
4794static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = {
4795 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
4796 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
4797 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
4798 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8,
4799 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
4800 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
4801 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
4802 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9,
4803 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 8, 8};
4804static const stbi_uc stbi__zdefault_distance[32] = {5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
4805 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5};
4819static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header) {
4822 if (!stbi__parse_zlib_header(a))
4826 a->hit_zeof_once = 0;
4828 final = stbi__zreceive(a, 1);
4829 type = stbi__zreceive(a, 2);
4831 if (!stbi__parse_uncompressed_block(a))
4833 }
else if (type == 3) {
4838 if (!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, STBI__ZNSYMS))
4840 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
4843 if (!stbi__compute_huffman_codes(a))
4846 if (!stbi__parse_huffman_block(a))
4853static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header) {
4854 a->zout_start = obuf;
4856 a->zout_end = obuf + olen;
4857 a->z_expandable = exp;
4859 return stbi__parse_zlib(a, parse_header);
4865 char *p = (
char *)stbi__malloc(initial_size);
4868 a.zbuffer = (
stbi_uc *)buffer;
4869 a.zbuffer_end = (
stbi_uc *)buffer + len;
4870 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4872 *outlen = (int)(a.zout - a.zout_start);
4873 return a.zout_start;
4875 STBI_FREE(a.zout_start);
4885 int initial_size,
int *outlen,
4888 char *p = (
char *)stbi__malloc(initial_size);
4891 a.zbuffer = (
stbi_uc *)buffer;
4892 a.zbuffer_end = (
stbi_uc *)buffer + len;
4893 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4895 *outlen = (int)(a.zout - a.zout_start);
4896 return a.zout_start;
4898 STBI_FREE(a.zout_start);
4905 a.zbuffer = (
stbi_uc *)ibuffer;
4906 a.zbuffer_end = (
stbi_uc *)ibuffer + ilen;
4907 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4908 return (
int)(a.zout - a.zout_start);
4915 char *p = (
char *)stbi__malloc(16384);
4918 a.zbuffer = (
stbi_uc *)buffer;
4919 a.zbuffer_end = (
stbi_uc *)buffer + len;
4920 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4922 *outlen = (int)(a.zout - a.zout_start);
4923 return a.zout_start;
4925 STBI_FREE(a.zout_start);
4933 a.zbuffer = (
stbi_uc *)ibuffer;
4934 a.zbuffer_end = (
stbi_uc *)ibuffer + ilen;
4935 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4936 return (
int)(a.zout - a.zout_start);
4954 stbi__uint32 length;
4958static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) {
4960 c.length = stbi__get32be(s);
4961 c.type = stbi__get32be(s);
4965static int stbi__check_png_header(stbi__context *s) {
4966 static const stbi_uc png_sig[8] = {137, 80, 78, 71, 13, 10, 26, 10};
4968 for (i = 0; i < 8; ++i)
4969 if (stbi__get8(s) != png_sig[i])
4970 return stbi__err(
"bad png sig",
"Not a PNG");
4976 stbi_uc *idata, *expanded, *out;
4990static stbi_uc first_row_filter[5] = {
4991 STBI__F_none, STBI__F_sub, STBI__F_none, STBI__F_avg_first,
4995static int stbi__paeth(
int a,
int b,
int c) {
4999 int thresh = c * 3 - (a + b);
5000 int lo = a < b ? a : b;
5001 int hi = a < b ? b : a;
5002 int t0 = (hi <= thresh) ? lo : c;
5003 int t1 = (thresh <= lo) ? hi : t0;
5007static const stbi_uc stbi__depth_scale_table[9] = {0, 0xff, 0x55, 0, 0x11, 0, 0, 0, 0x01};
5012static void stbi__create_png_alpha_expand8(
stbi_uc *dest,
stbi_uc *src, stbi__uint32 x,
int img_n) {
5016 for (i = x - 1; i >= 0; --i) {
5017 dest[i * 2 + 1] = 255;
5018 dest[i * 2 + 0] = src[i];
5021 STBI_ASSERT(img_n == 3);
5022 for (i = x - 1; i >= 0; --i) {
5023 dest[i * 4 + 3] = 255;
5024 dest[i * 4 + 2] = src[i * 3 + 2];
5025 dest[i * 4 + 1] = src[i * 3 + 1];
5026 dest[i * 4 + 0] = src[i * 3 + 0];
5032static int stbi__create_png_image_raw(stbi__png *a,
stbi_uc *raw, stbi__uint32 raw_len,
int out_n,
5033 stbi__uint32 x, stbi__uint32 y,
int depth,
int color) {
5034 int bytes = (depth == 16 ? 2 : 1);
5035 stbi__context *s = a->s;
5036 stbi__uint32 i, j, stride = x * out_n * bytes;
5037 stbi__uint32 img_len, img_width_bytes;
5041 int img_n = s->img_n;
5043 int output_bytes = out_n * bytes;
5044 int filter_bytes = img_n * bytes;
5047 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1);
5049 (
stbi_uc *)stbi__malloc_mad3(x, y, output_bytes, 0);
5051 return stbi__err(
"outofmem",
"Out of memory");
5055 if (!stbi__mad3sizes_valid(img_n, x, depth, 7))
5056 return stbi__err(
"too large",
"Corrupt PNG");
5057 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
5058 if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes))
5059 return stbi__err(
"too large",
"Corrupt PNG");
5060 img_len = (img_width_bytes + 1) * y;
5065 if (raw_len < img_len)
5066 return stbi__err(
"not enough pixels",
"Corrupt PNG");
5069 filter_buf = (
stbi_uc *)stbi__malloc_mad2(img_width_bytes, 2, 0);
5071 return stbi__err(
"outofmem",
"Out of memory");
5076 width = img_width_bytes;
5079 for (j = 0; j < y; ++j) {
5081 stbi_uc *cur = filter_buf + (j & 1) * img_width_bytes;
5082 stbi_uc *prior = filter_buf + (~j & 1) * img_width_bytes;
5083 stbi_uc *dest = a->out + stride * j;
5084 int nk = width * filter_bytes;
5085 int filter = *raw++;
5089 all_ok = stbi__err(
"invalid filter",
"Corrupt PNG");
5095 filter = first_row_filter[filter];
5100 memcpy(cur, raw, nk);
5103 memcpy(cur, raw, filter_bytes);
5104 for (k = filter_bytes; k < nk; ++k) cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]);
5107 for (k = 0; k < nk; ++k) cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
5110 for (k = 0; k < filter_bytes; ++k) cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1));
5111 for (k = filter_bytes; k < nk; ++k)
5112 cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1));
5115 for (k = 0; k < filter_bytes; ++k)
5116 cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
5117 for (k = filter_bytes; k < nk; ++k)
5118 cur[k] = STBI__BYTECAST(
5119 raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes]));
5121 case STBI__F_avg_first:
5122 memcpy(cur, raw, filter_bytes);
5123 for (k = filter_bytes; k < nk; ++k)
5124 cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1));
5132 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth]
5137 stbi__uint32 nsmp = x * img_n;
5141 for (i = 0; i < nsmp; ++i) {
5144 *out++ = scale * (inb >> 4);
5147 }
else if (depth == 2) {
5148 for (i = 0; i < nsmp; ++i) {
5151 *out++ = scale * (inb >> 6);
5155 STBI_ASSERT(depth == 1);
5156 for (i = 0; i < nsmp; ++i) {
5159 *out++ = scale * (inb >> 7);
5166 stbi__create_png_alpha_expand8(dest, dest, x, img_n);
5167 }
else if (depth == 8) {
5169 memcpy(dest, cur, x * img_n);
5171 stbi__create_png_alpha_expand8(dest, cur, x, img_n);
5172 }
else if (depth == 16) {
5174 stbi__uint16 *dest16 = (stbi__uint16 *)dest;
5175 stbi__uint32 nsmp = x * img_n;
5177 if (img_n == out_n) {
5178 for (i = 0; i < nsmp; ++i, ++dest16, cur += 2) *dest16 = (cur[0] << 8) | cur[1];
5180 STBI_ASSERT(img_n + 1 == out_n);
5182 for (i = 0; i < x; ++i, dest16 += 2, cur += 2) {
5183 dest16[0] = (cur[0] << 8) | cur[1];
5187 STBI_ASSERT(img_n == 3);
5188 for (i = 0; i < x; ++i, dest16 += 4, cur += 6) {
5189 dest16[0] = (cur[0] << 8) | cur[1];
5190 dest16[1] = (cur[2] << 8) | cur[3];
5191 dest16[2] = (cur[4] << 8) | cur[5];
5199 STBI_FREE(filter_buf);
5206static int stbi__create_png_image(stbi__png *a,
stbi_uc *image_data, stbi__uint32 image_data_len,
5207 int out_n,
int depth,
int color,
int interlaced) {
5208 int bytes = (depth == 16 ? 2 : 1);
5209 int out_bytes = out_n * bytes;
5213 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x,
5214 a->s->img_y, depth, color);
5217 final = (
stbi_uc *)stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
5219 return stbi__err(
"outofmem",
"Out of memory");
5220 for (p = 0; p < 7; ++p) {
5221 int xorig[] = {0, 4, 0, 2, 0, 1, 0};
5222 int yorig[] = {0, 0, 4, 0, 2, 0, 1};
5223 int xspc[] = {8, 8, 4, 4, 2, 2, 1};
5224 int yspc[] = {8, 8, 8, 4, 4, 2, 2};
5227 x = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p];
5228 y = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p];
5230 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
5231 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
5235 for (j = 0; j < y; ++j) {
5236 for (i = 0; i < x; ++i) {
5237 int out_y = j * yspc[p] + yorig[p];
5238 int out_x = i * xspc[p] + xorig[p];
5239 memcpy(
final + out_y * a->s->img_x * out_bytes + out_x * out_bytes,
5240 a->out + (j * x + i) * out_bytes, out_bytes);
5244 image_data += img_len;
5245 image_data_len -= img_len;
5253static int stbi__compute_transparency(stbi__png *z,
stbi_uc tc[3],
int out_n) {
5254 stbi__context *s = z->s;
5255 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
5260 STBI_ASSERT(out_n == 2 || out_n == 4);
5263 for (i = 0; i < pixel_count; ++i) {
5264 p[1] = (p[0] == tc[0] ? 0 : 255);
5268 for (i = 0; i < pixel_count; ++i) {
5269 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
5277static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3],
int out_n) {
5278 stbi__context *s = z->s;
5279 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
5280 stbi__uint16 *p = (stbi__uint16 *)z->out;
5284 STBI_ASSERT(out_n == 2 || out_n == 4);
5287 for (i = 0; i < pixel_count; ++i) {
5288 p[1] = (p[0] == tc[0] ? 0 : 65535);
5292 for (i = 0; i < pixel_count; ++i) {
5293 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
5301static int stbi__expand_png_palette(stbi__png *a,
stbi_uc *palette,
int len,
int pal_img_n) {
5302 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
5303 stbi_uc *p, *temp_out, *orig = a->out;
5305 p = (
stbi_uc *)stbi__malloc_mad2(pixel_count, pal_img_n, 0);
5307 return stbi__err(
"outofmem",
"Out of memory");
5312 if (pal_img_n == 3) {
5313 for (i = 0; i < pixel_count; ++i) {
5314 int n = orig[i] * 4;
5316 p[1] = palette[n + 1];
5317 p[2] = palette[n + 2];
5321 for (i = 0; i < pixel_count; ++i) {
5322 int n = orig[i] * 4;
5324 p[1] = palette[n + 1];
5325 p[2] = palette[n + 2];
5326 p[3] = palette[n + 3];
5338static int stbi__unpremultiply_on_load_global = 0;
5339static int stbi__de_iphone_flag_global = 0;
5342 stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;
5346 stbi__de_iphone_flag_global = flag_true_if_should_convert;
5349#ifndef STBI_THREAD_LOCAL
5350#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global
5351#define stbi__de_iphone_flag stbi__de_iphone_flag_global
5353static STBI_THREAD_LOCAL
int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;
5354static STBI_THREAD_LOCAL
int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;
5357 stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;
5358 stbi__unpremultiply_on_load_set = 1;
5362 stbi__de_iphone_flag_local = flag_true_if_should_convert;
5363 stbi__de_iphone_flag_set = 1;
5366#define stbi__unpremultiply_on_load \
5367 (stbi__unpremultiply_on_load_set ? stbi__unpremultiply_on_load_local \
5368 : stbi__unpremultiply_on_load_global)
5369#define stbi__de_iphone_flag \
5370 (stbi__de_iphone_flag_set ? stbi__de_iphone_flag_local : stbi__de_iphone_flag_global)
5373static void stbi__de_iphone(stbi__png *z) {
5374 stbi__context *s = z->s;
5375 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
5378 if (s->img_out_n == 3) {
5379 for (i = 0; i < pixel_count; ++i) {
5386 STBI_ASSERT(s->img_out_n == 4);
5387 if (stbi__unpremultiply_on_load) {
5389 for (i = 0; i < pixel_count; ++i) {
5394 p[0] = (p[2] * 255 + half) / a;
5395 p[1] = (p[1] * 255 + half) / a;
5396 p[2] = (t * 255 + half) / a;
5405 for (i = 0; i < pixel_count; ++i) {
5415#define STBI__PNG_TYPE(a, b, c, d) \
5416 (((unsigned)(a) << 24) + ((unsigned)(b) << 16) + ((unsigned)(c) << 8) + (unsigned)(d))
5418static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp) {
5419 stbi_uc palette[1024], pal_img_n = 0;
5420 stbi_uc has_trans = 0, tc[3] = {0};
5421 stbi__uint16 tc16[3];
5422 stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0;
5423 int first = 1, k, interlace = 0, color = 0, is_iphone = 0;
5424 stbi__context *s = z->s;
5430 if (!stbi__check_png_header(s))
5433 if (scan == STBI__SCAN_type)
5437 stbi__pngchunk c = stbi__get_chunk_header(s);
5439 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
5441 stbi__skip(s, c.length);
5443 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
5446 return stbi__err(
"multiple IHDR",
"Corrupt PNG");
5449 return stbi__err(
"bad IHDR len",
"Corrupt PNG");
5450 s->img_x = stbi__get32be(s);
5451 s->img_y = stbi__get32be(s);
5452 if (s->img_y > STBI_MAX_DIMENSIONS)
5453 return stbi__err(
"too large",
"Very large image (corrupt?)");
5454 if (s->img_x > STBI_MAX_DIMENSIONS)
5455 return stbi__err(
"too large",
"Very large image (corrupt?)");
5456 z->depth = stbi__get8(s);
5457 if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)
5458 return stbi__err(
"1/2/4/8/16-bit only",
"PNG not supported: 1/2/4/8/16-bit only");
5459 color = stbi__get8(s);
5461 return stbi__err(
"bad ctype",
"Corrupt PNG");
5462 if (color == 3 && z->depth == 16)
5463 return stbi__err(
"bad ctype",
"Corrupt PNG");
5467 return stbi__err(
"bad ctype",
"Corrupt PNG");
5468 comp = stbi__get8(s);
5470 return stbi__err(
"bad comp method",
"Corrupt PNG");
5471 filter = stbi__get8(s);
5473 return stbi__err(
"bad filter method",
"Corrupt PNG");
5474 interlace = stbi__get8(s);
5476 return stbi__err(
"bad interlace method",
"Corrupt PNG");
5477 if (!s->img_x || !s->img_y)
5478 return stbi__err(
"0-pixel image",
"Corrupt PNG");
5480 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
5481 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
5482 return stbi__err(
"too large",
"Image too large to decode");
5487 if ((1 << 30) / s->img_x / 4 < s->img_y)
5488 return stbi__err(
"too large",
"Corrupt PNG");
5494 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
5496 return stbi__err(
"first not IHDR",
"Corrupt PNG");
5497 if (c.length > 256 * 3)
5498 return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5499 pal_len = c.length / 3;
5500 if (pal_len * 3 != c.length)
5501 return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5502 for (i = 0; i < pal_len; ++i) {
5503 palette[i * 4 + 0] = stbi__get8(s);
5504 palette[i * 4 + 1] = stbi__get8(s);
5505 palette[i * 4 + 2] = stbi__get8(s);
5506 palette[i * 4 + 3] = 255;
5511 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
5513 return stbi__err(
"first not IHDR",
"Corrupt PNG");
5515 return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
5517 if (scan == STBI__SCAN_header) {
5522 return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
5523 if (c.length > pal_len)
5524 return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5526 for (i = 0; i < c.length; ++i) palette[i * 4 + 3] = stbi__get8(s);
5528 if (!(s->img_n & 1))
5529 return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
5530 if (c.length != (stbi__uint32)s->img_n * 2)
5531 return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5534 if (scan == STBI__SCAN_header) {
5538 if (z->depth == 16) {
5539 for (k = 0; k < s->img_n && k < 3;
5541 tc16[k] = (stbi__uint16)stbi__get16be(s);
5543 for (k = 0; k < s->img_n && k < 3; ++k)
5544 tc[k] = (
stbi_uc)(stbi__get16be(s) & 255) *
5545 stbi__depth_scale_table[z->depth];
5551 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
5553 return stbi__err(
"first not IHDR",
"Corrupt PNG");
5554 if (pal_img_n && !pal_len)
5555 return stbi__err(
"no PLTE",
"Corrupt PNG");
5556 if (scan == STBI__SCAN_header) {
5559 s->img_n = pal_img_n;
5562 if (c.length > (1u << 30))
5563 return stbi__err(
"IDAT size limit",
"IDAT section larger than 2^30 bytes");
5564 if ((
int)(ioff + c.length) < (
int)ioff)
5566 if (ioff + c.length > idata_limit) {
5567 stbi__uint32 idata_limit_old = idata_limit;
5569 if (idata_limit == 0)
5570 idata_limit = c.length > 4096 ? c.length : 4096;
5571 while (ioff + c.length > idata_limit) idata_limit *= 2;
5572 STBI_NOTUSED(idata_limit_old);
5573 p = (
stbi_uc *)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
5575 return stbi__err(
"outofmem",
"Out of memory");
5578 if (!stbi__getn(s, z->idata + ioff, c.length))
5579 return stbi__err(
"outofdata",
"Corrupt PNG");
5584 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
5585 stbi__uint32 raw_len, bpl;
5587 return stbi__err(
"first not IHDR",
"Corrupt PNG");
5588 if (scan != STBI__SCAN_load)
5590 if (z->idata == NULL)
5591 return stbi__err(
"no IDAT",
"Corrupt PNG");
5593 bpl = (s->img_x * z->depth + 7) / 8;
5594 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
5596 (
char *)z->idata, ioff, raw_len, (
int *)&raw_len, !is_iphone);
5597 if (z->expanded == NULL)
5599 STBI_FREE(z->idata);
5601 if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans)
5602 s->img_out_n = s->img_n + 1;
5604 s->img_out_n = s->img_n;
5605 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color,
5609 if (z->depth == 16) {
5610 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
5613 if (!stbi__compute_transparency(z, tc, s->img_out_n))
5617 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
5621 s->img_n = pal_img_n;
5622 s->img_out_n = pal_img_n;
5624 s->img_out_n = req_comp;
5625 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
5627 }
else if (has_trans) {
5631 STBI_FREE(z->expanded);
5641 return stbi__err(
"first not IHDR",
"Corrupt PNG");
5642 if ((c.type & (1 << 29)) == 0) {
5643#ifndef STBI_NO_FAILURE_STRINGS
5645 static char invalid_chunk[] =
"XXXX PNG chunk not known";
5646 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
5647 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
5648 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
5649 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
5651 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
5653 stbi__skip(s, c.length);
5661static void *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp,
5662 stbi__result_info *ri) {
5663 void *result = NULL;
5664 if (req_comp < 0 || req_comp > 4)
5665 return stbi__errpuc(
"bad req_comp",
"Internal error");
5666 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
5668 ri->bits_per_channel = 8;
5669 else if (p->depth == 16)
5670 ri->bits_per_channel = 16;
5672 return stbi__errpuc(
"bad bits_per_channel",
"PNG not supported: unsupported color depth");
5675 if (req_comp && req_comp != p->s->img_out_n) {
5676 if (ri->bits_per_channel == 8)
5677 result = stbi__convert_format((
unsigned char *)result, p->s->img_out_n, req_comp,
5678 p->s->img_x, p->s->img_y);
5680 result = stbi__convert_format16((stbi__uint16 *)result, p->s->img_out_n, req_comp,
5681 p->s->img_x, p->s->img_y);
5682 p->s->img_out_n = req_comp;
5693 STBI_FREE(p->expanded);
5695 STBI_FREE(p->idata);
5701static void *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
5702 stbi__result_info *ri) {
5705 return stbi__do_png(&p, x, y, comp, req_comp, ri);
5708static int stbi__png_test(stbi__context *s) {
5710 r = stbi__check_png_header(s);
5715static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp) {
5716 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
5725 *comp = p->s->img_n;
5729static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp) {
5732 return stbi__png_info_raw(&p, x, y, comp);
5735static int stbi__png_is16(stbi__context *s) {
5738 if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5740 if (p.depth != 16) {
5751static int stbi__bmp_test_raw(stbi__context *s) {
5754 if (stbi__get8(s) !=
'B')
5756 if (stbi__get8(s) !=
'M')
5762 sz = stbi__get32le(s);
5763 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5767static int stbi__bmp_test(stbi__context *s) {
5768 int r = stbi__bmp_test_raw(s);
5774static int stbi__high_bit(
unsigned int z) {
5800static int stbi__bitcount(
unsigned int a) {
5801 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
5802 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
5803 a = (a + (a >> 4)) & 0x0f0f0f0f;
5805 a = (a + (a >> 16));
5812static int stbi__shiftsigned(
unsigned int v,
int shift,
int bits) {
5813 static unsigned int mul_table[9] = {
5824 static unsigned int shift_table[9] = {
5825 0, 0, 0, 1, 0, 2, 4, 6, 0,
5831 STBI_ASSERT(v < 256);
5833 STBI_ASSERT(bits >= 0 && bits <= 8);
5834 return (
int)((unsigned)v * mul_table[bits]) >> shift_table[bits];
5838 int bpp, offset, hsz;
5839 unsigned int mr, mg, mb, ma, all_a;
5843static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info,
int compress) {
5848 if (compress == 0) {
5849 if (info->bpp == 16) {
5850 info->mr = 31u << 10;
5851 info->mg = 31u << 5;
5852 info->mb = 31u << 0;
5853 }
else if (info->bpp == 32) {
5854 info->mr = 0xffu << 16;
5855 info->mg = 0xffu << 8;
5856 info->mb = 0xffu << 0;
5857 info->ma = 0xffu << 24;
5861 info->mr = info->mg = info->mb = info->ma = 0;
5868static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) {
5870 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
5871 return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5875 info->offset = stbi__get32le(s);
5876 info->hsz = hsz = stbi__get32le(s);
5877 info->mr = info->mg = info->mb = info->ma = 0;
5878 info->extra_read = 14;
5880 if (info->offset < 0)
5881 return stbi__errpuc(
"bad BMP",
"bad BMP");
5883 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
5884 return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5886 s->img_x = stbi__get16le(s);
5887 s->img_y = stbi__get16le(s);
5889 s->img_x = stbi__get32le(s);
5890 s->img_y = stbi__get32le(s);
5892 if (stbi__get16le(s) != 1)
5893 return stbi__errpuc(
"bad BMP",
"bad BMP");
5894 info->bpp = stbi__get16le(s);
5896 int compress = stbi__get32le(s);
5897 if (compress == 1 || compress == 2)
5898 return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5900 return stbi__errpuc(
5902 "BMP type not supported: unsupported compression");
5903 if (compress == 3 && info->bpp != 16 && info->bpp != 32)
5904 return stbi__errpuc(
"bad BMP",
"bad BMP");
5910 if (hsz == 40 || hsz == 56) {
5917 if (info->bpp == 16 || info->bpp == 32) {
5918 if (compress == 0) {
5919 stbi__bmp_set_mask_defaults(info, compress);
5920 }
else if (compress == 3) {
5921 info->mr = stbi__get32le(s);
5922 info->mg = stbi__get32le(s);
5923 info->mb = stbi__get32le(s);
5924 info->extra_read += 12;
5926 if (info->mr == info->mg && info->mg == info->mb) {
5928 return stbi__errpuc(
"bad BMP",
"bad BMP");
5931 return stbi__errpuc(
"bad BMP",
"bad BMP");
5936 if (hsz != 108 && hsz != 124)
5937 return stbi__errpuc(
"bad BMP",
"bad BMP");
5938 info->mr = stbi__get32le(s);
5939 info->mg = stbi__get32le(s);
5940 info->mb = stbi__get32le(s);
5941 info->ma = stbi__get32le(s);
5943 stbi__bmp_set_mask_defaults(info, compress);
5945 for (i = 0; i < 12; ++i) stbi__get32le(s);
5957static void *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
5958 stbi__result_info *ri) {
5960 unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a;
5962 int psize = 0, i, j, width;
5963 int flip_vertically, pad, target;
5964 stbi__bmp_data info;
5968 if (stbi__bmp_parse_header(s, &info) == NULL)
5971 flip_vertically = ((int)s->img_y) > 0;
5972 s->img_y = abs((
int)s->img_y);
5974 if (s->img_y > STBI_MAX_DIMENSIONS)
5975 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5976 if (s->img_x > STBI_MAX_DIMENSIONS)
5977 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5985 if (info.hsz == 12) {
5987 psize = (info.offset - info.extra_read - 24) / 3;
5990 psize = (info.offset - info.extra_read - info.hsz) >> 2;
5995 int bytes_read_so_far =
5996 s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original);
5997 int header_limit = 1024;
5998 int extra_data_limit =
6000 if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) {
6001 return stbi__errpuc(
"bad header",
"Corrupt BMP");
6007 if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) {
6008 return stbi__errpuc(
"bad offset",
"Corrupt BMP");
6010 stbi__skip(s, info.offset - bytes_read_so_far);
6014 if (info.bpp == 24 && ma == 0xff000000)
6017 s->img_n = ma ? 4 : 3;
6018 if (req_comp && req_comp >= 3)
6024 if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
6025 return stbi__errpuc(
"too large",
"Corrupt BMP");
6027 out = (
stbi_uc *)stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
6029 return stbi__errpuc(
"outofmem",
"Out of memory");
6030 if (info.bpp < 16) {
6032 if (psize == 0 || psize > 256) {
6034 return stbi__errpuc(
"invalid",
"Corrupt BMP");
6036 for (i = 0; i < psize; ++i) {
6037 pal[i][2] = stbi__get8(s);
6038 pal[i][1] = stbi__get8(s);
6039 pal[i][0] = stbi__get8(s);
6044 stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
6046 width = (s->img_x + 7) >> 3;
6047 else if (info.bpp == 4)
6048 width = (s->img_x + 1) >> 1;
6049 else if (info.bpp == 8)
6053 return stbi__errpuc(
"bad bpp",
"Corrupt BMP");
6056 if (info.bpp == 1) {
6057 for (j = 0; j < (int)s->img_y; ++j) {
6058 int bit_offset = 7, v = stbi__get8(s);
6059 for (i = 0; i < (int)s->img_x; ++i) {
6060 int color = (v >> bit_offset) & 0x1;
6061 out[z++] = pal[color][0];
6062 out[z++] = pal[color][1];
6063 out[z++] = pal[color][2];
6066 if (i + 1 == (
int)s->img_x)
6068 if ((--bit_offset) < 0) {
6076 for (j = 0; j < (int)s->img_y; ++j) {
6077 for (i = 0; i < (int)s->img_x; i += 2) {
6078 int v = stbi__get8(s), v2 = 0;
6079 if (info.bpp == 4) {
6083 out[z++] = pal[v][0];
6084 out[z++] = pal[v][1];
6085 out[z++] = pal[v][2];
6088 if (i + 1 == (
int)s->img_x)
6090 v = (info.bpp == 8) ? stbi__get8(s) : v2;
6091 out[z++] = pal[v][0];
6092 out[z++] = pal[v][1];
6093 out[z++] = pal[v][2];
6101 int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0,
6105 stbi__skip(s, info.offset - info.extra_read - info.hsz);
6107 width = 3 * s->img_x;
6108 else if (info.bpp == 16)
6109 width = 2 * s->img_x;
6113 if (info.bpp == 24) {
6115 }
else if (info.bpp == 32) {
6116 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
6120 if (!mr || !mg || !mb) {
6122 return stbi__errpuc(
"bad masks",
"Corrupt BMP");
6125 rshift = stbi__high_bit(mr) - 7;
6126 rcount = stbi__bitcount(mr);
6127 gshift = stbi__high_bit(mg) - 7;
6128 gcount = stbi__bitcount(mg);
6129 bshift = stbi__high_bit(mb) - 7;
6130 bcount = stbi__bitcount(mb);
6131 ashift = stbi__high_bit(ma) - 7;
6132 acount = stbi__bitcount(ma);
6133 if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) {
6135 return stbi__errpuc(
"bad masks",
"Corrupt BMP");
6138 for (j = 0; j < (int)s->img_y; ++j) {
6140 for (i = 0; i < (int)s->img_x; ++i) {
6142 out[z + 2] = stbi__get8(s);
6143 out[z + 1] = stbi__get8(s);
6144 out[z + 0] = stbi__get8(s);
6146 a = (easy == 2 ? stbi__get8(s) : 255);
6153 for (i = 0; i < (int)s->img_x; ++i) {
6154 stbi__uint32 v = (bpp == 16 ? (stbi__uint32)stbi__get16le(s) : stbi__get32le(s));
6156 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
6157 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
6158 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
6159 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
6162 out[z++] = STBI__BYTECAST(a);
6170 if (target == 4 && all_a == 0)
6171 for (i = 4 * s->img_x * s->img_y - 1; i >= 0; i -= 4) out[i] = 255;
6173 if (flip_vertically) {
6175 for (j = 0; j < (int)s->img_y >> 1; ++j) {
6176 stbi_uc *p1 = out + j * s->img_x * target;
6177 stbi_uc *p2 = out + (s->img_y - 1 - j) * s->img_x * target;
6178 for (i = 0; i < (int)s->img_x * target; ++i) {
6186 if (req_comp && req_comp != target) {
6187 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
6204static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int *is_rgb16) {
6208 switch (bits_per_pixel) {
6221 return bits_per_pixel / 8;
6227static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp) {
6228 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
6229 int sz, tga_colormap_type;
6231 tga_colormap_type = stbi__get8(s);
6232 if (tga_colormap_type > 1) {
6236 tga_image_type = stbi__get8(s);
6237 if (tga_colormap_type == 1) {
6238 if (tga_image_type != 1 && tga_image_type != 9) {
6244 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) {
6249 tga_colormap_bpp = sz;
6251 if ((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) &&
6252 (tga_image_type != 11)) {
6257 tga_colormap_bpp = 0;
6259 tga_w = stbi__get16le(s);
6264 tga_h = stbi__get16le(s);
6269 tga_bits_per_pixel = stbi__get8(s);
6271 if (tga_colormap_bpp != 0) {
6272 if ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
6278 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
6281 stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
6296static int stbi__tga_test(stbi__context *s) {
6298 int sz, tga_color_type;
6300 tga_color_type = stbi__get8(s);
6301 if (tga_color_type > 1)
6304 if (tga_color_type == 1) {
6305 if (sz != 1 && sz != 9)
6309 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
6313 if ((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11))
6317 if (stbi__get16le(s) < 1)
6319 if (stbi__get16le(s) < 1)
6322 if ((tga_color_type == 1) && (sz != 8) && (sz != 16))
6324 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
6335static void stbi__tga_read_rgb16(stbi__context *s,
stbi_uc *out) {
6336 stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
6337 stbi__uint16 fiveBitMask = 31;
6339 int r = (px >> 10) & fiveBitMask;
6340 int g = (px >> 5) & fiveBitMask;
6341 int b = px & fiveBitMask;
6343 out[0] = (
stbi_uc)((r * 255) / 31);
6344 out[1] = (
stbi_uc)((g * 255) / 31);
6345 out[2] = (
stbi_uc)((b * 255) / 31);
6353static void *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
6354 stbi__result_info *ri) {
6356 int tga_offset = stbi__get8(s);
6357 int tga_indexed = stbi__get8(s);
6358 int tga_image_type = stbi__get8(s);
6360 int tga_palette_start = stbi__get16le(s);
6361 int tga_palette_len = stbi__get16le(s);
6362 int tga_palette_bits = stbi__get8(s);
6363 int tga_x_origin = stbi__get16le(s);
6364 int tga_y_origin = stbi__get16le(s);
6365 int tga_width = stbi__get16le(s);
6366 int tga_height = stbi__get16le(s);
6367 int tga_bits_per_pixel = stbi__get8(s);
6368 int tga_comp, tga_rgb16 = 0;
6369 int tga_inverted = stbi__get8(s);
6372 unsigned char *tga_data;
6373 unsigned char *tga_palette = NULL;
6375 unsigned char raw_data[4] = {0};
6377 int RLE_repeating = 0;
6378 int read_next_pixel = 1;
6380 STBI_NOTUSED(tga_x_origin);
6381 STBI_NOTUSED(tga_y_origin);
6383 if (tga_height > STBI_MAX_DIMENSIONS)
6384 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6385 if (tga_width > STBI_MAX_DIMENSIONS)
6386 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6389 if (tga_image_type >= 8) {
6390 tga_image_type -= 8;
6393 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
6397 tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
6399 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
6402 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
6410 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
6411 return stbi__errpuc(
"too large",
"Corrupt TGA");
6413 tga_data = (
unsigned char *)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
6415 return stbi__errpuc(
"outofmem",
"Out of memory");
6418 stbi__skip(s, tga_offset);
6420 if (!tga_indexed && !tga_is_RLE && !tga_rgb16) {
6421 for (i = 0; i < tga_height; ++i) {
6422 int row = tga_inverted ? tga_height - i - 1 : i;
6423 stbi_uc *tga_row = tga_data + row * tga_width * tga_comp;
6424 stbi__getn(s, tga_row, tga_width * tga_comp);
6429 if (tga_palette_len == 0) {
6430 STBI_FREE(tga_data);
6431 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
6435 stbi__skip(s, tga_palette_start);
6437 tga_palette = (
unsigned char *)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
6439 STBI_FREE(tga_data);
6440 return stbi__errpuc(
"outofmem",
"Out of memory");
6443 stbi_uc *pal_entry = tga_palette;
6445 for (i = 0; i < tga_palette_len; ++i) {
6446 stbi__tga_read_rgb16(s, pal_entry);
6447 pal_entry += tga_comp;
6449 }
else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
6450 STBI_FREE(tga_data);
6451 STBI_FREE(tga_palette);
6452 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
6456 for (i = 0; i < tga_width * tga_height; ++i) {
6459 if (RLE_count == 0) {
6461 int RLE_cmd = stbi__get8(s);
6462 RLE_count = 1 + (RLE_cmd & 127);
6463 RLE_repeating = RLE_cmd >> 7;
6464 read_next_pixel = 1;
6465 }
else if (!RLE_repeating) {
6466 read_next_pixel = 1;
6469 read_next_pixel = 1;
6472 if (read_next_pixel) {
6476 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
6477 if (pal_idx >= tga_palette_len) {
6481 pal_idx *= tga_comp;
6482 for (j = 0; j < tga_comp; ++j) {
6483 raw_data[j] = tga_palette[pal_idx + j];
6485 }
else if (tga_rgb16) {
6487 stbi__tga_read_rgb16(s, raw_data);
6490 for (j = 0; j < tga_comp; ++j) {
6491 raw_data[j] = stbi__get8(s);
6495 read_next_pixel = 0;
6499 for (j = 0; j < tga_comp; ++j) tga_data[i * tga_comp + j] = raw_data[j];
6506 for (j = 0; j * 2 < tga_height; ++j) {
6507 int index1 = j * tga_width * tga_comp;
6508 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
6509 for (i = tga_width * tga_comp; i > 0; --i) {
6510 unsigned char temp = tga_data[index1];
6511 tga_data[index1] = tga_data[index2];
6512 tga_data[index2] = temp;
6519 if (tga_palette != NULL) {
6520 STBI_FREE(tga_palette);
6525 if (tga_comp >= 3 && !tga_rgb16) {
6526 unsigned char *tga_pixel = tga_data;
6527 for (i = 0; i < tga_width * tga_height; ++i) {
6528 unsigned char temp = tga_pixel[0];
6529 tga_pixel[0] = tga_pixel[2];
6530 tga_pixel[2] = temp;
6531 tga_pixel += tga_comp;
6536 if (req_comp && req_comp != tga_comp)
6537 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
6541 tga_palette_start = tga_palette_len = tga_palette_bits = tga_x_origin = tga_y_origin = 0;
6542 STBI_NOTUSED(tga_palette_start);
6552static int stbi__psd_test(stbi__context *s) {
6553 int r = (stbi__get32be(s) == 0x38425053);
6558static int stbi__psd_decode_rle(stbi__context *s,
stbi_uc *p,
int pixelCount) {
6559 int count, nleft, len;
6562 while ((nleft = pixelCount - count) > 0) {
6563 len = stbi__get8(s);
6566 }
else if (len < 128) {
6577 }
else if (len > 128) {
6584 val = stbi__get8(s);
6597static void *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
6598 stbi__result_info *ri,
int bpc) {
6600 int channelCount, compression;
6608 if (stbi__get32be(s) != 0x38425053)
6609 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
6612 if (stbi__get16be(s) != 1)
6613 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
6619 channelCount = stbi__get16be(s);
6620 if (channelCount < 0 || channelCount > 16)
6621 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
6624 h = stbi__get32be(s);
6625 w = stbi__get32be(s);
6627 if (h > STBI_MAX_DIMENSIONS)
6628 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6629 if (w > STBI_MAX_DIMENSIONS)
6630 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6633 bitdepth = stbi__get16be(s);
6634 if (bitdepth != 8 && bitdepth != 16)
6635 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
6647 if (stbi__get16be(s) != 3)
6648 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
6651 stbi__skip(s, stbi__get32be(s));
6654 stbi__skip(s, stbi__get32be(s));
6657 stbi__skip(s, stbi__get32be(s));
6663 compression = stbi__get16be(s);
6664 if (compression > 1)
6665 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
6668 if (!stbi__mad3sizes_valid(4, w, h, 0))
6669 return stbi__errpuc(
"too large",
"Corrupt PSD");
6673 if (!compression && bitdepth == 16 && bpc == 16) {
6674 out = (
stbi_uc *)stbi__malloc_mad3(8, w, h, 0);
6675 ri->bits_per_channel = 16;
6677 out = (
stbi_uc *)stbi__malloc(4 * w * h);
6680 return stbi__errpuc(
"outofmem",
"Out of memory");
6698 stbi__skip(s, h * channelCount * 2);
6701 for (channel = 0; channel < 4; channel++) {
6705 if (channel >= channelCount) {
6707 for (i = 0; i < pixelCount; i++, p += 4) *p = (channel == 3 ? 255 : 0);
6710 if (!stbi__psd_decode_rle(s, p, pixelCount)) {
6712 return stbi__errpuc(
"corrupt",
"bad RLE data");
6722 for (channel = 0; channel < 4; channel++) {
6723 if (channel >= channelCount) {
6725 if (bitdepth == 16 && bpc == 16) {
6726 stbi__uint16 *q = ((stbi__uint16 *)out) + channel;
6727 stbi__uint16 val = channel == 3 ? 65535 : 0;
6728 for (i = 0; i < pixelCount; i++, q += 4) *q = val;
6731 stbi_uc val = channel == 3 ? 255 : 0;
6732 for (i = 0; i < pixelCount; i++, p += 4) *p = val;
6735 if (ri->bits_per_channel == 16) {
6736 stbi__uint16 *q = ((stbi__uint16 *)out) + channel;
6737 for (i = 0; i < pixelCount; i++, q += 4) *q = (stbi__uint16)stbi__get16be(s);
6740 if (bitdepth == 16) {
6741 for (i = 0; i < pixelCount; i++, p += 4) *p = (
stbi_uc)(stbi__get16be(s) >> 8);
6743 for (i = 0; i < pixelCount; i++, p += 4) *p = stbi__get8(s);
6751 if (channelCount >= 4) {
6752 if (ri->bits_per_channel == 16) {
6753 for (i = 0; i < w * h; ++i) {
6754 stbi__uint16 *pixel = (stbi__uint16 *)out + 4 * i;
6755 if (pixel[3] != 0 && pixel[3] != 65535) {
6756 float a = pixel[3] / 65535.0f;
6757 float ra = 1.0f / a;
6758 float inv_a = 65535.0f * (1 - ra);
6759 pixel[0] = (stbi__uint16)(pixel[0] * ra + inv_a);
6760 pixel[1] = (stbi__uint16)(pixel[1] * ra + inv_a);
6761 pixel[2] = (stbi__uint16)(pixel[2] * ra + inv_a);
6765 for (i = 0; i < w * h; ++i) {
6766 unsigned char *pixel = out + 4 * i;
6767 if (pixel[3] != 0 && pixel[3] != 255) {
6768 float a = pixel[3] / 255.0f;
6769 float ra = 1.0f / a;
6770 float inv_a = 255.0f * (1 - ra);
6771 pixel[0] = (
unsigned char)(pixel[0] * ra + inv_a);
6772 pixel[1] = (
unsigned char)(pixel[1] * ra + inv_a);
6773 pixel[2] = (
unsigned char)(pixel[2] * ra + inv_a);
6780 if (req_comp && req_comp != 4) {
6781 if (ri->bits_per_channel == 16)
6782 out = (
stbi_uc *)stbi__convert_format16((stbi__uint16 *)out, 4, req_comp, w, h);
6784 out = stbi__convert_format(out, 4, req_comp, w, h);
6806static int stbi__pic_is4(stbi__context *s,
const char *str) {
6808 for (i = 0; i < 4; ++i)
6809 if (stbi__get8(s) != (
stbi_uc)str[i])
6815static int stbi__pic_test_core(stbi__context *s) {
6818 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
6821 for (i = 0; i < 84; ++i) stbi__get8(s);
6823 if (!stbi__pic_is4(s,
"PICT"))
6833static stbi_uc *stbi__readval(stbi__context *s,
int channel,
stbi_uc *dest) {
6836 for (i = 0; i < 4; ++i, mask >>= 1) {
6837 if (channel & mask) {
6838 if (stbi__at_eof(s))
6839 return stbi__errpuc(
"bad file",
"PIC file too short");
6840 dest[i] = stbi__get8(s);
6847static void stbi__copyval(
int channel,
stbi_uc *dest,
const stbi_uc *src) {
6850 for (i = 0; i < 4; ++i, mask >>= 1)
6855static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp,
6857 int act_comp = 0, num_packets = 0, y, chained;
6858 stbi__pic_packet packets[10];
6863 stbi__pic_packet *packet;
6865 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
6866 return stbi__errpuc(
"bad format",
"too many packets");
6868 packet = &packets[num_packets++];
6870 chained = stbi__get8(s);
6871 packet->size = stbi__get8(s);
6872 packet->type = stbi__get8(s);
6873 packet->channel = stbi__get8(s);
6875 act_comp |= packet->channel;
6877 if (stbi__at_eof(s))
6878 return stbi__errpuc(
"bad file",
"file too short (reading packets)");
6879 if (packet->size != 8)
6880 return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
6883 *comp = (act_comp & 0x10 ? 4 : 3);
6885 for (y = 0; y < height; ++y) {
6888 for (packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
6889 stbi__pic_packet *packet = &packets[packet_idx];
6890 stbi_uc *dest = result + y * width * 4;
6892 switch (packet->type) {
6894 return stbi__errpuc(
"bad format",
"packet has bad compression type");
6899 for (x = 0; x < width; ++x, dest += 4)
6900 if (!stbi__readval(s, packet->channel, dest))
6907 int left = width, i;
6912 count = stbi__get8(s);
6913 if (stbi__at_eof(s))
6914 return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6919 if (!stbi__readval(s, packet->channel, value))
6922 for (i = 0; i < count; ++i, dest += 4) stbi__copyval(packet->channel, dest, value);
6930 int count = stbi__get8(s), i;
6931 if (stbi__at_eof(s))
6932 return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6938 count = stbi__get16be(s);
6942 return stbi__errpuc(
"bad file",
"scanline overrun");
6944 if (!stbi__readval(s, packet->channel, value))
6947 for (i = 0; i < count; ++i, dest += 4) stbi__copyval(packet->channel, dest, value);
6951 return stbi__errpuc(
"bad file",
"scanline overrun");
6953 for (i = 0; i < count; ++i, dest += 4)
6954 if (!stbi__readval(s, packet->channel, dest))
6968static void *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp,
6969 stbi__result_info *ri) {
6971 int i, x, y, internal_comp;
6975 comp = &internal_comp;
6977 for (i = 0; i < 92; ++i) stbi__get8(s);
6979 x = stbi__get16be(s);
6980 y = stbi__get16be(s);
6982 if (y > STBI_MAX_DIMENSIONS)
6983 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6984 if (x > STBI_MAX_DIMENSIONS)
6985 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6987 if (stbi__at_eof(s))
6988 return stbi__errpuc(
"bad file",
"file too short (pic header)");
6989 if (!stbi__mad3sizes_valid(x, y, 4, 0))
6990 return stbi__errpuc(
"too large",
"PIC image too large to decode");
6997 result = (
stbi_uc *)stbi__malloc_mad3(x, y, 4, 0);
6999 return stbi__errpuc(
"outofmem",
"Out of memory");
7000 memset(result, 0xff, x * y * 4);
7002 if (!stbi__pic_load_core(s, x, y, comp, result)) {
7010 result = stbi__convert_format(result, 4, req_comp, x, y);
7015static int stbi__pic_test(stbi__context *s) {
7016 int r = stbi__pic_test_core(s);
7037 int flags, bgindex, ratio, transparent, eflags;
7040 stbi__gif_lzw codes[8192];
7044 int start_x, start_y;
7051static int stbi__gif_test_raw(stbi__context *s) {
7053 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
7056 if (sz !=
'9' && sz !=
'7')
7058 if (stbi__get8(s) !=
'a')
7063static int stbi__gif_test(stbi__context *s) {
7064 int r = stbi__gif_test_raw(s);
7069static void stbi__gif_parse_colortable(stbi__context *s,
stbi_uc pal[256][4],
int num_entries,
7072 for (i = 0; i < num_entries; ++i) {
7073 pal[i][2] = stbi__get8(s);
7074 pal[i][1] = stbi__get8(s);
7075 pal[i][0] = stbi__get8(s);
7076 pal[i][3] = transp == i ? 0 : 255;
7080static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info) {
7082 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
7083 return stbi__err(
"not GIF",
"Corrupt GIF");
7085 version = stbi__get8(s);
7086 if (version !=
'7' && version !=
'9')
7087 return stbi__err(
"not GIF",
"Corrupt GIF");
7088 if (stbi__get8(s) !=
'a')
7089 return stbi__err(
"not GIF",
"Corrupt GIF");
7091 stbi__g_failure_reason =
"";
7092 g->w = stbi__get16le(s);
7093 g->h = stbi__get16le(s);
7094 g->flags = stbi__get8(s);
7095 g->bgindex = stbi__get8(s);
7096 g->ratio = stbi__get8(s);
7097 g->transparent = -1;
7099 if (g->w > STBI_MAX_DIMENSIONS)
7100 return stbi__err(
"too large",
"Very large image (corrupt?)");
7101 if (g->h > STBI_MAX_DIMENSIONS)
7102 return stbi__err(
"too large",
"Very large image (corrupt?)");
7110 if (g->flags & 0x80)
7111 stbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1);
7116static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp) {
7117 stbi__gif *g = (stbi__gif *)stbi__malloc(
sizeof(stbi__gif));
7119 return stbi__err(
"outofmem",
"Out of memory");
7120 if (!stbi__gif_header(s, g, comp, 1)) {
7133static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) {
7139 if (g->codes[code].prefix >= 0)
7140 stbi__out_gif_code(g, g->codes[code].prefix);
7142 if (g->cur_y >= g->max_y)
7145 idx = g->cur_x + g->cur_y;
7147 g->history[idx / 4] = 1;
7149 c = &g->color_table[g->codes[code].suffix * 4];
7158 if (g->cur_x >= g->max_x) {
7159 g->cur_x = g->start_x;
7160 g->cur_y += g->step;
7162 while (g->cur_y >= g->max_y && g->parse > 0) {
7163 g->step = (1 << g->parse) * g->line_size;
7164 g->cur_y = g->start_y + (g->step >> 1);
7170static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) {
7172 stbi__int32 len, init_code;
7174 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
7177 lzw_cs = stbi__get8(s);
7180 clear = 1 << lzw_cs;
7182 codesize = lzw_cs + 1;
7183 codemask = (1 << codesize) - 1;
7186 for (init_code = 0; init_code < clear; init_code++) {
7187 g->codes[init_code].prefix = -1;
7188 g->codes[init_code].first = (
stbi_uc)init_code;
7189 g->codes[init_code].suffix = (
stbi_uc)init_code;
7198 if (valid_bits < codesize) {
7200 len = stbi__get8(s);
7205 bits |= (stbi__int32)stbi__get8(s) << valid_bits;
7208 stbi__int32 code = bits & codemask;
7210 valid_bits -= codesize;
7212 if (code == clear) {
7213 codesize = lzw_cs + 1;
7214 codemask = (1 << codesize) - 1;
7218 }
else if (code == clear + 1) {
7220 while ((len = stbi__get8(s)) > 0) stbi__skip(s, len);
7222 }
else if (code <= avail) {
7224 return stbi__errpuc(
"no clear code",
"Corrupt GIF");
7228 p = &g->codes[avail++];
7230 return stbi__errpuc(
"too many codes",
"Corrupt GIF");
7233 p->prefix = (stbi__int16)oldcode;
7234 p->first = g->codes[oldcode].first;
7235 p->suffix = (code == avail) ? p->first : g->codes[code].first;
7236 }
else if (code == avail)
7237 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
7239 stbi__out_gif_code(g, (stbi__uint16)code);
7241 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
7243 codemask = (1 << codesize) - 1;
7248 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
7256static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp,
7262 STBI_NOTUSED(req_comp);
7267 if (!stbi__gif_header(s, g, comp, 0))
7269 if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
7270 return stbi__errpuc(
"too large",
"GIF image is too large");
7271 pcount = g->w * g->h;
7272 g->out = (
stbi_uc *)stbi__malloc(4 * pcount);
7273 g->background = (
stbi_uc *)stbi__malloc(4 * pcount);
7274 g->history = (
stbi_uc *)stbi__malloc(pcount);
7275 if (!g->out || !g->background || !g->history)
7276 return stbi__errpuc(
"outofmem",
"Out of memory");
7281 memset(g->out, 0x00, 4 * pcount);
7282 memset(g->background, 0x00, 4 * pcount);
7283 memset(g->history, 0x00, pcount);
7287 dispose = (g->eflags & 0x1C) >> 2;
7288 pcount = g->w * g->h;
7290 if ((dispose == 3) && (two_back == 0)) {
7295 for (pi = 0;
pi < pcount; ++
pi) {
7296 if (g->history[pi]) {
7297 memcpy(&g->out[pi * 4], &two_back[pi * 4], 4);
7300 }
else if (dispose == 2) {
7302 for (pi = 0;
pi < pcount; ++
pi) {
7303 if (g->history[pi]) {
7304 memcpy(&g->out[pi * 4], &g->background[pi * 4], 4);
7315 memcpy(g->background, g->out, 4 * g->w * g->h);
7319 memset(g->history, 0x00, g->w * g->h);
7322 int tag = stbi__get8(s);
7326 stbi__int32 x, y, w, h;
7329 x = stbi__get16le(s);
7330 y = stbi__get16le(s);
7331 w = stbi__get16le(s);
7332 h = stbi__get16le(s);
7333 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
7334 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
7336 g->line_size = g->w * 4;
7338 g->start_y = y * g->line_size;
7339 g->max_x = g->start_x + w * 4;
7340 g->max_y = g->start_y + h * g->line_size;
7341 g->cur_x = g->start_x;
7342 g->cur_y = g->start_y;
7349 g->cur_y = g->max_y;
7351 g->lflags = stbi__get8(s);
7353 if (g->lflags & 0x40) {
7354 g->step = 8 * g->line_size;
7357 g->step = g->line_size;
7361 if (g->lflags & 0x80) {
7362 stbi__gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7),
7363 g->eflags & 0x01 ? g->transparent : -1);
7364 g->color_table = (
stbi_uc *)g->lpal;
7365 }
else if (g->flags & 0x80) {
7366 g->color_table = (
stbi_uc *)g->pal;
7368 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
7370 o = stbi__process_gif_raster(s, g);
7375 pcount = g->w * g->h;
7376 if (first_frame && (g->bgindex > 0)) {
7378 for (pi = 0;
pi < pcount; ++
pi) {
7379 if (g->history[pi] == 0) {
7380 g->pal[g->bgindex][3] = 255;
7382 memcpy(&g->out[pi * 4], &g->pal[g->bgindex], 4);
7393 int ext = stbi__get8(s);
7395 len = stbi__get8(s);
7397 g->eflags = stbi__get8(s);
7398 g->delay = 10 * stbi__get16le(s);
7401 if (g->transparent >= 0) {
7402 g->pal[g->transparent][3] = 255;
7404 if (g->eflags & 0x01) {
7405 g->transparent = stbi__get8(s);
7406 if (g->transparent >= 0) {
7407 g->pal[g->transparent][3] = 0;
7412 g->transparent = -1;
7419 while ((len = stbi__get8(s)) != 0) {
7429 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
7434static void *stbi__load_gif_main_outofmem(stbi__gif *g,
stbi_uc *out,
int **delays) {
7436 STBI_FREE(g->history);
7437 STBI_FREE(g->background);
7441 if (delays && *delays)
7443 return stbi__errpuc(
"outofmem",
"Out of memory");
7446static void *stbi__load_gif_main(stbi__context *s,
int **delays,
int *x,
int *y,
int *z,
int *comp,
7448 if (stbi__gif_test(s)) {
7456 int delays_size = 0;
7458 STBI_NOTUSED(out_size);
7459 STBI_NOTUSED(delays_size);
7461 memset(&g, 0,
sizeof(g));
7467 u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
7475 stride = g.w * g.h * 4;
7478 void *tmp = (
stbi_uc *)STBI_REALLOC_SIZED(out, out_size, layers * stride);
7480 return stbi__load_gif_main_outofmem(&g, out, delays);
7483 out_size = layers * stride;
7487 int *new_delays = (
int *)STBI_REALLOC_SIZED(*delays, delays_size,
sizeof(
int) * layers);
7489 return stbi__load_gif_main_outofmem(&g, out, delays);
7490 *delays = new_delays;
7491 delays_size = layers *
sizeof(int);
7494 out = (
stbi_uc *)stbi__malloc(layers * stride);
7496 return stbi__load_gif_main_outofmem(&g, out, delays);
7497 out_size = layers * stride;
7499 *delays = (
int *)stbi__malloc(layers *
sizeof(
int));
7501 return stbi__load_gif_main_outofmem(&g, out, delays);
7502 delays_size = layers *
sizeof(int);
7505 memcpy(out + ((layers - 1) * stride), u, stride);
7507 two_back = out - 2 * stride;
7511 (*delays)[layers - 1U] = g.delay;
7518 STBI_FREE(g.history);
7519 STBI_FREE(g.background);
7522 if (req_comp && req_comp != 4)
7523 out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
7528 return stbi__errpuc(
"not GIF",
"Image was not as a gif type.");
7532static void *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
7533 stbi__result_info *ri) {
7536 memset(&g, 0,
sizeof(g));
7539 u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
7548 if (req_comp && req_comp != 4)
7549 u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
7556 STBI_FREE(g.history);
7557 STBI_FREE(g.background);
7562static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp) {
7563 return stbi__gif_info_raw(s, x, y, comp);
7571static int stbi__hdr_test_core(stbi__context *s,
const char *signature) {
7573 for (i = 0; signature[i]; ++i)
7574 if (stbi__get8(s) != signature[i])
7580static int stbi__hdr_test(stbi__context *s) {
7581 int r = stbi__hdr_test_core(s,
"#?RADIANCE\n");
7584 r = stbi__hdr_test_core(s,
"#?RGBE\n");
7590#define STBI__HDR_BUFLEN 1024
7591static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer) {
7595 c = (char)stbi__get8(z);
7597 while (!stbi__at_eof(z) && c !=
'\n') {
7599 if (len == STBI__HDR_BUFLEN - 1) {
7601 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n');
7604 c = (char)stbi__get8(z);
7611static void stbi__hdr_convert(
float *output,
stbi_uc *input,
int req_comp) {
7612 if (input[3] != 0) {
7615 f1 = (float)ldexp(1.0f, input[3] - (
int)(128 + 8));
7617 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
7619 output[0] = input[0] * f1;
7620 output[1] = input[1] * f1;
7621 output[2] = input[2] * f1;
7632 output[0] = output[1] = output[2] = 0;
7643static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
7644 stbi__result_info *ri) {
7645 char buffer[STBI__HDR_BUFLEN];
7652 unsigned char count, value;
7653 int i, j, k, c1, c2, z;
7654 const char *headerToken;
7658 headerToken = stbi__hdr_gettoken(s, buffer);
7659 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
7660 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
7664 token = stbi__hdr_gettoken(s, buffer);
7667 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0)
7672 return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
7676 token = stbi__hdr_gettoken(s, buffer);
7677 if (strncmp(token,
"-Y ", 3))
7678 return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7680 height = (int)strtol(token, &token, 10);
7681 while (*token ==
' ') ++token;
7682 if (strncmp(token,
"+X ", 3))
7683 return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7685 width = (int)strtol(token, NULL, 10);
7687 if (height > STBI_MAX_DIMENSIONS)
7688 return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7689 if (width > STBI_MAX_DIMENSIONS)
7690 return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7700 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
7701 return stbi__errpf(
"too large",
"HDR image is too large");
7704 hdr_data = (
float *)stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
7706 return stbi__errpf(
"outofmem",
"Out of memory");
7710 if (width < 8 || width >= 32768) {
7712 for (j = 0; j < height; ++j) {
7713 for (i = 0; i < width; ++i) {
7716 stbi__getn(s, rgbe, 4);
7717 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
7724 for (j = 0; j < height; ++j) {
7727 len = stbi__get8(s);
7728 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
7735 rgbe[3] = (
stbi_uc)stbi__get8(s);
7736 stbi__hdr_convert(hdr_data, rgbe, req_comp);
7739 STBI_FREE(scanline);
7740 goto main_decode_loop;
7743 len |= stbi__get8(s);
7745 STBI_FREE(hdr_data);
7746 STBI_FREE(scanline);
7747 return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR");
7749 if (scanline == NULL) {
7750 scanline = (
stbi_uc *)stbi__malloc_mad2(width, 4, 0);
7752 STBI_FREE(hdr_data);
7753 return stbi__errpf(
"outofmem",
"Out of memory");
7757 for (k = 0; k < 4; ++k) {
7760 while ((nleft = width - i) > 0) {
7761 count = stbi__get8(s);
7764 value = stbi__get8(s);
7766 if ((count == 0) || (count > nleft)) {
7767 STBI_FREE(hdr_data);
7768 STBI_FREE(scanline);
7769 return stbi__errpf(
"corrupt",
"bad RLE data in HDR");
7771 for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = value;
7774 if ((count == 0) || (count > nleft)) {
7775 STBI_FREE(hdr_data);
7776 STBI_FREE(scanline);
7777 return stbi__errpf(
"corrupt",
"bad RLE data in HDR");
7779 for (z = 0; z < count; ++z) scanline[i++ * 4 + k] = stbi__get8(s);
7783 for (i = 0; i < width; ++i)
7784 stbi__hdr_convert(hdr_data + (j * width + i) * req_comp, scanline + i * 4, req_comp);
7787 STBI_FREE(scanline);
7793static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp) {
7794 char buffer[STBI__HDR_BUFLEN];
7806 if (stbi__hdr_test(s) == 0) {
7812 token = stbi__hdr_gettoken(s, buffer);
7815 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0)
7823 token = stbi__hdr_gettoken(s, buffer);
7824 if (strncmp(token,
"-Y ", 3)) {
7829 *y = (int)strtol(token, &token, 10);
7830 while (*token ==
' ') ++token;
7831 if (strncmp(token,
"+X ", 3)) {
7836 *x = (int)strtol(token, NULL, 10);
7843static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp) {
7845 stbi__bmp_data info;
7848 p = stbi__bmp_parse_header(s, &info);
7858 if (info.bpp == 24 && info.ma == 0xff000000)
7861 *comp = info.ma ? 4 : 3;
7868static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp) {
7869 int channelCount, dummy, depth;
7876 if (stbi__get32be(s) != 0x38425053) {
7880 if (stbi__get16be(s) != 1) {
7885 channelCount = stbi__get16be(s);
7886 if (channelCount < 0 || channelCount > 16) {
7890 *y = stbi__get32be(s);
7891 *x = stbi__get32be(s);
7892 depth = stbi__get16be(s);
7893 if (depth != 8 && depth != 16) {
7897 if (stbi__get16be(s) != 3) {
7905static int stbi__psd_is16(stbi__context *s) {
7906 int channelCount, depth;
7907 if (stbi__get32be(s) != 0x38425053) {
7911 if (stbi__get16be(s) != 1) {
7916 channelCount = stbi__get16be(s);
7917 if (channelCount < 0 || channelCount > 16) {
7921 STBI_NOTUSED(stbi__get32be(s));
7922 STBI_NOTUSED(stbi__get32be(s));
7923 depth = stbi__get16be(s);
7933static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp) {
7934 int act_comp = 0, num_packets = 0, chained, dummy;
7935 stbi__pic_packet packets[10];
7944 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
7951 *x = stbi__get16be(s);
7952 *y = stbi__get16be(s);
7953 if (stbi__at_eof(s)) {
7957 if ((*x) != 0 && (1 << 28) / (*x) < (*y)) {
7965 stbi__pic_packet *packet;
7967 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
7970 packet = &packets[num_packets++];
7971 chained = stbi__get8(s);
7972 packet->size = stbi__get8(s);
7973 packet->type = stbi__get8(s);
7974 packet->channel = stbi__get8(s);
7975 act_comp |= packet->channel;
7977 if (stbi__at_eof(s)) {
7981 if (packet->size != 8) {
7987 *comp = (act_comp & 0x10 ? 4 : 3);
8006static int stbi__pnm_test(stbi__context *s) {
8008 p = (char)stbi__get8(s);
8009 t = (char)stbi__get8(s);
8010 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
8017static void *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp,
8018 stbi__result_info *ri) {
8022 ri->bits_per_channel = stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n);
8023 if (ri->bits_per_channel == 0)
8026 if (s->img_y > STBI_MAX_DIMENSIONS)
8027 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
8028 if (s->img_x > STBI_MAX_DIMENSIONS)
8029 return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
8036 if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))
8037 return stbi__errpuc(
"too large",
"PNM too large");
8039 out = (
stbi_uc *)stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);
8041 return stbi__errpuc(
"outofmem",
"Out of memory");
8042 if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) {
8044 return stbi__errpuc(
"bad PNM",
"PNM file truncated");
8047 if (req_comp && req_comp != s->img_n) {
8048 if (ri->bits_per_channel == 16) {
8049 out = (
stbi_uc *)stbi__convert_format16((stbi__uint16 *)out, s->img_n, req_comp, s->img_x,
8052 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
8060static int stbi__pnm_isspace(
char c) {
8061 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
8064static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c) {
8066 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) *c = (char)stbi__get8(s);
8068 if (stbi__at_eof(s) || *c !=
'#')
8071 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r') *c = (
char)stbi__get8(s);
8075static int stbi__pnm_isdigit(
char c) {
8076 return c >=
'0' && c <=
'9';
8079static int stbi__pnm_getinteger(stbi__context *s,
char *c) {
8082 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
8083 value = value * 10 + (*c -
'0');
8084 *c = (char)stbi__get8(s);
8085 if ((value > 214748364) || (value == 214748364 && *c >
'7'))
8086 return stbi__err(
"integer parse overflow",
8087 "Parsing an integer in the PPM header overflowed a 32-bit int");
8093static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp) {
8107 p = (char)stbi__get8(s);
8108 t = (char)stbi__get8(s);
8109 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
8114 *comp = (t ==
'6') ? 3 : 1;
8116 c = (char)stbi__get8(s);
8117 stbi__pnm_skip_whitespace(s, &c);
8119 *x = stbi__pnm_getinteger(s, &c);
8121 return stbi__err(
"invalid width",
"PPM image header had zero or overflowing width");
8122 stbi__pnm_skip_whitespace(s, &c);
8124 *y = stbi__pnm_getinteger(s, &c);
8126 return stbi__err(
"invalid width",
"PPM image header had zero or overflowing width");
8127 stbi__pnm_skip_whitespace(s, &c);
8129 maxv = stbi__pnm_getinteger(s, &c);
8131 return stbi__err(
"max value > 65535",
"PPM image supports only 8-bit and 16-bit images");
8132 else if (maxv > 255)
8138static int stbi__pnm_is16(stbi__context *s) {
8139 if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)
8145static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp) {
8147 if (stbi__jpeg_info(s, x, y, comp))
8152 if (stbi__png_info(s, x, y, comp))
8157 if (stbi__gif_info(s, x, y, comp))
8162 if (stbi__bmp_info(s, x, y, comp))
8167 if (stbi__psd_info(s, x, y, comp))
8172 if (stbi__pic_info(s, x, y, comp))
8177 if (stbi__pnm_info(s, x, y, comp))
8182 if (stbi__hdr_info(s, x, y, comp))
8188 if (stbi__tga_info(s, x, y, comp))
8191 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
8194static int stbi__is_16_main(stbi__context *s) {
8196 if (stbi__png_is16(s))
8201 if (stbi__psd_is16(s))
8206 if (stbi__pnm_is16(s))
8212#ifndef STBI_NO_STDIO
8214 FILE *f = stbi__fopen(filename,
"rb");
8217 return stbi__err(
"can't fopen",
"Unable to open file");
8226 long pos = ftell(f);
8227 stbi__start_file(&s, f);
8228 r = stbi__info_main(&s, x, y, comp);
8229 fseek(f, pos, SEEK_SET);
8234 FILE *f = stbi__fopen(filename,
"rb");
8237 return stbi__err(
"can't fopen",
"Unable to open file");
8246 long pos = ftell(f);
8247 stbi__start_file(&s, f);
8248 r = stbi__is_16_main(&s);
8249 fseek(f, pos, SEEK_SET);
8256 stbi__start_mem(&s, buffer, len);
8257 return stbi__info_main(&s, x, y, comp);
8264 return stbi__info_main(&s, x, y, comp);
8269 stbi__start_mem(&s, buffer, len);
8270 return stbi__is_16_main(&s);
8276 return stbi__is_16_main(&s);
constexpr float pi
Definition types.hpp:10
@ STBI_default
Definition stb_image.h:377
@ STBI_rgb
Definition stb_image.h:381
@ STBI_rgb_alpha
Definition stb_image.h:382
@ STBI_grey
Definition stb_image.h:379
@ STBI_grey_alpha
Definition stb_image.h:380
STBIDEF stbi_us * stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF stbi_uc * stbi_load_from_file(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF float * stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
STBIDEF stbi_uc * stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma)
STBIDEF stbi_us * stbi_load_16(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
unsigned char stbi_uc
Definition stb_image.h:386
STBIDEF stbi_us * stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
#define STBIDEF
Definition stb_image.h:397
STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
STBIDEF int stbi_is_16_bit_from_file(FILE *f)
STBIDEF float * stbi_loadf(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)
STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
unsigned short stbi_us
Definition stb_image.h:387
STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_is_16_bit(char const *filename)
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp)
STBIDEF float * stbi_loadf_from_file(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user)
STBIDEF stbi_us * stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF int stbi_is_hdr_from_file(FILE *f)
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma)
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
STBIDEF const char * stbi_failure_reason(void)
STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply)
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
STBIDEF void stbi_image_free(void *retval_from_stbi_load)
STBIDEF stbi_uc * stbi_load(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels)
STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)
STBIDEF char * stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen)
STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
STBIDEF void stbi_hdr_to_ldr_scale(float scale)
STBIDEF int stbi_is_hdr(char const *filename)
STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
STBIDEF void stbi_ldr_to_hdr_scale(float scale)
STBIDEF char * stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen)
STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert)
Definition stb_image.h:410