127#ifndef STBI_INCLUDE_STB_IMAGE_H
128#define STBI_INCLUDE_STB_IMAGE_H
372#define STBI_VERSION 1
393#ifdef STB_IMAGE_STATIC
394#define STBIDEF static
396#define STBIDEF extern
411 int (*read) (
void* user,
char*
data,
int size);
412 void (*skip) (
void* user,
int n);
413 int (*eof) (
void* user);
434#ifdef STBI_WINDOWS_UTF8
435 STBIDEF int stbi_convert_wchar_to_utf8(
char*
buffer,
size_t bufferlen,
const wchar_t*
input);
455#ifndef STBI_NO_LINEAR
460 STBIDEF float*
stbi_loadf(
char const* filename,
int* x,
int* y,
int* channels_in_file,
int desired_channels);
470#ifndef STBI_NO_LINEAR
545#ifdef STB_IMAGE_IMPLEMENTATION
547#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
548 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
549 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
550 || defined(STBI_ONLY_ZLIB)
551#ifndef STBI_ONLY_JPEG
580#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
591#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
601#define STBI_ASSERT(x) assert(x)
605#define STBI_EXTERN extern "C"
607#define STBI_EXTERN extern
613#define stbi_inline inline
618#define stbi_inline __forceinline
621#ifndef STBI_NO_THREAD_LOCALS
622#if defined(__cplusplus) && __cplusplus >= 201103L
623#define STBI_THREAD_LOCAL thread_local
624#elif defined(__GNUC__) && __GNUC__ < 5
625#define STBI_THREAD_LOCAL __thread
626#elif defined(_MSC_VER)
627#define STBI_THREAD_LOCAL __declspec(thread)
628#elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
629#define STBI_THREAD_LOCAL _Thread_local
632#ifndef STBI_THREAD_LOCAL
634#define STBI_THREAD_LOCAL __thread
639#if defined(_MSC_VER) || defined(__SYMBIAN32__)
640typedef unsigned short stbi__uint16;
641typedef signed short stbi__int16;
642typedef unsigned int stbi__uint32;
643typedef signed int stbi__int32;
646typedef uint16_t stbi__uint16;
647typedef int16_t stbi__int16;
648typedef uint32_t stbi__uint32;
649typedef int32_t stbi__int32;
653typedef unsigned char validate_uint32[
sizeof(stbi__uint32) == 4 ? 1 : -1];
656#define STBI_NOTUSED(v) (void)(v)
658#define STBI_NOTUSED(v) (void)sizeof(v)
662#define STBI_HAS_LROTL
666#define stbi_lrot(x,y) _lrotl(x,y)
668#define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (-(y) & 31)))
671#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
673#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
676#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
680#define STBI_MALLOC(sz) malloc(sz)
681#define STBI_REALLOC(p,newsz) realloc(p,newsz)
682#define STBI_FREE(p) free(p)
685#ifndef STBI_REALLOC_SIZED
686#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
690#if defined(__x86_64__) || defined(_M_X64)
691#define STBI__X64_TARGET
692#elif defined(__i386) || defined(_M_IX86)
693#define STBI__X86_TARGET
696#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
707#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
722#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
724#include <emmintrin.h>
730static int stbi__cpuid3(
void)
737static int stbi__cpuid3(
void)
749#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
751#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
752static int stbi__sse2_available(
void)
754 int info3 = stbi__cpuid3();
755 return ((info3 >> 26) & 1) != 0;
760#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
762#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
763static int stbi__sse2_available(
void)
776#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
783#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
785#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
789#ifndef STBI_SIMD_ALIGN
790#define STBI_SIMD_ALIGN(type, name) type name
793#ifndef STBI_MAX_DIMENSIONS
794#define STBI_MAX_DIMENSIONS (1 << 24)
805 stbi__uint32 img_x, img_y;
806 int img_n, img_out_n;
811 int read_from_callbacks;
814 int callback_already_read;
816 stbi_uc* img_buffer, * img_buffer_end;
817 stbi_uc* img_buffer_original, * img_buffer_original_end;
821static void stbi__refill_buffer(stbi__context*
s);
824static void stbi__start_mem(stbi__context*
s,
stbi_uc const*
buffer,
int len)
827 s->read_from_callbacks = 0;
828 s->callback_already_read = 0;
830 s->img_buffer_end =
s->img_buffer_original_end = (
stbi_uc*)
buffer + len;
837 s->io_user_data = user;
838 s->buflen =
sizeof(
s->buffer_start);
839 s->read_from_callbacks = 1;
840 s->callback_already_read = 0;
841 s->img_buffer =
s->img_buffer_original =
s->buffer_start;
842 stbi__refill_buffer(
s);
843 s->img_buffer_original_end =
s->img_buffer_end;
848static int stbi__stdio_read(
void* user,
char*
data,
int size)
850 return (
int)fread(
data, 1, size, (FILE*)user);
853static void stbi__stdio_skip(
void* user,
int n)
856 fseek((FILE*)user, n, SEEK_CUR);
857 ch = fgetc((FILE*)user);
859 ungetc(ch, (FILE*)user);
863static int stbi__stdio_eof(
void* user)
865 return feof((FILE*)user) || ferror((FILE*)user);
875static void stbi__start_file(stbi__context*
s, FILE* f)
877 stbi__start_callbacks(
s, &stbi__stdio_callbacks, (
void*)f);
884static void stbi__rewind(stbi__context*
s)
889 s->img_buffer =
s->img_buffer_original;
890 s->img_buffer_end =
s->img_buffer_original_end;
901 int bits_per_channel;
907static int stbi__jpeg_test(stbi__context*
s);
908static void* stbi__jpeg_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, 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, stbi__result_info* ri);
915static int stbi__png_info(stbi__context*
s,
int* x,
int* y,
int* comp);
916static int stbi__png_is16(stbi__context*
s);
920static int stbi__bmp_test(stbi__context*
s);
921static void* stbi__bmp_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
922static int stbi__bmp_info(stbi__context*
s,
int* x,
int* y,
int* comp);
926static int stbi__tga_test(stbi__context*
s);
927static void* stbi__tga_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
928static int stbi__tga_info(stbi__context*
s,
int* x,
int* y,
int* comp);
932static int stbi__psd_test(stbi__context*
s);
933static void* stbi__psd_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri,
int bpc);
934static int stbi__psd_info(stbi__context*
s,
int* x,
int* y,
int* comp);
935static int stbi__psd_is16(stbi__context*
s);
939static int stbi__hdr_test(stbi__context*
s);
940static float* stbi__hdr_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
941static int stbi__hdr_info(stbi__context*
s,
int* x,
int* y,
int* comp);
945static int stbi__pic_test(stbi__context*
s);
946static void* stbi__pic_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
947static int stbi__pic_info(stbi__context*
s,
int* x,
int* y,
int* comp);
951static int stbi__gif_test(stbi__context*
s);
952static void* stbi__gif_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
953static void* stbi__load_gif_main(stbi__context*
s,
int** delays,
int* x,
int* y,
int* z,
int* comp,
int req_comp);
954static int stbi__gif_info(stbi__context*
s,
int* x,
int* y,
int* comp);
958static int stbi__pnm_test(stbi__context*
s);
959static void* stbi__pnm_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri);
960static int stbi__pnm_info(stbi__context*
s,
int* x,
int* y,
int* comp);
961static int stbi__pnm_is16(stbi__context*
s);
965#ifdef STBI_THREAD_LOCAL
968const char* stbi__g_failure_reason;
972 return stbi__g_failure_reason;
975#ifndef STBI_NO_FAILURE_STRINGS
976static int stbi__err(
const char* str)
978 stbi__g_failure_reason = str;
983static void* stbi__malloc(
size_t size)
985 return STBI_MALLOC(size);
1000static int stbi__addsizes_valid(
int a,
int b)
1002 if (
b < 0)
return 0;
1007 return a <= INT_MAX -
b;
1012static int stbi__mul2sizes_valid(
int a,
int b)
1014 if (
a < 0 ||
b < 0)
return 0;
1015 if (
b == 0)
return 1;
1017 return a <= INT_MAX /
b;
1020#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1022static int stbi__mad2sizes_valid(
int a,
int b,
int add)
1024 return stbi__mul2sizes_valid(
a,
b) && stbi__addsizes_valid(
a *
b, add);
1029static int stbi__mad3sizes_valid(
int a,
int b,
int c,
int add)
1031 return stbi__mul2sizes_valid(
a,
b) && stbi__mul2sizes_valid(
a *
b, c) &&
1032 stbi__addsizes_valid(
a *
b * c, add);
1036#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1037static int stbi__mad4sizes_valid(
int a,
int b,
int c,
int d,
int add)
1039 return stbi__mul2sizes_valid(
a,
b) && stbi__mul2sizes_valid(
a *
b, c) &&
1040 stbi__mul2sizes_valid(
a *
b * c, d) && stbi__addsizes_valid(
a *
b * c * d, add);
1044#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1046static void* stbi__malloc_mad2(
int a,
int b,
int add)
1048 if (!stbi__mad2sizes_valid(
a,
b, add))
return NULL;
1049 return stbi__malloc(
a *
b + add);
1053static void* stbi__malloc_mad3(
int a,
int b,
int c,
int add)
1055 if (!stbi__mad3sizes_valid(
a,
b, c, add))
return NULL;
1056 return stbi__malloc(
a *
b * c + add);
1059#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1060static void* stbi__malloc_mad4(
int a,
int b,
int c,
int d,
int add)
1062 if (!stbi__mad4sizes_valid(
a,
b, c, d, add))
return NULL;
1063 return stbi__malloc(
a *
b * c * d + add);
1068static int stbi__addints_valid(
int a,
int b)
1070 if ((
a >= 0) != (
b >= 0))
return 1;
1071 if (
a < 0 &&
b < 0)
return a >= INT_MIN -
b;
1072 return a <= INT_MAX -
b;
1076static int stbi__mul2shorts_valid(
short a,
short b)
1078 if (
b == 0 ||
b == -1)
return 1;
1079 if ((
a >= 0) == (
b >= 0))
return a <= SHRT_MAX /
b;
1080 if (
b < 0)
return a <= SHRT_MIN /
b;
1081 return a >= SHRT_MIN /
b;
1088#ifdef STBI_NO_FAILURE_STRINGS
1089#define stbi__err(x,y) 0
1090#elif defined(STBI_FAILURE_USERMSG)
1091#define stbi__err(x,y) stbi__err(y)
1093#define stbi__err(x,y) stbi__err(x)
1096#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
1097#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
1101 STBI_FREE(retval_from_stbi_load);
1104#ifndef STBI_NO_LINEAR
1105static float* stbi__ldr_to_hdr(
stbi_uc*
data,
int x,
int y,
int comp);
1109static stbi_uc* stbi__hdr_to_ldr(
float*
data,
int x,
int y,
int comp);
1112static int stbi__vertically_flip_on_load_global = 0;
1116 stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
1119#ifndef STBI_THREAD_LOCAL
1120#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global
1122static STBI_THREAD_LOCAL
int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
1126 stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
1127 stbi__vertically_flip_on_load_set = 1;
1130#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \
1131 ? stbi__vertically_flip_on_load_local \
1132 : stbi__vertically_flip_on_load_global)
1135static void* stbi__load_main(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri,
int bpc)
1137 memset(ri, 0,
sizeof(*ri));
1138 ri->bits_per_channel = 8;
1139 ri->channel_order = STBI_ORDER_RGB;
1140 ri->num_channels = 0;
1145 if (stbi__png_test(
s))
return stbi__png_load(
s, x, y, comp, req_comp, ri);
1148 if (stbi__bmp_test(
s))
return stbi__bmp_load(
s, x, y, comp, req_comp, ri);
1151 if (stbi__gif_test(
s))
return stbi__gif_load(
s, x, y, comp, req_comp, ri);
1154 if (stbi__psd_test(
s))
return stbi__psd_load(
s, x, y, comp, req_comp, ri, bpc);
1159 if (stbi__pic_test(
s))
return stbi__pic_load(
s, x, y, comp, req_comp, ri);
1166 if (stbi__jpeg_test(
s))
return stbi__jpeg_load(
s, x, y, comp, req_comp, ri);
1169 if (stbi__pnm_test(
s))
return stbi__pnm_load(
s, x, y, comp, req_comp, ri);
1173 if (stbi__hdr_test(
s)) {
1174 float* hdr = stbi__hdr_load(
s, x, y, comp, req_comp, ri);
1175 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
1181 if (stbi__tga_test(
s))
1182 return stbi__tga_load(
s, x, y, comp, req_comp, ri);
1185 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
1188static stbi_uc* stbi__convert_16_to_8(stbi__uint16* orig,
int w,
int h,
int channels)
1191 int img_len = w * h * channels;
1194 reduced = (
stbi_uc*)stbi__malloc(img_len);
1195 if (reduced ==
NULL)
return stbi__errpuc(
"outofmem",
"Out of memory");
1197 for (
i = 0;
i < img_len; ++
i)
1198 reduced[
i] = (
stbi_uc)((orig[
i] >> 8) & 0xFF);
1204static stbi__uint16* stbi__convert_8_to_16(
stbi_uc* orig,
int w,
int h,
int channels)
1207 int img_len = w * h * channels;
1208 stbi__uint16* enlarged;
1210 enlarged = (stbi__uint16*)stbi__malloc(img_len * 2);
1211 if (enlarged ==
NULL)
return (stbi__uint16*)stbi__errpuc(
"outofmem",
"Out of memory");
1213 for (
i = 0;
i < img_len; ++
i)
1214 enlarged[
i] = (stbi__uint16)((orig[
i] << 8) + orig[
i]);
1220static void stbi__vertical_flip(
void*
image,
int w,
int h,
int bytes_per_pixel)
1223 size_t bytes_per_row = (size_t)w * bytes_per_pixel;
1227 for (row = 0; row < (h >> 1); row++) {
1231 size_t bytes_left = bytes_per_row;
1232 while (bytes_left) {
1233 size_t bytes_copy = (bytes_left <
sizeof(temp)) ? bytes_left :
sizeof(temp);
1234 memcpy(temp, row0, bytes_copy);
1235 memcpy(row0, row1, bytes_copy);
1236 memcpy(row1, temp, bytes_copy);
1239 bytes_left -= bytes_copy;
1245static void stbi__vertical_flip_slices(
void*
image,
int w,
int h,
int z,
int bytes_per_pixel)
1248 int slice_size = w * h * bytes_per_pixel;
1252 stbi__vertical_flip(
bytes, w, h, bytes_per_pixel);
1253 bytes += slice_size;
1258static unsigned char* stbi__load_and_postprocess_8bit(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp)
1260 stbi__result_info ri;
1261 void*
result = stbi__load_main(
s, x, y, comp, req_comp, &ri, 8);
1267 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1269 if (ri.bits_per_channel != 8) {
1270 result = stbi__convert_16_to_8((stbi__uint16*)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1271 ri.bits_per_channel = 8;
1276 if (stbi__vertically_flip_on_load) {
1277 int channels = req_comp ? req_comp : *comp;
1278 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
stbi_uc));
1281 return (
unsigned char*)
result;
1284static stbi__uint16* stbi__load_and_postprocess_16bit(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp)
1286 stbi__result_info ri;
1287 void*
result = stbi__load_main(
s, x, y, comp, req_comp, &ri, 16);
1293 STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1295 if (ri.bits_per_channel != 16) {
1296 result = stbi__convert_8_to_16((
stbi_uc*)result, *x, *y, req_comp == 0 ? *comp : req_comp);
1297 ri.bits_per_channel = 16;
1303 if (stbi__vertically_flip_on_load) {
1304 int channels = req_comp ? req_comp : *comp;
1305 stbi__vertical_flip(result, *x, *y, channels *
sizeof(stbi__uint16));
1308 return (stbi__uint16*)
result;
1311#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
1312static void stbi__float_postprocess(
float* result,
int* x,
int* y,
int* comp,
int req_comp)
1314 if (stbi__vertically_flip_on_load && result !=
NULL) {
1315 int channels = req_comp ? req_comp : *comp;
1316 stbi__vertical_flip(result, *x, *y, channels *
sizeof(
float));
1321#ifndef STBI_NO_STDIO
1323#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1324STBI_EXTERN __declspec(dllimport)
int __stdcall MultiByteToWideChar(
unsigned int cp,
unsigned long flags,
const char* str,
int cbmb,
wchar_t* widestr,
int cchwide);
1325STBI_EXTERN __declspec(dllimport)
int __stdcall WideCharToMultiByte(
unsigned int cp,
unsigned long flags,
const wchar_t* widestr,
int cchwide,
char* str,
int cbmb,
const char* defchar,
int* used_default);
1328#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1329STBIDEF int stbi_convert_wchar_to_utf8(
char*
buffer,
size_t bufferlen,
const wchar_t*
input)
1335static FILE* stbi__fopen(
char const* filename,
char const* mode)
1338#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1340 wchar_t wFilename[1024];
1341 if (0 == MultiByteToWideChar(65001 , 0, filename, -1, wFilename,
sizeof(wFilename) /
sizeof(*wFilename)))
1344 if (0 == MultiByteToWideChar(65001 , 0, mode, -1, wMode,
sizeof(wMode) /
sizeof(*wMode)))
1347#if defined(_MSC_VER) && _MSC_VER >= 1400
1348 if (0 != _wfopen_s(&f, wFilename, wMode))
1351 f = _wfopen(wFilename, wMode);
1354#elif defined(_MSC_VER) && _MSC_VER >= 1400
1355 if (0 !=
fopen_s(&f, filename, mode))
1358 f = fopen(filename, mode);
1366 FILE* f = stbi__fopen(filename,
"rb");
1368 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1378 stbi__start_file(&
s, f);
1379 result = stbi__load_and_postprocess_8bit(&
s, x, y, comp, req_comp);
1382 fseek(f, -(
int)(
s.img_buffer_end -
s.img_buffer), SEEK_CUR);
1391 stbi__start_file(&
s, f);
1392 result = stbi__load_and_postprocess_16bit(&
s, x, y, comp, req_comp);
1395 fseek(f, -(
int)(
s.img_buffer_end -
s.img_buffer), SEEK_CUR);
1402 FILE* f = stbi__fopen(filename,
"rb");
1404 if (!f)
return (
stbi_us*)stbi__errpuc(
"can't fopen",
"Unable to open file");
1416 stbi__start_mem(&
s,
buffer, len);
1417 return stbi__load_and_postprocess_16bit(&
s, x, y, channels_in_file, desired_channels);
1424 return stbi__load_and_postprocess_16bit(&
s, x, y, channels_in_file, desired_channels);
1430 stbi__start_mem(&
s,
buffer, len);
1431 return stbi__load_and_postprocess_8bit(&
s, x, y, comp, req_comp);
1438 return stbi__load_and_postprocess_8bit(&
s, x, y, comp, req_comp);
1446 stbi__start_mem(&
s,
buffer, len);
1448 result = (
unsigned char*)stbi__load_gif_main(&
s, delays, x, y, z, comp, req_comp);
1449 if (stbi__vertically_flip_on_load) {
1450 stbi__vertical_flip_slices(result, *x, *y, *z, *comp);
1457#ifndef STBI_NO_LINEAR
1458static float* stbi__loadf_main(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp)
1460 unsigned char*
data;
1462 if (stbi__hdr_test(
s)) {
1463 stbi__result_info ri;
1464 float* hdr_data = stbi__hdr_load(
s, x, y, comp, req_comp, &ri);
1466 stbi__float_postprocess(hdr_data, x, y, comp, req_comp);
1470 data = stbi__load_and_postprocess_8bit(
s, x, y, comp, req_comp);
1472 return stbi__ldr_to_hdr(
data, *x, *y, req_comp ? req_comp : *comp);
1473 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1479 stbi__start_mem(&
s,
buffer, len);
1480 return stbi__loadf_main(&
s, x, y, comp, req_comp);
1487 return stbi__loadf_main(&
s, x, y, comp, req_comp);
1490#ifndef STBI_NO_STDIO
1491STBIDEF float*
stbi_loadf(
char const* filename,
int* x,
int* y,
int* comp,
int req_comp)
1494 FILE* f = stbi__fopen(filename,
"rb");
1495 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1504 stbi__start_file(&
s, f);
1505 return stbi__loadf_main(&
s, x, y, comp, req_comp);
1519 stbi__start_mem(&
s,
buffer, len);
1520 return stbi__hdr_test(&
s);
1528#ifndef STBI_NO_STDIO
1531 FILE* f = stbi__fopen(filename,
"rb");
1543 long pos = ftell(f);
1546 stbi__start_file(&
s, f);
1547 res = stbi__hdr_test(&
s);
1548 fseek(f, pos, SEEK_SET);
1562 return stbi__hdr_test(&
s);
1570#ifndef STBI_NO_LINEAR
1571static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f;
1577static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f;
1590 STBI__SCAN_load = 0,
1595static void stbi__refill_buffer(stbi__context*
s)
1597 int n = (
s->io.read)(
s->io_user_data, (
char*)
s->buffer_start,
s->buflen);
1598 s->callback_already_read += (int)(
s->img_buffer -
s->img_buffer_original);
1602 s->read_from_callbacks = 0;
1603 s->img_buffer =
s->buffer_start;
1604 s->img_buffer_end =
s->buffer_start + 1;
1608 s->img_buffer =
s->buffer_start;
1609 s->img_buffer_end =
s->buffer_start + n;
1613stbi_inline
static stbi_uc stbi__get8(stbi__context*
s)
1615 if (
s->img_buffer <
s->img_buffer_end)
1616 return *
s->img_buffer++;
1617 if (
s->read_from_callbacks) {
1618 stbi__refill_buffer(
s);
1619 return *
s->img_buffer++;
1624#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1627stbi_inline
static int stbi__at_eof(stbi__context*
s)
1630 if (!(
s->io.eof)(
s->io_user_data))
return 0;
1633 if (
s->read_from_callbacks == 0)
return 1;
1636 return s->img_buffer >=
s->img_buffer_end;
1640#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)
1643static void stbi__skip(stbi__context*
s,
int n)
1647 s->img_buffer =
s->img_buffer_end;
1651 int blen = (int)(
s->img_buffer_end -
s->img_buffer);
1653 s->img_buffer =
s->img_buffer_end;
1654 (
s->io.skip)(
s->io_user_data, n - blen);
1662#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
1668 int blen = (int)(
s->img_buffer_end -
s->img_buffer);
1672 memcpy(
buffer,
s->img_buffer, blen);
1674 count = (
s->io.read)(
s->io_user_data, (
char*)
buffer + blen, n - blen);
1675 res = (
count == (n - blen));
1676 s->img_buffer =
s->img_buffer_end;
1681 if (
s->img_buffer + n <= s->img_buffer_end) {
1682 memcpy(
buffer,
s->img_buffer, n);
1691#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1694static int stbi__get16be(stbi__context*
s)
1696 int z = stbi__get8(
s);
1697 return (z << 8) + stbi__get8(
s);
1701#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1704static stbi__uint32 stbi__get32be(stbi__context*
s)
1706 stbi__uint32 z = stbi__get16be(
s);
1707 return (z << 16) + stbi__get16be(
s);
1711#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1714static int stbi__get16le(stbi__context*
s)
1716 int z = stbi__get8(
s);
1717 return z + (stbi__get8(
s) << 8);
1722static stbi__uint32 stbi__get32le(stbi__context*
s)
1724 stbi__uint32 z = stbi__get16le(
s);
1725 z += (stbi__uint32)stbi__get16le(
s) << 16;
1730#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255))
1732#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1746static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1748 return (
stbi_uc)(((r * 77) + (g * 150) + (29 *
b)) >> 8);
1752#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1755static unsigned char* stbi__convert_format(
unsigned char*
data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1758 unsigned char* good;
1760 if (req_comp == img_n)
return data;
1761 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1763 good = (
unsigned char*)stbi__malloc_mad3(req_comp, x, y, 0);
1766 return stbi__errpuc(
"outofmem",
"Out of memory");
1769 for (j = 0; j < (int)y; ++j) {
1770 unsigned char* src =
data + j * x * img_n;
1771 unsigned char* dest = good + j * x * req_comp;
1773#define STBI__COMBO(a,b) ((a)*8+(b))
1774#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1777 switch (STBI__COMBO(img_n, req_comp)) {
1778 STBI__CASE(1, 2) { dest[0] = src[0]; dest[1] = 255; }
break;
1779 STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1780 STBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = 255; }
break;
1781 STBI__CASE(2, 1) { dest[0] = src[0]; }
break;
1782 STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1783 STBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = src[1]; }
break;
1784 STBI__CASE(3, 4) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; dest[3] = 255; }
break;
1785 STBI__CASE(3, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); }
break;
1786 STBI__CASE(3, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); dest[1] = 255; }
break;
1787 STBI__CASE(4, 1) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); }
break;
1788 STBI__CASE(4, 2) { dest[0] = stbi__compute_y(src[0], src[1], src[2]); dest[1] = src[3]; }
break;
1789 STBI__CASE(4, 3) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; }
break;
1790 default: STBI_ASSERT(0); STBI_FREE(
data); STBI_FREE(good);
return stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1800#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1803static stbi__uint16 stbi__compute_y_16(
int r,
int g,
int b)
1805 return (stbi__uint16)(((r * 77) + (g * 150) + (29 *
b)) >> 8);
1809#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1812static stbi__uint16* stbi__convert_format16(stbi__uint16*
data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1817 if (req_comp == img_n)
return data;
1818 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1820 good = (stbi__uint16*)stbi__malloc(req_comp * x * y * 2);
1823 return (stbi__uint16*)stbi__errpuc(
"outofmem",
"Out of memory");
1826 for (j = 0; j < (int)y; ++j) {
1827 stbi__uint16* src =
data + j * x * img_n;
1828 stbi__uint16* dest = good + j * x * req_comp;
1830#define STBI__COMBO(a,b) ((a)*8+(b))
1831#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1834 switch (STBI__COMBO(img_n, req_comp)) {
1835 STBI__CASE(1, 2) { dest[0] = src[0]; dest[1] = 0xffff; }
break;
1836 STBI__CASE(1, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1837 STBI__CASE(1, 4) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = 0xffff; }
break;
1838 STBI__CASE(2, 1) { dest[0] = src[0]; }
break;
1839 STBI__CASE(2, 3) { dest[0] = dest[1] = dest[2] = src[0]; }
break;
1840 STBI__CASE(2, 4) { dest[0] = dest[1] = dest[2] = src[0]; dest[3] = src[1]; }
break;
1841 STBI__CASE(3, 4) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; dest[3] = 0xffff; }
break;
1842 STBI__CASE(3, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); }
break;
1843 STBI__CASE(3, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); dest[1] = 0xffff; }
break;
1844 STBI__CASE(4, 1) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); }
break;
1845 STBI__CASE(4, 2) { dest[0] = stbi__compute_y_16(src[0], src[1], src[2]); dest[1] = src[3]; }
break;
1846 STBI__CASE(4, 3) { dest[0] = src[0]; dest[1] = src[1]; dest[2] = src[2]; }
break;
1847 default: STBI_ASSERT(0); STBI_FREE(
data); STBI_FREE(good);
return (stbi__uint16*)stbi__errpuc(
"unsupported",
"Unsupported format conversion");
1857#ifndef STBI_NO_LINEAR
1858static float* stbi__ldr_to_hdr(
stbi_uc*
data,
int x,
int y,
int comp)
1863 output = (
float*)stbi__malloc_mad4(x, y, comp,
sizeof(
float), 0);
1864 if (
output ==
NULL) { STBI_FREE(
data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1866 if (comp & 1) n = comp;
else n = comp - 1;
1867 for (
i = 0;
i < x * y; ++
i) {
1868 for (k = 0; k < n; ++k) {
1869 output[
i * comp + k] = (float)(pow(
data[
i * comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1873 for (
i = 0;
i < x * y; ++
i) {
1883#define stbi__float2int(x) ((int) (x))
1884static stbi_uc* stbi__hdr_to_ldr(
float*
data,
int x,
int y,
int comp)
1890 if (
output ==
NULL) { STBI_FREE(
data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1892 if (comp & 1) n = comp;
else n = comp - 1;
1893 for (
i = 0;
i < x * y; ++
i) {
1894 for (k = 0; k < n; ++k) {
1895 float z = (float)pow(
data[
i * comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1897 if (z > 255) z = 255;
1901 float z =
data[
i * comp + k] * 255 + 0.5f;
1903 if (z > 255) z = 255;
1942 stbi__uint16
code[256];
1945 unsigned int maxcode[18];
1952 stbi__huffman huff_dc[4];
1953 stbi__huffman huff_ac[4];
1954 stbi__uint16 dequant[4][64];
1955 stbi__int16 fast_ac[4][1 << FAST_BITS];
1958 int img_h_max, img_v_max;
1959 int img_mcu_x, img_mcu_y;
1960 int img_mcu_w, img_mcu_h;
1973 void* raw_data, * raw_coeff;
1976 int coeff_w, coeff_h;
1979 stbi__uint32 code_buffer;
1981 unsigned char marker;
1991 int app14_color_transform;
1994 int scan_n, order[4];
1995 int restart_interval, todo;
1998 void (*idct_block_kernel)(
stbi_uc*
out,
int out_stride,
short data[64]);
2003static int stbi__build_huffman(stbi__huffman* h,
int*
count)
2008 for (
i = 0;
i < 16; ++
i) {
2009 for (j = 0; j <
count[
i]; ++j) {
2011 if (k >= 257)
return stbi__err(
"bad size list",
"Corrupt JPEG");
2019 for (j = 1; j <= 16; ++j) {
2021 h->delta[j] = k -
code;
2022 if (h->size[k] == j) {
2023 while (h->size[k] == j)
2024 h->code[k++] = (stbi__uint16)(
code++);
2025 if (
code - 1 >= (1u << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
2028 h->maxcode[j] =
code << (16 - j);
2031 h->maxcode[j] = 0xffffffff;
2034 memset(h->fast, 255, 1 << FAST_BITS);
2035 for (
i = 0;
i < k; ++
i) {
2037 if (
s <= FAST_BITS) {
2038 int c = h->code[
i] << (FAST_BITS -
s);
2039 int m = 1 << (FAST_BITS -
s);
2040 for (j = 0; j < m; ++j) {
2050static void stbi__build_fast_ac(stbi__int16* fast_ac, stbi__huffman* h)
2053 for (
i = 0;
i < (1 << FAST_BITS); ++
i) {
2057 int rs = h->values[fast];
2058 int run = (rs >> 4) & 15;
2059 int magbits = rs & 15;
2060 int len = h->size[fast];
2062 if (magbits && len + magbits <= FAST_BITS) {
2064 int k = ((
i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
2065 int m = 1 << (magbits - 1);
2066 if (k < m) k += (~0U << magbits) + 1;
2068 if (k >= -128 && k <= 127)
2069 fast_ac[
i] = (stbi__int16)((k * 256) + (run * 16) + (len + magbits));
2075static void stbi__grow_buffer_unsafe(stbi__jpeg* j)
2078 unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
2080 int c = stbi__get8(j->s);
2081 while (c == 0xff) c = stbi__get8(j->s);
2083 j->marker = (
unsigned char)c;
2088 j->code_buffer |=
b << (24 - j->code_bits);
2090 }
while (j->code_bits <= 24);
2094static const stbi__uint32 stbi__bmask[17] = { 0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535 };
2097stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg* j, stbi__huffman* h)
2102 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2106 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2110 if (
s > j->code_bits)
2112 j->code_buffer <<=
s;
2114 return h->values[k];
2123 temp = j->code_buffer >> 16;
2124 for (k = FAST_BITS + 1; ; ++k)
2125 if (temp < h->maxcode[k])
2133 if (k > j->code_bits)
2137 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
2138 if (c < 0 || c >= 256)
2140 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
2144 j->code_buffer <<= k;
2145 return h->values[c];
2149static const int stbi__jbias[16] = { 0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767 };
2153stbi_inline
static int stbi__extend_receive(stbi__jpeg* j,
int n)
2157 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
2158 if (j->code_bits < n)
return 0;
2160 sgn = j->code_buffer >> 31;
2161 k = stbi_lrot(j->code_buffer, n);
2162 j->code_buffer = k & ~stbi__bmask[n];
2163 k &= stbi__bmask[n];
2165 return k + (stbi__jbias[n] & (sgn - 1));
2169stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg* j,
int n)
2172 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
2173 if (j->code_bits < n)
return 0;
2174 k = stbi_lrot(j->code_buffer, n);
2175 j->code_buffer = k & ~stbi__bmask[n];
2176 k &= stbi__bmask[n];
2181stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg* j)
2184 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
2185 if (j->code_bits < 1)
return 0;
2187 j->code_buffer <<= 1;
2189 return k & 0x80000000;
2194static const stbi_uc stbi__jpeg_dezigzag[64 + 15] =
2196 0, 1, 8, 16, 9, 2, 3, 10,
2197 17, 24, 32, 25, 18, 11, 4, 5,
2198 12, 19, 26, 33, 40, 48, 41, 34,
2199 27, 20, 13, 6, 7, 14, 21, 28,
2200 35, 42, 49, 56, 57, 50, 43, 36,
2201 29, 22, 15, 23, 30, 37, 44, 51,
2202 58, 59, 52, 45, 38, 31, 39, 46,
2203 53, 60, 61, 54, 47, 55, 62, 63,
2205 63, 63, 63, 63, 63, 63, 63, 63,
2206 63, 63, 63, 63, 63, 63, 63
2210static int stbi__jpeg_decode_block(stbi__jpeg* j,
short data[64], stbi__huffman* hdc, stbi__huffman* hac, stbi__int16* fac,
int b, stbi__uint16* dequant)
2215 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2216 t = stbi__jpeg_huff_decode(j, hdc);
2217 if (t < 0 || t > 15)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2220 memset(
data, 0, 64 *
sizeof(
data[0]));
2222 diff = t ? stbi__extend_receive(j, t) : 0;
2223 if (!stbi__addints_valid(j->img_comp[
b].dc_pred, diff))
return stbi__err(
"bad delta",
"Corrupt JPEG");
2224 dc = j->img_comp[
b].dc_pred + diff;
2225 j->img_comp[
b].dc_pred = dc;
2226 if (!stbi__mul2shorts_valid(dc, dequant[0]))
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2227 data[0] = (short)(dc * dequant[0]);
2234 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2235 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2240 if (
s > j->code_bits)
return stbi__err(
"bad huffman code",
"Combined length longer than code bits available");
2241 j->code_buffer <<=
s;
2244 zig = stbi__jpeg_dezigzag[k++];
2245 data[zig] = (short)((r >> 8) * dequant[zig]);
2248 int rs = stbi__jpeg_huff_decode(j, hac);
2249 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2253 if (rs != 0xf0)
break;
2259 zig = stbi__jpeg_dezigzag[k++];
2260 data[zig] = (short)(stbi__extend_receive(j,
s) * dequant[zig]);
2267static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg* j,
short data[64], stbi__huffman* hdc,
int b)
2271 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2273 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2275 if (j->succ_high == 0) {
2277 memset(
data, 0, 64 *
sizeof(
data[0]));
2278 t = stbi__jpeg_huff_decode(j, hdc);
2279 if (t < 0 || t > 15)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2280 diff = t ? stbi__extend_receive(j, t) : 0;
2282 if (!stbi__addints_valid(j->img_comp[
b].dc_pred, diff))
return stbi__err(
"bad delta",
"Corrupt JPEG");
2283 dc = j->img_comp[
b].dc_pred + diff;
2284 j->img_comp[
b].dc_pred = dc;
2285 if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low))
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2286 data[0] = (short)(dc * (1 << j->succ_low));
2290 if (stbi__jpeg_get_bit(j))
2291 data[0] += (
short)(1 << j->succ_low);
2298static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg* j,
short data[64], stbi__huffman* hac, stbi__int16* fac)
2301 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
2303 if (j->succ_high == 0) {
2304 int shift = j->succ_low;
2315 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2316 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
2321 if (
s > j->code_bits)
return stbi__err(
"bad huffman code",
"Combined length longer than code bits available");
2322 j->code_buffer <<=
s;
2324 zig = stbi__jpeg_dezigzag[k++];
2325 data[zig] = (short)((r >> 8) * (1 << shift));
2328 int rs = stbi__jpeg_huff_decode(j, hac);
2329 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2334 j->eob_run = (1 << r);
2336 j->eob_run += stbi__jpeg_get_bits(j, r);
2344 zig = stbi__jpeg_dezigzag[k++];
2345 data[zig] = (short)(stbi__extend_receive(j,
s) * (1 << shift));
2348 }
while (k <= j->spec_end);
2353 short bit = (short)(1 << j->succ_low);
2357 for (k = j->spec_start; k <= j->spec_end; ++k) {
2358 short*
p = &
data[stbi__jpeg_dezigzag[k]];
2360 if (stbi__jpeg_get_bit(j))
2361 if ((*
p & bit) == 0) {
2373 int rs = stbi__jpeg_huff_decode(j, hac);
2374 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2379 j->eob_run = (1 << r) - 1;
2381 j->eob_run += stbi__jpeg_get_bits(j, r);
2391 if (
s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
2393 if (stbi__jpeg_get_bit(j))
2400 while (k <= j->spec_end) {
2401 short*
p = &
data[stbi__jpeg_dezigzag[k++]];
2403 if (stbi__jpeg_get_bit(j))
2404 if ((*
p & bit) == 0) {
2419 }
while (k <= j->spec_end);
2426stbi_inline
static stbi_uc stbi__clamp(
int x)
2429 if ((
unsigned int)x > 255) {
2430 if (x < 0)
return 0;
2431 if (x > 255)
return 255;
2436#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
2437#define stbi__fsh(x) ((x) * 4096)
2440#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2441 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2444 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
2445 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
2446 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
2449 t0 = stbi__fsh(p2+p3); \
2450 t1 = stbi__fsh(p2-p3); \
2463 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
2464 t0 = t0*stbi__f2f( 0.298631336f); \
2465 t1 = t1*stbi__f2f( 2.053119869f); \
2466 t2 = t2*stbi__f2f( 3.072711026f); \
2467 t3 = t3*stbi__f2f( 1.501321110f); \
2468 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
2469 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
2470 p3 = p3*stbi__f2f(-1.961570560f); \
2471 p4 = p4*stbi__f2f(-0.390180644f); \
2477static void stbi__idct_block(
stbi_uc*
out,
int out_stride,
short data[64])
2479 int i, val[64], * v = val;
2484 for (
i = 0;
i < 8; ++
i, ++d, ++v) {
2486 if (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0
2487 && d[40] == 0 && d[48] == 0 && d[56] == 0) {
2492 int dcterm = d[0] * 4;
2493 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2496 STBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56])
2499 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2500 v[0] = (x0 + t3) >> 10;
2501 v[56] = (x0 - t3) >> 10;
2502 v[8] = (x1 + t2) >> 10;
2503 v[48] = (x1 - t2) >> 10;
2504 v[16] = (x2 + t1) >> 10;
2505 v[40] = (x2 - t1) >> 10;
2506 v[24] = (x3 + t0) >> 10;
2507 v[32] = (x3 - t0) >> 10;
2511 for (
i = 0, v = val, o =
out;
i < 8; ++
i, v += 8, o += out_stride) {
2513 STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7])
2520 x0 += 65536 + (128 << 17);
2521 x1 += 65536 + (128 << 17);
2522 x2 += 65536 + (128 << 17);
2523 x3 += 65536 + (128 << 17);
2526 o[0] = stbi__clamp((x0 + t3) >> 17);
2527 o[7] = stbi__clamp((x0 - t3) >> 17);
2528 o[1] = stbi__clamp((x1 + t2) >> 17);
2529 o[6] = stbi__clamp((x1 - t2) >> 17);
2530 o[2] = stbi__clamp((x2 + t1) >> 17);
2531 o[5] = stbi__clamp((x2 - t1) >> 17);
2532 o[3] = stbi__clamp((x3 + t0) >> 17);
2533 o[4] = stbi__clamp((x3 - t0) >> 17);
2541static void stbi__idct_simd(
stbi_uc*
out,
int out_stride,
short data[64])
2544 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2548#define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2552#define dct_rot(out0,out1, x,y,c0,c1) \
2553 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2554 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2555 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2556 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2557 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2558 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2561#define dct_widen(out, in) \
2562 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2563 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2566#define dct_wadd(out, a, b) \
2567 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2568 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2571#define dct_wsub(out, a, b) \
2572 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2573 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2576#define dct_bfly32o(out0, out1, a,b,bias,s) \
2578 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2579 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2580 dct_wadd(sum, abiased, b); \
2581 dct_wsub(dif, abiased, b); \
2582 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2583 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2587#define dct_interleave8(a, b) \
2589 a = _mm_unpacklo_epi8(a, b); \
2590 b = _mm_unpackhi_epi8(tmp, b)
2593#define dct_interleave16(a, b) \
2595 a = _mm_unpacklo_epi16(a, b); \
2596 b = _mm_unpackhi_epi16(tmp, b)
2598#define dct_pass(bias,shift) \
2601 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2602 __m128i sum04 = _mm_add_epi16(row0, row4); \
2603 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2604 dct_widen(t0e, sum04); \
2605 dct_widen(t1e, dif04); \
2606 dct_wadd(x0, t0e, t3e); \
2607 dct_wsub(x3, t0e, t3e); \
2608 dct_wadd(x1, t1e, t2e); \
2609 dct_wsub(x2, t1e, t2e); \
2611 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2612 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2613 __m128i sum17 = _mm_add_epi16(row1, row7); \
2614 __m128i sum35 = _mm_add_epi16(row3, row5); \
2615 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2616 dct_wadd(x4, y0o, y4o); \
2617 dct_wadd(x5, y1o, y5o); \
2618 dct_wadd(x6, y2o, y5o); \
2619 dct_wadd(x7, y3o, y4o); \
2620 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2621 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2622 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2623 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2626 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2627 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f));
2628 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2629 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2630 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f));
2631 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f));
2632 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f));
2633 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f));
2636 __m128i bias_0 = _mm_set1_epi32(512);
2637 __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17));
2640 row0 = _mm_load_si128((
const __m128i*) (
data + 0 * 8));
2641 row1 = _mm_load_si128((
const __m128i*) (
data + 1 * 8));
2642 row2 = _mm_load_si128((
const __m128i*) (
data + 2 * 8));
2643 row3 = _mm_load_si128((
const __m128i*) (
data + 3 * 8));
2644 row4 = _mm_load_si128((
const __m128i*) (
data + 4 * 8));
2645 row5 = _mm_load_si128((
const __m128i*) (
data + 5 * 8));
2646 row6 = _mm_load_si128((
const __m128i*) (
data + 6 * 8));
2647 row7 = _mm_load_si128((
const __m128i*) (
data + 7 * 8));
2650 dct_pass(bias_0, 10);
2654 dct_interleave16(row0, row4);
2655 dct_interleave16(row1, row5);
2656 dct_interleave16(row2, row6);
2657 dct_interleave16(row3, row7);
2660 dct_interleave16(row0, row2);
2661 dct_interleave16(row1, row3);
2662 dct_interleave16(row4, row6);
2663 dct_interleave16(row5, row7);
2666 dct_interleave16(row0, row1);
2667 dct_interleave16(row2, row3);
2668 dct_interleave16(row4, row5);
2669 dct_interleave16(row6, row7);
2673 dct_pass(bias_1, 17);
2677 __m128i p0 = _mm_packus_epi16(row0, row1);
2678 __m128i p1 = _mm_packus_epi16(row2, row3);
2679 __m128i p2 = _mm_packus_epi16(row4, row5);
2680 __m128i p3 = _mm_packus_epi16(row6, row7);
2683 dct_interleave8(p0, p2);
2684 dct_interleave8(p1, p3);
2687 dct_interleave8(p0, p1);
2688 dct_interleave8(p2, p3);
2691 dct_interleave8(p0, p2);
2692 dct_interleave8(p1, p3);
2695 _mm_storel_epi64((__m128i*)
out, p0);
out += out_stride;
2696 _mm_storel_epi64((__m128i*)
out, _mm_shuffle_epi32(p0, 0x4e));
out += out_stride;
2697 _mm_storel_epi64((__m128i*)
out, p2);
out += out_stride;
2698 _mm_storel_epi64((__m128i*)
out, _mm_shuffle_epi32(p2, 0x4e));
out += out_stride;
2699 _mm_storel_epi64((__m128i*)
out, p1);
out += out_stride;
2700 _mm_storel_epi64((__m128i*)
out, _mm_shuffle_epi32(p1, 0x4e));
out += out_stride;
2701 _mm_storel_epi64((__m128i*)
out, p3);
out += out_stride;
2702 _mm_storel_epi64((__m128i*)
out, _mm_shuffle_epi32(p3, 0x4e));
2711#undef dct_interleave8
2712#undef dct_interleave16
2722static void stbi__idct_simd(
stbi_uc*
out,
int out_stride,
short data[64])
2724 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2726 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2727 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2728 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f));
2729 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f));
2730 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2731 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2732 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2733 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2734 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f));
2735 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f));
2736 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f));
2737 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f));
2739#define dct_long_mul(out, inq, coeff) \
2740 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2741 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2743#define dct_long_mac(out, acc, inq, coeff) \
2744 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2745 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2747#define dct_widen(out, inq) \
2748 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2749 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2752#define dct_wadd(out, a, b) \
2753 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2754 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2757#define dct_wsub(out, a, b) \
2758 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2759 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2762#define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2764 dct_wadd(sum, a, b); \
2765 dct_wsub(dif, a, b); \
2766 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2767 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2770#define dct_pass(shiftop, shift) \
2773 int16x8_t sum26 = vaddq_s16(row2, row6); \
2774 dct_long_mul(p1e, sum26, rot0_0); \
2775 dct_long_mac(t2e, p1e, row6, rot0_1); \
2776 dct_long_mac(t3e, p1e, row2, rot0_2); \
2777 int16x8_t sum04 = vaddq_s16(row0, row4); \
2778 int16x8_t dif04 = vsubq_s16(row0, row4); \
2779 dct_widen(t0e, sum04); \
2780 dct_widen(t1e, dif04); \
2781 dct_wadd(x0, t0e, t3e); \
2782 dct_wsub(x3, t0e, t3e); \
2783 dct_wadd(x1, t1e, t2e); \
2784 dct_wsub(x2, t1e, t2e); \
2786 int16x8_t sum15 = vaddq_s16(row1, row5); \
2787 int16x8_t sum17 = vaddq_s16(row1, row7); \
2788 int16x8_t sum35 = vaddq_s16(row3, row5); \
2789 int16x8_t sum37 = vaddq_s16(row3, row7); \
2790 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2791 dct_long_mul(p5o, sumodd, rot1_0); \
2792 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2793 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2794 dct_long_mul(p3o, sum37, rot2_0); \
2795 dct_long_mul(p4o, sum15, rot2_1); \
2796 dct_wadd(sump13o, p1o, p3o); \
2797 dct_wadd(sump24o, p2o, p4o); \
2798 dct_wadd(sump23o, p2o, p3o); \
2799 dct_wadd(sump14o, p1o, p4o); \
2800 dct_long_mac(x4, sump13o, row7, rot3_0); \
2801 dct_long_mac(x5, sump24o, row5, rot3_1); \
2802 dct_long_mac(x6, sump23o, row3, rot3_2); \
2803 dct_long_mac(x7, sump14o, row1, rot3_3); \
2804 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2805 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2806 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2807 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2811 row0 = vld1q_s16(
data + 0 * 8);
2812 row1 = vld1q_s16(
data + 1 * 8);
2813 row2 = vld1q_s16(
data + 2 * 8);
2814 row3 = vld1q_s16(
data + 3 * 8);
2815 row4 = vld1q_s16(
data + 4 * 8);
2816 row5 = vld1q_s16(
data + 5 * 8);
2817 row6 = vld1q_s16(
data + 6 * 8);
2818 row7 = vld1q_s16(
data + 7 * 8);
2821 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2824 dct_pass(vrshrn_n_s32, 10);
2830#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2831#define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }
2832#define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }
2835 dct_trn16(row0, row1);
2836 dct_trn16(row2, row3);
2837 dct_trn16(row4, row5);
2838 dct_trn16(row6, row7);
2841 dct_trn32(row0, row2);
2842 dct_trn32(row1, row3);
2843 dct_trn32(row4, row6);
2844 dct_trn32(row5, row7);
2847 dct_trn64(row0, row4);
2848 dct_trn64(row1, row5);
2849 dct_trn64(row2, row6);
2850 dct_trn64(row3, row7);
2861 dct_pass(vshrn_n_s32, 16);
2865 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2866 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2867 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2868 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2869 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2870 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2871 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2872 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2875#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2876#define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }
2877#define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }
2889 dct_trn8_16(p0, p2);
2890 dct_trn8_16(p1, p3);
2891 dct_trn8_16(p4, p6);
2892 dct_trn8_16(p5, p7);
2895 dct_trn8_32(p0, p4);
2896 dct_trn8_32(p1, p5);
2897 dct_trn8_32(p2, p6);
2898 dct_trn8_32(p3, p7);
2901 vst1_u8(
out, p0);
out += out_stride;
2902 vst1_u8(
out, p1);
out += out_stride;
2903 vst1_u8(
out, p2);
out += out_stride;
2904 vst1_u8(
out, p3);
out += out_stride;
2905 vst1_u8(
out, p4);
out += out_stride;
2906 vst1_u8(
out, p5);
out += out_stride;
2907 vst1_u8(
out, p6);
out += out_stride;
2926#define STBI__MARKER_none 0xff
2930static stbi_uc stbi__get_marker(stbi__jpeg* j)
2933 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2934 x = stbi__get8(j->s);
2935 if (x != 0xff)
return STBI__MARKER_none;
2937 x = stbi__get8(j->s);
2943#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2947static void stbi__jpeg_reset(stbi__jpeg* j)
2952 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
2953 j->marker = STBI__MARKER_none;
2954 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2960static int stbi__parse_entropy_coded_data(stbi__jpeg* z)
2962 stbi__jpeg_reset(z);
2963 if (!z->progressive) {
2964 if (z->scan_n == 1) {
2966 STBI_SIMD_ALIGN(
short,
data[64]);
2967 int n = z->order[0];
2972 int w = (z->img_comp[n].x + 7) >> 3;
2973 int h = (z->img_comp[n].y + 7) >> 3;
2974 for (j = 0; j < h; ++j) {
2975 for (
i = 0;
i < w; ++
i) {
2976 int ha = z->img_comp[n].ha;
2977 if (!stbi__jpeg_decode_block(z,
data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
return 0;
2978 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 +
i * 8, z->img_comp[n].w2,
data);
2980 if (--z->todo <= 0) {
2981 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2984 if (!STBI__RESTART(z->marker))
return 1;
2985 stbi__jpeg_reset(z);
2993 STBI_SIMD_ALIGN(
short,
data[64]);
2994 for (j = 0; j < z->img_mcu_y; ++j) {
2995 for (
i = 0;
i < z->img_mcu_x; ++
i) {
2997 for (k = 0; k < z->scan_n; ++k) {
2998 int n = z->order[k];
3001 for (y = 0; y < z->img_comp[n].v; ++y) {
3002 for (x = 0; x < z->img_comp[n].h; ++x) {
3003 int x2 = (
i * z->img_comp[n].h + x) * 8;
3004 int y2 = (j * z->img_comp[n].v + y) * 8;
3005 int ha = z->img_comp[n].ha;
3006 if (!stbi__jpeg_decode_block(z,
data, z->huff_dc + z->img_comp[n].hd, z->huff_ac + ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
return 0;
3007 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * y2 + x2, z->img_comp[n].w2,
data);
3013 if (--z->todo <= 0) {
3014 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3015 if (!STBI__RESTART(z->marker))
return 1;
3016 stbi__jpeg_reset(z);
3024 if (z->scan_n == 1) {
3026 int n = z->order[0];
3031 int w = (z->img_comp[n].x + 7) >> 3;
3032 int h = (z->img_comp[n].y + 7) >> 3;
3033 for (j = 0; j < h; ++j) {
3034 for (
i = 0;
i < w; ++
i) {
3035 short*
data = z->img_comp[n].coeff + 64 * (
i + j * z->img_comp[n].coeff_w);
3036 if (z->spec_start == 0) {
3037 if (!stbi__jpeg_decode_block_prog_dc(z,
data, &z->huff_dc[z->img_comp[n].hd], n))
3041 int ha = z->img_comp[n].ha;
3042 if (!stbi__jpeg_decode_block_prog_ac(z,
data, &z->huff_ac[ha], z->fast_ac[ha]))
3046 if (--z->todo <= 0) {
3047 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3048 if (!STBI__RESTART(z->marker))
return 1;
3049 stbi__jpeg_reset(z);
3057 for (j = 0; j < z->img_mcu_y; ++j) {
3058 for (
i = 0;
i < z->img_mcu_x; ++
i) {
3060 for (k = 0; k < z->scan_n; ++k) {
3061 int n = z->order[k];
3064 for (y = 0; y < z->img_comp[n].v; ++y) {
3065 for (x = 0; x < z->img_comp[n].h; ++x) {
3066 int x2 = (
i * z->img_comp[n].h + x);
3067 int y2 = (j * z->img_comp[n].v + y);
3068 short*
data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
3069 if (!stbi__jpeg_decode_block_prog_dc(z,
data, &z->huff_dc[z->img_comp[n].hd], n))
3076 if (--z->todo <= 0) {
3077 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3078 if (!STBI__RESTART(z->marker))
return 1;
3079 stbi__jpeg_reset(z);
3088static void stbi__jpeg_dequantize(
short*
data, stbi__uint16* dequant)
3091 for (
i = 0;
i < 64; ++
i)
3095static void stbi__jpeg_finish(stbi__jpeg* z)
3097 if (z->progressive) {
3100 for (n = 0; n < z->s->img_n; ++n) {
3101 int w = (z->img_comp[n].x + 7) >> 3;
3102 int h = (z->img_comp[n].y + 7) >> 3;
3103 for (j = 0; j < h; ++j) {
3104 for (
i = 0;
i < w; ++
i) {
3105 short*
data = z->img_comp[n].coeff + 64 * (
i + j * z->img_comp[n].coeff_w);
3106 stbi__jpeg_dequantize(
data, z->dequant[z->img_comp[n].tq]);
3107 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2 * j * 8 +
i * 8, z->img_comp[n].w2,
data);
3114static int stbi__process_marker(stbi__jpeg* z,
int m)
3118 case STBI__MARKER_none:
3119 return stbi__err(
"expected marker",
"Corrupt JPEG");
3122 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
3123 z->restart_interval = stbi__get16be(z->s);
3127 L = stbi__get16be(z->s) - 2;
3129 int q = stbi__get8(z->s);
3130 int p =
q >> 4, sixteen = (
p != 0);
3132 if (
p != 0 &&
p != 1)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
3133 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
3135 for (
i = 0;
i < 64; ++
i)
3136 z->dequant[t][stbi__jpeg_dezigzag[
i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->
s));
3137 L -= (sixteen ? 129 : 65);
3142 L = stbi__get16be(z->s) - 2;
3145 int sizes[16],
i, n = 0;
3146 int q = stbi__get8(z->s);
3149 if (tc > 1 ||
th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
3150 for (
i = 0;
i < 16; ++
i) {
3151 sizes[
i] = stbi__get8(z->s);
3154 if (n > 256)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
3157 if (!stbi__build_huffman(z->huff_dc +
th, sizes))
return 0;
3158 v = z->huff_dc[
th].values;
3161 if (!stbi__build_huffman(z->huff_ac +
th, sizes))
return 0;
3162 v = z->huff_ac[
th].values;
3164 for (
i = 0;
i < n; ++
i)
3165 v[
i] = stbi__get8(z->s);
3167 stbi__build_fast_ac(z->fast_ac[
th], z->huff_ac +
th);
3174 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
3175 L = stbi__get16be(z->s);
3178 return stbi__err(
"bad COM len",
"Corrupt JPEG");
3180 return stbi__err(
"bad APP len",
"Corrupt JPEG");
3184 if (m == 0xE0 && L >= 5) {
3185 static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0' };
3188 for (
i = 0;
i < 5; ++
i)
3189 if (stbi__get8(z->s) != tag[
i])
3195 else if (m == 0xEE && L >= 12) {
3196 static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0' };
3199 for (
i = 0;
i < 6; ++
i)
3200 if (stbi__get8(z->s) != tag[
i])
3205 stbi__get16be(z->s);
3206 stbi__get16be(z->s);
3207 z->app14_color_transform = stbi__get8(z->s);
3212 stbi__skip(z->s, L);
3216 return stbi__err(
"unknown marker",
"Corrupt JPEG");
3220static int stbi__process_scan_header(stbi__jpeg* z)
3223 int Ls = stbi__get16be(z->s);
3224 z->scan_n = stbi__get8(z->s);
3225 if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (
int)z->s->img_n)
return stbi__err(
"bad SOS component count",
"Corrupt JPEG");
3226 if (Ls != 6 + 2 * z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
3227 for (
i = 0;
i < z->scan_n; ++
i) {
3228 int id = stbi__get8(z->s), which;
3229 int q = stbi__get8(z->s);
3230 for (which = 0; which < z->s->img_n; ++which)
3231 if (z->img_comp[which].id ==
id)
3233 if (which == z->s->img_n)
return 0;
3234 z->img_comp[which].hd =
q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
3235 z->img_comp[which].ha =
q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
3236 z->order[
i] = which;
3241 z->spec_start = stbi__get8(z->s);
3242 z->spec_end = stbi__get8(z->s);
3243 aa = stbi__get8(z->s);
3244 z->succ_high = (aa >> 4);
3245 z->succ_low = (aa & 15);
3246 if (z->progressive) {
3247 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
3248 return stbi__err(
"bad SOS",
"Corrupt JPEG");
3251 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3252 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
3260static int stbi__free_jpeg_components(stbi__jpeg* z,
int ncomp,
int why)
3263 for (
i = 0;
i < ncomp; ++
i) {
3264 if (z->img_comp[
i].raw_data) {
3265 STBI_FREE(z->img_comp[
i].raw_data);
3266 z->img_comp[
i].raw_data =
NULL;
3267 z->img_comp[
i].data =
NULL;
3269 if (z->img_comp[
i].raw_coeff) {
3270 STBI_FREE(z->img_comp[
i].raw_coeff);
3271 z->img_comp[
i].raw_coeff = 0;
3272 z->img_comp[
i].coeff = 0;
3274 if (z->img_comp[
i].linebuf) {
3275 STBI_FREE(z->img_comp[
i].linebuf);
3276 z->img_comp[
i].linebuf =
NULL;
3282static int stbi__process_frame_header(stbi__jpeg* z,
int scan)
3284 stbi__context*
s = z->s;
3285 int Lf,
p,
i,
q, h_max = 1, v_max = 1, c;
3286 Lf = stbi__get16be(
s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3287 p = stbi__get8(
s);
if (
p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
3288 s->img_y = stbi__get16be(
s);
if (
s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
3289 s->img_x = stbi__get16be(
s);
if (
s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
3290 if (
s->img_y > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
3291 if (
s->img_x > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
3293 if (c != 3 && c != 1 && c != 4)
return stbi__err(
"bad component count",
"Corrupt JPEG");
3295 for (
i = 0;
i < c; ++
i) {
3296 z->img_comp[
i].data =
NULL;
3297 z->img_comp[
i].linebuf =
NULL;
3300 if (Lf != 8 + 3 *
s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
3303 for (
i = 0;
i <
s->img_n; ++
i) {
3304 static const unsigned char rgb[3] = {
'R',
'G',
'B' };
3305 z->img_comp[
i].id = stbi__get8(
s);
3306 if (
s->img_n == 3 && z->img_comp[
i].id ==
rgb[
i])
3309 z->img_comp[
i].h = (
q >> 4);
if (!z->img_comp[
i].h || z->img_comp[
i].h > 4)
return stbi__err(
"bad H",
"Corrupt JPEG");
3310 z->img_comp[
i].v =
q & 15;
if (!z->img_comp[
i].v || z->img_comp[
i].v > 4)
return stbi__err(
"bad V",
"Corrupt JPEG");
3311 z->img_comp[
i].tq = stbi__get8(
s);
if (z->img_comp[
i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
3314 if (scan != STBI__SCAN_load)
return 1;
3316 if (!stbi__mad3sizes_valid(
s->img_x,
s->img_y,
s->img_n, 0))
return stbi__err(
"too large",
"Image too large to decode");
3318 for (
i = 0;
i <
s->img_n; ++
i) {
3319 if (z->img_comp[
i].h > h_max) h_max = z->img_comp[
i].h;
3320 if (z->img_comp[
i].v > v_max) v_max = z->img_comp[
i].v;
3325 for (
i = 0;
i <
s->img_n; ++
i) {
3326 if (h_max % z->img_comp[
i].h != 0)
return stbi__err(
"bad H",
"Corrupt JPEG");
3327 if (v_max % z->img_comp[
i].v != 0)
return stbi__err(
"bad V",
"Corrupt JPEG");
3331 z->img_h_max = h_max;
3332 z->img_v_max = v_max;
3333 z->img_mcu_w = h_max * 8;
3334 z->img_mcu_h = v_max * 8;
3336 z->img_mcu_x = (
s->img_x + z->img_mcu_w - 1) / z->img_mcu_w;
3337 z->img_mcu_y = (
s->img_y + z->img_mcu_h - 1) / z->img_mcu_h;
3339 for (
i = 0;
i <
s->img_n; ++
i) {
3341 z->img_comp[
i].x = (
s->img_x * z->img_comp[
i].h + h_max - 1) / h_max;
3342 z->img_comp[
i].y = (
s->img_y * z->img_comp[
i].v + v_max - 1) / v_max;
3350 z->img_comp[
i].w2 = z->img_mcu_x * z->img_comp[
i].h * 8;
3351 z->img_comp[
i].h2 = z->img_mcu_y * z->img_comp[
i].v * 8;
3352 z->img_comp[
i].coeff = 0;
3353 z->img_comp[
i].raw_coeff = 0;
3354 z->img_comp[
i].linebuf =
NULL;
3355 z->img_comp[
i].raw_data = stbi__malloc_mad2(z->img_comp[
i].w2, z->img_comp[
i].h2, 15);
3356 if (z->img_comp[
i].raw_data ==
NULL)
3357 return stbi__free_jpeg_components(z,
i + 1, stbi__err(
"outofmem",
"Out of memory"));
3359 z->img_comp[
i].data = (
stbi_uc*)(((
size_t)z->img_comp[
i].raw_data + 15) & ~15);
3360 if (z->progressive) {
3362 z->img_comp[
i].coeff_w = z->img_comp[
i].w2 / 8;
3363 z->img_comp[
i].coeff_h = z->img_comp[
i].h2 / 8;
3364 z->img_comp[
i].raw_coeff = stbi__malloc_mad3(z->img_comp[
i].w2, z->img_comp[
i].h2,
sizeof(
short), 15);
3365 if (z->img_comp[
i].raw_coeff ==
NULL)
3366 return stbi__free_jpeg_components(z,
i + 1, stbi__err(
"outofmem",
"Out of memory"));
3367 z->img_comp[
i].coeff = (
short*)(((
size_t)z->img_comp[
i].raw_coeff + 15) & ~15);
3375#define stbi__DNL(x) ((x) == 0xdc)
3376#define stbi__SOI(x) ((x) == 0xd8)
3377#define stbi__EOI(x) ((x) == 0xd9)
3378#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3379#define stbi__SOS(x) ((x) == 0xda)
3381#define stbi__SOF_progressive(x) ((x) == 0xc2)
3383static int stbi__decode_jpeg_header(stbi__jpeg* z,
int scan)
3387 z->app14_color_transform = -1;
3388 z->marker = STBI__MARKER_none;
3389 m = stbi__get_marker(z);
3390 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
3391 if (scan == STBI__SCAN_type)
return 1;
3392 m = stbi__get_marker(z);
3393 while (!stbi__SOF(m)) {
3394 if (!stbi__process_marker(z, m))
return 0;
3395 m = stbi__get_marker(z);
3396 while (m == STBI__MARKER_none) {
3398 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
3399 m = stbi__get_marker(z);
3402 z->progressive = stbi__SOF_progressive(m);
3403 if (!stbi__process_frame_header(z, scan))
return 0;
3407static int stbi__skip_jpeg_junk_at_end(stbi__jpeg* j)
3411 while (!stbi__at_eof(j->s)) {
3412 int x = stbi__get8(j->s);
3414 if (stbi__at_eof(j->s))
return STBI__MARKER_none;
3415 x = stbi__get8(j->s);
3416 if (x != 0x00 && x != 0xff) {
3426 return STBI__MARKER_none;
3430static int stbi__decode_jpeg_image(stbi__jpeg* j)
3433 for (m = 0; m < 4; m++) {
3434 j->img_comp[m].raw_data =
NULL;
3435 j->img_comp[m].raw_coeff =
NULL;
3437 j->restart_interval = 0;
3438 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
3439 m = stbi__get_marker(j);
3440 while (!stbi__EOI(m)) {
3442 if (!stbi__process_scan_header(j))
return 0;
3443 if (!stbi__parse_entropy_coded_data(j))
return 0;
3444 if (j->marker == STBI__MARKER_none) {
3445 j->marker = stbi__skip_jpeg_junk_at_end(j);
3448 m = stbi__get_marker(j);
3449 if (STBI__RESTART(m))
3450 m = stbi__get_marker(j);
3452 else if (stbi__DNL(m)) {
3453 int Ld = stbi__get16be(j->s);
3454 stbi__uint32 NL = stbi__get16be(j->s);
3455 if (Ld != 4)
return stbi__err(
"bad DNL len",
"Corrupt JPEG");
3456 if (NL != j->s->img_y)
return stbi__err(
"bad DNL height",
"Corrupt JPEG");
3457 m = stbi__get_marker(j);
3460 if (!stbi__process_marker(j, m))
return 1;
3461 m = stbi__get_marker(j);
3465 stbi__jpeg_finish(j);
3474#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3479 STBI_NOTUSED(in_far);
3490 for (
i = 0;
i < w; ++
i)
3491 out[
i] = stbi__div4(3 * in_near[
i] + in_far[
i] + 2);
3509 for (
i = 1;
i < w - 1; ++
i) {
3510 int n = 3 *
input[
i] + 2;
3511 out[
i * 2 + 0] = stbi__div4(n +
input[
i - 1]);
3512 out[
i * 2 + 1] = stbi__div4(n +
input[
i + 1]);
3514 out[
i * 2 + 0] = stbi__div4(
input[w - 2] * 3 +
input[w - 1] + 2);
3517 STBI_NOTUSED(in_far);
3523#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3530 out[0] =
out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3534 t1 = 3 * in_near[0] + in_far[0];
3535 out[0] = stbi__div4(t1 + 2);
3536 for (
i = 1;
i < w; ++
i) {
3538 t1 = 3 * in_near[
i] + in_far[
i];
3539 out[
i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3540 out[
i * 2] = stbi__div16(3 * t1 + t0 + 8);
3542 out[w * 2 - 1] = stbi__div4(t1 + 2);
3549#if defined(STBI_SSE2) || defined(STBI_NEON)
3556 out[0] =
out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
3560 t1 = 3 * in_near[0] + in_far[0];
3564 for (;
i < ((w - 1) & ~7);
i += 8) {
3565#if defined(STBI_SSE2)
3568 __m128i zero = _mm_setzero_si128();
3569 __m128i farb = _mm_loadl_epi64((__m128i*) (in_far +
i));
3570 __m128i nearb = _mm_loadl_epi64((__m128i*) (in_near +
i));
3571 __m128i farw = _mm_unpacklo_epi8(farb, zero);
3572 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3573 __m128i diff = _mm_sub_epi16(farw, nearw);
3574 __m128i nears = _mm_slli_epi16(nearw, 2);
3575 __m128i curr = _mm_add_epi16(nears, diff);
3582 __m128i prv0 = _mm_slli_si128(curr, 2);
3583 __m128i nxt0 = _mm_srli_si128(curr, 2);
3584 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3585 __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[
i + 8] + in_far[
i + 8], 7);
3591 __m128i bias = _mm_set1_epi16(8);
3592 __m128i curs = _mm_slli_epi16(curr, 2);
3593 __m128i prvd = _mm_sub_epi16(prev, curr);
3594 __m128i nxtd = _mm_sub_epi16(next, curr);
3595 __m128i curb = _mm_add_epi16(curs, bias);
3596 __m128i even = _mm_add_epi16(prvd, curb);
3597 __m128i odd = _mm_add_epi16(nxtd, curb);
3600 __m128i int0 = _mm_unpacklo_epi16(even, odd);
3601 __m128i int1 = _mm_unpackhi_epi16(even, odd);
3602 __m128i de0 = _mm_srli_epi16(int0, 4);
3603 __m128i de1 = _mm_srli_epi16(int1, 4);
3606 __m128i outv = _mm_packus_epi16(de0, de1);
3607 _mm_storeu_si128((__m128i*) (
out +
i * 2), outv);
3608#elif defined(STBI_NEON)
3611 uint8x8_t farb = vld1_u8(in_far +
i);
3612 uint8x8_t nearb = vld1_u8(in_near +
i);
3613 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3614 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3615 int16x8_t curr = vaddq_s16(nears, diff);
3622 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3623 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3624 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3625 int16x8_t next = vsetq_lane_s16(3 * in_near[
i + 8] + in_far[
i + 8], nxt0, 7);
3631 int16x8_t curs = vshlq_n_s16(curr, 2);
3632 int16x8_t prvd = vsubq_s16(prev, curr);
3633 int16x8_t nxtd = vsubq_s16(next, curr);
3634 int16x8_t even = vaddq_s16(curs, prvd);
3635 int16x8_t odd = vaddq_s16(curs, nxtd);
3639 o.val[0] = vqrshrun_n_s16(even, 4);
3640 o.val[1] = vqrshrun_n_s16(odd, 4);
3641 vst2_u8(
out +
i * 2, o);
3645 t1 = 3 * in_near[
i + 7] + in_far[
i + 7];
3649 t1 = 3 * in_near[
i] + in_far[
i];
3650 out[
i * 2] = stbi__div16(3 * t1 + t0 + 8);
3652 for (++
i;
i < w; ++
i) {
3654 t1 = 3 * in_near[
i] + in_far[
i];
3655 out[
i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
3656 out[
i * 2] = stbi__div16(3 * t1 + t0 + 8);
3658 out[w * 2 - 1] = stbi__div4(t1 + 2);
3670 STBI_NOTUSED(in_far);
3671 for (
i = 0;
i < w; ++
i)
3672 for (j = 0; j < hs; ++j)
3673 out[
i * hs + j] = in_near[
i];
3679#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3684 int y_fixed = (y[
i] << 20) + (1 << 19);
3686 int cr = pcr[
i] - 128;
3687 int cb = pcb[
i] - 128;
3688 r = y_fixed + cr * stbi__float2fixed(1.40200f);
3689 g = y_fixed + (cr * -stbi__float2fixed(0.71414f)) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000);
3690 b = y_fixed + cb * stbi__float2fixed(1.77200f);
3694 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3695 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3696 if ((
unsigned)
b > 255) {
if (
b < 0)
b = 0;
else b = 255; }
3705#if defined(STBI_SSE2) || defined(STBI_NEON)
3716 __m128i signflip = _mm_set1_epi8(-0x80);
3717 __m128i cr_const0 = _mm_set1_epi16((
short)(1.40200f * 4096.0f + 0.5f));
3718 __m128i cr_const1 = _mm_set1_epi16(-(
short)(0.71414f * 4096.0f + 0.5f));
3719 __m128i cb_const0 = _mm_set1_epi16(-(
short)(0.34414f * 4096.0f + 0.5f));
3720 __m128i cb_const1 = _mm_set1_epi16((
short)(1.77200f * 4096.0f + 0.5f));
3721 __m128i y_bias = _mm_set1_epi8((
char)(
unsigned char)128);
3722 __m128i xw = _mm_set1_epi16(255);
3724 for (;
i + 7 <
count;
i += 8) {
3726 __m128i y_bytes = _mm_loadl_epi64((__m128i*) (y +
i));
3727 __m128i cr_bytes = _mm_loadl_epi64((__m128i*) (pcr +
i));
3728 __m128i cb_bytes = _mm_loadl_epi64((__m128i*) (pcb +
i));
3729 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3730 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3733 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3734 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3735 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3738 __m128i yws = _mm_srli_epi16(yw, 4);
3739 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3740 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3741 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3742 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3743 __m128i rws = _mm_add_epi16(cr0, yws);
3744 __m128i gwt = _mm_add_epi16(cb0, yws);
3745 __m128i bws = _mm_add_epi16(yws, cb1);
3746 __m128i gws = _mm_add_epi16(gwt, cr1);
3749 __m128i rw = _mm_srai_epi16(rws, 4);
3750 __m128i bw = _mm_srai_epi16(bws, 4);
3751 __m128i gw = _mm_srai_epi16(gws, 4);
3754 __m128i brb = _mm_packus_epi16(rw, bw);
3755 __m128i gxb = _mm_packus_epi16(gw, xw);
3758 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3759 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3760 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3761 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3764 _mm_storeu_si128((__m128i*) (
out + 0), o0);
3765 _mm_storeu_si128((__m128i*) (
out + 16), o1);
3775 uint8x8_t signflip = vdup_n_u8(0x80);
3776 int16x8_t cr_const0 = vdupq_n_s16((
short)(1.40200f * 4096.0f + 0.5f));
3777 int16x8_t cr_const1 = vdupq_n_s16(-(
short)(0.71414f * 4096.0f + 0.5f));
3778 int16x8_t cb_const0 = vdupq_n_s16(-(
short)(0.34414f * 4096.0f + 0.5f));
3779 int16x8_t cb_const1 = vdupq_n_s16((
short)(1.77200f * 4096.0f + 0.5f));
3781 for (;
i + 7 <
count;
i += 8) {
3783 uint8x8_t y_bytes = vld1_u8(y +
i);
3784 uint8x8_t cr_bytes = vld1_u8(pcr +
i);
3785 uint8x8_t cb_bytes = vld1_u8(pcb +
i);
3786 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3787 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3790 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3791 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3792 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3795 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3796 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3797 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3798 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3799 int16x8_t rws = vaddq_s16(yws, cr0);
3800 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3801 int16x8_t bws = vaddq_s16(yws, cb1);
3805 o.val[0] = vqrshrun_n_s16(rws, 4);
3806 o.val[1] = vqrshrun_n_s16(gws, 4);
3807 o.val[2] = vqrshrun_n_s16(bws, 4);
3808 o.val[3] = vdup_n_u8(255);
3818 int y_fixed = (y[
i] << 20) + (1 << 19);
3820 int cr = pcr[
i] - 128;
3821 int cb = pcb[
i] - 128;
3822 r = y_fixed + cr * stbi__float2fixed(1.40200f);
3823 g = y_fixed + cr * -stbi__float2fixed(0.71414f) + ((cb * -stbi__float2fixed(0.34414f)) & 0xffff0000);
3824 b = y_fixed + cb * stbi__float2fixed(1.77200f);
3828 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3829 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3830 if ((
unsigned)
b > 255) {
if (
b < 0)
b = 0;
else b = 255; }
3841static void stbi__setup_jpeg(stbi__jpeg* j)
3843 j->idct_block_kernel = stbi__idct_block;
3844 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3845 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3848 if (stbi__sse2_available()) {
3849 j->idct_block_kernel = stbi__idct_simd;
3850 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3851 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3856 j->idct_block_kernel = stbi__idct_simd;
3857 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3858 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3863static void stbi__cleanup_jpeg(stbi__jpeg* j)
3865 stbi__free_jpeg_components(j, j->s->img_n, 0);
3870 resample_row_func resample;
3881 unsigned int t = x * y + 128;
3882 return (
stbi_uc)((t + (t >> 8)) >> 8);
3885static stbi_uc* load_jpeg_image(stbi__jpeg* z,
int* out_x,
int* out_y,
int* comp,
int req_comp)
3887 int n, decode_n, is_rgb;
3891 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3894 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3897 n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3899 is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3901 if (z->s->img_n == 3 && n < 3 && !is_rgb)
3904 decode_n = z->s->img_n;
3908 if (decode_n <= 0) { stbi__cleanup_jpeg(z);
return NULL; }
3917 stbi__resample res_comp[4];
3919 for (k = 0; k < decode_n; ++k) {
3920 stbi__resample* r = &res_comp[k];
3924 z->img_comp[k].linebuf = (
stbi_uc*)stbi__malloc(z->s->img_x + 3);
3925 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3927 r->hs = z->img_h_max / z->img_comp[k].h;
3928 r->vs = z->img_v_max / z->img_comp[k].v;
3929 r->ystep = r->vs >> 1;
3930 r->w_lores = (z->s->img_x + r->hs - 1) / r->hs;
3932 r->line0 = r->line1 = z->img_comp[k].data;
3934 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3935 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3936 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3937 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3938 else r->resample = stbi__resample_row_generic;
3942 output = (
stbi_uc*)stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3943 if (!
output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3946 for (j = 0; j < z->s->img_y; ++j) {
3948 for (k = 0; k < decode_n; ++k) {
3949 stbi__resample* r = &res_comp[k];
3950 int y_bot = r->ystep >= (r->vs >> 1);
3951 coutput[k] = r->resample(z->img_comp[k].linebuf,
3952 y_bot ? r->line1 : r->line0,
3953 y_bot ? r->line0 : r->line1,
3955 if (++r->ystep >= r->vs) {
3957 r->line0 = r->line1;
3958 if (++r->ypos < z->img_comp[k].y)
3959 r->line1 += z->img_comp[k].w2;
3964 if (z->s->img_n == 3) {
3966 for (
i = 0;
i < z->s->img_x; ++
i) {
3968 out[1] = coutput[1][
i];
3969 out[2] = coutput[2][
i];
3975 z->YCbCr_to_RGB_kernel(
out, y, coutput[1], coutput[2], z->s->img_x, n);
3978 else if (z->s->img_n == 4) {
3979 if (z->app14_color_transform == 0) {
3980 for (
i = 0;
i < z->s->img_x; ++
i) {
3982 out[0] = stbi__blinn_8x8(coutput[0][
i], m);
3983 out[1] = stbi__blinn_8x8(coutput[1][
i], m);
3984 out[2] = stbi__blinn_8x8(coutput[2][
i], m);
3989 else if (z->app14_color_transform == 2) {
3990 z->YCbCr_to_RGB_kernel(
out, y, coutput[1], coutput[2], z->s->img_x, n);
3991 for (
i = 0;
i < z->s->img_x; ++
i) {
3993 out[0] = stbi__blinn_8x8(255 -
out[0], m);
3994 out[1] = stbi__blinn_8x8(255 -
out[1], m);
3995 out[2] = stbi__blinn_8x8(255 -
out[2], m);
4000 z->YCbCr_to_RGB_kernel(
out, y, coutput[1], coutput[2], z->s->img_x, n);
4004 for (
i = 0;
i < z->s->img_x; ++
i) {
4013 for (
i = 0;
i < z->s->img_x; ++
i)
4014 *
out++ = stbi__compute_y(coutput[0][
i], coutput[1][
i], coutput[2][
i]);
4016 for (
i = 0;
i < z->s->img_x; ++
i,
out += 2) {
4017 out[0] = stbi__compute_y(coutput[0][
i], coutput[1][
i], coutput[2][
i]);
4022 else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
4023 for (
i = 0;
i < z->s->img_x; ++
i) {
4025 stbi_uc r = stbi__blinn_8x8(coutput[0][
i], m);
4026 stbi_uc g = stbi__blinn_8x8(coutput[1][
i], m);
4027 stbi_uc b = stbi__blinn_8x8(coutput[2][
i], m);
4028 out[0] = stbi__compute_y(r, g,
b);
4033 else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
4034 for (
i = 0;
i < z->s->img_x; ++
i) {
4035 out[0] = stbi__blinn_8x8(255 - coutput[0][
i], coutput[3][
i]);
4043 for (
i = 0;
i < z->s->img_x; ++
i)
out[
i] = y[
i];
4045 for (
i = 0;
i < z->s->img_x; ++
i) { *
out++ = y[
i]; *
out++ = 255; }
4049 stbi__cleanup_jpeg(z);
4050 *out_x = z->s->img_x;
4051 *out_y = z->s->img_y;
4052 if (comp) *comp = z->s->img_n >= 3 ? 3 : 1;
4057static void* stbi__jpeg_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
4060 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
4061 if (!j)
return stbi__errpuc(
"outofmem",
"Out of memory");
4062 memset(j, 0,
sizeof(stbi__jpeg));
4065 stbi__setup_jpeg(j);
4066 result = load_jpeg_image(j, x, y, comp, req_comp);
4071static int stbi__jpeg_test(stbi__context*
s)
4074 stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
4075 if (!j)
return stbi__err(
"outofmem",
"Out of memory");
4076 memset(j, 0,
sizeof(stbi__jpeg));
4078 stbi__setup_jpeg(j);
4079 r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
4085static int stbi__jpeg_info_raw(stbi__jpeg* j,
int* x,
int* y,
int* comp)
4087 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
4091 if (x) *x = j->s->img_x;
4092 if (y) *y = j->s->img_y;
4093 if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
4097static int stbi__jpeg_info(stbi__context*
s,
int* x,
int* y,
int* comp)
4100 stbi__jpeg* j = (stbi__jpeg*)(stbi__malloc(
sizeof(stbi__jpeg)));
4101 if (!j)
return stbi__err(
"outofmem",
"Out of memory");
4102 memset(j, 0,
sizeof(stbi__jpeg));
4104 result = stbi__jpeg_info_raw(j, x, y, comp);
4120#define STBI__ZFAST_BITS 9
4121#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
4122#define STBI__ZNSYMS 288
4128 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
4129 stbi__uint16 firstcode[16];
4131 stbi__uint16 firstsymbol[16];
4133 stbi__uint16
value[STBI__ZNSYMS];
4136stbi_inline
static int stbi__bitreverse16(
int n)
4138 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
4139 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
4140 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
4141 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
4145stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
4147 STBI_ASSERT(bits <= 16);
4150 return stbi__bitreverse16(v) >> (16 - bits);
4153static int stbi__zbuild_huffman(stbi__zhuffman* z,
const stbi_uc* sizelist,
int num)
4156 int code, next_code[16], sizes[17];
4159 memset(sizes, 0,
sizeof(sizes));
4160 memset(z->fast, 0,
sizeof(z->fast));
4161 for (
i = 0;
i < num; ++
i)
4162 ++sizes[sizelist[
i]];
4164 for (
i = 1;
i < 16; ++
i)
4165 if (sizes[
i] > (1 <<
i))
4166 return stbi__err(
"bad sizes",
"Corrupt PNG");
4168 for (
i = 1;
i < 16; ++
i) {
4169 next_code[
i] =
code;
4170 z->firstcode[
i] = (stbi__uint16)
code;
4171 z->firstsymbol[
i] = (stbi__uint16)k;
4174 if (
code - 1 >= (1 <<
i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4175 z->maxcode[
i] =
code << (16 -
i);
4179 z->maxcode[16] = 0x10000;
4180 for (
i = 0;
i < num; ++
i) {
4181 int s = sizelist[
i];
4183 int c = next_code[
s] - z->firstcode[
s] + z->firstsymbol[
s];
4184 stbi__uint16 fastv = (stbi__uint16)((
s << 9) |
i);
4186 z->value[c] = (stbi__uint16)
i;
4187 if (
s <= STBI__ZFAST_BITS) {
4188 int j = stbi__bit_reverse(next_code[
s],
s);
4189 while (j < (1 << STBI__ZFAST_BITS)) {
4208 stbi_uc* zbuffer, * zbuffer_end;
4210 stbi__uint32 code_buffer;
4217 stbi__zhuffman z_length, z_distance;
4220stbi_inline
static int stbi__zeof(stbi__zbuf* z)
4222 return (z->zbuffer >= z->zbuffer_end);
4225stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf* z)
4227 return stbi__zeof(z) ? 0 : *z->zbuffer++;
4230static void stbi__fill_bits(stbi__zbuf* z)
4233 if (z->code_buffer >= (1U << z->num_bits)) {
4234 z->zbuffer = z->zbuffer_end;
4237 z->code_buffer |= (
unsigned int)stbi__zget8(z) << z->num_bits;
4239 }
while (z->num_bits <= 24);
4242stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf* z,
int n)
4245 if (z->num_bits < n) stbi__fill_bits(z);
4246 k = z->code_buffer & ((1 << n) - 1);
4247 z->code_buffer >>= n;
4252static int stbi__zhuffman_decode_slowpath(stbi__zbuf*
a, stbi__zhuffman* z)
4257 k = stbi__bit_reverse(
a->code_buffer, 16);
4258 for (
s = STBI__ZFAST_BITS + 1; ; ++
s)
4259 if (k < z->maxcode[
s])
4261 if (
s >= 16)
return -1;
4263 b = (k >> (16 -
s)) - z->firstcode[
s] + z->firstsymbol[
s];
4264 if (
b >= STBI__ZNSYMS)
return -1;
4265 if (z->size[
b] !=
s)
return -1;
4266 a->code_buffer >>=
s;
4271stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf*
a, stbi__zhuffman* z)
4274 if (
a->num_bits < 16) {
4275 if (stbi__zeof(
a)) {
4280 b = z->fast[
a->code_buffer & STBI__ZFAST_MASK];
4283 a->code_buffer >>=
s;
4287 return stbi__zhuffman_decode_slowpath(
a, z);
4290static int stbi__zexpand(stbi__zbuf* z,
char* zout,
int n)
4293 unsigned int cur, limit, old_limit;
4295 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
4296 cur = (
unsigned int)(z->zout - z->zout_start);
4297 limit = old_limit = (unsigned)(z->zout_end - z->zout_start);
4298 if (UINT_MAX - cur < (
unsigned)n)
return stbi__err(
"outofmem",
"Out of memory");
4299 while (cur + n > limit) {
4300 if (limit > UINT_MAX / 2)
return stbi__err(
"outofmem",
"Out of memory");
4303 q = (
char*)STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
4304 STBI_NOTUSED(old_limit);
4305 if (
q ==
NULL)
return stbi__err(
"outofmem",
"Out of memory");
4308 z->zout_end =
q + limit;
4312static const int stbi__zlength_base[31] = {
4313 3,4,5,6,7,8,9,10,11,13,
4314 15,17,19,23,27,31,35,43,51,59,
4315 67,83,99,115,131,163,195,227,258,0,0 };
4317static const int stbi__zlength_extra[31] =
4318{ 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
4320static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
4321257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0 };
4323static const int stbi__zdist_extra[32] =
4324{ 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13 };
4326static int stbi__parse_huffman_block(stbi__zbuf*
a)
4328 char* zout =
a->zout;
4330 int z = stbi__zhuffman_decode(
a, &
a->z_length);
4332 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4333 if (zout >=
a->zout_end) {
4334 if (!stbi__zexpand(
a, zout, 1))
return 0;
4346 if (z >= 286)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4348 len = stbi__zlength_base[z];
4349 if (stbi__zlength_extra[z]) len += stbi__zreceive(
a, stbi__zlength_extra[z]);
4350 z = stbi__zhuffman_decode(
a, &
a->z_distance);
4351 if (z < 0 || z >= 30)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
4352 dist = stbi__zdist_base[z];
4353 if (stbi__zdist_extra[z]) dist += stbi__zreceive(
a, stbi__zdist_extra[z]);
4354 if (zout -
a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
4355 if (zout + len >
a->zout_end) {
4356 if (!stbi__zexpand(
a, zout, len))
return 0;
4362 if (len) {
do *zout++ = v;
while (--len); }
4365 if (len) {
do *zout++ = *
p++;
while (--len); }
4371static int stbi__compute_huffman_codes(stbi__zbuf*
a)
4373 static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
4374 stbi__zhuffman z_codelength;
4375 stbi_uc lencodes[286 + 32 + 137];
4379 int hlit = stbi__zreceive(
a, 5) + 257;
4380 int hdist = stbi__zreceive(
a, 5) + 1;
4381 int hclen = stbi__zreceive(
a, 4) + 4;
4382 int ntot = hlit + hdist;
4384 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
4385 for (
i = 0;
i < hclen; ++
i) {
4386 int s = stbi__zreceive(
a, 3);
4387 codelength_sizes[length_dezigzag[
i]] = (
stbi_uc)
s;
4389 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
4393 int c = stbi__zhuffman_decode(
a, &z_codelength);
4394 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4400 c = stbi__zreceive(
a, 2) + 3;
4401 if (n == 0)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4402 fill = lencodes[n - 1];
4405 c = stbi__zreceive(
a, 3) + 3;
4408 c = stbi__zreceive(
a, 7) + 11;
4411 return stbi__err(
"bad codelengths",
"Corrupt PNG");
4413 if (ntot - n < c)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4414 memset(lencodes + n,
fill, c);
4418 if (n != ntot)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
4419 if (!stbi__zbuild_huffman(&
a->z_length, lencodes, hlit))
return 0;
4420 if (!stbi__zbuild_huffman(&
a->z_distance, lencodes + hlit, hdist))
return 0;
4424static int stbi__parse_uncompressed_block(stbi__zbuf*
a)
4428 if (
a->num_bits & 7)
4429 stbi__zreceive(
a,
a->num_bits & 7);
4432 while (
a->num_bits > 0) {
4434 a->code_buffer >>= 8;
4437 if (
a->num_bits < 0)
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4443 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
4444 if (
a->zbuffer + len >
a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
4445 if (
a->zout + len >
a->zout_end)
4446 if (!stbi__zexpand(
a,
a->zout, len))
return 0;
4447 memcpy(
a->zout,
a->zbuffer, len);
4453static int stbi__parse_zlib_header(stbi__zbuf*
a)
4455 int cmf = stbi__zget8(
a);
4458 int flg = stbi__zget8(
a);
4459 if (stbi__zeof(
a))
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4460 if ((cmf * 256 + flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
4461 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
4462 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
4467static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] =
4469 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,
4470 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,
4471 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,
4472 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,
4473 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,
4474 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,
4475 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,
4476 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,
4477 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
4479static const stbi_uc stbi__zdefault_distance[32] =
4481 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
4500 if (!stbi__parse_zlib_header(
a))
return 0;
4504 final = stbi__zreceive(
a, 1);
4505 type = stbi__zreceive(
a, 2);
4507 if (!stbi__parse_uncompressed_block(
a))
return 0;
4509 else if (
type == 3) {
4515 if (!stbi__zbuild_huffman(&
a->z_length, stbi__zdefault_length, STBI__ZNSYMS))
return 0;
4516 if (!stbi__zbuild_huffman(&
a->z_distance, stbi__zdefault_distance, 32))
return 0;
4519 if (!stbi__compute_huffman_codes(
a))
return 0;
4521 if (!stbi__parse_huffman_block(
a))
return 0;
4527static int stbi__do_zlib(stbi__zbuf*
a,
char* obuf,
int olen,
int exp,
int parse_header)
4529 a->zout_start = obuf;
4531 a->zout_end = obuf + olen;
4532 a->z_expandable =
exp;
4540 char*
p = (
char*)stbi__malloc(initial_size);
4544 if (stbi__do_zlib(&
a,
p, initial_size, 1, 1)) {
4545 if (outlen) *outlen = (int)(
a.zout -
a.zout_start);
4546 return a.zout_start;
4549 STBI_FREE(
a.zout_start);
4562 char*
p = (
char*)stbi__malloc(initial_size);
4567 if (outlen) *outlen = (int)(
a.zout -
a.zout_start);
4568 return a.zout_start;
4571 STBI_FREE(
a.zout_start);
4580 a.zbuffer_end = (
stbi_uc*)ibuffer + ilen;
4581 if (stbi__do_zlib(&
a, obuffer, olen, 0, 1))
4582 return (
int)(
a.zout -
a.zout_start);
4590 char*
p = (
char*)stbi__malloc(16384);
4594 if (stbi__do_zlib(&
a,
p, 16384, 1, 0)) {
4595 if (outlen) *outlen = (int)(
a.zout -
a.zout_start);
4596 return a.zout_start;
4599 STBI_FREE(
a.zout_start);
4608 a.zbuffer_end = (
stbi_uc*)ibuffer + ilen;
4609 if (stbi__do_zlib(&
a, obuffer, olen, 0, 0))
4610 return (
int)(
a.zout -
a.zout_start);
4629 stbi__uint32 length;
4633static stbi__pngchunk stbi__get_chunk_header(stbi__context*
s)
4636 c.length = stbi__get32be(
s);
4637 c.type = stbi__get32be(
s);
4641static int stbi__check_png_header(stbi__context*
s)
4643 static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4645 for (
i = 0;
i < 8; ++
i)
4646 if (stbi__get8(
s) != png_sig[
i])
return stbi__err(
"bad png sig",
"Not a PNG");
4669static stbi_uc first_row_filter[5] =
4678static int stbi__paeth(
int a,
int b,
int c)
4681 int pa =
abs(
p -
a);
4682 int pb =
abs(
p -
b);
4683 int pc =
abs(
p - c);
4684 if (pa <= pb && pa <= pc)
return a;
4685 if (pb <= pc)
return b;
4689static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4692static int stbi__create_png_image_raw(stbi__png*
a,
stbi_uc* raw, stbi__uint32 raw_len,
int out_n, stbi__uint32 x, stbi__uint32 y,
int depth,
int color)
4694 int bytes = (depth == 16 ? 2 : 1);
4695 stbi__context*
s =
a->s;
4696 stbi__uint32
i, j, stride = x * out_n *
bytes;
4697 stbi__uint32 img_len, img_width_bytes;
4699 int img_n =
s->img_n;
4701 int output_bytes = out_n *
bytes;
4702 int filter_bytes = img_n *
bytes;
4705 STBI_ASSERT(out_n ==
s->img_n || out_n ==
s->img_n + 1);
4706 a->out = (
stbi_uc*)stbi__malloc_mad3(x, y, output_bytes, 0);
4707 if (!
a->out)
return stbi__err(
"outofmem",
"Out of memory");
4709 if (!stbi__mad3sizes_valid(img_n, x, depth, 7))
return stbi__err(
"too large",
"Corrupt PNG");
4710 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4711 img_len = (img_width_bytes + 1) * y;
4716 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4718 for (j = 0; j < y; ++j) {
4719 stbi_uc* cur =
a->out + stride * j;
4721 int filter = *raw++;
4724 return stbi__err(
"invalid filter",
"Corrupt PNG");
4727 if (img_width_bytes > x)
return stbi__err(
"invalid width",
"Corrupt PNG");
4728 cur += x * out_n - img_width_bytes;
4730 width = img_width_bytes;
4732 prior = cur - stride;
4735 if (j == 0) filter = first_row_filter[filter];
4738 for (k = 0; k < filter_bytes; ++k) {
4740 case STBI__F_none: cur[k] = raw[k];
break;
4741 case STBI__F_sub: cur[k] = raw[k];
break;
4742 case STBI__F_up: cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4743 case STBI__F_avg: cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1));
break;
4744 case STBI__F_paeth: cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0, prior[k], 0));
break;
4745 case STBI__F_avg_first: cur[k] = raw[k];
break;
4746 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4757 else if (depth == 16) {
4758 if (img_n != out_n) {
4759 cur[filter_bytes] = 255;
4760 cur[filter_bytes + 1] = 255;
4762 raw += filter_bytes;
4763 cur += output_bytes;
4764 prior += output_bytes;
4773 if (depth < 8 || img_n == out_n) {
4774 int nk = (width - 1) * filter_bytes;
4775#define STBI__CASE(f) \
4777 for (k=0; k < nk; ++k)
4780 case STBI__F_none: memcpy(cur, raw, nk);
break;
4781 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); }
break;
4782 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4783 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); }
break;
4784 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); }
break;
4785 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); }
break;
4786 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], 0, 0)); }
break;
4792 STBI_ASSERT(img_n + 1 == out_n);
4793#define STBI__CASE(f) \
4795 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4796 for (k=0; k < filter_bytes; ++k)
4798 STBI__CASE(STBI__F_none) { cur[k] = raw[k]; }
break;
4799 STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k - output_bytes]); }
break;
4800 STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); }
break;
4801 STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - output_bytes]) >> 1)); }
break;
4802 STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], prior[k], prior[k - output_bytes])); }
break;
4803 STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k - output_bytes] >> 1)); }
break;
4804 STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - output_bytes], 0, 0)); }
break;
4811 cur =
a->out + stride * j;
4812 for (
i = 0;
i < x; ++
i, cur += output_bytes) {
4813 cur[filter_bytes + 1] = 255;
4823 for (j = 0; j < y; ++j) {
4824 stbi_uc* cur =
a->out + stride * j;
4825 stbi_uc*
in =
a->out + stride * j + x * out_n - img_width_bytes;
4828 stbi_uc scale = (
color == 0) ? stbi__depth_scale_table[depth] : 1;
4837 for (k = x * img_n; k >= 2; k -= 2, ++
in) {
4838 *cur++ = scale * ((*
in >> 4));
4839 *cur++ = scale * ((*in) & 0x0f);
4841 if (k > 0) *cur++ = scale * ((*
in >> 4));
4843 else if (depth == 2) {
4844 for (k = x * img_n; k >= 4; k -= 4, ++
in) {
4845 *cur++ = scale * ((*
in >> 6));
4846 *cur++ = scale * ((*
in >> 4) & 0x03);
4847 *cur++ = scale * ((*
in >> 2) & 0x03);
4848 *cur++ = scale * ((*in) & 0x03);
4850 if (k > 0) *cur++ = scale * ((*
in >> 6));
4851 if (k > 1) *cur++ = scale * ((*
in >> 4) & 0x03);
4852 if (k > 2) *cur++ = scale * ((*
in >> 2) & 0x03);
4854 else if (depth == 1) {
4855 for (k = x * img_n; k >= 8; k -= 8, ++
in) {
4856 *cur++ = scale * ((*
in >> 7));
4857 *cur++ = scale * ((*
in >> 6) & 0x01);
4858 *cur++ = scale * ((*
in >> 5) & 0x01);
4859 *cur++ = scale * ((*
in >> 4) & 0x01);
4860 *cur++ = scale * ((*
in >> 3) & 0x01);
4861 *cur++ = scale * ((*
in >> 2) & 0x01);
4862 *cur++ = scale * ((*
in >> 1) & 0x01);
4863 *cur++ = scale * ((*in) & 0x01);
4865 if (k > 0) *cur++ = scale * ((*
in >> 7));
4866 if (k > 1) *cur++ = scale * ((*
in >> 6) & 0x01);
4867 if (k > 2) *cur++ = scale * ((*
in >> 5) & 0x01);
4868 if (k > 3) *cur++ = scale * ((*
in >> 4) & 0x01);
4869 if (k > 4) *cur++ = scale * ((*
in >> 3) & 0x01);
4870 if (k > 5) *cur++ = scale * ((*
in >> 2) & 0x01);
4871 if (k > 6) *cur++ = scale * ((*
in >> 1) & 0x01);
4873 if (img_n != out_n) {
4876 cur =
a->out + stride * j;
4878 for (
q = x - 1;
q >= 0; --
q) {
4879 cur[
q * 2 + 1] = 255;
4880 cur[
q * 2 + 0] = cur[
q];
4884 STBI_ASSERT(img_n == 3);
4885 for (
q = x - 1;
q >= 0; --
q) {
4886 cur[
q * 4 + 3] = 255;
4887 cur[
q * 4 + 2] = cur[
q * 3 + 2];
4888 cur[
q * 4 + 1] = cur[
q * 3 + 1];
4889 cur[
q * 4 + 0] = cur[
q * 3 + 0];
4895 else if (depth == 16) {
4901 stbi__uint16* cur16 = (stbi__uint16*)cur;
4903 for (
i = 0;
i < x * y * out_n; ++
i, cur16++, cur += 2) {
4904 *cur16 = (cur[0] << 8) | cur[1];
4911static int stbi__create_png_image(stbi__png*
a,
stbi_uc* image_data, stbi__uint32 image_data_len,
int out_n,
int depth,
int color,
int interlaced)
4913 int bytes = (depth == 16 ? 2 : 1);
4914 int out_bytes = out_n *
bytes;
4918 return stbi__create_png_image_raw(
a, image_data, image_data_len, out_n,
a->s->img_x,
a->s->img_y, depth,
color);
4921 final = (
stbi_uc*)stbi__malloc_mad3(
a->s->img_x,
a->s->img_y, out_bytes, 0);
4922 if (!
final)
return stbi__err(
"outofmem",
"Out of memory");
4923 for (
p = 0;
p < 7; ++
p) {
4924 int xorig[] = { 0,4,0,2,0,1,0 };
4925 int yorig[] = { 0,0,4,0,2,0,1 };
4926 int xspc[] = { 8,8,4,4,2,2,1 };
4927 int yspc[] = { 8,8,8,4,4,2,2 };
4930 x = (
a->s->img_x - xorig[
p] + xspc[
p] - 1) / xspc[
p];
4931 y = (
a->s->img_y - yorig[
p] + yspc[
p] - 1) / yspc[
p];
4933 stbi__uint32 img_len = ((((
a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4934 if (!stbi__create_png_image_raw(
a, image_data, image_data_len, out_n, x, y, depth,
color)) {
4938 for (j = 0; j < y; ++j) {
4939 for (
i = 0;
i < x; ++
i) {
4940 int out_y = j * yspc[
p] + yorig[
p];
4941 int out_x =
i * xspc[
p] + xorig[
p];
4942 memcpy(
final + out_y *
a->s->img_x * out_bytes + out_x * out_bytes,
4943 a->out + (j * x +
i) * out_bytes, out_bytes);
4947 image_data += img_len;
4948 image_data_len -= img_len;
4956static int stbi__compute_transparency(stbi__png* z,
stbi_uc tc[3],
int out_n)
4958 stbi__context*
s = z->s;
4959 stbi__uint32
i, pixel_count =
s->img_x *
s->img_y;
4964 STBI_ASSERT(out_n == 2 || out_n == 4);
4967 for (
i = 0;
i < pixel_count; ++
i) {
4968 p[1] = (
p[0] == tc[0] ? 0 : 255);
4973 for (
i = 0;
i < pixel_count; ++
i) {
4974 if (
p[0] == tc[0] &&
p[1] == tc[1] &&
p[2] == tc[2])
4982static int stbi__compute_transparency16(stbi__png* z, stbi__uint16 tc[3],
int out_n)
4984 stbi__context*
s = z->s;
4985 stbi__uint32
i, pixel_count =
s->img_x *
s->img_y;
4986 stbi__uint16*
p = (stbi__uint16*)z->out;
4990 STBI_ASSERT(out_n == 2 || out_n == 4);
4993 for (
i = 0;
i < pixel_count; ++
i) {
4994 p[1] = (
p[0] == tc[0] ? 0 : 65535);
4999 for (
i = 0;
i < pixel_count; ++
i) {
5000 if (
p[0] == tc[0] &&
p[1] == tc[1] &&
p[2] == tc[2])
5008static int stbi__expand_png_palette(stbi__png*
a,
stbi_uc* palette,
int len,
int pal_img_n)
5010 stbi__uint32
i, pixel_count =
a->s->img_x *
a->s->img_y;
5011 stbi_uc*
p, * temp_out, * orig =
a->out;
5013 p = (
stbi_uc*)stbi__malloc_mad2(pixel_count, pal_img_n, 0);
5014 if (
p ==
NULL)
return stbi__err(
"outofmem",
"Out of memory");
5019 if (pal_img_n == 3) {
5020 for (
i = 0;
i < pixel_count; ++
i) {
5021 int n = orig[
i] * 4;
5023 p[1] = palette[n + 1];
5024 p[2] = palette[n + 2];
5029 for (
i = 0;
i < pixel_count; ++
i) {
5030 int n = orig[
i] * 4;
5032 p[1] = palette[n + 1];
5033 p[2] = palette[n + 2];
5034 p[3] = palette[n + 3];
5046static int stbi__unpremultiply_on_load_global = 0;
5047static int stbi__de_iphone_flag_global = 0;
5051 stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;
5056 stbi__de_iphone_flag_global = flag_true_if_should_convert;
5059#ifndef STBI_THREAD_LOCAL
5060#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global
5061#define stbi__de_iphone_flag stbi__de_iphone_flag_global
5063static STBI_THREAD_LOCAL
int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;
5064static STBI_THREAD_LOCAL
int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;
5068 stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;
5069 stbi__unpremultiply_on_load_set = 1;
5074 stbi__de_iphone_flag_local = flag_true_if_should_convert;
5075 stbi__de_iphone_flag_set = 1;
5078#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \
5079 ? stbi__unpremultiply_on_load_local \
5080 : stbi__unpremultiply_on_load_global)
5081#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \
5082 ? stbi__de_iphone_flag_local \
5083 : stbi__de_iphone_flag_global)
5086static void stbi__de_iphone(stbi__png* z)
5088 stbi__context*
s = z->s;
5089 stbi__uint32
i, pixel_count =
s->img_x *
s->img_y;
5092 if (
s->img_out_n == 3) {
5093 for (
i = 0;
i < pixel_count; ++
i) {
5101 STBI_ASSERT(
s->img_out_n == 4);
5102 if (stbi__unpremultiply_on_load) {
5104 for (
i = 0;
i < pixel_count; ++
i) {
5109 p[0] = (
p[2] * 255 + half) /
a;
5110 p[1] = (
p[1] * 255 + half) /
a;
5111 p[2] = (t * 255 + half) /
a;
5122 for (
i = 0;
i < pixel_count; ++
i) {
5132#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
5134static int stbi__parse_png_file(stbi__png* z,
int scan,
int req_comp)
5136 stbi_uc palette[1024], pal_img_n = 0;
5137 stbi_uc has_trans = 0, tc[3] = { 0 };
5138 stbi__uint16 tc16[3];
5139 stbi__uint32 ioff = 0, idata_limit = 0,
i, pal_len = 0;
5140 int first = 1, k, interlace = 0,
color = 0, is_iphone = 0;
5141 stbi__context*
s = z->s;
5147 if (!stbi__check_png_header(
s))
return 0;
5149 if (scan == STBI__SCAN_type)
return 1;
5152 stbi__pngchunk c = stbi__get_chunk_header(
s);
5154 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
5156 stbi__skip(
s, c.length);
5158 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
5160 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
5162 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
5163 s->img_x = stbi__get32be(
s);
5164 s->img_y = stbi__get32be(
s);
5165 if (
s->img_y > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
5166 if (
s->img_x > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
5167 z->depth = stbi__get8(
s);
if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)
return stbi__err(
"1/2/4/8/16-bit only",
"PNG not supported: 1/2/4/8/16-bit only");
5168 color = stbi__get8(
s);
if (
color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5169 if (
color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5170 if (
color == 3) pal_img_n = 3;
else if (
color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
5171 comp = stbi__get8(
s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
5172 filter = stbi__get8(
s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
5173 interlace = stbi__get8(
s);
if (interlace > 1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
5174 if (!
s->img_x || !
s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
5176 s->img_n = (
color & 2 ? 3 : 1) + (
color & 4 ? 1 : 0);
5177 if ((1 << 30) /
s->img_x /
s->img_n <
s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
5183 if ((1 << 30) /
s->img_x / 4 <
s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
5189 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
5190 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5191 if (c.length > 256 * 3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5192 pal_len = c.length / 3;
5193 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
5194 for (
i = 0;
i < pal_len; ++
i) {
5195 palette[
i * 4 + 0] = stbi__get8(
s);
5196 palette[
i * 4 + 1] = stbi__get8(
s);
5197 palette[
i * 4 + 2] = stbi__get8(
s);
5198 palette[
i * 4 + 3] = 255;
5203 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
5204 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5205 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
5207 if (scan == STBI__SCAN_header) {
s->img_n = 4;
return 1; }
5208 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
5209 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5211 for (
i = 0;
i < c.length; ++
i)
5212 palette[
i * 4 + 3] = stbi__get8(
s);
5215 if (!(
s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
5216 if (c.length != (stbi__uint32)
s->img_n * 2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
5219 if (scan == STBI__SCAN_header) { ++
s->img_n;
return 1; }
5220 if (z->depth == 16) {
5221 for (k = 0; k <
s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(
s);
5224 for (k = 0; k <
s->img_n; ++k) tc[k] = (
stbi_uc)(stbi__get16be(
s) & 255) * stbi__depth_scale_table[z->depth];
5230 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
5231 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5232 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
5233 if (scan == STBI__SCAN_header) {
5236 s->img_n = pal_img_n;
5239 if (c.length > (1u << 30))
return stbi__err(
"IDAT size limit",
"IDAT section larger than 2^30 bytes");
5240 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
5241 if (ioff + c.length > idata_limit) {
5242 stbi__uint32 idata_limit_old = idata_limit;
5244 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
5245 while (ioff + c.length > idata_limit)
5247 STBI_NOTUSED(idata_limit_old);
5248 p = (
stbi_uc*)STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (
p ==
NULL)
return stbi__err(
"outofmem",
"Out of memory");
5251 if (!stbi__getn(
s, z->idata + ioff, c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
5256 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
5257 stbi__uint32 raw_len, bpl;
5258 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5259 if (scan != STBI__SCAN_load)
return 1;
5260 if (z->idata ==
NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
5262 bpl = (
s->img_x * z->depth + 7) / 8;
5263 raw_len = bpl *
s->img_y *
s->img_n +
s->img_y ;
5265 if (z->expanded ==
NULL)
return 0;
5266 STBI_FREE(z->idata); z->idata =
NULL;
5267 if ((req_comp ==
s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans)
5268 s->img_out_n =
s->img_n + 1;
5270 s->img_out_n =
s->img_n;
5271 if (!stbi__create_png_image(z, z->expanded, raw_len,
s->img_out_n, z->depth,
color, interlace))
return 0;
5273 if (z->depth == 16) {
5274 if (!stbi__compute_transparency16(z, tc16,
s->img_out_n))
return 0;
5277 if (!stbi__compute_transparency(z, tc,
s->img_out_n))
return 0;
5280 if (is_iphone && stbi__de_iphone_flag &&
s->img_out_n > 2)
5284 s->img_n = pal_img_n;
5285 s->img_out_n = pal_img_n;
5286 if (req_comp >= 3)
s->img_out_n = req_comp;
5287 if (!stbi__expand_png_palette(z, palette, pal_len,
s->img_out_n))
5290 else if (has_trans) {
5294 STBI_FREE(z->expanded); z->expanded =
NULL;
5302 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
5303 if ((c.type & (1 << 29)) == 0) {
5304#ifndef STBI_NO_FAILURE_STRINGS
5306 static char invalid_chunk[] =
"XXXX PNG chunk not known";
5307 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
5308 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
5309 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
5310 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
5312 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
5314 stbi__skip(
s, c.length);
5322static void* stbi__do_png(stbi__png*
p,
int* x,
int* y,
int* n,
int req_comp, stbi__result_info* ri)
5325 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
5326 if (stbi__parse_png_file(
p, STBI__SCAN_load, req_comp)) {
5328 ri->bits_per_channel = 8;
5329 else if (
p->depth == 16)
5330 ri->bits_per_channel = 16;
5332 return stbi__errpuc(
"bad bits_per_channel",
"PNG not supported: unsupported color depth");
5335 if (req_comp && req_comp !=
p->s->img_out_n) {
5336 if (ri->bits_per_channel == 8)
5337 result = stbi__convert_format((
unsigned char*)result,
p->s->img_out_n, req_comp,
p->s->img_x,
p->s->img_y);
5339 result = stbi__convert_format16((stbi__uint16*)result,
p->s->img_out_n, req_comp,
p->s->img_x,
p->s->img_y);
5340 p->s->img_out_n = req_comp;
5345 if (n) *n =
p->s->img_n;
5347 STBI_FREE(
p->out);
p->out =
NULL;
5348 STBI_FREE(
p->expanded);
p->expanded =
NULL;
5349 STBI_FREE(
p->idata);
p->idata =
NULL;
5354static void* stbi__png_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
5358 return stbi__do_png(&
p, x, y, comp, req_comp, ri);
5361static int stbi__png_test(stbi__context*
s)
5364 r = stbi__check_png_header(
s);
5369static int stbi__png_info_raw(stbi__png*
p,
int* x,
int* y,
int* comp)
5371 if (!stbi__parse_png_file(
p, STBI__SCAN_header, 0)) {
5375 if (x) *x =
p->s->img_x;
5376 if (y) *y =
p->s->img_y;
5377 if (comp) *comp =
p->s->img_n;
5381static int stbi__png_info(stbi__context*
s,
int* x,
int* y,
int* comp)
5385 return stbi__png_info_raw(&
p, x, y, comp);
5388static int stbi__png_is16(stbi__context*
s)
5394 if (
p.depth != 16) {
5405static int stbi__bmp_test_raw(stbi__context*
s)
5409 if (stbi__get8(
s) !=
'B')
return 0;
5410 if (stbi__get8(
s) !=
'M')
return 0;
5415 sz = stbi__get32le(
s);
5416 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5420static int stbi__bmp_test(stbi__context*
s)
5422 int r = stbi__bmp_test_raw(
s);
5429static int stbi__high_bit(
unsigned int z)
5432 if (z == 0)
return -1;
5433 if (z >= 0x10000) { n += 16; z >>= 16; }
5434 if (z >= 0x00100) { n += 8; z >>= 8; }
5435 if (z >= 0x00010) { n += 4; z >>= 4; }
5436 if (z >= 0x00004) { n += 2; z >>= 2; }
5437 if (z >= 0x00002) { n += 1; }
5441static int stbi__bitcount(
unsigned int a)
5443 a = (
a & 0x55555555) + ((
a >> 1) & 0x55555555);
5444 a = (
a & 0x33333333) + ((
a >> 2) & 0x33333333);
5445 a = (
a + (
a >> 4)) & 0x0f0f0f0f;
5447 a = (
a + (
a >> 16));
5454static int stbi__shiftsigned(
unsigned int v,
int shift,
int bits)
5456 static unsigned int mul_table[9] = {
5458 0xff, 0x55, 0x49, 0x11,
5459 0x21, 0x41, 0x81, 0x01,
5461 static unsigned int shift_table[9] = {
5468 STBI_ASSERT(v < 256);
5470 STBI_ASSERT(bits >= 0 && bits <= 8);
5471 return (
int)((unsigned)v * mul_table[bits]) >> shift_table[bits];
5477 unsigned int mr, mg, mb, ma, all_a;
5481static int stbi__bmp_set_mask_defaults(stbi__bmp_data* info,
int compress)
5487 if (compress == 0) {
5488 if (
info->bpp == 16) {
5489 info->mr = 31u << 10;
5490 info->mg = 31u << 5;
5491 info->mb = 31u << 0;
5493 else if (
info->bpp == 32) {
5494 info->mr = 0xffu << 16;
5495 info->mg = 0xffu << 8;
5496 info->mb = 0xffu << 0;
5497 info->ma = 0xffu << 24;
5509static void* stbi__bmp_parse_header(stbi__context*
s, stbi__bmp_data* info)
5512 if (stbi__get8(
s) !=
'B' || stbi__get8(
s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
5516 info->offset = stbi__get32le(
s);
5517 info->hsz = hsz = stbi__get32le(
s);
5519 info->extra_read = 14;
5521 if (
info->offset < 0)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5523 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
5525 s->img_x = stbi__get16le(
s);
5526 s->img_y = stbi__get16le(
s);
5529 s->img_x = stbi__get32le(
s);
5530 s->img_y = stbi__get32le(
s);
5532 if (stbi__get16le(
s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5533 info->bpp = stbi__get16le(
s);
5536 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
5537 if (compress >= 4)
return stbi__errpuc(
"BMP JPEG/PNG",
"BMP type not supported: unsupported compression");
5538 if (compress == 3 &&
info->bpp != 16 &&
info->bpp != 32)
return stbi__errpuc(
"bad BMP",
"bad BMP");
5544 if (hsz == 40 || hsz == 56) {
5551 if (
info->bpp == 16 ||
info->bpp == 32) {
5552 if (compress == 0) {
5553 stbi__bmp_set_mask_defaults(info, compress);
5555 else if (compress == 3) {
5556 info->mr = stbi__get32le(
s);
5557 info->mg = stbi__get32le(
s);
5558 info->mb = stbi__get32le(
s);
5559 info->extra_read += 12;
5563 return stbi__errpuc(
"bad BMP",
"bad BMP");
5567 return stbi__errpuc(
"bad BMP",
"bad BMP");
5573 if (hsz != 108 && hsz != 124)
5574 return stbi__errpuc(
"bad BMP",
"bad BMP");
5575 info->mr = stbi__get32le(
s);
5576 info->mg = stbi__get32le(
s);
5577 info->mb = stbi__get32le(
s);
5578 info->ma = stbi__get32le(
s);
5580 stbi__bmp_set_mask_defaults(info, compress);
5582 for (
i = 0;
i < 12; ++
i)
5596static void* stbi__bmp_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
5599 unsigned int mr = 0, mg = 0, mb = 0, ma = 0, all_a;
5601 int psize = 0,
i, j, width;
5602 int flip_vertically, pad, target;
5603 stbi__bmp_data
info;
5607 if (stbi__bmp_parse_header(
s, &info) ==
NULL)
5610 flip_vertically = ((int)
s->img_y) > 0;
5611 s->img_y =
abs((
int)
s->img_y);
5613 if (
s->img_y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5614 if (
s->img_x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5622 if (
info.hsz == 12) {
5624 psize = (
info.offset -
info.extra_read - 24) / 3;
5628 psize = (
info.offset -
info.extra_read -
info.hsz) >> 2;
5633 int bytes_read_so_far =
s->callback_already_read + (int)(
s->img_buffer -
s->img_buffer_original);
5634 int header_limit = 1024;
5635 int extra_data_limit = 256 * 4;
5636 if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) {
5637 return stbi__errpuc(
"bad header",
"Corrupt BMP");
5643 if (
info.offset < bytes_read_so_far ||
info.offset - bytes_read_so_far > extra_data_limit) {
5644 return stbi__errpuc(
"bad offset",
"Corrupt BMP");
5647 stbi__skip(
s,
info.offset - bytes_read_so_far);
5651 if (
info.bpp == 24 && ma == 0xff000000)
5654 s->img_n = ma ? 4 : 3;
5655 if (req_comp && req_comp >= 3)
5661 if (!stbi__mad3sizes_valid(target,
s->img_x,
s->img_y, 0))
5662 return stbi__errpuc(
"too large",
"Corrupt BMP");
5664 out = (
stbi_uc*)stbi__malloc_mad3(target,
s->img_x,
s->img_y, 0);
5665 if (!
out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5666 if (
info.bpp < 16) {
5668 if (psize == 0 || psize > 256) { STBI_FREE(
out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
5669 for (
i = 0;
i < psize; ++
i) {
5670 pal[
i][2] = stbi__get8(
s);
5671 pal[
i][1] = stbi__get8(
s);
5672 pal[
i][0] = stbi__get8(
s);
5673 if (
info.hsz != 12) stbi__get8(
s);
5676 stbi__skip(
s,
info.offset -
info.extra_read -
info.hsz - psize * (
info.hsz == 12 ? 3 : 4));
5677 if (
info.bpp == 1) width = (
s->img_x + 7) >> 3;
5678 else if (
info.bpp == 4) width = (
s->img_x + 1) >> 1;
5679 else if (
info.bpp == 8) width =
s->img_x;
5680 else { STBI_FREE(
out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
5682 if (
info.bpp == 1) {
5683 for (j = 0; j < (int)
s->img_y; ++j) {
5684 int bit_offset = 7, v = stbi__get8(
s);
5685 for (
i = 0;
i < (int)
s->img_x; ++
i) {
5686 int color = (v >> bit_offset) & 0x1;
5690 if (target == 4)
out[z++] = 255;
5691 if (
i + 1 == (
int)
s->img_x)
break;
5692 if ((--bit_offset) < 0) {
5701 for (j = 0; j < (int)
s->img_y; ++j) {
5702 for (
i = 0;
i < (int)
s->img_x;
i += 2) {
5703 int v = stbi__get8(
s), v2 = 0;
5704 if (
info.bpp == 4) {
5708 out[z++] = pal[v][0];
5709 out[z++] = pal[v][1];
5710 out[z++] = pal[v][2];
5711 if (target == 4)
out[z++] = 255;
5712 if (
i + 1 == (
int)
s->img_x)
break;
5713 v = (
info.bpp == 8) ? stbi__get8(
s) : v2;
5714 out[z++] = pal[v][0];
5715 out[z++] = pal[v][1];
5716 out[z++] = pal[v][2];
5717 if (target == 4)
out[z++] = 255;
5724 int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0;
5728 if (
info.bpp == 24) width = 3 *
s->img_x;
5729 else if (
info.bpp == 16) width = 2 *
s->img_x;
5732 if (
info.bpp == 24) {
5735 else if (
info.bpp == 32) {
5736 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5740 if (!mr || !mg || !mb) { STBI_FREE(
out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5742 rshift = stbi__high_bit(mr) - 7; rcount = stbi__bitcount(mr);
5743 gshift = stbi__high_bit(mg) - 7; gcount = stbi__bitcount(mg);
5744 bshift = stbi__high_bit(mb) - 7; bcount = stbi__bitcount(mb);
5745 ashift = stbi__high_bit(ma) - 7; acount = stbi__bitcount(ma);
5746 if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(
out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
5748 for (j = 0; j < (int)
s->img_y; ++j) {
5750 for (
i = 0;
i < (int)
s->img_x; ++
i) {
5752 out[z + 2] = stbi__get8(
s);
5753 out[z + 1] = stbi__get8(
s);
5754 out[z + 0] = stbi__get8(
s);
5756 a = (easy == 2 ? stbi__get8(
s) : 255);
5758 if (target == 4)
out[z++] =
a;
5763 for (
i = 0;
i < (int)
s->img_x; ++
i) {
5764 stbi__uint32 v = (bpp == 16 ? (stbi__uint32)stbi__get16le(
s) : stbi__get32le(
s));
5766 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5767 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5768 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5769 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5771 if (target == 4)
out[z++] = STBI__BYTECAST(
a);
5779 if (target == 4 && all_a == 0)
5780 for (
i = 4 *
s->img_x *
s->img_y - 1;
i >= 0;
i -= 4)
5783 if (flip_vertically) {
5785 for (j = 0; j < (int)
s->img_y >> 1; ++j) {
5787 stbi_uc* p2 =
out + (
s->img_y - 1 - j) *
s->img_x * target;
5788 for (
i = 0;
i < (int)
s->img_x * target; ++
i) {
5789 t = p1[
i]; p1[
i] = p2[
i]; p2[
i] = t;
5794 if (req_comp && req_comp != target) {
5795 out = stbi__convert_format(
out, target, req_comp,
s->img_x,
s->img_y);
5801 if (comp) *comp =
s->img_n;
5810static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
5813 if (is_rgb16) *is_rgb16 = 0;
5814 switch (bits_per_pixel) {
5818 case 15:
if (is_rgb16) *is_rgb16 = 1;
5821 case 32:
return bits_per_pixel / 8;
5826static int stbi__tga_info(stbi__context*
s,
int* x,
int* y,
int* comp)
5828 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5829 int sz, tga_colormap_type;
5831 tga_colormap_type = stbi__get8(
s);
5832 if (tga_colormap_type > 1) {
5836 tga_image_type = stbi__get8(
s);
5837 if (tga_colormap_type == 1) {
5838 if (tga_image_type != 1 && tga_image_type != 9) {
5844 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32)) {
5849 tga_colormap_bpp = sz;
5852 if ((tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11)) {
5857 tga_colormap_bpp = 0;
5859 tga_w = stbi__get16le(
s);
5864 tga_h = stbi__get16le(
s);
5869 tga_bits_per_pixel = stbi__get8(
s);
5871 if (tga_colormap_bpp != 0) {
5872 if ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5878 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0,
NULL);
5881 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11),
NULL);
5889 if (comp) *comp = tga_comp;
5893static int stbi__tga_test(stbi__context*
s)
5896 int sz, tga_color_type;
5898 tga_color_type = stbi__get8(
s);
5899 if (tga_color_type > 1)
goto errorEnd;
5901 if (tga_color_type == 1) {
5902 if (sz != 1 && sz != 9)
goto errorEnd;
5905 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
goto errorEnd;
5909 if ((sz != 2) && (sz != 3) && (sz != 10) && (sz != 11))
goto errorEnd;
5912 if (stbi__get16le(
s) < 1)
goto errorEnd;
5913 if (stbi__get16le(
s) < 1)
goto errorEnd;
5915 if ((tga_color_type == 1) && (sz != 8) && (sz != 16))
goto errorEnd;
5916 if ((sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32))
goto errorEnd;
5926static void stbi__tga_read_rgb16(stbi__context*
s,
stbi_uc*
out)
5928 stbi__uint16 px = (stbi__uint16)stbi__get16le(
s);
5929 stbi__uint16 fiveBitMask = 31;
5931 int r = (px >> 10) & fiveBitMask;
5932 int g = (px >> 5) & fiveBitMask;
5933 int b = px & fiveBitMask;
5945static void* stbi__tga_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
5948 int tga_offset = stbi__get8(
s);
5949 int tga_indexed = stbi__get8(
s);
5950 int tga_image_type = stbi__get8(
s);
5952 int tga_palette_start = stbi__get16le(
s);
5953 int tga_palette_len = stbi__get16le(
s);
5954 int tga_palette_bits = stbi__get8(
s);
5955 int tga_x_origin = stbi__get16le(
s);
5956 int tga_y_origin = stbi__get16le(
s);
5957 int tga_width = stbi__get16le(
s);
5958 int tga_height = stbi__get16le(
s);
5959 int tga_bits_per_pixel = stbi__get8(
s);
5960 int tga_comp, tga_rgb16 = 0;
5961 int tga_inverted = stbi__get8(
s);
5964 unsigned char* tga_data;
5965 unsigned char* tga_palette =
NULL;
5967 unsigned char raw_data[4] = { 0 };
5969 int RLE_repeating = 0;
5970 int read_next_pixel = 1;
5972 STBI_NOTUSED(tga_x_origin);
5973 STBI_NOTUSED(tga_y_origin);
5975 if (tga_height > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5976 if (tga_width > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
5979 if (tga_image_type >= 8)
5981 tga_image_type -= 8;
5984 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5987 if (tga_indexed) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5988 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5991 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5996 if (comp) *comp = tga_comp;
5998 if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5999 return stbi__errpuc(
"too large",
"Corrupt TGA");
6001 tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
6002 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
6005 stbi__skip(
s, tga_offset);
6007 if (!tga_indexed && !tga_is_RLE && !tga_rgb16) {
6008 for (
i = 0;
i < tga_height; ++
i) {
6009 int row = tga_inverted ? tga_height -
i - 1 :
i;
6010 stbi_uc* tga_row = tga_data + row * tga_width * tga_comp;
6011 stbi__getn(
s, tga_row, tga_width * tga_comp);
6018 if (tga_palette_len == 0) {
6019 STBI_FREE(tga_data);
6020 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
6024 stbi__skip(
s, tga_palette_start);
6026 tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
6028 STBI_FREE(tga_data);
6029 return stbi__errpuc(
"outofmem",
"Out of memory");
6032 stbi_uc* pal_entry = tga_palette;
6034 for (
i = 0;
i < tga_palette_len; ++
i) {
6035 stbi__tga_read_rgb16(
s, pal_entry);
6036 pal_entry += tga_comp;
6039 else if (!stbi__getn(
s, tga_palette, tga_palette_len * tga_comp)) {
6040 STBI_FREE(tga_data);
6041 STBI_FREE(tga_palette);
6042 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
6046 for (
i = 0;
i < tga_width * tga_height; ++
i)
6054 int RLE_cmd = stbi__get8(
s);
6055 RLE_count = 1 + (RLE_cmd & 127);
6056 RLE_repeating = RLE_cmd >> 7;
6057 read_next_pixel = 1;
6059 else if (!RLE_repeating)
6061 read_next_pixel = 1;
6066 read_next_pixel = 1;
6069 if (read_next_pixel)
6075 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(
s) : stbi__get16le(
s);
6076 if (pal_idx >= tga_palette_len) {
6080 pal_idx *= tga_comp;
6081 for (j = 0; j < tga_comp; ++j) {
6082 raw_data[j] = tga_palette[pal_idx + j];
6085 else if (tga_rgb16) {
6087 stbi__tga_read_rgb16(
s, raw_data);
6091 for (j = 0; j < tga_comp; ++j) {
6092 raw_data[j] = stbi__get8(
s);
6096 read_next_pixel = 0;
6100 for (j = 0; j < tga_comp; ++j)
6101 tga_data[
i * tga_comp + j] = raw_data[j];
6109 for (j = 0; j * 2 < tga_height; ++j)
6111 int index1 = j * tga_width * tga_comp;
6112 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
6113 for (
i = tga_width * tga_comp;
i > 0; --
i)
6115 unsigned char temp = tga_data[index1];
6116 tga_data[index1] = tga_data[index2];
6117 tga_data[index2] = temp;
6124 if (tga_palette !=
NULL)
6126 STBI_FREE(tga_palette);
6131 if (tga_comp >= 3 && !tga_rgb16)
6133 unsigned char* tga_pixel = tga_data;
6134 for (
i = 0;
i < tga_width * tga_height; ++
i)
6136 unsigned char temp = tga_pixel[0];
6137 tga_pixel[0] = tga_pixel[2];
6138 tga_pixel[2] = temp;
6139 tga_pixel += tga_comp;
6144 if (req_comp && req_comp != tga_comp)
6145 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
6149 tga_palette_start = tga_palette_len = tga_palette_bits =
6150 tga_x_origin = tga_y_origin = 0;
6151 STBI_NOTUSED(tga_palette_start);
6161static int stbi__psd_test(stbi__context*
s)
6163 int r = (stbi__get32be(
s) == 0x38425053);
6168static int stbi__psd_decode_rle(stbi__context*
s,
stbi_uc*
p,
int pixelCount)
6170 int count, nleft, len;
6173 while ((nleft = pixelCount -
count) > 0) {
6174 len = stbi__get8(
s);
6178 else if (len < 128) {
6181 if (len > nleft)
return 0;
6189 else if (len > 128) {
6194 if (len > nleft)
return 0;
6195 val = stbi__get8(
s);
6208static void* stbi__psd_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri,
int bpc)
6211 int channelCount, compression;
6219 if (stbi__get32be(
s) != 0x38425053)
6220 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
6223 if (stbi__get16be(
s) != 1)
6224 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
6230 channelCount = stbi__get16be(
s);
6231 if (channelCount < 0 || channelCount > 16)
6232 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
6235 h = stbi__get32be(
s);
6236 w = stbi__get32be(
s);
6238 if (h > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6239 if (w > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6242 bitdepth = stbi__get16be(
s);
6243 if (bitdepth != 8 && bitdepth != 16)
6244 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
6256 if (stbi__get16be(
s) != 3)
6257 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
6260 stbi__skip(
s, stbi__get32be(
s));
6263 stbi__skip(
s, stbi__get32be(
s));
6266 stbi__skip(
s, stbi__get32be(
s));
6272 compression = stbi__get16be(
s);
6273 if (compression > 1)
6274 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
6277 if (!stbi__mad3sizes_valid(4, w, h, 0))
6278 return stbi__errpuc(
"too large",
"Corrupt PSD");
6282 if (!compression && bitdepth == 16 && bpc == 16) {
6283 out = (
stbi_uc*)stbi__malloc_mad3(8, w, h, 0);
6284 ri->bits_per_channel = 16;
6289 if (!
out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6307 stbi__skip(
s, h * channelCount * 2);
6310 for (channel = 0; channel < 4; channel++) {
6314 if (channel >= channelCount) {
6316 for (
i = 0;
i < pixelCount;
i++,
p += 4)
6317 *
p = (channel == 3 ? 255 : 0);
6321 if (!stbi__psd_decode_rle(
s,
p, pixelCount)) {
6323 return stbi__errpuc(
"corrupt",
"bad RLE data");
6334 for (channel = 0; channel < 4; channel++) {
6335 if (channel >= channelCount) {
6337 if (bitdepth == 16 && bpc == 16) {
6338 stbi__uint16*
q = ((stbi__uint16*)
out) + channel;
6339 stbi__uint16 val = channel == 3 ? 65535 : 0;
6340 for (
i = 0;
i < pixelCount;
i++,
q += 4)
6345 stbi_uc val = channel == 3 ? 255 : 0;
6346 for (
i = 0;
i < pixelCount;
i++,
p += 4)
6351 if (ri->bits_per_channel == 16) {
6352 stbi__uint16*
q = ((stbi__uint16*)
out) + channel;
6353 for (
i = 0;
i < pixelCount;
i++,
q += 4)
6354 *
q = (stbi__uint16)stbi__get16be(
s);
6358 if (bitdepth == 16) {
6359 for (
i = 0;
i < pixelCount;
i++,
p += 4)
6363 for (
i = 0;
i < pixelCount;
i++,
p += 4)
6372 if (channelCount >= 4) {
6373 if (ri->bits_per_channel == 16) {
6374 for (
i = 0;
i < w * h; ++
i) {
6375 stbi__uint16* pixel = (stbi__uint16*)
out + 4 *
i;
6376 if (pixel[3] != 0 && pixel[3] != 65535) {
6377 float a = pixel[3] / 65535.0f;
6378 float ra = 1.0f /
a;
6379 float inv_a = 65535.0f * (1 - ra);
6380 pixel[0] = (stbi__uint16)(pixel[0] * ra + inv_a);
6381 pixel[1] = (stbi__uint16)(pixel[1] * ra + inv_a);
6382 pixel[2] = (stbi__uint16)(pixel[2] * ra + inv_a);
6387 for (
i = 0;
i < w * h; ++
i) {
6388 unsigned char* pixel =
out + 4 *
i;
6389 if (pixel[3] != 0 && pixel[3] != 255) {
6390 float a = pixel[3] / 255.0f;
6391 float ra = 1.0f /
a;
6392 float inv_a = 255.0f * (1 - ra);
6393 pixel[0] = (
unsigned char)(pixel[0] * ra + inv_a);
6394 pixel[1] = (
unsigned char)(pixel[1] * ra + inv_a);
6395 pixel[2] = (
unsigned char)(pixel[2] * ra + inv_a);
6402 if (req_comp && req_comp != 4) {
6403 if (ri->bits_per_channel == 16)
6404 out = (
stbi_uc*)stbi__convert_format16((stbi__uint16*)
out, 4, req_comp, w, h);
6406 out = stbi__convert_format(
out, 4, req_comp, w, h);
6410 if (comp) *comp = 4;
6426static int stbi__pic_is4(stbi__context*
s,
const char* str)
6429 for (
i = 0;
i < 4; ++
i)
6436static int stbi__pic_test_core(stbi__context*
s)
6440 if (!stbi__pic_is4(
s,
"\x53\x80\xF6\x34"))
6443 for (
i = 0;
i < 84; ++
i)
6446 if (!stbi__pic_is4(
s,
"PICT"))
6457static stbi_uc* stbi__readval(stbi__context*
s,
int channel,
stbi_uc* dest)
6461 for (
i = 0; i < 4; ++i, mask >>= 1) {
6462 if (channel & mask) {
6463 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"PIC file too short");
6464 dest[
i] = stbi__get8(
s);
6471static void stbi__copyval(
int channel,
stbi_uc* dest,
const stbi_uc* src)
6475 for (
i = 0; i < 4; ++i, mask >>= 1)
6480static stbi_uc* stbi__pic_load_core(stbi__context*
s,
int width,
int height,
int* comp,
stbi_uc* result)
6482 int act_comp = 0, num_packets = 0, y, chained;
6483 stbi__pic_packet packets[10];
6488 stbi__pic_packet* packet;
6490 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
6491 return stbi__errpuc(
"bad format",
"too many packets");
6493 packet = &packets[num_packets++];
6495 chained = stbi__get8(
s);
6496 packet->size = stbi__get8(
s);
6497 packet->type = stbi__get8(
s);
6498 packet->channel = stbi__get8(
s);
6500 act_comp |= packet->channel;
6502 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
6503 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
6506 *comp = (act_comp & 0x10 ? 4 : 3);
6508 for (y = 0; y < height; ++y) {
6511 for (packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
6512 stbi__pic_packet* packet = &packets[packet_idx];
6515 switch (packet->type) {
6517 return stbi__errpuc(
"bad format",
"packet has bad compression type");
6522 for (x = 0; x < width; ++x, dest += 4)
6523 if (!stbi__readval(
s, packet->channel, dest))
6530 int left = width,
i;
6536 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
6541 if (!stbi__readval(
s, packet->channel,
value))
return 0;
6543 for (
i = 0;
i <
count; ++
i, dest += 4)
6544 stbi__copyval(packet->channel, dest,
value);
6554 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
6560 count = stbi__get16be(
s);
6564 return stbi__errpuc(
"bad file",
"scanline overrun");
6566 if (!stbi__readval(
s, packet->channel,
value))
6569 for (
i = 0;
i <
count; ++
i, dest += 4)
6570 stbi__copyval(packet->channel, dest,
value);
6574 if (
count > left)
return stbi__errpuc(
"bad file",
"scanline overrun");
6576 for (
i = 0;
i <
count; ++
i, dest += 4)
6577 if (!stbi__readval(
s, packet->channel, dest))
6591static void* stbi__pic_load(stbi__context*
s,
int* px,
int* py,
int* comp,
int req_comp, stbi__result_info* ri)
6594 int i, x, y, internal_comp;
6597 if (!comp) comp = &internal_comp;
6599 for (
i = 0;
i < 92; ++
i)
6602 x = stbi__get16be(
s);
6603 y = stbi__get16be(
s);
6605 if (y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6606 if (x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
6608 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
6609 if (!stbi__mad3sizes_valid(x, y, 4, 0))
return stbi__errpuc(
"too large",
"PIC image too large to decode");
6617 if (!result)
return stbi__errpuc(
"outofmem",
"Out of memory");
6618 memset(result, 0xff, x * y * 4);
6620 if (!stbi__pic_load_core(
s, x, y, comp, result)) {
6626 if (req_comp == 0) req_comp = *comp;
6627 result = stbi__convert_format(result, 4, req_comp, x, y);
6632static int stbi__pic_test(stbi__context*
s)
6634 int r = stbi__pic_test_core(
s);
6660 stbi__gif_lzw codes[8192];
6664 int start_x, start_y;
6671static int stbi__gif_test_raw(stbi__context*
s)
6674 if (stbi__get8(
s) !=
'G' || stbi__get8(
s) !=
'I' || stbi__get8(
s) !=
'F' || stbi__get8(
s) !=
'8')
return 0;
6676 if (sz !=
'9' && sz !=
'7')
return 0;
6677 if (stbi__get8(
s) !=
'a')
return 0;
6681static int stbi__gif_test(stbi__context*
s)
6683 int r = stbi__gif_test_raw(
s);
6688static void stbi__gif_parse_colortable(stbi__context*
s,
stbi_uc pal[256][4],
int num_entries,
int transp)
6691 for (
i = 0;
i < num_entries; ++
i) {
6692 pal[
i][2] = stbi__get8(
s);
6693 pal[
i][1] = stbi__get8(
s);
6694 pal[
i][0] = stbi__get8(
s);
6695 pal[
i][3] = transp ==
i ? 0 : 255;
6699static int stbi__gif_header(stbi__context*
s, stbi__gif* g,
int* comp,
int is_info)
6702 if (stbi__get8(
s) !=
'G' || stbi__get8(
s) !=
'I' || stbi__get8(
s) !=
'F' || stbi__get8(
s) !=
'8')
6703 return stbi__err(
"not GIF",
"Corrupt GIF");
6705 version = stbi__get8(
s);
6706 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
6707 if (stbi__get8(
s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
6709 stbi__g_failure_reason =
"";
6710 g->w = stbi__get16le(
s);
6711 g->h = stbi__get16le(
s);
6712 g->flags = stbi__get8(
s);
6713 g->bgindex = stbi__get8(
s);
6714 g->ratio = stbi__get8(
s);
6715 g->transparent = -1;
6717 if (g->w > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
6718 if (g->h > STBI_MAX_DIMENSIONS)
return stbi__err(
"too large",
"Very large image (corrupt?)");
6720 if (comp != 0) *comp = 4;
6722 if (is_info)
return 1;
6724 if (g->flags & 0x80)
6725 stbi__gif_parse_colortable(
s, g->pal, 2 << (g->flags & 7), -1);
6730static int stbi__gif_info_raw(stbi__context*
s,
int* x,
int* y,
int* comp)
6732 stbi__gif* g = (stbi__gif*)stbi__malloc(
sizeof(stbi__gif));
6733 if (!g)
return stbi__err(
"outofmem",
"Out of memory");
6734 if (!stbi__gif_header(
s, g, comp, 1)) {
6745static void stbi__out_gif_code(stbi__gif* g, stbi__uint16
code)
6752 if (g->codes[
code].prefix >= 0)
6753 stbi__out_gif_code(g, g->codes[
code].prefix);
6755 if (g->cur_y >= g->max_y)
return;
6757 idx = g->cur_x + g->cur_y;
6759 g->history[idx / 4] = 1;
6761 c = &g->color_table[g->codes[
code].suffix * 4];
6770 if (g->cur_x >= g->max_x) {
6771 g->cur_x = g->start_x;
6772 g->cur_y += g->step;
6774 while (g->cur_y >= g->max_y && g->parse > 0) {
6775 g->step = (1 << g->parse) * g->line_size;
6776 g->cur_y = g->start_y + (g->step >> 1);
6782static stbi_uc* stbi__process_gif_raster(stbi__context*
s, stbi__gif* g)
6785 stbi__int32 len, init_code;
6787 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6790 lzw_cs = stbi__get8(
s);
6791 if (lzw_cs > 12)
return NULL;
6792 clear = 1 << lzw_cs;
6794 codesize = lzw_cs + 1;
6795 codemask = (1 << codesize) - 1;
6798 for (init_code = 0; init_code < clear; init_code++) {
6799 g->codes[init_code].prefix = -1;
6800 g->codes[init_code].first = (
stbi_uc)init_code;
6801 g->codes[init_code].suffix = (
stbi_uc)init_code;
6810 if (valid_bits < codesize) {
6812 len = stbi__get8(
s);
6817 bits |= (stbi__int32)stbi__get8(
s) << valid_bits;
6821 stbi__int32
code = bits & codemask;
6823 valid_bits -= codesize;
6825 if (
code == clear) {
6826 codesize = lzw_cs + 1;
6827 codemask = (1 << codesize) - 1;
6832 else if (
code == clear + 1) {
6834 while ((len = stbi__get8(
s)) > 0)
6838 else if (
code <= avail) {
6840 return stbi__errpuc(
"no clear code",
"Corrupt GIF");
6844 p = &g->codes[avail++];
6846 return stbi__errpuc(
"too many codes",
"Corrupt GIF");
6849 p->prefix = (stbi__int16)oldcode;
6850 p->first = g->codes[oldcode].first;
6853 else if (
code == avail)
6854 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6856 stbi__out_gif_code(g, (stbi__uint16)
code);
6858 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6860 codemask = (1 << codesize) - 1;
6866 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
6874static stbi_uc* stbi__gif_load_next(stbi__context*
s, stbi__gif* g,
int* comp,
int req_comp,
stbi_uc* two_back)
6880 STBI_NOTUSED(req_comp);
6885 if (!stbi__gif_header(
s, g, comp, 0))
return 0;
6886 if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
6887 return stbi__errpuc(
"too large",
"GIF image is too large");
6888 pcount = g->w * g->h;
6889 g->out = (
stbi_uc*)stbi__malloc(4 * pcount);
6890 g->background = (
stbi_uc*)stbi__malloc(4 * pcount);
6891 g->history = (
stbi_uc*)stbi__malloc(pcount);
6892 if (!g->out || !g->background || !g->history)
6893 return stbi__errpuc(
"outofmem",
"Out of memory");
6898 memset(g->out, 0x00, 4 * pcount);
6899 memset(g->background, 0x00, 4 * pcount);
6900 memset(g->history, 0x00, pcount);
6905 dispose = (g->eflags & 0x1C) >> 2;
6906 pcount = g->w * g->h;
6908 if ((dispose == 3) && (two_back == 0)) {
6913 for (pi = 0;
pi < pcount; ++
pi) {
6914 if (g->history[pi]) {
6915 memcpy(&g->out[pi * 4], &two_back[pi * 4], 4);
6919 else if (dispose == 2) {
6921 for (pi = 0;
pi < pcount; ++
pi) {
6922 if (g->history[pi]) {
6923 memcpy(&g->out[pi * 4], &g->background[pi * 4], 4);
6935 memcpy(g->background, g->out, 4 * g->w * g->h);
6939 memset(g->history, 0x00, g->w * g->h);
6942 int tag = stbi__get8(
s);
6946 stbi__int32 x, y, w, h;
6949 x = stbi__get16le(
s);
6950 y = stbi__get16le(
s);
6951 w = stbi__get16le(
s);
6952 h = stbi__get16le(
s);
6953 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6954 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
6956 g->line_size = g->w * 4;
6958 g->start_y = y * g->line_size;
6959 g->max_x = g->start_x + w * 4;
6960 g->max_y = g->start_y + h * g->line_size;
6961 g->cur_x = g->start_x;
6962 g->cur_y = g->start_y;
6969 g->cur_y = g->max_y;
6971 g->lflags = stbi__get8(
s);
6973 if (g->lflags & 0x40) {
6974 g->step = 8 * g->line_size;
6978 g->step = g->line_size;
6982 if (g->lflags & 0x80) {
6983 stbi__gif_parse_colortable(
s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6984 g->color_table = (
stbi_uc*)g->lpal;
6986 else if (g->flags & 0x80) {
6987 g->color_table = (
stbi_uc*)g->pal;
6990 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6992 o = stbi__process_gif_raster(
s, g);
6993 if (!o)
return NULL;
6996 pcount = g->w * g->h;
6997 if (first_frame && (g->bgindex > 0)) {
6999 for (pi = 0;
pi < pcount; ++
pi) {
7000 if (g->history[pi] == 0) {
7001 g->pal[g->bgindex][3] = 255;
7002 memcpy(&g->out[pi * 4], &g->pal[g->bgindex], 4);
7013 int ext = stbi__get8(
s);
7015 len = stbi__get8(
s);
7017 g->eflags = stbi__get8(
s);
7018 g->delay = 10 * stbi__get16le(
s);
7021 if (g->transparent >= 0) {
7022 g->pal[g->transparent][3] = 255;
7024 if (g->eflags & 0x01) {
7025 g->transparent = stbi__get8(
s);
7026 if (g->transparent >= 0) {
7027 g->pal[g->transparent][3] = 0;
7033 g->transparent = -1;
7041 while ((len = stbi__get8(
s)) != 0) {
7051 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
7056static void* stbi__load_gif_main_outofmem(stbi__gif* g,
stbi_uc*
out,
int** delays)
7059 STBI_FREE(g->history);
7060 STBI_FREE(g->background);
7063 if (delays && *delays) STBI_FREE(*delays);
7064 return stbi__errpuc(
"outofmem",
"Out of memory");
7067static void* stbi__load_gif_main(stbi__context*
s,
int** delays,
int* x,
int* y,
int* z,
int* comp,
int req_comp)
7069 if (stbi__gif_test(
s)) {
7077 int delays_size = 0;
7079 STBI_NOTUSED(out_size);
7080 STBI_NOTUSED(delays_size);
7082 memset(&g, 0,
sizeof(g));
7088 u = stbi__gif_load_next(
s, &g, comp, req_comp, two_back);
7095 stride = g.w * g.h * 4;
7098 void* tmp = (
stbi_uc*)STBI_REALLOC_SIZED(
out, out_size, layers * stride);
7100 return stbi__load_gif_main_outofmem(&g,
out, delays);
7103 out_size = layers * stride;
7107 int* new_delays = (
int*)STBI_REALLOC_SIZED(*delays, delays_size,
sizeof(
int) * layers);
7109 return stbi__load_gif_main_outofmem(&g,
out, delays);
7110 *delays = new_delays;
7111 delays_size = layers *
sizeof(int);
7115 out = (
stbi_uc*)stbi__malloc(layers * stride);
7117 return stbi__load_gif_main_outofmem(&g,
out, delays);
7118 out_size = layers * stride;
7120 *delays = (
int*)stbi__malloc(layers *
sizeof(
int));
7122 return stbi__load_gif_main_outofmem(&g,
out, delays);
7123 delays_size = layers *
sizeof(int);
7126 memcpy(
out + ((layers - 1) * stride),
u, stride);
7128 two_back =
out - 2 * stride;
7132 (*delays)[layers - 1U] = g.delay;
7139 STBI_FREE(g.history);
7140 STBI_FREE(g.background);
7143 if (req_comp && req_comp != 4)
7144 out = stbi__convert_format(
out, 4, req_comp, layers * g.w, g.h);
7150 return stbi__errpuc(
"not GIF",
"Image was not as a gif type.");
7154static void* stbi__gif_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
7158 memset(&g, 0,
sizeof(g));
7161 u = stbi__gif_load_next(
s, &g, comp, req_comp, 0);
7169 if (req_comp && req_comp != 4)
7170 u = stbi__convert_format(
u, 4, req_comp, g.w, g.h);
7178 STBI_FREE(g.history);
7179 STBI_FREE(g.background);
7184static int stbi__gif_info(stbi__context*
s,
int* x,
int* y,
int* comp)
7186 return stbi__gif_info_raw(
s, x, y, comp);
7194static int stbi__hdr_test_core(stbi__context*
s,
const char* signature)
7197 for (
i = 0; signature[
i]; ++
i)
7198 if (stbi__get8(
s) != signature[
i])
7204static int stbi__hdr_test(stbi__context*
s)
7206 int r = stbi__hdr_test_core(
s,
"#?RADIANCE\n");
7209 r = stbi__hdr_test_core(
s,
"#?RGBE\n");
7215#define STBI__HDR_BUFLEN 1024
7216static char* stbi__hdr_gettoken(stbi__context* z,
char*
buffer)
7221 c = (char)stbi__get8(z);
7223 while (!stbi__at_eof(z) && c !=
'\n') {
7225 if (len == STBI__HDR_BUFLEN - 1) {
7227 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
7231 c = (char)stbi__get8(z);
7240 if (
input[3] != 0) {
7243 f1 = (float)ldexp(1.0f,
input[3] - (
int)(128 + 8));
7251 if (req_comp == 2)
output[1] = 1;
7252 if (req_comp == 4)
output[3] = 1;
7266static float* stbi__hdr_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
7268 char buffer[STBI__HDR_BUFLEN];
7276 int i, j, k, c1, c2, z;
7277 const char* headerToken;
7281 headerToken = stbi__hdr_gettoken(
s,
buffer);
7282 if (strcmp(headerToken,
"#?RADIANCE") != 0 && strcmp(headerToken,
"#?RGBE") != 0)
7283 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
7287 token = stbi__hdr_gettoken(
s,
buffer);
7288 if (token[0] == 0)
break;
7289 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7292 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
7296 token = stbi__hdr_gettoken(
s,
buffer);
7297 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7299 height = (int)strtol(token, &token, 10);
7300 while (*token ==
' ') ++token;
7301 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
7303 width = (int)strtol(token,
NULL, 10);
7305 if (height > STBI_MAX_DIMENSIONS)
return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7306 if (width > STBI_MAX_DIMENSIONS)
return stbi__errpf(
"too large",
"Very large image (corrupt?)");
7311 if (comp) *comp = 3;
7312 if (req_comp == 0) req_comp = 3;
7314 if (!stbi__mad4sizes_valid(width, height, req_comp,
sizeof(
float), 0))
7315 return stbi__errpf(
"too large",
"HDR image is too large");
7318 hdr_data = (
float*)stbi__malloc_mad4(width, height, req_comp,
sizeof(
float), 0);
7320 return stbi__errpf(
"outofmem",
"Out of memory");
7324 if (width < 8 || width >= 32768) {
7326 for (j = 0; j < height; ++j) {
7327 for (
i = 0;
i < width; ++
i) {
7330 stbi__getn(
s, rgbe, 4);
7331 stbi__hdr_convert(hdr_data + j * width * req_comp +
i * req_comp, rgbe, req_comp);
7339 for (j = 0; j < height; ++j) {
7342 len = stbi__get8(
s);
7343 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
7351 stbi__hdr_convert(hdr_data, rgbe, req_comp);
7354 STBI_FREE(scanline);
7355 goto main_decode_loop;
7358 len |= stbi__get8(
s);
7359 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
7360 if (scanline ==
NULL) {
7361 scanline = (
stbi_uc*)stbi__malloc_mad2(width, 4, 0);
7363 STBI_FREE(hdr_data);
7364 return stbi__errpf(
"outofmem",
"Out of memory");
7368 for (k = 0; k < 4; ++k) {
7371 while ((nleft = width -
i) > 0) {
7377 if ((
count == 0) || (
count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
7378 for (z = 0; z <
count; ++z)
7379 scanline[
i++ * 4 + k] =
value;
7383 if ((
count == 0) || (
count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"corrupt",
"bad RLE data in HDR"); }
7384 for (z = 0; z <
count; ++z)
7385 scanline[
i++ * 4 + k] = stbi__get8(
s);
7389 for (
i = 0;
i < width; ++
i)
7390 stbi__hdr_convert(hdr_data + (j * width +
i) * req_comp, scanline +
i * 4, req_comp);
7393 STBI_FREE(scanline);
7399static int stbi__hdr_info(stbi__context*
s,
int* x,
int* y,
int* comp)
7401 char buffer[STBI__HDR_BUFLEN];
7408 if (!comp) comp = &dummy;
7410 if (stbi__hdr_test(
s) == 0) {
7416 token = stbi__hdr_gettoken(
s,
buffer);
7417 if (token[0] == 0)
break;
7418 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7425 token = stbi__hdr_gettoken(
s,
buffer);
7426 if (strncmp(token,
"-Y ", 3)) {
7431 *y = (int)strtol(token, &token, 10);
7432 while (*token ==
' ') ++token;
7433 if (strncmp(token,
"+X ", 3)) {
7438 *x = (int)strtol(token,
NULL, 10);
7445static int stbi__bmp_info(stbi__context*
s,
int* x,
int* y,
int* comp)
7448 stbi__bmp_data
info;
7451 p = stbi__bmp_parse_header(
s, &info);
7456 if (x) *x =
s->img_x;
7457 if (y) *y =
s->img_y;
7459 if (
info.bpp == 24 &&
info.ma == 0xff000000)
7462 *comp =
info.ma ? 4 : 3;
7469static int stbi__psd_info(stbi__context*
s,
int* x,
int* y,
int* comp)
7471 int channelCount, dummy, depth;
7474 if (!comp) comp = &dummy;
7475 if (stbi__get32be(
s) != 0x38425053) {
7479 if (stbi__get16be(
s) != 1) {
7484 channelCount = stbi__get16be(
s);
7485 if (channelCount < 0 || channelCount > 16) {
7489 *y = stbi__get32be(
s);
7490 *x = stbi__get32be(
s);
7491 depth = stbi__get16be(
s);
7492 if (depth != 8 && depth != 16) {
7496 if (stbi__get16be(
s) != 3) {
7504static int stbi__psd_is16(stbi__context*
s)
7506 int channelCount, depth;
7507 if (stbi__get32be(
s) != 0x38425053) {
7511 if (stbi__get16be(
s) != 1) {
7516 channelCount = stbi__get16be(
s);
7517 if (channelCount < 0 || channelCount > 16) {
7521 STBI_NOTUSED(stbi__get32be(
s));
7522 STBI_NOTUSED(stbi__get32be(
s));
7523 depth = stbi__get16be(
s);
7533static int stbi__pic_info(stbi__context*
s,
int* x,
int* y,
int* comp)
7535 int act_comp = 0, num_packets = 0, chained, dummy;
7536 stbi__pic_packet packets[10];
7540 if (!comp) comp = &dummy;
7542 if (!stbi__pic_is4(
s,
"\x53\x80\xF6\x34")) {
7549 *x = stbi__get16be(
s);
7550 *y = stbi__get16be(
s);
7551 if (stbi__at_eof(
s)) {
7555 if ((*x) != 0 && (1 << 28) / (*x) < (*y)) {
7563 stbi__pic_packet* packet;
7565 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
7568 packet = &packets[num_packets++];
7569 chained = stbi__get8(
s);
7570 packet->size = stbi__get8(
s);
7571 packet->type = stbi__get8(
s);
7572 packet->channel = stbi__get8(
s);
7573 act_comp |= packet->channel;
7575 if (stbi__at_eof(
s)) {
7579 if (packet->size != 8) {
7585 *comp = (act_comp & 0x10 ? 4 : 3);
7604static int stbi__pnm_test(stbi__context*
s)
7607 p = (char)stbi__get8(
s);
7608 t = (char)stbi__get8(
s);
7609 if (
p !=
'P' || (t !=
'5' && t !=
'6')) {
7616static void* stbi__pnm_load(stbi__context*
s,
int* x,
int* y,
int* comp,
int req_comp, stbi__result_info* ri)
7621 ri->bits_per_channel = stbi__pnm_info(
s, (
int*)&
s->img_x, (
int*)&
s->img_y, (
int*)&
s->img_n);
7622 if (ri->bits_per_channel == 0)
7625 if (
s->img_y > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
7626 if (
s->img_x > STBI_MAX_DIMENSIONS)
return stbi__errpuc(
"too large",
"Very large image (corrupt?)");
7630 if (comp) *comp =
s->img_n;
7632 if (!stbi__mad4sizes_valid(
s->img_n,
s->img_x,
s->img_y, ri->bits_per_channel / 8, 0))
7633 return stbi__errpuc(
"too large",
"PNM too large");
7635 out = (
stbi_uc*)stbi__malloc_mad4(
s->img_n,
s->img_x,
s->img_y, ri->bits_per_channel / 8, 0);
7636 if (!
out)
return stbi__errpuc(
"outofmem",
"Out of memory");
7637 if (!stbi__getn(
s,
out,
s->img_n *
s->img_x *
s->img_y * (ri->bits_per_channel / 8))) {
7639 return stbi__errpuc(
"bad PNM",
"PNM file truncated");
7642 if (req_comp && req_comp !=
s->img_n) {
7643 if (ri->bits_per_channel == 16) {
7644 out = (
stbi_uc*)stbi__convert_format16((stbi__uint16*)
out,
s->img_n, req_comp,
s->img_x,
s->img_y);
7647 out = stbi__convert_format(
out,
s->img_n, req_comp,
s->img_x,
s->img_y);
7654static int stbi__pnm_isspace(
char c)
7656 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
7659static void stbi__pnm_skip_whitespace(stbi__context*
s,
char* c)
7662 while (!stbi__at_eof(
s) && stbi__pnm_isspace(*c))
7663 *c = (char)stbi__get8(
s);
7665 if (stbi__at_eof(
s) || *c !=
'#')
7668 while (!stbi__at_eof(
s) && *c !=
'\n' && *c !=
'\r')
7669 *c = (
char)stbi__get8(
s);
7673static int stbi__pnm_isdigit(
char c)
7675 return c >=
'0' && c <=
'9';
7678static int stbi__pnm_getinteger(stbi__context*
s,
char* c)
7682 while (!stbi__at_eof(
s) && stbi__pnm_isdigit(*c)) {
7684 *c = (char)stbi__get8(
s);
7685 if ((
value > 214748364) || (
value == 214748364 && *c >
'7'))
7686 return stbi__err(
"integer parse overflow",
"Parsing an integer in the PPM header overflowed a 32-bit int");
7692static int stbi__pnm_info(stbi__context*
s,
int* x,
int* y,
int* comp)
7699 if (!comp) comp = &dummy;
7704 p = (char)stbi__get8(
s);
7705 t = (char)stbi__get8(
s);
7706 if (
p !=
'P' || (t !=
'5' && t !=
'6')) {
7711 *comp = (t ==
'6') ? 3 : 1;
7713 c = (char)stbi__get8(
s);
7714 stbi__pnm_skip_whitespace(
s, &c);
7716 *x = stbi__pnm_getinteger(
s, &c);
7718 return stbi__err(
"invalid width",
"PPM image header had zero or overflowing width");
7719 stbi__pnm_skip_whitespace(
s, &c);
7721 *y = stbi__pnm_getinteger(
s, &c);
7723 return stbi__err(
"invalid width",
"PPM image header had zero or overflowing width");
7724 stbi__pnm_skip_whitespace(
s, &c);
7726 maxv = stbi__pnm_getinteger(
s, &c);
7728 return stbi__err(
"max value > 65535",
"PPM image supports only 8-bit and 16-bit images");
7729 else if (maxv > 255)
7735static int stbi__pnm_is16(stbi__context*
s)
7743static int stbi__info_main(stbi__context*
s,
int* x,
int* y,
int* comp)
7746 if (stbi__jpeg_info(
s, x, y, comp))
return 1;
7750 if (stbi__png_info(
s, x, y, comp))
return 1;
7754 if (stbi__gif_info(
s, x, y, comp))
return 1;
7758 if (stbi__bmp_info(
s, x, y, comp))
return 1;
7762 if (stbi__psd_info(
s, x, y, comp))
return 1;
7766 if (stbi__pic_info(
s, x, y, comp))
return 1;
7770 if (stbi__pnm_info(
s, x, y, comp))
return 1;
7774 if (stbi__hdr_info(
s, x, y, comp))
return 1;
7779 if (stbi__tga_info(
s, x, y, comp))
7782 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
7785static int stbi__is_16_main(stbi__context*
s)
7788 if (stbi__png_is16(
s))
return 1;
7792 if (stbi__psd_is16(
s))
return 1;
7796 if (stbi__pnm_is16(
s))
return 1;
7801#ifndef STBI_NO_STDIO
7804 FILE* f = stbi__fopen(filename,
"rb");
7806 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7816 long pos = ftell(f);
7817 stbi__start_file(&
s, f);
7818 r = stbi__info_main(&
s, x, y, comp);
7819 fseek(f, pos, SEEK_SET);
7825 FILE* f = stbi__fopen(filename,
"rb");
7827 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
7837 long pos = ftell(f);
7838 stbi__start_file(&
s, f);
7839 r = stbi__is_16_main(&
s);
7840 fseek(f, pos, SEEK_SET);
7848 stbi__start_mem(&
s,
buffer, len);
7849 return stbi__info_main(&
s, x, y, comp);
7856 return stbi__info_main(&
s, x, y, comp);
7862 stbi__start_mem(&
s,
buffer, len);
7863 return stbi__is_16_main(&
s);
7870 return stbi__is_16_main(&
s);
const color transparent(0, 0, 0, 0)
constexpr std::chrono::duration< Rep, Period > abs(std::chrono::duration< Rep, Period > d)
Definition chrono.h:1986
constexpr auto count() -> size_t
Definition core.h:1538
type
Definition core.h:681
#define offset(member)
Definition css_properties.cpp:5
#define out
Definition encodings.cpp:5
#define in
Definition internal.h:15
constexpr auto num_bits() -> int
Definition format.h:504
const T & first(const T &value, const Tail &...)
Definition compile.h:179
result
Definition format.h:3059
std::string compress(const char *data, std::size_t size, int level=Z_DEFAULT_COMPRESSION)
Definition compress.hpp:100
const float pi
Definition gradient.cpp:350
vector< T > slice(const vector< T > &vec, int index, int count=-1)
Definition html.h:64
SPDLOG_INLINE bool fopen_s(FILE **fp, const filename_t &filename, const filename_t &mode)
Definition os-inl.h:128
@ info
Definition common.h:236
int parse_header(const Char *&it, const Char *end, basic_format_specs< Char > &specs, GetArg get_arg)
Definition printf.h:447
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)
@ STBI_default
Definition stb_image.h:376
@ STBI_rgb
Definition stb_image.h:380
@ STBI_rgb_alpha
Definition stb_image.h:381
@ STBI_grey
Definition stb_image.h:378
@ STBI_grey_alpha
Definition stb_image.h:379
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:385
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:396
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:386
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)
#define NULL
Definition strtod.cpp:30
Definition stb_image.h:410
q
Definition tag_strings.h:49
b
Definition tag_strings.h:61
s
Definition tag_strings.h:47
a
Definition tag_strings.h:43
image
Definition tag_strings.h:74
u
Definition tag_strings.h:62
annotation input
Definition tag_strings.h:114
annotation output
Definition tag_strings.h:122
i
Definition tag_strings.h:60
p
Definition tag_strings.h:29
h2
Definition tag_strings.h:20
header
Definition tag_strings.h:26
annotation th
Definition tag_strings.h:109
code
Definition tag_strings.h:54