207 #ifndef STBI_INCLUDE_STB_IMAGE_H 208 #define STBI_INCLUDE_STB_IMAGE_H 380 #ifndef STBI_NO_STDIO 382 #endif // STBI_NO_STDIO 384 #define STBI_VERSION 1 402 #ifdef STB_IMAGE_STATIC 403 #define STBIDEF static 405 #define STBIDEF extern 419 int(*read) (
void *user,
char *data,
int size);
420 void(*skip) (
void *user,
int n);
421 int(*eof) (
void *user);
428 #ifndef STBI_NO_STDIO 433 #ifndef STBI_NO_LINEAR 434 STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp);
438 #ifndef STBI_NO_STDIO 448 #ifndef STBI_NO_LINEAR 451 #endif // STBI_NO_HDR 456 #ifndef STBI_NO_STDIO 459 #endif // STBI_NO_STDIO 473 #ifndef STBI_NO_STDIO 509 #endif // STBI_INCLUDE_STB_IMAGE_H 511 #ifdef STB_IMAGE_IMPLEMENTATION 513 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ 514 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ 515 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ 516 || defined(STBI_ONLY_ZLIB) 517 #ifndef STBI_ONLY_JPEG 520 #ifndef STBI_ONLY_PNG 523 #ifndef STBI_ONLY_BMP 526 #ifndef STBI_ONLY_PSD 529 #ifndef STBI_ONLY_TGA 532 #ifndef STBI_ONLY_GIF 535 #ifndef STBI_ONLY_HDR 538 #ifndef STBI_ONLY_PIC 541 #ifndef STBI_ONLY_PNM 546 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) 556 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) 560 #ifndef STBI_NO_STDIO 566 #define STBI_ASSERT(x) assert(x) 572 #define stbi_inline inline 577 #define stbi_inline __forceinline 582 typedef unsigned short stbi__uint16;
583 typedef signed short stbi__int16;
584 typedef unsigned int stbi__uint32;
585 typedef signed int stbi__int32;
588 typedef uint16_t stbi__uint16;
589 typedef int16_t stbi__int16;
590 typedef uint32_t stbi__uint32;
591 typedef int32_t stbi__int32;
595 typedef unsigned char validate_uint32[
sizeof(stbi__uint32) == 4 ? 1 : -1];
598 #define STBI_NOTUSED(v) (void)(v) 600 #define STBI_NOTUSED(v) (void)sizeof(v) 604 #define STBI_HAS_LROTL 607 #ifdef STBI_HAS_LROTL 608 #define stbi_lrot(x,y) _lrotl(x,y) 610 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) 613 #if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC) 615 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) 618 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC." 622 #define STBI_MALLOC(sz) malloc(sz) 623 #define STBI_REALLOC(p,sz) realloc(p,sz) 624 #define STBI_FREE(p) free(p) 627 #if defined(__GNUC__) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) 635 #if !defined(STBI_NO_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86)) 637 #include <emmintrin.h> 641 #if _MSC_VER >= 1400 // not VC6 643 static int stbi__cpuid3(
void)
650 static int stbi__cpuid3(
void)
662 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name 664 static int stbi__sse2_available()
666 int info3 = stbi__cpuid3();
667 return ((info3 >> 26) & 1) != 0;
669 #else // assume GCC-style if not VC++ 670 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 672 static int stbi__sse2_available()
674 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later 676 return __builtin_cpu_supports(
"sse2");
687 #if defined(STBI_NO_SIMD) && defined(STBI_NEON) 692 #include <arm_neon.h> 694 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 697 #ifndef STBI_SIMD_ALIGN 698 #define STBI_SIMD_ALIGN(type, name) type name 709 stbi__uint32 img_x, img_y;
710 int img_n, img_out_n;
715 int read_from_callbacks;
719 stbi_uc *img_buffer, *img_buffer_end;
724 static void stbi__refill_buffer(stbi__context *s);
727 static void stbi__start_mem(stbi__context *s,
stbi_uc const *buffer,
int len)
730 s->read_from_callbacks = 0;
731 s->img_buffer = s->img_buffer_original = (
stbi_uc *)buffer;
732 s->img_buffer_end = (
stbi_uc *)buffer + len;
736 static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user)
739 s->io_user_data = user;
740 s->buflen =
sizeof(s->buffer_start);
741 s->read_from_callbacks = 1;
742 s->img_buffer_original = s->buffer_start;
743 stbi__refill_buffer(s);
746 #ifndef STBI_NO_STDIO 748 static int stbi__stdio_read(
void *user,
char *data,
int size)
750 return (
int)fread(data, 1, size, (FILE*)user);
753 static void stbi__stdio_skip(
void *user,
int n)
755 fseek((FILE*)user, n, SEEK_CUR);
758 static int stbi__stdio_eof(
void *user)
760 return feof((FILE*)user);
770 static void stbi__start_file(stbi__context *s, FILE *f)
772 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *)f);
777 #endif // !STBI_NO_STDIO 779 static void stbi__rewind(stbi__context *s)
784 s->img_buffer = s->img_buffer_original;
788 static int stbi__jpeg_test(stbi__context *s);
789 static stbi_uc *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
790 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
794 static int stbi__png_test(stbi__context *s);
795 static stbi_uc *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
796 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
800 static int stbi__bmp_test(stbi__context *s);
801 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
802 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
806 static int stbi__tga_test(stbi__context *s);
807 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
808 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
812 static int stbi__psd_test(stbi__context *s);
813 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
814 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
818 static int stbi__hdr_test(stbi__context *s);
819 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
820 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
824 static int stbi__pic_test(stbi__context *s);
825 static stbi_uc *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
826 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
830 static int stbi__gif_test(stbi__context *s);
831 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
832 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
836 static int stbi__pnm_test(stbi__context *s);
837 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
838 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
842 static const char *stbi__g_failure_reason;
846 return stbi__g_failure_reason;
849 static int stbi__err(
const char *str)
851 stbi__g_failure_reason = str;
855 static void *stbi__malloc(
size_t size)
857 return STBI_MALLOC(size);
864 #ifdef STBI_NO_FAILURE_STRINGS 865 #define stbi__err(x,y) 0 866 #elif defined(STBI_FAILURE_USERMSG) 867 #define stbi__err(x,y) stbi__err(y) 869 #define stbi__err(x,y) stbi__err(x) 872 #define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL)) 873 #define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL)) 877 STBI_FREE(retval_from_stbi_load);
880 #ifndef STBI_NO_LINEAR 881 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp);
885 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
888 static unsigned char *stbi_load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
891 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s, x, y, comp, req_comp);
894 if (stbi__png_test(s))
return stbi__png_load(s, x, y, comp, req_comp);
897 if (stbi__bmp_test(s))
return stbi__bmp_load(s, x, y, comp, req_comp);
900 if (stbi__gif_test(s))
return stbi__gif_load(s, x, y, comp, req_comp);
903 if (stbi__psd_test(s))
return stbi__psd_load(s, x, y, comp, req_comp);
906 if (stbi__pic_test(s))
return stbi__pic_load(s, x, y, comp, req_comp);
909 if (stbi__pnm_test(s))
return stbi__pnm_load(s, x, y, comp, req_comp);
913 if (stbi__hdr_test(s)) {
914 float *hdr = stbi__hdr_load(s, x, y, comp, req_comp);
915 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
921 if (stbi__tga_test(s))
922 return stbi__tga_load(s, x, y, comp, req_comp);
925 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
928 #ifndef STBI_NO_STDIO 930 static FILE *stbi__fopen(
char const *filename,
char const *mode)
933 #if defined(_MSC_VER) && _MSC_VER >= 1400 934 if (0 != fopen_s(&f, filename, mode))
937 f = fopen(filename, mode);
945 FILE *f = stbi__fopen(filename,
"rb");
946 unsigned char *result;
947 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
955 unsigned char *result;
957 stbi__start_file(&s, f);
958 result = stbi_load_main(&s, x, y, comp, req_comp);
961 fseek(f, -(
int)(s.img_buffer_end - s.img_buffer), SEEK_CUR);
970 stbi__start_mem(&s, buffer, len);
971 return stbi_load_main(&s, x, y, comp, req_comp);
978 return stbi_load_main(&s, x, y, comp, req_comp);
981 #ifndef STBI_NO_LINEAR 982 static float *stbi_loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
986 if (stbi__hdr_test(s))
987 return stbi__hdr_load(s, x, y, comp, req_comp);
989 data = stbi_load_main(s, x, y, comp, req_comp);
991 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
992 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
998 stbi__start_mem(&s, buffer, len);
999 return stbi_loadf_main(&s, x, y, comp, req_comp);
1006 return stbi_loadf_main(&s, x, y, comp, req_comp);
1009 #ifndef STBI_NO_STDIO 1010 STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1013 FILE *f = stbi__fopen(filename,
"rb");
1014 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1023 stbi__start_file(&s, f);
1024 return stbi_loadf_main(&s, x, y, comp, req_comp);
1026 #endif // !STBI_NO_STDIO 1028 #endif // !STBI_NO_LINEAR 1038 stbi__start_mem(&s, buffer, len);
1039 return stbi__hdr_test(&s);
1041 STBI_NOTUSED(buffer);
1047 #ifndef STBI_NO_STDIO 1050 FILE *f = stbi__fopen(filename,
"rb");
1063 stbi__start_file(&s, f);
1064 return stbi__hdr_test(&s);
1069 #endif // !STBI_NO_STDIO 1076 return stbi__hdr_test(&s);
1082 static float stbi__h2l_gamma_i = 1.0f / 2.2f, stbi__h2l_scale_i = 1.0f;
1083 static float stbi__l2h_gamma = 2.2f, stbi__l2h_scale = 1.0f;
1085 #ifndef STBI_NO_LINEAR 1101 STBI__SCAN_load = 0,
1106 static void stbi__refill_buffer(stbi__context *s)
1108 int n = (s->io.read)(s->io_user_data, (
char*)s->buffer_start, s->buflen);
1112 s->read_from_callbacks = 0;
1113 s->img_buffer = s->buffer_start;
1114 s->img_buffer_end = s->buffer_start + 1;
1118 s->img_buffer = s->buffer_start;
1119 s->img_buffer_end = s->buffer_start + n;
1123 stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1125 if (s->img_buffer < s->img_buffer_end)
1126 return *s->img_buffer++;
1127 if (s->read_from_callbacks) {
1128 stbi__refill_buffer(s);
1129 return *s->img_buffer++;
1134 stbi_inline
static int stbi__at_eof(stbi__context *s)
1137 if (!(s->io.eof)(s->io_user_data))
return 0;
1140 if (s->read_from_callbacks == 0)
return 1;
1143 return s->img_buffer >= s->img_buffer_end;
1146 static void stbi__skip(stbi__context *s,
int n)
1149 int blen = (int)(s->img_buffer_end - s->img_buffer);
1151 s->img_buffer = s->img_buffer_end;
1152 (s->io.skip)(s->io_user_data, n - blen);
1159 static int stbi__getn(stbi__context *s,
stbi_uc *buffer,
int n)
1162 int blen = (int)(s->img_buffer_end - s->img_buffer);
1166 memcpy(buffer, s->img_buffer, blen);
1168 count = (s->io.read)(s->io_user_data, (
char*)buffer + blen, n - blen);
1169 res = (count == (n - blen));
1170 s->img_buffer = s->img_buffer_end;
1175 if (s->img_buffer + n <= s->img_buffer_end) {
1176 memcpy(buffer, s->img_buffer, n);
1184 static int stbi__get16be(stbi__context *s)
1186 int z = stbi__get8(s);
1187 return (z << 8) + stbi__get8(s);
1190 static stbi__uint32 stbi__get32be(stbi__context *s)
1192 stbi__uint32 z = stbi__get16be(s);
1193 return (z << 16) + stbi__get16be(s);
1196 static int stbi__get16le(stbi__context *s)
1198 int z = stbi__get8(s);
1199 return z + (stbi__get8(s) << 8);
1202 static stbi__uint32 stbi__get32le(stbi__context *s)
1204 stbi__uint32 z = stbi__get16le(s);
1205 return z + (stbi__get16le(s) << 16);
1208 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings 1222 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1224 return (
stbi_uc)(((r * 77) + (g * 150) + (29 * b)) >> 8);
1227 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1230 unsigned char *good;
1232 if (req_comp == img_n)
return data;
1233 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1235 good = (
unsigned char *)stbi__malloc(req_comp * x * y);
1238 return stbi__errpuc(
"outofmem",
"Out of memory");
1241 for (j = 0; j < (int)y; ++j) {
1242 unsigned char *src = data + j * x * img_n;
1243 unsigned char *dest = good + j * x * req_comp;
1245 #define COMBO(a,b) ((a)*8+(b)) 1246 #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 1249 switch (COMBO(img_n, req_comp)) {
1250 CASE(1, 2) dest[0] = src[0], dest[1] = 255; break;
1251 CASE(1, 3) dest[0] = dest[1] = dest[2] = src[0]; break;
1252 CASE(1, 4) dest[0] = dest[1] = dest[2] = src[0], dest[3] = 255; break;
1253 CASE(2, 1) dest[0] = src[0]; break;
1254 CASE(2, 3) dest[0] = dest[1] = dest[2] = src[0]; break;
1255 CASE(2, 4) dest[0] = dest[1] = dest[2] = src[0], dest[3] = src[1]; break;
1256 CASE(3, 4) dest[0] = src[0], dest[1] = src[1], dest[2] = src[2], dest[3] = 255; break;
1257 CASE(3, 1) dest[0] = stbi__compute_y(src[0], src[1], src[2]); break;
1258 CASE(3, 2) dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = 255; break;
1259 CASE(4, 1) dest[0] = stbi__compute_y(src[0], src[1], src[2]); break;
1260 CASE(4, 2) dest[0] = stbi__compute_y(src[0], src[1], src[2]), dest[1] = src[3]; break;
1261 CASE(4, 3) dest[0] = src[0], dest[1] = src[1], dest[2] = src[2]; break;
1262 default: STBI_ASSERT(0);
1271 #ifndef STBI_NO_LINEAR 1272 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp)
1275 float *output = (
float *)stbi__malloc(x * y * comp *
sizeof(
float));
1276 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1278 if (comp & 1) n = comp;
else n = comp - 1;
1279 for (i = 0; i < x*y; ++i) {
1280 for (k = 0; k < n; ++k) {
1281 output[i*comp + k] = (float)(pow(data[i*comp + k] / 255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1283 if (k < comp) output[i*comp + k] = data[i*comp + k] / 255.0f;
1291 #define stbi__float2int(x) ((int) (x)) 1292 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1296 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1298 if (comp & 1) n = comp;
else n = comp - 1;
1299 for (i = 0; i < x*y; ++i) {
1300 for (k = 0; k < n; ++k) {
1301 float z = (float)pow(data[i*comp + k] * stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1303 if (z > 255) z = 255;
1304 output[i*comp + k] = (
stbi_uc)stbi__float2int(z);
1307 float z = data[i*comp + k] * 255 + 0.5f;
1309 if (z > 255) z = 255;
1310 output[i*comp + k] = (
stbi_uc)stbi__float2int(z);
1339 #ifndef STBI_NO_JPEG 1342 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache 1348 stbi__uint16 code[256];
1351 unsigned int maxcode[18];
1358 stbi__huffman huff_dc[4];
1359 stbi__huffman huff_ac[4];
1361 stbi__int16 fast_ac[4][1 << FAST_BITS];
1364 int img_h_max, img_v_max;
1365 int img_mcu_x, img_mcu_y;
1366 int img_mcu_w, img_mcu_h;
1379 void *raw_data, *raw_coeff;
1382 int coeff_w, coeff_h;
1385 stbi__uint32 code_buffer;
1387 unsigned char marker;
1397 int scan_n, order[4];
1398 int restart_interval, todo;
1401 void(*idct_block_kernel)(
stbi_uc *out,
int out_stride,
short data[64]);
1406 static int stbi__build_huffman(stbi__huffman *h,
int *count)
1408 int i, j, k = 0, code;
1410 for (i = 0; i < 16; ++i)
1411 for (j = 0; j < count[i]; ++j)
1412 h->size[k++] = (
stbi_uc)(i + 1);
1418 for (j = 1; j <= 16; ++j) {
1420 h->delta[j] = k - code;
1421 if (h->size[k] == j) {
1422 while (h->size[k] == j)
1423 h->code[k++] = (stbi__uint16)(code++);
1424 if (code - 1 >= (1 << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1427 h->maxcode[j] = code << (16 - j);
1430 h->maxcode[j] = 0xffffffff;
1433 memset(h->fast, 255, 1 << FAST_BITS);
1434 for (i = 0; i < k; ++i) {
1436 if (s <= FAST_BITS) {
1437 int c = h->code[i] << (FAST_BITS - s);
1438 int m = 1 << (FAST_BITS - s);
1439 for (j = 0; j < m; ++j) {
1449 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1452 for (i = 0; i < (1 << FAST_BITS); ++i) {
1456 int rs = h->values[fast];
1457 int run = (rs >> 4) & 15;
1458 int magbits = rs & 15;
1459 int len = h->size[fast];
1461 if (magbits && len + magbits <= FAST_BITS) {
1463 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1464 int m = 1 << (magbits - 1);
1465 if (k < m) k += (-1 << magbits) + 1;
1467 if (k >= -128 && k <= 127)
1468 fast_ac[i] = (stbi__int16)((k << 8) + (run << 4) + (len + magbits));
1474 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1477 int b = j->nomore ? 0 : stbi__get8(j->s);
1479 int c = stbi__get8(j->s);
1481 j->marker = (
unsigned char)c;
1486 j->code_buffer |= b << (24 - j->code_bits);
1488 }
while (j->code_bits <= 24);
1492 static stbi__uint32 stbi__bmask[17] = { 0, 1, 3, 7, 15, 31, 63, 127, 255, 511, 1023, 2047, 4095, 8191, 16383, 32767, 65535 };
1495 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1500 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1504 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
1508 if (s > j->code_bits)
1510 j->code_buffer <<= s;
1512 return h->values[k];
1521 temp = j->code_buffer >> 16;
1522 for (k = FAST_BITS + 1;; ++k)
1523 if (temp < h->maxcode[k])
1531 if (k > j->code_bits)
1535 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1536 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1540 j->code_buffer <<= k;
1541 return h->values[c];
1545 static int const stbi__jbias[16] = { 0, -1, -3, -7, -15, -31, -63, -127, -255, -511, -1023, -2047, -4095, -8191, -16383, -32767 };
1549 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1553 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1555 sgn = (stbi__int32)j->code_buffer >> 31;
1556 k = stbi_lrot(j->code_buffer, n);
1557 j->code_buffer = k & ~stbi__bmask[n];
1558 k &= stbi__bmask[n];
1560 return k + (stbi__jbias[n] & ~sgn);
1564 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
1567 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1568 k = stbi_lrot(j->code_buffer, n);
1569 j->code_buffer = k & ~stbi__bmask[n];
1570 k &= stbi__bmask[n];
1575 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
1578 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1580 j->code_buffer <<= 1;
1582 return k & 0x80000000;
1587 static stbi_uc stbi__jpeg_dezigzag[64 + 15] =
1589 0, 1, 8, 16, 9, 2, 3, 10,
1590 17, 24, 32, 25, 18, 11, 4, 5,
1591 12, 19, 26, 33, 40, 48, 41, 34,
1592 27, 20, 13, 6, 7, 14, 21, 28,
1593 35, 42, 49, 56, 57, 50, 43, 36,
1594 29, 22, 15, 23, 30, 37, 44, 51,
1595 58, 59, 52, 45, 38, 31, 39, 46,
1596 53, 60, 61, 54, 47, 55, 62, 63,
1598 63, 63, 63, 63, 63, 63, 63, 63,
1599 63, 63, 63, 63, 63, 63, 63
1603 static int stbi__jpeg_decode_block(stbi__jpeg *j,
short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac,
int b,
stbi_uc *dequant)
1608 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1609 t = stbi__jpeg_huff_decode(j, hdc);
1610 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1613 memset(data, 0, 64 *
sizeof(data[0]));
1615 diff = t ? stbi__extend_receive(j, t) : 0;
1616 dc = j->img_comp[b].dc_pred + diff;
1617 j->img_comp[b].dc_pred = dc;
1618 data[0] = (short)(dc * dequant[0]);
1625 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1626 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
1631 j->code_buffer <<= s;
1634 zig = stbi__jpeg_dezigzag[k++];
1635 data[zig] = (short)((r >> 8) * dequant[zig]);
1638 int rs = stbi__jpeg_huff_decode(j, hac);
1639 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1643 if (rs != 0xf0)
break;
1649 zig = stbi__jpeg_dezigzag[k++];
1650 data[zig] = (short)(stbi__extend_receive(j, s) * dequant[zig]);
1657 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
1661 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1663 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1665 if (j->succ_high == 0) {
1667 memset(data, 0, 64 *
sizeof(data[0]));
1668 t = stbi__jpeg_huff_decode(j, hdc);
1669 diff = t ? stbi__extend_receive(j, t) : 0;
1671 dc = j->img_comp[b].dc_pred + diff;
1672 j->img_comp[b].dc_pred = dc;
1673 data[0] = (short)(dc << j->succ_low);
1677 if (stbi__jpeg_get_bit(j))
1678 data[0] += (
short)(1 << j->succ_low);
1685 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
1688 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1690 if (j->succ_high == 0) {
1691 int shift = j->succ_low;
1702 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1703 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS) - 1);
1708 j->code_buffer <<= s;
1710 zig = stbi__jpeg_dezigzag[k++];
1711 data[zig] = (short)((r >> 8) << shift);
1714 int rs = stbi__jpeg_huff_decode(j, hac);
1715 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1720 j->eob_run = (1 << r);
1722 j->eob_run += stbi__jpeg_get_bits(j, r);
1730 zig = stbi__jpeg_dezigzag[k++];
1731 data[zig] = (short)(stbi__extend_receive(j, s) << shift);
1734 }
while (k <= j->spec_end);
1739 short bit = (short)(1 << j->succ_low);
1743 for (k = j->spec_start; k <= j->spec_end; ++k) {
1744 short *p = &data[stbi__jpeg_dezigzag[k]];
1746 if (stbi__jpeg_get_bit(j))
1747 if ((*p & bit) == 0) {
1759 int rs = stbi__jpeg_huff_decode(j, hac);
1760 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1765 j->eob_run = (1 << r) - 1;
1767 j->eob_run += stbi__jpeg_get_bits(j, r);
1774 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1776 if (stbi__jpeg_get_bit(j))
1783 while (k <= j->spec_end) {
1784 short *p = &data[stbi__jpeg_dezigzag[k]];
1786 if (stbi__jpeg_get_bit(j))
1787 if ((*p & bit) == 0) {
1798 data[stbi__jpeg_dezigzag[k++]] = (short)s;
1805 }
while (k <= j->spec_end);
1812 stbi_inline
static stbi_uc stbi__clamp(
int x)
1815 if ((
unsigned int)x > 255) {
1816 if (x < 0)
return 0;
1817 if (x > 255)
return 255;
1822 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) 1823 #define stbi__fsh(x) ((x) << 12) 1826 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ 1827 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ 1830 p1 = (p2+p3) * stbi__f2f(0.5411961f); \ 1831 t2 = p1 + p3*stbi__f2f(-1.847759065f); \ 1832 t3 = p1 + p2*stbi__f2f( 0.765366865f); \ 1835 t0 = stbi__fsh(p2+p3); \ 1836 t1 = stbi__fsh(p2-p3); \ 1849 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ 1850 t0 = t0*stbi__f2f( 0.298631336f); \ 1851 t1 = t1*stbi__f2f( 2.053119869f); \ 1852 t2 = t2*stbi__f2f( 3.072711026f); \ 1853 t3 = t3*stbi__f2f( 1.501321110f); \ 1854 p1 = p5 + p1*stbi__f2f(-0.899976223f); \ 1855 p2 = p5 + p2*stbi__f2f(-2.562915447f); \ 1856 p3 = p3*stbi__f2f(-1.961570560f); \ 1857 p4 = p4*stbi__f2f(-0.390180644f); \ 1863 static void stbi__idct_block(
stbi_uc *out,
int out_stride,
short data[64])
1865 int i, val[64], *v = val;
1870 for (i = 0; i < 8; ++i, ++d, ++v) {
1872 if (d[8] == 0 && d[16] == 0 && d[24] == 0 && d[32] == 0
1873 && d[40] == 0 && d[48] == 0 && d[56] == 0) {
1878 int dcterm = d[0] << 2;
1879 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1882 STBI__IDCT_1D(d[0], d[8], d[16], d[24], d[32], d[40], d[48], d[56])
1885 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
1886 v[0] = (x0 + t3) >> 10;
1887 v[56] = (x0 - t3) >> 10;
1888 v[8] = (x1 + t2) >> 10;
1889 v[48] = (x1 - t2) >> 10;
1890 v[16] = (x2 + t1) >> 10;
1891 v[40] = (x2 - t1) >> 10;
1892 v[24] = (x3 + t0) >> 10;
1893 v[32] = (x3 - t0) >> 10;
1897 for (i = 0, v = val, o = out; i < 8; ++i, v += 8, o += out_stride) {
1899 STBI__IDCT_1D(v[0], v[1], v[2], v[3], v[4], v[5], v[6], v[7])
1906 x0 += 65536 + (128 << 17);
1907 x1 += 65536 + (128 << 17);
1908 x2 += 65536 + (128 << 17);
1909 x3 += 65536 + (128 << 17);
1912 o[0] = stbi__clamp((x0 + t3) >> 17);
1913 o[7] = stbi__clamp((x0 - t3) >> 17);
1914 o[1] = stbi__clamp((x1 + t2) >> 17);
1915 o[6] = stbi__clamp((x1 - t2) >> 17);
1916 o[2] = stbi__clamp((x2 + t1) >> 17);
1917 o[5] = stbi__clamp((x2 - t1) >> 17);
1918 o[3] = stbi__clamp((x3 + t0) >> 17);
1919 o[4] = stbi__clamp((x3 - t0) >> 17);
1927 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
1930 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
1934 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) 1938 #define dct_rot(out0,out1, x,y,c0,c1) \ 1939 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ 1940 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ 1941 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ 1942 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ 1943 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ 1944 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) 1947 #define dct_widen(out, in) \ 1948 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ 1949 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) 1952 #define dct_wadd(out, a, b) \ 1953 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ 1954 __m128i out##_h = _mm_add_epi32(a##_h, b##_h) 1957 #define dct_wsub(out, a, b) \ 1958 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ 1959 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) 1962 #define dct_bfly32o(out0, out1, a,b,bias,s) \ 1964 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ 1965 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ 1966 dct_wadd(sum, abiased, b); \ 1967 dct_wsub(dif, abiased, b); \ 1968 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ 1969 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ 1973 #define dct_interleave8(a, b) \ 1975 a = _mm_unpacklo_epi8(a, b); \ 1976 b = _mm_unpackhi_epi8(tmp, b) 1979 #define dct_interleave16(a, b) \ 1981 a = _mm_unpacklo_epi16(a, b); \ 1982 b = _mm_unpackhi_epi16(tmp, b) 1984 #define dct_pass(bias,shift) \ 1987 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ 1988 __m128i sum04 = _mm_add_epi16(row0, row4); \ 1989 __m128i dif04 = _mm_sub_epi16(row0, row4); \ 1990 dct_widen(t0e, sum04); \ 1991 dct_widen(t1e, dif04); \ 1992 dct_wadd(x0, t0e, t3e); \ 1993 dct_wsub(x3, t0e, t3e); \ 1994 dct_wadd(x1, t1e, t2e); \ 1995 dct_wsub(x2, t1e, t2e); \ 1997 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ 1998 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ 1999 __m128i sum17 = _mm_add_epi16(row1, row7); \ 2000 __m128i sum35 = _mm_add_epi16(row3, row5); \ 2001 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ 2002 dct_wadd(x4, y0o, y4o); \ 2003 dct_wadd(x5, y1o, y5o); \ 2004 dct_wadd(x6, y2o, y5o); \ 2005 dct_wadd(x7, y3o, y4o); \ 2006 dct_bfly32o(row0,row7, x0,x7,bias,shift); \ 2007 dct_bfly32o(row1,row6, x1,x6,bias,shift); \ 2008 dct_bfly32o(row2,row5, x2,x5,bias,shift); \ 2009 dct_bfly32o(row3,row4, x3,x4,bias,shift); \ 2012 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2013 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f(0.765366865f), stbi__f2f(0.5411961f));
2014 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2015 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2016 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f(0.298631336f), stbi__f2f(-1.961570560f));
2017 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f(3.072711026f));
2018 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f(2.053119869f), stbi__f2f(-0.390180644f));
2019 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f(1.501321110f));
2022 __m128i bias_0 = _mm_set1_epi32(512);
2023 __m128i bias_1 = _mm_set1_epi32(65536 + (128 << 17));
2026 row0 = _mm_load_si128((
const __m128i *) (data + 0 * 8));
2027 row1 = _mm_load_si128((
const __m128i *) (data + 1 * 8));
2028 row2 = _mm_load_si128((
const __m128i *) (data + 2 * 8));
2029 row3 = _mm_load_si128((
const __m128i *) (data + 3 * 8));
2030 row4 = _mm_load_si128((
const __m128i *) (data + 4 * 8));
2031 row5 = _mm_load_si128((
const __m128i *) (data + 5 * 8));
2032 row6 = _mm_load_si128((
const __m128i *) (data + 6 * 8));
2033 row7 = _mm_load_si128((
const __m128i *) (data + 7 * 8));
2036 dct_pass(bias_0, 10);
2040 dct_interleave16(row0, row4);
2041 dct_interleave16(row1, row5);
2042 dct_interleave16(row2, row6);
2043 dct_interleave16(row3, row7);
2046 dct_interleave16(row0, row2);
2047 dct_interleave16(row1, row3);
2048 dct_interleave16(row4, row6);
2049 dct_interleave16(row5, row7);
2052 dct_interleave16(row0, row1);
2053 dct_interleave16(row2, row3);
2054 dct_interleave16(row4, row5);
2055 dct_interleave16(row6, row7);
2059 dct_pass(bias_1, 17);
2063 __m128i p0 = _mm_packus_epi16(row0, row1);
2064 __m128i p1 = _mm_packus_epi16(row2, row3);
2065 __m128i p2 = _mm_packus_epi16(row4, row5);
2066 __m128i p3 = _mm_packus_epi16(row6, row7);
2069 dct_interleave8(p0, p2);
2070 dct_interleave8(p1, p3);
2073 dct_interleave8(p0, p1);
2074 dct_interleave8(p2, p3);
2077 dct_interleave8(p0, p2);
2078 dct_interleave8(p1, p3);
2081 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2082 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2083 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2084 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2085 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2086 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2087 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2088 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2097 #undef dct_interleave8 2098 #undef dct_interleave16 2108 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2110 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2112 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2113 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2114 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f(0.765366865f));
2115 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f(1.175875602f));
2116 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2117 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2118 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2119 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2120 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f(0.298631336f));
2121 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f(2.053119869f));
2122 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f(3.072711026f));
2123 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f(1.501321110f));
2125 #define dct_long_mul(out, inq, coeff) \ 2126 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ 2127 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) 2129 #define dct_long_mac(out, acc, inq, coeff) \ 2130 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ 2131 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) 2133 #define dct_widen(out, inq) \ 2134 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ 2135 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) 2138 #define dct_wadd(out, a, b) \ 2139 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ 2140 int32x4_t out##_h = vaddq_s32(a##_h, b##_h) 2143 #define dct_wsub(out, a, b) \ 2144 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ 2145 int32x4_t out##_h = vsubq_s32(a##_h, b##_h) 2148 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \ 2150 dct_wadd(sum, a, b); \ 2151 dct_wsub(dif, a, b); \ 2152 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ 2153 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ 2156 #define dct_pass(shiftop, shift) \ 2159 int16x8_t sum26 = vaddq_s16(row2, row6); \ 2160 dct_long_mul(p1e, sum26, rot0_0); \ 2161 dct_long_mac(t2e, p1e, row6, rot0_1); \ 2162 dct_long_mac(t3e, p1e, row2, rot0_2); \ 2163 int16x8_t sum04 = vaddq_s16(row0, row4); \ 2164 int16x8_t dif04 = vsubq_s16(row0, row4); \ 2165 dct_widen(t0e, sum04); \ 2166 dct_widen(t1e, dif04); \ 2167 dct_wadd(x0, t0e, t3e); \ 2168 dct_wsub(x3, t0e, t3e); \ 2169 dct_wadd(x1, t1e, t2e); \ 2170 dct_wsub(x2, t1e, t2e); \ 2172 int16x8_t sum15 = vaddq_s16(row1, row5); \ 2173 int16x8_t sum17 = vaddq_s16(row1, row7); \ 2174 int16x8_t sum35 = vaddq_s16(row3, row5); \ 2175 int16x8_t sum37 = vaddq_s16(row3, row7); \ 2176 int16x8_t sumodd = vaddq_s16(sum17, sum35); \ 2177 dct_long_mul(p5o, sumodd, rot1_0); \ 2178 dct_long_mac(p1o, p5o, sum17, rot1_1); \ 2179 dct_long_mac(p2o, p5o, sum35, rot1_2); \ 2180 dct_long_mul(p3o, sum37, rot2_0); \ 2181 dct_long_mul(p4o, sum15, rot2_1); \ 2182 dct_wadd(sump13o, p1o, p3o); \ 2183 dct_wadd(sump24o, p2o, p4o); \ 2184 dct_wadd(sump23o, p2o, p3o); \ 2185 dct_wadd(sump14o, p1o, p4o); \ 2186 dct_long_mac(x4, sump13o, row7, rot3_0); \ 2187 dct_long_mac(x5, sump24o, row5, rot3_1); \ 2188 dct_long_mac(x6, sump23o, row3, rot3_2); \ 2189 dct_long_mac(x7, sump14o, row1, rot3_3); \ 2190 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ 2191 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ 2192 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ 2193 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ 2197 row0 = vld1q_s16(data + 0 * 8);
2198 row1 = vld1q_s16(data + 1 * 8);
2199 row2 = vld1q_s16(data + 2 * 8);
2200 row3 = vld1q_s16(data + 3 * 8);
2201 row4 = vld1q_s16(data + 4 * 8);
2202 row5 = vld1q_s16(data + 5 * 8);
2203 row6 = vld1q_s16(data + 6 * 8);
2204 row7 = vld1q_s16(data + 7 * 8);
2207 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2210 dct_pass(vrshrn_n_s32, 10);
2216 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } 2217 #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]); } 2218 #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)); } 2221 dct_trn16(row0, row1);
2222 dct_trn16(row2, row3);
2223 dct_trn16(row4, row5);
2224 dct_trn16(row6, row7);
2227 dct_trn32(row0, row2);
2228 dct_trn32(row1, row3);
2229 dct_trn32(row4, row6);
2230 dct_trn32(row5, row7);
2233 dct_trn64(row0, row4);
2234 dct_trn64(row1, row5);
2235 dct_trn64(row2, row6);
2236 dct_trn64(row3, row7);
2247 dct_pass(vshrn_n_s32, 16);
2251 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2252 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2253 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2254 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2255 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2256 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2257 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2258 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2261 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } 2262 #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]); } 2263 #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]); } 2275 dct_trn8_16(p0, p2);
2276 dct_trn8_16(p1, p3);
2277 dct_trn8_16(p4, p6);
2278 dct_trn8_16(p5, p7);
2281 dct_trn8_32(p0, p4);
2282 dct_trn8_32(p1, p5);
2283 dct_trn8_32(p2, p6);
2284 dct_trn8_32(p3, p7);
2287 vst1_u8(out, p0); out += out_stride;
2288 vst1_u8(out, p1); out += out_stride;
2289 vst1_u8(out, p2); out += out_stride;
2290 vst1_u8(out, p3); out += out_stride;
2291 vst1_u8(out, p4); out += out_stride;
2292 vst1_u8(out, p5); out += out_stride;
2293 vst1_u8(out, p6); out += out_stride;
2312 #define STBI__MARKER_none 0xff 2316 static stbi_uc stbi__get_marker(stbi__jpeg *j)
2319 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2320 x = stbi__get8(j->s);
2321 if (x != 0xff)
return STBI__MARKER_none;
2323 x = stbi__get8(j->s);
2329 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) 2333 static void stbi__jpeg_reset(stbi__jpeg *j)
2338 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
2339 j->marker = STBI__MARKER_none;
2340 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2346 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2348 stbi__jpeg_reset(z);
2349 if (!z->progressive) {
2350 if (z->scan_n == 1) {
2352 STBI_SIMD_ALIGN(
short, data[64]);
2353 int n = z->order[0];
2358 int w = (z->img_comp[n].x + 7) >> 3;
2359 int h = (z->img_comp[n].y + 7) >> 3;
2360 for (j = 0; j < h; ++j) {
2361 for (i = 0; i < w; ++i) {
2362 int ha = z->img_comp[n].ha;
2363 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;
2364 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2*j * 8 + i * 8, z->img_comp[n].w2, data);
2366 if (--z->todo <= 0) {
2367 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2370 if (!STBI__RESTART(z->marker))
return 1;
2371 stbi__jpeg_reset(z);
2379 STBI_SIMD_ALIGN(
short, data[64]);
2380 for (j = 0; j < z->img_mcu_y; ++j) {
2381 for (i = 0; i < z->img_mcu_x; ++i) {
2383 for (k = 0; k < z->scan_n; ++k) {
2384 int n = z->order[k];
2387 for (y = 0; y < z->img_comp[n].v; ++y) {
2388 for (x = 0; x < z->img_comp[n].h; ++x) {
2389 int x2 = (i*z->img_comp[n].h + x) * 8;
2390 int y2 = (j*z->img_comp[n].v + y) * 8;
2391 int ha = z->img_comp[n].ha;
2392 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;
2393 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2*y2 + x2, z->img_comp[n].w2, data);
2399 if (--z->todo <= 0) {
2400 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2401 if (!STBI__RESTART(z->marker))
return 1;
2402 stbi__jpeg_reset(z);
2410 if (z->scan_n == 1) {
2412 int n = z->order[0];
2417 int w = (z->img_comp[n].x + 7) >> 3;
2418 int h = (z->img_comp[n].y + 7) >> 3;
2419 for (j = 0; j < h; ++j) {
2420 for (i = 0; i < w; ++i) {
2421 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2422 if (z->spec_start == 0) {
2423 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2427 int ha = z->img_comp[n].ha;
2428 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2432 if (--z->todo <= 0) {
2433 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2434 if (!STBI__RESTART(z->marker))
return 1;
2435 stbi__jpeg_reset(z);
2443 for (j = 0; j < z->img_mcu_y; ++j) {
2444 for (i = 0; i < z->img_mcu_x; ++i) {
2446 for (k = 0; k < z->scan_n; ++k) {
2447 int n = z->order[k];
2450 for (y = 0; y < z->img_comp[n].v; ++y) {
2451 for (x = 0; x < z->img_comp[n].h; ++x) {
2452 int x2 = (i*z->img_comp[n].h + x);
2453 int y2 = (j*z->img_comp[n].v + y);
2454 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2455 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2462 if (--z->todo <= 0) {
2463 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2464 if (!STBI__RESTART(z->marker))
return 1;
2465 stbi__jpeg_reset(z);
2474 static void stbi__jpeg_dequantize(
short *data,
stbi_uc *dequant)
2477 for (i = 0; i < 64; ++i)
2478 data[i] *= dequant[i];
2481 static void stbi__jpeg_finish(stbi__jpeg *z)
2483 if (z->progressive) {
2486 for (n = 0; n < z->s->img_n; ++n) {
2487 int w = (z->img_comp[n].x + 7) >> 3;
2488 int h = (z->img_comp[n].y + 7) >> 3;
2489 for (j = 0; j < h; ++j) {
2490 for (i = 0; i < w; ++i) {
2491 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2492 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2493 z->idct_block_kernel(z->img_comp[n].data + z->img_comp[n].w2*j * 8 + i * 8, z->img_comp[n].w2, data);
2500 static int stbi__process_marker(stbi__jpeg *z,
int m)
2504 case STBI__MARKER_none:
2505 return stbi__err(
"expected marker",
"Corrupt JPEG");
2508 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2509 z->restart_interval = stbi__get16be(z->s);
2513 L = stbi__get16be(z->s) - 2;
2515 int q = stbi__get8(z->s);
2518 if (p != 0)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2519 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2520 for (i = 0; i < 64; ++i)
2521 z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
2527 L = stbi__get16be(z->s) - 2;
2530 int sizes[16], i, n = 0;
2531 int q = stbi__get8(z->s);
2534 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2535 for (i = 0; i < 16; ++i) {
2536 sizes[i] = stbi__get8(z->s);
2541 if (!stbi__build_huffman(z->huff_dc + th, sizes))
return 0;
2542 v = z->huff_dc[th].values;
2545 if (!stbi__build_huffman(z->huff_ac + th, sizes))
return 0;
2546 v = z->huff_ac[th].values;
2548 for (i = 0; i < n; ++i)
2549 v[i] = stbi__get8(z->s);
2551 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2557 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2558 stbi__skip(z->s, stbi__get16be(z->s) - 2);
2565 static int stbi__process_scan_header(stbi__jpeg *z)
2568 int Ls = stbi__get16be(z->s);
2569 z->scan_n = stbi__get8(z->s);
2570 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");
2571 if (Ls != 6 + 2 * z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2572 for (i = 0; i < z->scan_n; ++i) {
2573 int id = stbi__get8(z->s), which;
2574 int q = stbi__get8(z->s);
2575 for (which = 0; which < z->s->img_n; ++which)
2576 if (z->img_comp[which].id ==
id)
2578 if (which == z->s->img_n)
return 0;
2579 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2580 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2581 z->order[i] = which;
2586 z->spec_start = stbi__get8(z->s);
2587 z->spec_end = stbi__get8(z->s);
2588 aa = stbi__get8(z->s);
2589 z->succ_high = (aa >> 4);
2590 z->succ_low = (aa & 15);
2591 if (z->progressive) {
2592 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2593 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2596 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2597 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2605 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
2607 stbi__context *s = z->s;
2608 int Lf, p, i, q, h_max = 1, v_max = 1, c;
2609 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2610 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
2611 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
2612 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
2614 if (c != 3 && c != 1)
return stbi__err(
"bad component count",
"Corrupt JPEG");
2616 for (i = 0; i < c; ++i) {
2617 z->img_comp[i].data = NULL;
2618 z->img_comp[i].linebuf = NULL;
2621 if (Lf != 8 + 3 * s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2623 for (i = 0; i < s->img_n; ++i) {
2624 z->img_comp[i].id = stbi__get8(s);
2625 if (z->img_comp[i].id != i + 1)
2626 if (z->img_comp[i].id != i)
2627 return stbi__err(
"bad component ID",
"Corrupt JPEG");
2629 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");
2630 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");
2631 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
2634 if (scan != STBI__SCAN_load)
return 1;
2636 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
2638 for (i = 0; i < s->img_n; ++i) {
2639 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
2640 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
2644 z->img_h_max = h_max;
2645 z->img_v_max = v_max;
2646 z->img_mcu_w = h_max * 8;
2647 z->img_mcu_h = v_max * 8;
2648 z->img_mcu_x = (s->img_x + z->img_mcu_w - 1) / z->img_mcu_w;
2649 z->img_mcu_y = (s->img_y + z->img_mcu_h - 1) / z->img_mcu_h;
2651 for (i = 0; i < s->img_n; ++i) {
2653 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max - 1) / h_max;
2654 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max - 1) / v_max;
2659 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
2660 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
2661 z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2 + 15);
2663 if (z->img_comp[i].raw_data == NULL) {
2664 for (--i; i >= 0; --i) {
2665 STBI_FREE(z->img_comp[i].raw_data);
2666 z->img_comp[i].data = NULL;
2668 return stbi__err(
"outofmem",
"Out of memory");
2671 z->img_comp[i].data = (
stbi_uc*)(((
size_t)z->img_comp[i].raw_data + 15) & ~15);
2672 z->img_comp[i].linebuf = NULL;
2673 if (z->progressive) {
2674 z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;
2675 z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
2676 z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 *
sizeof(
short) + 15);
2677 z->img_comp[i].coeff = (
short*)(((
size_t)z->img_comp[i].raw_coeff + 15) & ~15);
2680 z->img_comp[i].coeff = 0;
2681 z->img_comp[i].raw_coeff = 0;
2689 #define stbi__DNL(x) ((x) == 0xdc) 2690 #define stbi__SOI(x) ((x) == 0xd8) 2691 #define stbi__EOI(x) ((x) == 0xd9) 2692 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) 2693 #define stbi__SOS(x) ((x) == 0xda) 2695 #define stbi__SOF_progressive(x) ((x) == 0xc2) 2697 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
2700 z->marker = STBI__MARKER_none;
2701 m = stbi__get_marker(z);
2702 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
2703 if (scan == STBI__SCAN_type)
return 1;
2704 m = stbi__get_marker(z);
2705 while (!stbi__SOF(m)) {
2706 if (!stbi__process_marker(z, m))
return 0;
2707 m = stbi__get_marker(z);
2708 while (m == STBI__MARKER_none) {
2710 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
2711 m = stbi__get_marker(z);
2714 z->progressive = stbi__SOF_progressive(m);
2715 if (!stbi__process_frame_header(z, scan))
return 0;
2720 static int stbi__decode_jpeg_image(stbi__jpeg *j)
2723 j->restart_interval = 0;
2724 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
2725 m = stbi__get_marker(j);
2726 while (!stbi__EOI(m)) {
2728 if (!stbi__process_scan_header(j))
return 0;
2729 if (!stbi__parse_entropy_coded_data(j))
return 0;
2730 if (j->marker == STBI__MARKER_none) {
2732 while (!stbi__at_eof(j->s)) {
2733 int x = stbi__get8(j->s);
2735 j->marker = stbi__get8(j->s);
2739 return stbi__err(
"junk before marker",
"Corrupt JPEG");
2746 if (!stbi__process_marker(j, m))
return 0;
2748 m = stbi__get_marker(j);
2751 stbi__jpeg_finish(j);
2760 #define stbi__div4(x) ((stbi_uc) ((x) >> 2)) 2765 STBI_NOTUSED(in_far);
2776 for (i = 0; i < w; ++i)
2777 out[i] = stbi__div4(3 * in_near[i] + in_far[i] + 2);
2789 out[0] = out[1] = input[0];
2794 out[1] = stbi__div4(input[0] * 3 + input[1] + 2);
2795 for (i = 1; i < w - 1; ++i) {
2796 int n = 3 * input[i] + 2;
2797 out[i * 2 + 0] = stbi__div4(n + input[i - 1]);
2798 out[i * 2 + 1] = stbi__div4(n + input[i + 1]);
2800 out[i * 2 + 0] = stbi__div4(input[w - 2] * 3 + input[w - 1] + 2);
2801 out[i * 2 + 1] = input[w - 1];
2803 STBI_NOTUSED(in_far);
2809 #define stbi__div16(x) ((stbi_uc) ((x) >> 4)) 2816 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
2820 t1 = 3 * in_near[0] + in_far[0];
2821 out[0] = stbi__div4(t1 + 2);
2822 for (i = 1; i < w; ++i) {
2824 t1 = 3 * in_near[i] + in_far[i];
2825 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
2826 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
2828 out[w * 2 - 1] = stbi__div4(t1 + 2);
2835 #if defined(STBI_SSE2) || defined(STBI_NEON) 2842 out[0] = out[1] = stbi__div4(3 * in_near[0] + in_far[0] + 2);
2846 t1 = 3 * in_near[0] + in_far[0];
2850 for (; i < ((w - 1) & ~7); i += 8) {
2851 #if defined(STBI_SSE2) 2854 __m128i zero = _mm_setzero_si128();
2855 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
2856 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
2857 __m128i farw = _mm_unpacklo_epi8(farb, zero);
2858 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
2859 __m128i diff = _mm_sub_epi16(farw, nearw);
2860 __m128i nears = _mm_slli_epi16(nearw, 2);
2861 __m128i curr = _mm_add_epi16(nears, diff);
2868 __m128i prv0 = _mm_slli_si128(curr, 2);
2869 __m128i nxt0 = _mm_srli_si128(curr, 2);
2870 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
2871 __m128i next = _mm_insert_epi16(nxt0, 3 * in_near[i + 8] + in_far[i + 8], 7);
2877 __m128i bias = _mm_set1_epi16(8);
2878 __m128i curs = _mm_slli_epi16(curr, 2);
2879 __m128i prvd = _mm_sub_epi16(prev, curr);
2880 __m128i nxtd = _mm_sub_epi16(next, curr);
2881 __m128i curb = _mm_add_epi16(curs, bias);
2882 __m128i even = _mm_add_epi16(prvd, curb);
2883 __m128i odd = _mm_add_epi16(nxtd, curb);
2886 __m128i int0 = _mm_unpacklo_epi16(even, odd);
2887 __m128i int1 = _mm_unpackhi_epi16(even, odd);
2888 __m128i de0 = _mm_srli_epi16(int0, 4);
2889 __m128i de1 = _mm_srli_epi16(int1, 4);
2892 __m128i outv = _mm_packus_epi16(de0, de1);
2893 _mm_storeu_si128((__m128i *) (out + i * 2), outv);
2894 #elif defined(STBI_NEON) 2897 uint8x8_t farb = vld1_u8(in_far + i);
2898 uint8x8_t nearb = vld1_u8(in_near + i);
2899 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
2900 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
2901 int16x8_t curr = vaddq_s16(nears, diff);
2908 int16x8_t prv0 = vextq_s16(curr, curr, 7);
2909 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
2910 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
2911 int16x8_t next = vsetq_lane_s16(3 * in_near[i + 8] + in_far[i + 8], nxt0, 7);
2917 int16x8_t curs = vshlq_n_s16(curr, 2);
2918 int16x8_t prvd = vsubq_s16(prev, curr);
2919 int16x8_t nxtd = vsubq_s16(next, curr);
2920 int16x8_t even = vaddq_s16(curs, prvd);
2921 int16x8_t odd = vaddq_s16(curs, nxtd);
2925 o.val[0] = vqrshrun_n_s16(even, 4);
2926 o.val[1] = vqrshrun_n_s16(odd, 4);
2927 vst2_u8(out + i * 2, o);
2931 t1 = 3 * in_near[i + 7] + in_far[i + 7];
2935 t1 = 3 * in_near[i] + in_far[i];
2936 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
2938 for (++i; i < w; ++i) {
2940 t1 = 3 * in_near[i] + in_far[i];
2941 out[i * 2 - 1] = stbi__div16(3 * t0 + t1 + 8);
2942 out[i * 2] = stbi__div16(3 * t1 + t0 + 8);
2944 out[w * 2 - 1] = stbi__div4(t1 + 2);
2956 STBI_NOTUSED(in_far);
2957 for (i = 0; i < w; ++i)
2958 for (j = 0; j < hs; ++j)
2959 out[i*hs + j] = in_near[i];
2963 #ifdef STBI_JPEG_OLD 2966 #define float2fixed(x) ((int) ((x) * 65536 + 0.5)) 2970 for (i = 0; i < count; ++i) {
2971 int y_fixed = (y[i] << 16) + 32768;
2973 int cr = pcr[i] - 128;
2974 int cb = pcb[i] - 128;
2975 r = y_fixed + cr*float2fixed(1.40200f);
2976 g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
2977 b = y_fixed + cb*float2fixed(1.77200f);
2981 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
2982 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
2983 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
2994 #define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) 2998 for (i = 0; i < count; ++i) {
2999 int y_fixed = (y[i] << 20) + (1 << 19);
3001 int cr = pcr[i] - 128;
3002 int cb = pcb[i] - 128;
3003 r = y_fixed + cr* float2fixed(1.40200f);
3004 g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3005 b = y_fixed + cb* float2fixed(1.77200f);
3009 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3010 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3011 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
3021 #if defined(STBI_SSE2) || defined(STBI_NEON) 3032 __m128i signflip = _mm_set1_epi8(-0x80);
3033 __m128i cr_const0 = _mm_set1_epi16((
short)(1.40200f*4096.0f + 0.5f));
3034 __m128i cr_const1 = _mm_set1_epi16(-(
short)(0.71414f*4096.0f + 0.5f));
3035 __m128i cb_const0 = _mm_set1_epi16(-(
short)(0.34414f*4096.0f + 0.5f));
3036 __m128i cb_const1 = _mm_set1_epi16((
short)(1.77200f*4096.0f + 0.5f));
3037 __m128i y_bias = _mm_set1_epi8((
char)(
unsigned char)128);
3038 __m128i xw = _mm_set1_epi16(255);
3040 for (; i + 7 < count; i += 8) {
3042 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y + i));
3043 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr + i));
3044 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb + i));
3045 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3046 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3049 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3050 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3051 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3054 __m128i yws = _mm_srli_epi16(yw, 4);
3055 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3056 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3057 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3058 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3059 __m128i rws = _mm_add_epi16(cr0, yws);
3060 __m128i gwt = _mm_add_epi16(cb0, yws);
3061 __m128i bws = _mm_add_epi16(yws, cb1);
3062 __m128i gws = _mm_add_epi16(gwt, cr1);
3065 __m128i rw = _mm_srai_epi16(rws, 4);
3066 __m128i bw = _mm_srai_epi16(bws, 4);
3067 __m128i gw = _mm_srai_epi16(gws, 4);
3070 __m128i brb = _mm_packus_epi16(rw, bw);
3071 __m128i gxb = _mm_packus_epi16(gw, xw);
3074 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3075 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3076 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3077 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3080 _mm_storeu_si128((__m128i *) (out + 0), o0);
3081 _mm_storeu_si128((__m128i *) (out + 16), o1);
3091 uint8x8_t signflip = vdup_n_u8(0x80);
3092 int16x8_t cr_const0 = vdupq_n_s16((
short)(1.40200f*4096.0f + 0.5f));
3093 int16x8_t cr_const1 = vdupq_n_s16(-(
short)(0.71414f*4096.0f + 0.5f));
3094 int16x8_t cb_const0 = vdupq_n_s16(-(
short)(0.34414f*4096.0f + 0.5f));
3095 int16x8_t cb_const1 = vdupq_n_s16((
short)(1.77200f*4096.0f + 0.5f));
3097 for (; i + 7 < count; i += 8) {
3099 uint8x8_t y_bytes = vld1_u8(y + i);
3100 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3101 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3102 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3103 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3106 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3107 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3108 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3111 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3112 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3113 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3114 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3115 int16x8_t rws = vaddq_s16(yws, cr0);
3116 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3117 int16x8_t bws = vaddq_s16(yws, cb1);
3121 o.val[0] = vqrshrun_n_s16(rws, 4);
3122 o.val[1] = vqrshrun_n_s16(gws, 4);
3123 o.val[2] = vqrshrun_n_s16(bws, 4);
3124 o.val[3] = vdup_n_u8(255);
3133 for (; i < count; ++i) {
3134 int y_fixed = (y[i] << 20) + (1 << 19);
3136 int cr = pcr[i] - 128;
3137 int cb = pcb[i] - 128;
3138 r = y_fixed + cr* float2fixed(1.40200f);
3139 g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3140 b = y_fixed + cb* float2fixed(1.77200f);
3144 if ((
unsigned)r > 255) {
if (r < 0) r = 0;
else r = 255; }
3145 if ((
unsigned)g > 255) {
if (g < 0) g = 0;
else g = 255; }
3146 if ((
unsigned)b > 255) {
if (b < 0) b = 0;
else b = 255; }
3157 static void stbi__setup_jpeg(stbi__jpeg *j)
3159 j->idct_block_kernel = stbi__idct_block;
3160 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3161 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3164 if (stbi__sse2_available()) {
3165 j->idct_block_kernel = stbi__idct_simd;
3166 #ifndef STBI_JPEG_OLD 3167 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3169 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3174 j->idct_block_kernel = stbi__idct_simd;
3175 #ifndef STBI_JPEG_OLD 3176 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3178 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3183 static void stbi__cleanup_jpeg(stbi__jpeg *j)
3186 for (i = 0; i < j->s->img_n; ++i) {
3187 if (j->img_comp[i].raw_data) {
3188 STBI_FREE(j->img_comp[i].raw_data);
3189 j->img_comp[i].raw_data = NULL;
3190 j->img_comp[i].data = NULL;
3192 if (j->img_comp[i].raw_coeff) {
3193 STBI_FREE(j->img_comp[i].raw_coeff);
3194 j->img_comp[i].raw_coeff = 0;
3195 j->img_comp[i].coeff = 0;
3197 if (j->img_comp[i].linebuf) {
3198 STBI_FREE(j->img_comp[i].linebuf);
3199 j->img_comp[i].linebuf = NULL;
3206 resample_row_func resample;
3214 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3220 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3223 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3226 n = req_comp ? req_comp : z->s->img_n;
3228 if (z->s->img_n == 3 && n < 3)
3231 decode_n = z->s->img_n;
3240 stbi__resample res_comp[4];
3242 for (k = 0; k < decode_n; ++k) {
3243 stbi__resample *r = &res_comp[k];
3247 z->img_comp[k].linebuf = (
stbi_uc *)stbi__malloc(z->s->img_x + 3);
3248 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3250 r->hs = z->img_h_max / z->img_comp[k].h;
3251 r->vs = z->img_v_max / z->img_comp[k].v;
3252 r->ystep = r->vs >> 1;
3253 r->w_lores = (z->s->img_x + r->hs - 1) / r->hs;
3255 r->line0 = r->line1 = z->img_comp[k].data;
3257 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3258 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3259 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3260 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3261 else r->resample = stbi__resample_row_generic;
3265 output = (
stbi_uc *)stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
3266 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3269 for (j = 0; j < z->s->img_y; ++j) {
3270 stbi_uc *out = output + n * z->s->img_x * j;
3271 for (k = 0; k < decode_n; ++k) {
3272 stbi__resample *r = &res_comp[k];
3273 int y_bot = r->ystep >= (r->vs >> 1);
3274 coutput[k] = r->resample(z->img_comp[k].linebuf,
3275 y_bot ? r->line1 : r->line0,
3276 y_bot ? r->line0 : r->line1,
3278 if (++r->ystep >= r->vs) {
3280 r->line0 = r->line1;
3281 if (++r->ypos < z->img_comp[k].y)
3282 r->line1 += z->img_comp[k].w2;
3287 if (z->s->img_n == 3) {
3288 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3291 for (i = 0; i < z->s->img_x; ++i) {
3292 out[0] = out[1] = out[2] = y[i];
3300 for (i = 0; i < z->s->img_x; ++i) out[i] = y[i];
3302 for (i = 0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3305 stbi__cleanup_jpeg(z);
3306 *out_x = z->s->img_x;
3307 *out_y = z->s->img_y;
3308 if (comp) *comp = z->s->img_n;
3313 static unsigned char *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
3317 stbi__setup_jpeg(&j);
3318 return load_jpeg_image(&j, x, y, comp, req_comp);
3321 static int stbi__jpeg_test(stbi__context *s)
3326 stbi__setup_jpeg(&j);
3327 r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
3332 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
3334 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3338 if (x) *x = j->s->img_x;
3339 if (y) *y = j->s->img_y;
3340 if (comp) *comp = j->s->img_n;
3344 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
3348 return stbi__jpeg_info_raw(&j, x, y, comp);
3359 #ifndef STBI_NO_ZLIB 3362 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables 3363 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) 3369 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3370 stbi__uint16 firstcode[16];
3372 stbi__uint16 firstsymbol[16];
3374 stbi__uint16 value[288];
3377 stbi_inline
static int stbi__bitreverse16(
int n)
3379 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3380 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3381 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3382 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3386 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3388 STBI_ASSERT(bits <= 16);
3391 return stbi__bitreverse16(v) >> (16 - bits);
3394 static int stbi__zbuild_huffman(stbi__zhuffman *z,
stbi_uc *sizelist,
int num)
3397 int code, next_code[16], sizes[17];
3400 memset(sizes, 0,
sizeof(sizes));
3401 memset(z->fast, 0,
sizeof(z->fast));
3402 for (i = 0; i < num; ++i)
3403 ++sizes[sizelist[i]];
3405 for (i = 1; i < 16; ++i)
3406 STBI_ASSERT(sizes[i] <= (1 << i));
3408 for (i = 1; i < 16; ++i) {
3409 next_code[i] = code;
3410 z->firstcode[i] = (stbi__uint16)code;
3411 z->firstsymbol[i] = (stbi__uint16)k;
3412 code = (code + sizes[i]);
3414 if (code - 1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt JPEG");
3415 z->maxcode[i] = code << (16 - i);
3419 z->maxcode[16] = 0x10000;
3420 for (i = 0; i < num; ++i) {
3421 int s = sizelist[i];
3423 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3424 stbi__uint16 fastv = (stbi__uint16)((s << 9) | i);
3426 z->value[c] = (stbi__uint16)i;
3427 if (s <= STBI__ZFAST_BITS) {
3428 int k = stbi__bit_reverse(next_code[s], s);
3429 while (k < (1 << STBI__ZFAST_BITS)) {
3448 stbi_uc *zbuffer, *zbuffer_end;
3450 stbi__uint32 code_buffer;
3457 stbi__zhuffman z_length, z_distance;
3460 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
3462 if (z->zbuffer >= z->zbuffer_end)
return 0;
3463 return *z->zbuffer++;
3466 static void stbi__fill_bits(stbi__zbuf *z)
3469 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3470 z->code_buffer |= stbi__zget8(z) << z->num_bits;
3472 }
while (z->num_bits <= 24);
3475 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
3478 if (z->num_bits < n) stbi__fill_bits(z);
3479 k = z->code_buffer & ((1 << n) - 1);
3480 z->code_buffer >>= n;
3485 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
3490 k = stbi__bit_reverse(a->code_buffer, 16);
3491 for (s = STBI__ZFAST_BITS + 1;; ++s)
3492 if (k < z->maxcode[s])
3494 if (s == 16)
return -1;
3496 b = (k >> (16 - s)) - z->firstcode[s] + z->firstsymbol[s];
3497 STBI_ASSERT(z->size[b] == s);
3498 a->code_buffer >>= s;
3503 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3506 if (a->num_bits < 16) stbi__fill_bits(a);
3507 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3510 a->code_buffer >>= s;
3514 return stbi__zhuffman_decode_slowpath(a, z);
3517 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
3522 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3523 cur = (int)(z->zout - z->zout_start);
3524 limit = (int)(z->zout_end - z->zout_start);
3525 while (cur + n > limit)
3527 q = (
char *)STBI_REALLOC(z->zout_start, limit);
3528 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
3531 z->zout_end = q + limit;
3535 static int stbi__zlength_base[31] = {
3536 3, 4, 5, 6, 7, 8, 9, 10, 11, 13,
3537 15, 17, 19, 23, 27, 31, 35, 43, 51, 59,
3538 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 };
3540 static int stbi__zlength_extra[31] =
3541 { 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 };
3543 static int stbi__zdist_base[32] = { 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
3544 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, 8193, 12289, 16385, 24577, 0, 0 };
3546 static int stbi__zdist_extra[32] =
3547 { 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 };
3549 static int stbi__parse_huffman_block(stbi__zbuf *a)
3551 char *zout = a->zout;
3553 int z = stbi__zhuffman_decode(a, &a->z_length);
3555 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3556 if (zout >= a->zout_end) {
3557 if (!stbi__zexpand(a, zout, 1))
return 0;
3570 len = stbi__zlength_base[z];
3571 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
3572 z = stbi__zhuffman_decode(a, &a->z_distance);
3573 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3574 dist = stbi__zdist_base[z];
3575 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
3576 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
3577 if (zout + len > a->zout_end) {
3578 if (!stbi__zexpand(a, zout, len))
return 0;
3584 do *zout++ = v;
while (--len);
3587 do *zout++ = *p++;
while (--len);
3593 static int stbi__compute_huffman_codes(stbi__zbuf *a)
3595 static stbi_uc length_dezigzag[19] = { 16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15 };
3596 stbi__zhuffman z_codelength;
3597 stbi_uc lencodes[286 + 32 + 137];
3601 int hlit = stbi__zreceive(a, 5) + 257;
3602 int hdist = stbi__zreceive(a, 5) + 1;
3603 int hclen = stbi__zreceive(a, 4) + 4;
3605 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
3606 for (i = 0; i < hclen; ++i) {
3607 int s = stbi__zreceive(a, 3);
3608 codelength_sizes[length_dezigzag[i]] = (
stbi_uc)s;
3610 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
3613 while (n < hlit + hdist) {
3614 int c = stbi__zhuffman_decode(a, &z_codelength);
3615 STBI_ASSERT(c >= 0 && c < 19);
3619 c = stbi__zreceive(a, 2) + 3;
3620 memset(lencodes + n, lencodes[n - 1], c);
3624 c = stbi__zreceive(a, 3) + 3;
3625 memset(lencodes + n, 0, c);
3629 STBI_ASSERT(c == 18);
3630 c = stbi__zreceive(a, 7) + 11;
3631 memset(lencodes + n, 0, c);
3635 if (n != hlit + hdist)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3636 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
3637 if (!stbi__zbuild_huffman(&a->z_distance, lencodes + hlit, hdist))
return 0;
3641 static int stbi__parse_uncomperssed_block(stbi__zbuf *a)
3645 if (a->num_bits & 7)
3646 stbi__zreceive(a, a->num_bits & 7);
3649 while (a->num_bits > 0) {
3650 header[k++] = (
stbi_uc)(a->code_buffer & 255);
3651 a->code_buffer >>= 8;
3654 STBI_ASSERT(a->num_bits == 0);
3657 header[k++] = stbi__zget8(a);
3658 len = header[1] * 256 + header[0];
3659 nlen = header[3] * 256 + header[2];
3660 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
3661 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
3662 if (a->zout + len > a->zout_end)
3663 if (!stbi__zexpand(a, a->zout, len))
return 0;
3664 memcpy(a->zout, a->zbuffer, len);
3670 static int stbi__parse_zlib_header(stbi__zbuf *a)
3672 int cmf = stbi__zget8(a);
3675 int flg = stbi__zget8(a);
3676 if ((cmf * 256 + flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
3677 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
3678 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
3684 static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
3685 static void stbi__init_zdefaults(
void)
3688 for (i = 0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
3689 for (; i <= 255; ++i) stbi__zdefault_length[i] = 9;
3690 for (; i <= 279; ++i) stbi__zdefault_length[i] = 7;
3691 for (; i <= 287; ++i) stbi__zdefault_length[i] = 8;
3693 for (i = 0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
3696 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
3700 if (!stbi__parse_zlib_header(a))
return 0;
3704 final = stbi__zreceive(a, 1);
3705 type = stbi__zreceive(a, 2);
3707 if (!stbi__parse_uncomperssed_block(a))
return 0;
3709 else if (type == 3) {
3715 if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
3716 if (!stbi__zbuild_huffman(&a->z_length, stbi__zdefault_length, 288))
return 0;
3717 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
3720 if (!stbi__compute_huffman_codes(a))
return 0;
3722 if (!stbi__parse_huffman_block(a))
return 0;
3728 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
3730 a->zout_start = obuf;
3732 a->zout_end = obuf + olen;
3733 a->z_expandable = exp;
3735 return stbi__parse_zlib(a, parse_header);
3741 char *p = (
char *)stbi__malloc(initial_size);
3742 if (p == NULL)
return NULL;
3743 a.zbuffer = (
stbi_uc *)buffer;
3744 a.zbuffer_end = (
stbi_uc *)buffer + len;
3745 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
3746 if (outlen) *outlen = (int)(a.zout - a.zout_start);
3747 return a.zout_start;
3750 STBI_FREE(a.zout_start);
3763 char *p = (
char *)stbi__malloc(initial_size);
3764 if (p == NULL)
return NULL;
3765 a.zbuffer = (
stbi_uc *)buffer;
3766 a.zbuffer_end = (
stbi_uc *)buffer + len;
3767 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
3768 if (outlen) *outlen = (int)(a.zout - a.zout_start);
3769 return a.zout_start;
3772 STBI_FREE(a.zout_start);
3780 a.zbuffer = (
stbi_uc *)ibuffer;
3781 a.zbuffer_end = (
stbi_uc *)ibuffer + ilen;
3782 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
3783 return (
int)(a.zout - a.zout_start);
3791 char *p = (
char *)stbi__malloc(16384);
3792 if (p == NULL)
return NULL;
3793 a.zbuffer = (
stbi_uc *)buffer;
3794 a.zbuffer_end = (
stbi_uc *)buffer + len;
3795 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
3796 if (outlen) *outlen = (int)(a.zout - a.zout_start);
3797 return a.zout_start;
3800 STBI_FREE(a.zout_start);
3808 a.zbuffer = (
stbi_uc *)ibuffer;
3809 a.zbuffer_end = (
stbi_uc *)ibuffer + ilen;
3810 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
3811 return (
int)(a.zout - a.zout_start);
3830 stbi__uint32 length;
3834 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
3837 c.length = stbi__get32be(s);
3838 c.type = stbi__get32be(s);
3842 static int stbi__check_png_header(stbi__context *s)
3844 static stbi_uc png_sig[8] = { 137, 80, 78, 71, 13, 10, 26, 10 };
3846 for (i = 0; i < 8; ++i)
3847 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
3854 stbi_uc *idata, *expanded, *out;
3869 static stbi_uc first_row_filter[5] =
3878 static int stbi__paeth(
int a,
int b,
int c)
3881 int pa = abs(p - a);
3882 int pb = abs(p - b);
3883 int pc = abs(p - c);
3884 if (pa <= pb && pa <= pc)
return a;
3885 if (pb <= pc)
return b;
3889 static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0, 0, 0, 0x01 };
3892 static int stbi__create_png_image_raw(stbi__png *a,
stbi_uc *raw, stbi__uint32 raw_len,
int out_n, stbi__uint32 x, stbi__uint32 y,
int depth,
int color)
3894 stbi__context *s = a->s;
3895 stbi__uint32 i, j, stride = x*out_n;
3896 stbi__uint32 img_len, img_width_bytes;
3898 int img_n = s->img_n;
3900 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n + 1);
3901 a->out = (
stbi_uc *)stbi__malloc(x * y * out_n);
3902 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
3904 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
3905 img_len = (img_width_bytes + 1) * y;
3906 if (s->img_x == x && s->img_y == y) {
3907 if (raw_len != img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
3910 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
3913 for (j = 0; j < y; ++j) {
3914 stbi_uc *cur = a->out + stride*j;
3915 stbi_uc *prior = cur - stride;
3916 int filter = *raw++;
3917 int filter_bytes = img_n;
3920 return stbi__err(
"invalid filter",
"Corrupt PNG");
3923 STBI_ASSERT(img_width_bytes <= x);
3924 cur += x*out_n - img_width_bytes;
3926 width = img_width_bytes;
3930 if (j == 0) filter = first_row_filter[filter];
3933 for (k = 0; k < filter_bytes; ++k) {
3935 case STBI__F_none: cur[k] = raw[k];
break;
3936 case STBI__F_sub: cur[k] = raw[k];
break;
3937 case STBI__F_up: cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
3938 case STBI__F_avg: cur[k] = STBI__BYTECAST(raw[k] + (prior[k] >> 1));
break;
3939 case STBI__F_paeth: cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0, prior[k], 0));
break;
3940 case STBI__F_avg_first: cur[k] = raw[k];
break;
3941 case STBI__F_paeth_first: cur[k] = raw[k];
break;
3959 if (depth < 8 || img_n == out_n) {
3960 int nk = (width - 1)*img_n;
3963 for (k=0; k < nk; ++k) 3966 case STBI__F_none: memcpy(cur, raw, nk);
break;
3967 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k - filter_bytes]); break;
3968 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
3969 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - filter_bytes]) >> 1)); break;
3970 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], prior[k], prior[k - filter_bytes])); break;
3971 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k - filter_bytes] >> 1)); break;
3972 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - filter_bytes], 0, 0)); break;
3978 STBI_ASSERT(img_n + 1 == out_n);
3981 for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ 3982 for (k=0; k < img_n; ++k) 3984 CASE(STBI__F_none) cur[k] = raw[k]; break;
3985 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k - out_n]); break;
3986 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
3987 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k - out_n]) >> 1)); break;
3988 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - out_n], prior[k], prior[k - out_n])); break;
3989 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k - out_n] >> 1)); break;
3990 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k - out_n], 0, 0)); break;
4000 for (j = 0; j < y; ++j) {
4001 stbi_uc *cur = a->out + stride*j;
4002 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
4005 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4014 for (k = x*img_n; k >= 2; k -= 2, ++in) {
4015 *cur++ = scale * ((*in >> 4));
4016 *cur++ = scale * ((*in) & 0x0f);
4018 if (k > 0) *cur++ = scale * ((*in >> 4));
4020 else if (depth == 2) {
4021 for (k = x*img_n; k >= 4; k -= 4, ++in) {
4022 *cur++ = scale * ((*in >> 6));
4023 *cur++ = scale * ((*in >> 4) & 0x03);
4024 *cur++ = scale * ((*in >> 2) & 0x03);
4025 *cur++ = scale * ((*in) & 0x03);
4027 if (k > 0) *cur++ = scale * ((*in >> 6));
4028 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4029 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4031 else if (depth == 1) {
4032 for (k = x*img_n; k >= 8; k -= 8, ++in) {
4033 *cur++ = scale * ((*in >> 7));
4034 *cur++ = scale * ((*in >> 6) & 0x01);
4035 *cur++ = scale * ((*in >> 5) & 0x01);
4036 *cur++ = scale * ((*in >> 4) & 0x01);
4037 *cur++ = scale * ((*in >> 3) & 0x01);
4038 *cur++ = scale * ((*in >> 2) & 0x01);
4039 *cur++ = scale * ((*in >> 1) & 0x01);
4040 *cur++ = scale * ((*in) & 0x01);
4042 if (k > 0) *cur++ = scale * ((*in >> 7));
4043 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4044 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4045 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4046 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4047 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4048 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4050 if (img_n != out_n) {
4052 stbi_uc *cur = a->out + stride*j;
4055 for (i = x - 1; i >= 0; --i) {
4056 cur[i * 2 + 1] = 255;
4057 cur[i * 2 + 0] = cur[i];
4061 STBI_ASSERT(img_n == 3);
4062 for (i = x - 1; i >= 0; --i) {
4063 cur[i * 4 + 3] = 255;
4064 cur[i * 4 + 2] = cur[i * 3 + 2];
4065 cur[i * 4 + 1] = cur[i * 3 + 1];
4066 cur[i * 4 + 0] = cur[i * 3 + 0];
4076 static int stbi__create_png_image(stbi__png *a,
stbi_uc *image_data, stbi__uint32 image_data_len,
int out_n,
int depth,
int color,
int interlaced)
4081 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4084 final = (
stbi_uc *)stbi__malloc(a->s->img_x * a->s->img_y * out_n);
4085 for (p = 0; p < 7; ++p) {
4086 int xorig[] = { 0, 4, 0, 2, 0, 1, 0 };
4087 int yorig[] = { 0, 0, 4, 0, 2, 0, 1 };
4088 int xspc[] = { 8, 8, 4, 4, 2, 2, 1 };
4089 int yspc[] = { 8, 8, 8, 4, 4, 2, 2 };
4092 x = (a->s->img_x - xorig[p] + xspc[p] - 1) / xspc[p];
4093 y = (a->s->img_y - yorig[p] + yspc[p] - 1) / yspc[p];
4095 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4096 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4100 for (j = 0; j < y; ++j) {
4101 for (i = 0; i < x; ++i) {
4102 int out_y = j*yspc[p] + yorig[p];
4103 int out_x = i*xspc[p] + xorig[p];
4104 memcpy(
final + out_y*a->s->img_x*out_n + out_x*out_n,
4105 a->out + (j*x + i)*out_n, out_n);
4109 image_data += img_len;
4110 image_data_len -= img_len;
4118 static int stbi__compute_transparency(stbi__png *z,
stbi_uc tc[3],
int out_n)
4120 stbi__context *s = z->s;
4121 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4126 STBI_ASSERT(out_n == 2 || out_n == 4);
4129 for (i = 0; i < pixel_count; ++i) {
4130 p[1] = (p[0] == tc[0] ? 0 : 255);
4135 for (i = 0; i < pixel_count; ++i) {
4136 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4144 static int stbi__expand_png_palette(stbi__png *a,
stbi_uc *palette,
int len,
int pal_img_n)
4146 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4147 stbi_uc *p, *temp_out, *orig = a->out;
4149 p = (
stbi_uc *)stbi__malloc(pixel_count * pal_img_n);
4150 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4155 if (pal_img_n == 3) {
4156 for (i = 0; i < pixel_count; ++i) {
4157 int n = orig[i] * 4;
4159 p[1] = palette[n + 1];
4160 p[2] = palette[n + 2];
4165 for (i = 0; i < pixel_count; ++i) {
4166 int n = orig[i] * 4;
4168 p[1] = palette[n + 1];
4169 p[2] = palette[n + 2];
4170 p[3] = palette[n + 3];
4182 static int stbi__unpremultiply_on_load = 0;
4183 static int stbi__de_iphone_flag = 0;
4187 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4192 stbi__de_iphone_flag = flag_true_if_should_convert;
4195 static void stbi__de_iphone(stbi__png *z)
4197 stbi__context *s = z->s;
4198 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4201 if (s->img_out_n == 3) {
4202 for (i = 0; i < pixel_count; ++i) {
4210 STBI_ASSERT(s->img_out_n == 4);
4211 if (stbi__unpremultiply_on_load) {
4213 for (i = 0; i < pixel_count; ++i) {
4217 p[0] = p[2] * 255 / a;
4218 p[1] = p[1] * 255 / a;
4230 for (i = 0; i < pixel_count; ++i) {
4240 #define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) 4242 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
4244 stbi_uc palette[1024], pal_img_n = 0;
4246 stbi__uint32 ioff = 0, idata_limit = 0, i, pal_len = 0;
4247 int first = 1, k, interlace = 0, color = 0, depth = 0, is_iphone = 0;
4248 stbi__context *s = z->s;
4254 if (!stbi__check_png_header(s))
return 0;
4256 if (scan == STBI__SCAN_type)
return 1;
4259 stbi__pngchunk c = stbi__get_chunk_header(s);
4261 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4263 stbi__skip(s, c.length);
4265 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4267 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4269 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4270 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4271 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4272 depth = stbi__get8(s);
if (depth != 1 && depth != 2 && depth != 4 && depth != 8)
return stbi__err(
"1/2/4/8-bit only",
"PNG not supported: 1/2/4/8-bit only");
4273 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4274 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4275 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4276 filter = stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4277 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4278 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4280 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4281 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4282 if (scan == STBI__SCAN_header)
return 1;
4288 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4294 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4295 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4296 if (c.length > 256 * 3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4297 pal_len = c.length / 3;
4298 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4299 for (i = 0; i < pal_len; ++i) {
4300 palette[i * 4 + 0] = stbi__get8(s);
4301 palette[i * 4 + 1] = stbi__get8(s);
4302 palette[i * 4 + 2] = stbi__get8(s);
4303 palette[i * 4 + 3] = 255;
4308 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4309 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4310 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4312 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4313 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4314 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4316 for (i = 0; i < c.length; ++i)
4317 palette[i * 4 + 3] = stbi__get8(s);
4320 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4321 if (c.length != (stbi__uint32)s->img_n * 2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4323 for (k = 0; k < s->img_n; ++k)
4324 tc[k] = (
stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[depth];
4329 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4330 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4331 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4332 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4333 if (ioff + c.length > idata_limit) {
4335 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4336 while (ioff + c.length > idata_limit)
4338 p = (
stbi_uc *)STBI_REALLOC(z->idata, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4341 if (!stbi__getn(s, z->idata + ioff, c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4346 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4347 stbi__uint32 raw_len, bpl;
4348 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4349 if (scan != STBI__SCAN_load)
return 1;
4350 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4352 bpl = (s->img_x * depth + 7) / 8;
4353 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4355 if (z->expanded == NULL)
return 0;
4356 STBI_FREE(z->idata); z->idata = NULL;
4357 if ((req_comp == s->img_n + 1 && req_comp != 3 && !pal_img_n) || has_trans)
4358 s->img_out_n = s->img_n + 1;
4360 s->img_out_n = s->img_n;
4361 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace))
return 0;
4363 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4364 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4368 s->img_n = pal_img_n;
4369 s->img_out_n = pal_img_n;
4370 if (req_comp >= 3) s->img_out_n = req_comp;
4371 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4374 STBI_FREE(z->expanded); z->expanded = NULL;
4380 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4381 if ((c.type & (1 << 29)) == 0) {
4382 #ifndef STBI_NO_FAILURE_STRINGS 4384 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4385 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4386 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4387 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4388 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4390 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4392 stbi__skip(s, c.length);
4400 static unsigned char *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp)
4402 unsigned char *result = NULL;
4403 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4404 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4407 if (req_comp && req_comp != p->s->img_out_n) {
4408 result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4409 p->s->img_out_n = req_comp;
4410 if (result == NULL)
return result;
4414 if (n) *n = p->s->img_out_n;
4416 STBI_FREE(p->out); p->out = NULL;
4417 STBI_FREE(p->expanded); p->expanded = NULL;
4418 STBI_FREE(p->idata); p->idata = NULL;
4423 static unsigned char *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4427 return stbi__do_png(&p, x, y, comp, req_comp);
4430 static int stbi__png_test(stbi__context *s)
4433 r = stbi__check_png_header(s);
4438 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
4440 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
4444 if (x) *x = p->s->img_x;
4445 if (y) *y = p->s->img_y;
4446 if (comp) *comp = p->s->img_n;
4450 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
4454 return stbi__png_info_raw(&p, x, y, comp);
4461 static int stbi__bmp_test_raw(stbi__context *s)
4465 if (stbi__get8(s) !=
'B')
return 0;
4466 if (stbi__get8(s) !=
'M')
return 0;
4471 sz = stbi__get32le(s);
4472 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4476 static int stbi__bmp_test(stbi__context *s)
4478 int r = stbi__bmp_test_raw(s);
4485 static int stbi__high_bit(
unsigned int z)
4488 if (z == 0)
return -1;
4489 if (z >= 0x10000) n += 16, z >>= 16;
4490 if (z >= 0x00100) n += 8, z >>= 8;
4491 if (z >= 0x00010) n += 4, z >>= 4;
4492 if (z >= 0x00004) n += 2, z >>= 2;
4493 if (z >= 0x00002) n += 1, z >>= 1;
4497 static int stbi__bitcount(
unsigned int a)
4499 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
4500 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
4501 a = (a + (a >> 4)) & 0x0f0f0f0f;
4503 a = (a + (a >> 16));
4507 static int stbi__shiftsigned(
int v,
int shift,
int bits)
4512 if (shift < 0) v <<= -shift;
4524 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4527 unsigned int mr = 0, mg = 0, mb = 0, ma = 0, fake_a = 0;
4529 int psize = 0, i, j, compress = 0, width;
4530 int bpp, flip_vertically, pad, target, offset, hsz;
4531 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
4535 offset = stbi__get32le(s);
4536 hsz = stbi__get32le(s);
4537 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
4539 s->img_x = stbi__get16le(s);
4540 s->img_y = stbi__get16le(s);
4543 s->img_x = stbi__get32le(s);
4544 s->img_y = stbi__get32le(s);
4546 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
4547 bpp = stbi__get16le(s);
4548 if (bpp == 1)
return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
4549 flip_vertically = ((int)s->img_y) > 0;
4550 s->img_y = abs((
int)s->img_y);
4553 psize = (offset - 14 - 24) / 3;
4556 compress = stbi__get32le(s);
4557 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
4563 if (hsz == 40 || hsz == 56) {
4570 if (bpp == 16 || bpp == 32) {
4572 if (compress == 0) {
4579 STBI_NOTUSED(fake_a);
4587 else if (compress == 3) {
4588 mr = stbi__get32le(s);
4589 mg = stbi__get32le(s);
4590 mb = stbi__get32le(s);
4592 if (mr == mg && mg == mb) {
4594 return stbi__errpuc(
"bad BMP",
"bad BMP");
4598 return stbi__errpuc(
"bad BMP",
"bad BMP");
4602 STBI_ASSERT(hsz == 108 || hsz == 124);
4603 mr = stbi__get32le(s);
4604 mg = stbi__get32le(s);
4605 mb = stbi__get32le(s);
4606 ma = stbi__get32le(s);
4608 for (i = 0; i < 12; ++i)
4618 psize = (offset - 14 - hsz) >> 2;
4620 s->img_n = ma ? 4 : 3;
4621 if (req_comp && req_comp >= 3)
4625 out = (
stbi_uc *)stbi__malloc(target * s->img_x * s->img_y);
4626 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
4629 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
4630 for (i = 0; i < psize; ++i) {
4631 pal[i][2] = stbi__get8(s);
4632 pal[i][1] = stbi__get8(s);
4633 pal[i][0] = stbi__get8(s);
4634 if (hsz != 12) stbi__get8(s);
4637 stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
4638 if (bpp == 4) width = (s->img_x + 1) >> 1;
4639 else if (bpp == 8) width = s->img_x;
4640 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
4642 for (j = 0; j < (int)s->img_y; ++j) {
4643 for (i = 0; i < (int)s->img_x; i += 2) {
4644 int v = stbi__get8(s), v2 = 0;
4649 out[z++] = pal[v][0];
4650 out[z++] = pal[v][1];
4651 out[z++] = pal[v][2];
4652 if (target == 4) out[z++] = 255;
4653 if (i + 1 == (
int)s->img_x)
break;
4654 v = (bpp == 8) ? stbi__get8(s) : v2;
4655 out[z++] = pal[v][0];
4656 out[z++] = pal[v][1];
4657 out[z++] = pal[v][2];
4658 if (target == 4) out[z++] = 255;
4664 int rshift = 0, gshift = 0, bshift = 0, ashift = 0, rcount = 0, gcount = 0, bcount = 0, acount = 0;
4667 stbi__skip(s, offset - 14 - hsz);
4668 if (bpp == 24) width = 3 * s->img_x;
4669 else if (bpp == 16) width = 2 * s->img_x;
4675 else if (bpp == 32) {
4676 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
4680 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
4682 rshift = stbi__high_bit(mr) - 7; rcount = stbi__bitcount(mr);
4683 gshift = stbi__high_bit(mg) - 7; gcount = stbi__bitcount(mg);
4684 bshift = stbi__high_bit(mb) - 7; bcount = stbi__bitcount(mb);
4685 ashift = stbi__high_bit(ma) - 7; acount = stbi__bitcount(ma);
4687 for (j = 0; j < (int)s->img_y; ++j) {
4689 for (i = 0; i < (int)s->img_x; ++i) {
4691 out[z + 2] = stbi__get8(s);
4692 out[z + 1] = stbi__get8(s);
4693 out[z + 0] = stbi__get8(s);
4695 a = (easy == 2 ? stbi__get8(s) : 255);
4696 if (target == 4) out[z++] = a;
4700 for (i = 0; i < (int)s->img_x; ++i) {
4701 stbi__uint32 v = (stbi__uint32)(bpp == 16 ? stbi__get16le(s) : stbi__get32le(s));
4703 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
4704 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
4705 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
4706 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
4707 if (target == 4) out[z++] = STBI__BYTECAST(a);
4713 if (flip_vertically) {
4715 for (j = 0; j < (int)s->img_y >> 1; ++j) {
4716 stbi_uc *p1 = out + j *s->img_x*target;
4717 stbi_uc *p2 = out + (s->img_y - 1 - j)*s->img_x*target;
4718 for (i = 0; i < (int)s->img_x*target; ++i) {
4719 t = p1[i], p1[i] = p2[i], p2[i] = t;
4724 if (req_comp && req_comp != target) {
4725 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
4726 if (out == NULL)
return out;
4731 if (comp) *comp = s->img_n;
4739 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
4741 int tga_w, tga_h, tga_comp;
4751 if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11))
return 0;
4753 tga_w = stbi__get16le(s);
4758 tga_h = stbi__get16le(s);
4765 if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
4772 if (comp) *comp = tga_comp / 8;
4776 static int stbi__tga_test(stbi__context *s)
4782 if (sz > 1)
return 0;
4784 if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11))
return 0;
4790 if (stbi__get16be(s) < 1)
return 0;
4791 if (stbi__get16be(s) < 1)
return 0;
4793 if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32))
4801 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4804 int tga_offset = stbi__get8(s);
4805 int tga_indexed = stbi__get8(s);
4806 int tga_image_type = stbi__get8(s);
4808 int tga_palette_start = stbi__get16le(s);
4809 int tga_palette_len = stbi__get16le(s);
4810 int tga_palette_bits = stbi__get8(s);
4811 int tga_x_origin = stbi__get16le(s);
4812 int tga_y_origin = stbi__get16le(s);
4813 int tga_width = stbi__get16le(s);
4814 int tga_height = stbi__get16le(s);
4815 int tga_bits_per_pixel = stbi__get8(s);
4816 int tga_comp = tga_bits_per_pixel / 8;
4817 int tga_inverted = stbi__get8(s);
4819 unsigned char *tga_data;
4820 unsigned char *tga_palette = NULL;
4822 unsigned char raw_data[4];
4824 int RLE_repeating = 0;
4825 int read_next_pixel = 1;
4828 if (tga_image_type >= 8)
4830 tga_image_type -= 8;
4834 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
4838 (tga_width < 1) || (tga_height < 1) ||
4839 (tga_image_type < 1) || (tga_image_type > 3) ||
4840 ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
4841 (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
4850 tga_comp = tga_palette_bits / 8;
4856 if (comp) *comp = tga_comp;
4858 tga_data = (
unsigned char*)stbi__malloc(tga_width * tga_height * tga_comp);
4859 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
4862 stbi__skip(s, tga_offset);
4864 if (!tga_indexed && !tga_is_RLE) {
4865 for (i = 0; i < tga_height; ++i) {
4866 int y = tga_inverted ? tga_height - i - 1 : i;
4867 stbi_uc *tga_row = tga_data + y*tga_width*tga_comp;
4868 stbi__getn(s, tga_row, tga_width * tga_comp);
4876 stbi__skip(s, tga_palette_start);
4878 tga_palette = (
unsigned char*)stbi__malloc(tga_palette_len * tga_palette_bits / 8);
4880 STBI_FREE(tga_data);
4881 return stbi__errpuc(
"outofmem",
"Out of memory");
4883 if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8)) {
4884 STBI_FREE(tga_data);
4885 STBI_FREE(tga_palette);
4886 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
4890 for (i = 0; i < tga_width * tga_height; ++i)
4898 int RLE_cmd = stbi__get8(s);
4899 RLE_count = 1 + (RLE_cmd & 127);
4900 RLE_repeating = RLE_cmd >> 7;
4901 read_next_pixel = 1;
4903 else if (!RLE_repeating)
4905 read_next_pixel = 1;
4910 read_next_pixel = 1;
4913 if (read_next_pixel)
4919 int pal_idx = stbi__get8(s);
4920 if (pal_idx >= tga_palette_len)
4925 pal_idx *= tga_bits_per_pixel / 8;
4926 for (j = 0; j * 8 < tga_bits_per_pixel; ++j)
4928 raw_data[j] = tga_palette[pal_idx + j];
4934 for (j = 0; j * 8 < tga_bits_per_pixel; ++j)
4936 raw_data[j] = stbi__get8(s);
4940 read_next_pixel = 0;
4944 for (j = 0; j < tga_comp; ++j)
4945 tga_data[i*tga_comp + j] = raw_data[j];
4953 for (j = 0; j * 2 < tga_height; ++j)
4955 int index1 = j * tga_width * tga_comp;
4956 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
4957 for (i = tga_width * tga_comp; i > 0; --i)
4959 unsigned char temp = tga_data[index1];
4960 tga_data[index1] = tga_data[index2];
4961 tga_data[index2] = temp;
4968 if (tga_palette != NULL)
4970 STBI_FREE(tga_palette);
4977 unsigned char* tga_pixel = tga_data;
4978 for (i = 0; i < tga_width * tga_height; ++i)
4980 unsigned char temp = tga_pixel[0];
4981 tga_pixel[0] = tga_pixel[2];
4982 tga_pixel[2] = temp;
4983 tga_pixel += tga_comp;
4988 if (req_comp && req_comp != tga_comp)
4989 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
4993 tga_palette_start = tga_palette_len = tga_palette_bits =
4994 tga_x_origin = tga_y_origin = 0;
5004 static int stbi__psd_test(stbi__context *s)
5006 int r = (stbi__get32be(s) == 0x38425053);
5011 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5014 int channelCount, compression;
5015 int channel, i, count, len;
5020 if (stbi__get32be(s) != 0x38425053)
5021 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5024 if (stbi__get16be(s) != 1)
5025 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5031 channelCount = stbi__get16be(s);
5032 if (channelCount < 0 || channelCount > 16)
5033 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5036 h = stbi__get32be(s);
5037 w = stbi__get32be(s);
5040 if (stbi__get16be(s) != 8)
5041 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 bit");
5053 if (stbi__get16be(s) != 3)
5054 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5057 stbi__skip(s, stbi__get32be(s));
5060 stbi__skip(s, stbi__get32be(s));
5063 stbi__skip(s, stbi__get32be(s));
5069 compression = stbi__get16be(s);
5070 if (compression > 1)
5071 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5074 out = (
stbi_uc *)stbi__malloc(4 * w*h);
5075 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5093 stbi__skip(s, h * channelCount * 2);
5096 for (channel = 0; channel < 4; channel++) {
5100 if (channel >= channelCount) {
5102 for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;
5107 while (count < pixelCount) {
5108 len = stbi__get8(s);
5112 else if (len < 128) {
5122 else if (len > 128) {
5128 val = stbi__get8(s);
5146 for (channel = 0; channel < 4; channel++) {
5150 if (channel > channelCount) {
5152 for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;
5156 for (i = 0; i < pixelCount; i++)
5157 *p = stbi__get8(s), p += 4;
5162 if (req_comp && req_comp != 4) {
5163 out = stbi__convert_format(out, 4, req_comp, w, h);
5164 if (out == NULL)
return out;
5167 if (comp) *comp = channelCount;
5183 static int stbi__pic_is4(stbi__context *s,
const char *str)
5186 for (i = 0; i<4; ++i)
5187 if (stbi__get8(s) != (
stbi_uc)str[i])
5193 static int stbi__pic_test_core(stbi__context *s)
5197 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
5200 for (i = 0; i<84; ++i)
5203 if (!stbi__pic_is4(s,
"PICT"))
5214 static stbi_uc *stbi__readval(stbi__context *s,
int channel,
stbi_uc *dest)
5218 for (i = 0; i<4; ++i, mask >>= 1) {
5219 if (channel & mask) {
5220 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
5221 dest[i] = stbi__get8(s);
5228 static void stbi__copyval(
int channel,
stbi_uc *dest,
const stbi_uc *src)
5232 for (i = 0; i<4; ++i, mask >>= 1)
5237 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp,
stbi_uc *result)
5239 int act_comp = 0, num_packets = 0, y, chained;
5240 stbi__pic_packet packets[10];
5245 stbi__pic_packet *packet;
5247 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
5248 return stbi__errpuc(
"bad format",
"too many packets");
5250 packet = &packets[num_packets++];
5252 chained = stbi__get8(s);
5253 packet->size = stbi__get8(s);
5254 packet->type = stbi__get8(s);
5255 packet->channel = stbi__get8(s);
5257 act_comp |= packet->channel;
5259 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
5260 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
5263 *comp = (act_comp & 0x10 ? 4 : 3);
5265 for (y = 0; y<height; ++y) {
5268 for (packet_idx = 0; packet_idx < num_packets; ++packet_idx) {
5269 stbi__pic_packet *packet = &packets[packet_idx];
5270 stbi_uc *dest = result + y*width * 4;
5272 switch (packet->type) {
5274 return stbi__errpuc(
"bad format",
"packet has bad compression type");
5279 for (x = 0; x<width; ++x, dest += 4)
5280 if (!stbi__readval(s, packet->channel, dest))
5287 int left = width, i;
5292 count = stbi__get8(s);
5293 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
5298 if (!stbi__readval(s, packet->channel, value))
return 0;
5300 for (i = 0; i<count; ++i, dest += 4)
5301 stbi__copyval(packet->channel, dest, value);
5310 int count = stbi__get8(s), i;
5311 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
5318 count = stbi__get16be(s);
5322 return stbi__errpuc(
"bad file",
"scanline overrun");
5324 if (!stbi__readval(s, packet->channel, value))
5327 for (i = 0; i<count; ++i, dest += 4)
5328 stbi__copyval(packet->channel, dest, value);
5332 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
5334 for (i = 0; i<count; ++i, dest += 4)
5335 if (!stbi__readval(s, packet->channel, dest))
5349 static stbi_uc *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp)
5354 for (i = 0; i<92; ++i)
5357 x = stbi__get16be(s);
5358 y = stbi__get16be(s);
5359 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
5360 if ((1 << 28) / x < y)
return stbi__errpuc(
"too large",
"Image too large to decode");
5367 result = (
stbi_uc *)stbi__malloc(x*y * 4);
5368 memset(result, 0xff, x*y * 4);
5370 if (!stbi__pic_load_core(s, x, y, comp, result)) {
5376 if (req_comp == 0) req_comp = *comp;
5377 result = stbi__convert_format(result, 4, req_comp, x, y);
5382 static int stbi__pic_test(stbi__context *s)
5384 int r = stbi__pic_test_core(s);
5405 int flags, bgindex, ratio, transparent, eflags;
5408 stbi__gif_lzw codes[4096];
5412 int start_x, start_y;
5418 static int stbi__gif_test_raw(stbi__context *s)
5421 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
5423 if (sz !=
'9' && sz !=
'7')
return 0;
5424 if (stbi__get8(s) !=
'a')
return 0;
5428 static int stbi__gif_test(stbi__context *s)
5430 int r = stbi__gif_test_raw(s);
5435 static void stbi__gif_parse_colortable(stbi__context *s,
stbi_uc pal[256][4],
int num_entries,
int transp)
5438 for (i = 0; i < num_entries; ++i) {
5439 pal[i][2] = stbi__get8(s);
5440 pal[i][1] = stbi__get8(s);
5441 pal[i][0] = stbi__get8(s);
5442 pal[i][3] = transp == i ? 0 : 255;
5446 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
5449 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
5450 return stbi__err(
"not GIF",
"Corrupt GIF");
5452 version = stbi__get8(s);
5453 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
5454 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
5456 stbi__g_failure_reason =
"";
5457 g->w = stbi__get16le(s);
5458 g->h = stbi__get16le(s);
5459 g->flags = stbi__get8(s);
5460 g->bgindex = stbi__get8(s);
5461 g->ratio = stbi__get8(s);
5462 g->transparent = -1;
5464 if (comp != 0) *comp = 4;
5466 if (is_info)
return 1;
5468 if (g->flags & 0x80)
5469 stbi__gif_parse_colortable(s, g->pal, 2 << (g->flags & 7), -1);
5474 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
5477 if (!stbi__gif_header(s, &g, comp, 1)) {
5486 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
5492 if (g->codes[code].prefix >= 0)
5493 stbi__out_gif_code(g, g->codes[code].prefix);
5495 if (g->cur_y >= g->max_y)
return;
5497 p = &g->out[g->cur_x + g->cur_y];
5498 c = &g->color_table[g->codes[code].suffix * 4];
5508 if (g->cur_x >= g->max_x) {
5509 g->cur_x = g->start_x;
5510 g->cur_y += g->step;
5512 while (g->cur_y >= g->max_y && g->parse > 0) {
5513 g->step = (1 << g->parse) * g->line_size;
5514 g->cur_y = g->start_y + (g->step >> 1);
5520 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
5523 stbi__int32 len, code;
5525 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
5528 lzw_cs = stbi__get8(s);
5529 clear = 1 << lzw_cs;
5531 codesize = lzw_cs + 1;
5532 codemask = (1 << codesize) - 1;
5535 for (code = 0; code < clear; code++) {
5536 g->codes[code].prefix = -1;
5537 g->codes[code].first = (
stbi_uc)code;
5538 g->codes[code].suffix = (
stbi_uc)code;
5547 if (valid_bits < codesize) {
5549 len = stbi__get8(s);
5554 bits |= (stbi__int32)stbi__get8(s) << valid_bits;
5558 stbi__int32 code = bits & codemask;
5560 valid_bits -= codesize;
5562 if (code == clear) {
5563 codesize = lzw_cs + 1;
5564 codemask = (1 << codesize) - 1;
5569 else if (code == clear + 1) {
5571 while ((len = stbi__get8(s)) > 0)
5575 else if (code <= avail) {
5576 if (first)
return stbi__errpuc(
"no clear code",
"Corrupt GIF");
5579 p = &g->codes[avail++];
5580 if (avail > 4096)
return stbi__errpuc(
"too many codes",
"Corrupt GIF");
5581 p->prefix = (stbi__int16)oldcode;
5582 p->first = g->codes[oldcode].first;
5583 p->suffix = (code == avail) ? p->first : g->codes[code].first;
5585 else if (code == avail)
5586 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5588 stbi__out_gif_code(g, (stbi__uint16)code);
5590 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
5592 codemask = (1 << codesize) - 1;
5598 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5604 static void stbi__fill_gif_background(stbi__gif *g)
5607 stbi_uc *c = g->pal[g->bgindex];
5609 for (i = 0; i < g->w * g->h * 4; i += 4) {
5619 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp)
5625 if (!stbi__gif_header(s, g, comp, 0))
return 0;
5626 g->out = (
stbi_uc *)stbi__malloc(4 * g->w * g->h);
5627 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5628 stbi__fill_gif_background(g);
5632 if (((g->eflags & 0x1C) >> 2) == 3) {
5634 g->out = (
stbi_uc *)stbi__malloc(4 * g->w * g->h);
5635 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5636 memcpy(g->out, old_out, g->w*g->h * 4);
5641 switch (stbi__get8(s)) {
5644 stbi__int32 x, y, w, h;
5647 x = stbi__get16le(s);
5648 y = stbi__get16le(s);
5649 w = stbi__get16le(s);
5650 h = stbi__get16le(s);
5651 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
5652 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
5654 g->line_size = g->w * 4;
5656 g->start_y = y * g->line_size;
5657 g->max_x = g->start_x + w * 4;
5658 g->max_y = g->start_y + h * g->line_size;
5659 g->cur_x = g->start_x;
5660 g->cur_y = g->start_y;
5662 g->lflags = stbi__get8(s);
5664 if (g->lflags & 0x40) {
5665 g->step = 8 * g->line_size;
5669 g->step = g->line_size;
5673 if (g->lflags & 0x80) {
5674 stbi__gif_parse_colortable(s, g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
5675 g->color_table = (
stbi_uc *)g->lpal;
5677 else if (g->flags & 0x80) {
5678 for (i = 0; i < 256; ++i)
5680 if (g->transparent >= 0 && (g->eflags & 0x01))
5681 g->pal[g->transparent][3] = 0;
5682 g->color_table = (
stbi_uc *)g->pal;
5685 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
5687 o = stbi__process_gif_raster(s, g);
5688 if (o == NULL)
return NULL;
5690 if (req_comp && req_comp != 4)
5691 o = stbi__convert_format(o, 4, req_comp, g->w, g->h);
5698 if (stbi__get8(s) == 0xF9) {
5699 len = stbi__get8(s);
5701 g->eflags = stbi__get8(s);
5703 g->transparent = stbi__get8(s);
5710 while ((len = stbi__get8(s)) != 0)
5719 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
5724 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5728 memset(&g, 0,
sizeof(g));
5730 u = stbi__gif_load_next(s, &g, comp, req_comp);
5740 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
5742 return stbi__gif_info_raw(s, x, y, comp);
5750 static int stbi__hdr_test_core(stbi__context *s)
5752 const char *signature =
"#?RADIANCE\n";
5754 for (i = 0; signature[i]; ++i)
5755 if (stbi__get8(s) != signature[i])
5760 static int stbi__hdr_test(stbi__context* s)
5762 int r = stbi__hdr_test_core(s);
5767 #define STBI__HDR_BUFLEN 1024 5768 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
5773 c = (char)stbi__get8(z);
5775 while (!stbi__at_eof(z) && c !=
'\n') {
5777 if (len == STBI__HDR_BUFLEN - 1) {
5779 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
5783 c = (char)stbi__get8(z);
5790 static void stbi__hdr_convert(
float *output,
stbi_uc *input,
int req_comp)
5792 if (input[3] != 0) {
5795 f1 = (float)ldexp(1.0f, input[3] - (
int)(128 + 8));
5797 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
5799 output[0] = input[0] * f1;
5800 output[1] = input[1] * f1;
5801 output[2] = input[2] * f1;
5803 if (req_comp == 2) output[1] = 1;
5804 if (req_comp == 4) output[3] = 1;
5808 case 4: output[3] = 1;
5809 case 3: output[0] = output[1] = output[2] = 0;
5811 case 2: output[1] = 1;
5812 case 1: output[0] = 0;
5818 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5820 char buffer[STBI__HDR_BUFLEN];
5827 unsigned char count, value;
5828 int i, j, k, c1, c2, z;
5832 if (strcmp(stbi__hdr_gettoken(s, buffer),
"#?RADIANCE") != 0)
5833 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
5837 token = stbi__hdr_gettoken(s, buffer);
5838 if (token[0] == 0)
break;
5839 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5842 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
5846 token = stbi__hdr_gettoken(s, buffer);
5847 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5849 height = (int)strtol(token, &token, 10);
5850 while (*token ==
' ') ++token;
5851 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5853 width = (int)strtol(token, NULL, 10);
5858 if (comp) *comp = 3;
5859 if (req_comp == 0) req_comp = 3;
5862 hdr_data = (
float *)stbi__malloc(height * width * req_comp *
sizeof(
float));
5866 if (width < 8 || width >= 32768) {
5868 for (j = 0; j < height; ++j) {
5869 for (i = 0; i < width; ++i) {
5872 stbi__getn(s, rgbe, 4);
5873 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
5881 for (j = 0; j < height; ++j) {
5884 len = stbi__get8(s);
5885 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
5892 rgbe[3] = (
stbi_uc)stbi__get8(s);
5893 stbi__hdr_convert(hdr_data, rgbe, req_comp);
5896 STBI_FREE(scanline);
5897 goto main_decode_loop;
5900 len |= stbi__get8(s);
5901 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
5902 if (scanline == NULL) scanline = (
stbi_uc *)stbi__malloc(width * 4);
5904 for (k = 0; k < 4; ++k) {
5907 count = stbi__get8(s);
5910 value = stbi__get8(s);
5912 for (z = 0; z < count; ++z)
5913 scanline[i++ * 4 + k] = value;
5917 for (z = 0; z < count; ++z)
5918 scanline[i++ * 4 + k] = stbi__get8(s);
5922 for (i = 0; i < width; ++i)
5923 stbi__hdr_convert(hdr_data + (j*width + i)*req_comp, scanline + i * 4, req_comp);
5925 STBI_FREE(scanline);
5931 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
5933 char buffer[STBI__HDR_BUFLEN];
5937 if (strcmp(stbi__hdr_gettoken(s, buffer),
"#?RADIANCE") != 0) {
5943 token = stbi__hdr_gettoken(s, buffer);
5944 if (token[0] == 0)
break;
5945 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5952 token = stbi__hdr_gettoken(s, buffer);
5953 if (strncmp(token,
"-Y ", 3)) {
5958 *y = (int)strtol(token, &token, 10);
5959 while (*token ==
' ') ++token;
5960 if (strncmp(token,
"+X ", 3)) {
5965 *x = (int)strtol(token, NULL, 10);
5969 #endif // STBI_NO_HDR 5972 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
5975 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M') {
5980 hsz = stbi__get32le(s);
5981 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
5986 *x = stbi__get16le(s);
5987 *y = stbi__get16le(s);
5990 *x = stbi__get32le(s);
5991 *y = stbi__get32le(s);
5993 if (stbi__get16le(s) != 1) {
5997 *comp = stbi__get16le(s) / 8;
6003 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
6006 if (stbi__get32be(s) != 0x38425053) {
6010 if (stbi__get16be(s) != 1) {
6015 channelCount = stbi__get16be(s);
6016 if (channelCount < 0 || channelCount > 16) {
6020 *y = stbi__get32be(s);
6021 *x = stbi__get32be(s);
6022 if (stbi__get16be(s) != 8) {
6026 if (stbi__get16be(s) != 3) {
6036 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
6038 int act_comp = 0, num_packets = 0, chained;
6039 stbi__pic_packet packets[10];
6043 *x = stbi__get16be(s);
6044 *y = stbi__get16be(s);
6045 if (stbi__at_eof(s))
return 0;
6046 if ((*x) != 0 && (1 << 28) / (*x) < (*y)) {
6054 stbi__pic_packet *packet;
6056 if (num_packets ==
sizeof(packets) /
sizeof(packets[0]))
6059 packet = &packets[num_packets++];
6060 chained = stbi__get8(s);
6061 packet->size = stbi__get8(s);
6062 packet->type = stbi__get8(s);
6063 packet->channel = stbi__get8(s);
6064 act_comp |= packet->channel;
6066 if (stbi__at_eof(s)) {
6070 if (packet->size != 8) {
6076 *comp = (act_comp & 0x10 ? 4 : 3);
6096 static int stbi__pnm_test(stbi__context *s)
6099 p = (char)stbi__get8(s);
6100 t = (char)stbi__get8(s);
6101 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6108 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
6111 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
6117 out = (
stbi_uc *)stbi__malloc(s->img_n * s->img_x * s->img_y);
6118 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6119 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
6121 if (req_comp && req_comp != s->img_n) {
6122 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
6123 if (out == NULL)
return out;
6128 static int stbi__pnm_isspace(
char c)
6130 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
6133 static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
6135 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
6136 *c = (char)stbi__get8(s);
6139 static int stbi__pnm_isdigit(
char c)
6141 return c >=
'0' && c <=
'9';
6144 static int stbi__pnm_getinteger(stbi__context *s,
char *c)
6148 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
6149 value = value * 10 + (*c -
'0');
6150 *c = (char)stbi__get8(s);
6156 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
6164 p = (char)stbi__get8(s);
6165 t = (char)stbi__get8(s);
6166 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6171 *comp = (t ==
'6') ? 3 : 1;
6173 c = (char)stbi__get8(s);
6174 stbi__pnm_skip_whitespace(s, &c);
6176 *x = stbi__pnm_getinteger(s, &c);
6177 stbi__pnm_skip_whitespace(s, &c);
6179 *y = stbi__pnm_getinteger(s, &c);
6180 stbi__pnm_skip_whitespace(s, &c);
6182 maxv = stbi__pnm_getinteger(s, &c);
6185 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
6191 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
6193 #ifndef STBI_NO_JPEG 6194 if (stbi__jpeg_info(s, x, y, comp))
return 1;
6198 if (stbi__png_info(s, x, y, comp))
return 1;
6202 if (stbi__gif_info(s, x, y, comp))
return 1;
6206 if (stbi__bmp_info(s, x, y, comp))
return 1;
6210 if (stbi__psd_info(s, x, y, comp))
return 1;
6214 if (stbi__pic_info(s, x, y, comp))
return 1;
6218 if (stbi__pnm_info(s, x, y, comp))
return 1;
6222 if (stbi__hdr_info(s, x, y, comp))
return 1;
6227 if (stbi__tga_info(s, x, y, comp))
6230 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
6233 #ifndef STBI_NO_STDIO 6236 FILE *f = stbi__fopen(filename,
"rb");
6238 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
6248 long pos = ftell(f);
6249 stbi__start_file(&s, f);
6250 r = stbi__info_main(&s, x, y, comp);
6251 fseek(f, pos, SEEK_SET);
6254 #endif // !STBI_NO_STDIO 6259 stbi__start_mem(&s, buffer, len);
6260 return stbi__info_main(&s, x, y, comp);
6267 return stbi__info_main(&s, x, y, comp);
6270 #endif // STB_IMAGE_IMPLEMENTATION #define STBIDEF
Definition: stb_image.h:405
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
Definition: stb_image.h:391
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
STBIDEF const char * stbi_failure_reason(void)
STBIDEF void stbi_hdr_to_ldr_scale(float scale)
STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
STBIDEF float * stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
STBIDEF float * stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma)
Definition: stb_image.h:392
Definition: stb_image.h:417
STBIDEF stbi_uc * stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma)
STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
STBIDEF void stbi_ldr_to_hdr_scale(float scale)
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
STBIDEF int stbi_is_hdr_from_file(FILE *f)
STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
Definition: stb_image.h:393
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp)
Definition: stb_image.h:390
STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
STBIDEF int stbi_is_hdr(char const *filename)
unsigned char stbi_uc
Definition: stb_image.h:396
STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
STBIDEF float * stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
STBIDEF void stbi_image_free(void *retval_from_stbi_load)
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 char * stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen)
Definition: stb_image.h:388
STBIDEF stbi_uc * stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)