219 #ifndef STBI_INCLUDE_STB_IMAGE_H 220 #define STBI_INCLUDE_STB_IMAGE_H 392 #ifndef STBI_NO_STDIO 394 #endif // STBI_NO_STDIO 396 #define STBI_VERSION 1 414 #ifdef STB_IMAGE_STATIC 415 #define STBIDEF static 417 #define STBIDEF extern 431 int (*read) (
void *user,
char *data,
int size);
432 void (*skip) (
void *user,
int n);
433 int (*eof) (
void *user);
440 #ifndef STBI_NO_STDIO 445 #ifndef STBI_NO_LINEAR 446 STBIDEF float *
stbi_loadf (
char const *filename,
int *x,
int *y,
int *comp,
int req_comp);
450 #ifndef STBI_NO_STDIO 458 #endif // STBI_NO_HDR 460 #ifndef STBI_NO_LINEAR 463 #endif // STBI_NO_LINEAR 468 #ifndef STBI_NO_STDIO 471 #endif // STBI_NO_STDIO 485 #ifndef STBI_NO_STDIO 523 #endif // STBI_INCLUDE_STB_IMAGE_H 525 #ifdef STB_IMAGE_IMPLEMENTATION 527 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ 528 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ 529 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ 530 || defined(STBI_ONLY_ZLIB) 531 #ifndef STBI_ONLY_JPEG 534 #ifndef STBI_ONLY_PNG 537 #ifndef STBI_ONLY_BMP 540 #ifndef STBI_ONLY_PSD 543 #ifndef STBI_ONLY_TGA 546 #ifndef STBI_ONLY_GIF 549 #ifndef STBI_ONLY_HDR 552 #ifndef STBI_ONLY_PIC 555 #ifndef STBI_ONLY_PNM 560 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) 570 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) 574 #ifndef STBI_NO_STDIO 580 #define STBI_ASSERT(x) assert(x) 586 #define stbi_inline inline 591 #define stbi_inline __forceinline 596 typedef unsigned short stbi__uint16;
597 typedef signed short stbi__int16;
598 typedef unsigned int stbi__uint32;
599 typedef signed int stbi__int32;
602 typedef uint16_t stbi__uint16;
603 typedef int16_t stbi__int16;
604 typedef uint32_t stbi__uint32;
605 typedef int32_t stbi__int32;
609 typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
612 #define STBI_NOTUSED(v) (void)(v) 614 #define STBI_NOTUSED(v) (void)sizeof(v) 618 #define STBI_HAS_LROTL 621 #ifdef STBI_HAS_LROTL 622 #define stbi_lrot(x,y) _lrotl(x,y) 624 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) 627 #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) 629 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) 632 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." 636 #define STBI_MALLOC(sz) malloc(sz) 637 #define STBI_REALLOC(p,newsz) realloc(p,newsz) 638 #define STBI_FREE(p) free(p) 641 #ifndef STBI_REALLOC_SIZED 642 #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) 646 #if defined(__x86_64__) || defined(_M_X64) 647 #define STBI__X64_TARGET 648 #elif defined(__i386) || defined(_M_IX86) 649 #define STBI__X86_TARGET 652 #if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) 661 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) 676 #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) 678 #include <emmintrin.h> 682 #if _MSC_VER >= 1400 // not VC6 684 static int stbi__cpuid3(
void)
691 static int stbi__cpuid3(
void)
703 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name 705 static int stbi__sse2_available()
707 int info3 = stbi__cpuid3();
708 return ((info3 >> 26) & 1) != 0;
710 #else // assume GCC-style if not VC++ 711 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 713 static int stbi__sse2_available()
715 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later 717 return __builtin_cpu_supports(
"sse2");
728 #if defined(STBI_NO_SIMD) && defined(STBI_NEON) 733 #include <arm_neon.h> 735 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 738 #ifndef STBI_SIMD_ALIGN 739 #define STBI_SIMD_ALIGN(type, name) type name 750 stbi__uint32 img_x, img_y;
751 int img_n, img_out_n;
756 int read_from_callbacks;
760 stbi_uc *img_buffer, *img_buffer_end;
761 stbi_uc *img_buffer_original, *img_buffer_original_end;
765 static void stbi__refill_buffer(stbi__context *s);
768 static void stbi__start_mem(stbi__context *s,
stbi_uc const *buffer,
int len)
771 s->read_from_callbacks = 0;
772 s->img_buffer = s->img_buffer_original = (
stbi_uc *) buffer;
773 s->img_buffer_end = s->img_buffer_original_end = (
stbi_uc *) buffer+len;
777 static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user)
780 s->io_user_data = user;
781 s->buflen =
sizeof(s->buffer_start);
782 s->read_from_callbacks = 1;
783 s->img_buffer_original = s->buffer_start;
784 stbi__refill_buffer(s);
785 s->img_buffer_original_end = s->img_buffer_end;
788 #ifndef STBI_NO_STDIO 790 static int stbi__stdio_read(
void *user,
char *data,
int size)
792 return (
int) fread(data,1,size,(FILE*) user);
795 static void stbi__stdio_skip(
void *user,
int n)
797 fseek((FILE*) user, n, SEEK_CUR);
800 static int stbi__stdio_eof(
void *user)
802 return feof((FILE*) user);
812 static void stbi__start_file(stbi__context *s, FILE *f)
814 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *) f);
819 #endif // !STBI_NO_STDIO 821 static void stbi__rewind(stbi__context *s)
826 s->img_buffer = s->img_buffer_original;
827 s->img_buffer_end = s->img_buffer_original_end;
831 static int stbi__jpeg_test(stbi__context *s);
832 static stbi_uc *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
833 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
837 static int stbi__png_test(stbi__context *s);
838 static stbi_uc *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
839 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
843 static int stbi__bmp_test(stbi__context *s);
844 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
845 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
849 static int stbi__tga_test(stbi__context *s);
850 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
851 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
855 static int stbi__psd_test(stbi__context *s);
856 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
857 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
861 static int stbi__hdr_test(stbi__context *s);
862 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
863 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
867 static int stbi__pic_test(stbi__context *s);
868 static stbi_uc *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
869 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
873 static int stbi__gif_test(stbi__context *s);
874 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
875 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
879 static int stbi__pnm_test(stbi__context *s);
880 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
881 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
885 static const char *stbi__g_failure_reason;
889 return stbi__g_failure_reason;
892 static int stbi__err(
const char *str)
894 stbi__g_failure_reason = str;
898 static void *stbi__malloc(
size_t size)
900 return STBI_MALLOC(size);
907 #ifdef STBI_NO_FAILURE_STRINGS 908 #define stbi__err(x,y) 0 909 #elif defined(STBI_FAILURE_USERMSG) 910 #define stbi__err(x,y) stbi__err(y) 912 #define stbi__err(x,y) stbi__err(x) 915 #define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) 916 #define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) 920 STBI_FREE(retval_from_stbi_load);
923 #ifndef STBI_NO_LINEAR 924 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp);
928 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
931 static int stbi__vertically_flip_on_load = 0;
935 stbi__vertically_flip_on_load = flag_true_if_should_flip;
938 static unsigned char *stbi__load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
941 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s,x,y,comp,req_comp);
944 if (stbi__png_test(s))
return stbi__png_load(s,x,y,comp,req_comp);
947 if (stbi__bmp_test(s))
return stbi__bmp_load(s,x,y,comp,req_comp);
950 if (stbi__gif_test(s))
return stbi__gif_load(s,x,y,comp,req_comp);
953 if (stbi__psd_test(s))
return stbi__psd_load(s,x,y,comp,req_comp);
956 if (stbi__pic_test(s))
return stbi__pic_load(s,x,y,comp,req_comp);
959 if (stbi__pnm_test(s))
return stbi__pnm_load(s,x,y,comp,req_comp);
963 if (stbi__hdr_test(s)) {
964 float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);
965 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
971 if (stbi__tga_test(s))
972 return stbi__tga_load(s,x,y,comp,req_comp);
975 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
978 static unsigned char *stbi__load_flip(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
980 unsigned char *result = stbi__load_main(s, x, y, comp, req_comp);
982 if (stbi__vertically_flip_on_load && result != NULL) {
984 int depth = req_comp ? req_comp : *comp;
989 for (row = 0; row < (h>>1); row++) {
990 for (col = 0; col < w; col++) {
991 for (z = 0; z < depth; z++) {
992 temp = result[(row * w + col) * depth + z];
993 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
994 result[((h - row - 1) * w + col) * depth + z] = temp;
1004 static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp)
1006 if (stbi__vertically_flip_on_load && result != NULL) {
1008 int depth = req_comp ? req_comp : *comp;
1013 for (row = 0; row < (h>>1); row++) {
1014 for (col = 0; col < w; col++) {
1015 for (z = 0; z < depth; z++) {
1016 temp = result[(row * w + col) * depth + z];
1017 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
1018 result[((h - row - 1) * w + col) * depth + z] = temp;
1026 #ifndef STBI_NO_STDIO 1028 static FILE *stbi__fopen(
char const *filename,
char const *mode)
1031 #if defined(_MSC_VER) && _MSC_VER >= 1400 1032 if (0 != fopen_s(&f, filename, mode))
1035 f = fopen(filename, mode);
1043 FILE *f = stbi__fopen(filename,
"rb");
1044 unsigned char *result;
1045 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1053 unsigned char *result;
1055 stbi__start_file(&s,f);
1056 result = stbi__load_flip(&s,x,y,comp,req_comp);
1059 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1068 stbi__start_mem(&s,buffer,len);
1069 return stbi__load_flip(&s,x,y,comp,req_comp);
1076 return stbi__load_flip(&s,x,y,comp,req_comp);
1079 #ifndef STBI_NO_LINEAR 1080 static float *stbi__loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1082 unsigned char *data;
1084 if (stbi__hdr_test(s)) {
1085 float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp);
1087 stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1091 data = stbi__load_flip(s, x, y, comp, req_comp);
1093 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1094 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1100 stbi__start_mem(&s,buffer,len);
1101 return stbi__loadf_main(&s,x,y,comp,req_comp);
1108 return stbi__loadf_main(&s,x,y,comp,req_comp);
1111 #ifndef STBI_NO_STDIO 1112 STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1115 FILE *f = stbi__fopen(filename,
"rb");
1116 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1125 stbi__start_file(&s,f);
1126 return stbi__loadf_main(&s,x,y,comp,req_comp);
1128 #endif // !STBI_NO_STDIO 1130 #endif // !STBI_NO_LINEAR 1140 stbi__start_mem(&s,buffer,len);
1141 return stbi__hdr_test(&s);
1143 STBI_NOTUSED(buffer);
1149 #ifndef STBI_NO_STDIO 1152 FILE *f = stbi__fopen(filename,
"rb");
1165 stbi__start_file(&s,f);
1166 return stbi__hdr_test(&s);
1172 #endif // !STBI_NO_STDIO 1179 return stbi__hdr_test(&s);
1187 #ifndef STBI_NO_LINEAR 1188 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1194 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1212 static void stbi__refill_buffer(stbi__context *s)
1214 int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
1218 s->read_from_callbacks = 0;
1219 s->img_buffer = s->buffer_start;
1220 s->img_buffer_end = s->buffer_start+1;
1223 s->img_buffer = s->buffer_start;
1224 s->img_buffer_end = s->buffer_start + n;
1228 stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1230 if (s->img_buffer < s->img_buffer_end)
1231 return *s->img_buffer++;
1232 if (s->read_from_callbacks) {
1233 stbi__refill_buffer(s);
1234 return *s->img_buffer++;
1239 stbi_inline
static int stbi__at_eof(stbi__context *s)
1242 if (!(s->io.eof)(s->io_user_data))
return 0;
1245 if (s->read_from_callbacks == 0)
return 1;
1248 return s->img_buffer >= s->img_buffer_end;
1251 static void stbi__skip(stbi__context *s,
int n)
1254 s->img_buffer = s->img_buffer_end;
1258 int blen = (int) (s->img_buffer_end - s->img_buffer);
1260 s->img_buffer = s->img_buffer_end;
1261 (s->io.skip)(s->io_user_data, n - blen);
1268 static int stbi__getn(stbi__context *s,
stbi_uc *buffer,
int n)
1271 int blen = (int) (s->img_buffer_end - s->img_buffer);
1275 memcpy(buffer, s->img_buffer, blen);
1277 count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
1278 res = (count == (n-blen));
1279 s->img_buffer = s->img_buffer_end;
1284 if (s->img_buffer+n <= s->img_buffer_end) {
1285 memcpy(buffer, s->img_buffer, n);
1292 static int stbi__get16be(stbi__context *s)
1294 int z = stbi__get8(s);
1295 return (z << 8) + stbi__get8(s);
1298 static stbi__uint32 stbi__get32be(stbi__context *s)
1300 stbi__uint32 z = stbi__get16be(s);
1301 return (z << 16) + stbi__get16be(s);
1304 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) 1307 static int stbi__get16le(stbi__context *s)
1309 int z = stbi__get8(s);
1310 return z + (stbi__get8(s) << 8);
1315 static stbi__uint32 stbi__get32le(stbi__context *s)
1317 stbi__uint32 z = stbi__get16le(s);
1318 return z + (stbi__get16le(s) << 16);
1322 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings 1336 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1338 return (
stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
1341 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1344 unsigned char *good;
1346 if (req_comp == img_n)
return data;
1347 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1349 good = (
unsigned char *) stbi__malloc(req_comp * x * y);
1352 return stbi__errpuc(
"outofmem",
"Out of memory");
1355 for (j=0; j < (int) y; ++j) {
1356 unsigned char *src = data + j * x * img_n ;
1357 unsigned char *dest = good + j * x * req_comp;
1359 #define COMBO(a,b) ((a)*8+(b)) 1360 #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 1363 switch (COMBO(img_n, req_comp)) {
1364 CASE(1,2) dest[0]=src[0], dest[1]=255; break;
1365 CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1366 CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
1367 CASE(2,1) dest[0]=src[0]; break;
1368 CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1369 CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
1370 CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
1371 CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1372 CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
1373 CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1374 CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
1375 CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
1376 default: STBI_ASSERT(0);
1385 #ifndef STBI_NO_LINEAR 1386 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp)
1389 float *output = (
float *) stbi__malloc(x * y * comp *
sizeof(
float));
1390 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1392 if (comp & 1) n = comp;
else n = comp-1;
1393 for (i=0; i < x*y; ++i) {
1394 for (k=0; k < n; ++k) {
1395 output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1397 if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
1405 #define stbi__float2int(x) ((int) (x)) 1406 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1410 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1412 if (comp & 1) n = comp;
else n = comp-1;
1413 for (i=0; i < x*y; ++i) {
1414 for (k=0; k < n; ++k) {
1415 float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1417 if (z > 255) z = 255;
1418 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1421 float z = data[i*comp+k] * 255 + 0.5f;
1423 if (z > 255) z = 255;
1424 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1453 #ifndef STBI_NO_JPEG 1456 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache 1462 stbi__uint16 code[256];
1465 unsigned int maxcode[18];
1472 stbi__huffman huff_dc[4];
1473 stbi__huffman huff_ac[4];
1475 stbi__int16 fast_ac[4][1 << FAST_BITS];
1478 int img_h_max, img_v_max;
1479 int img_mcu_x, img_mcu_y;
1480 int img_mcu_w, img_mcu_h;
1493 void *raw_data, *raw_coeff;
1496 int coeff_w, coeff_h;
1499 stbi__uint32 code_buffer;
1501 unsigned char marker;
1512 int scan_n, order[4];
1513 int restart_interval, todo;
1516 void (*idct_block_kernel)(
stbi_uc *out,
int out_stride,
short data[64]);
1521 static int stbi__build_huffman(stbi__huffman *h,
int *count)
1525 for (i=0; i < 16; ++i)
1526 for (j=0; j < count[i]; ++j)
1527 h->size[k++] = (
stbi_uc) (i+1);
1533 for(j=1; j <= 16; ++j) {
1535 h->delta[j] = k - code;
1536 if (h->size[k] == j) {
1537 while (h->size[k] == j)
1538 h->code[k++] = (stbi__uint16) (code++);
1539 if (code-1 >= (1 << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1542 h->maxcode[j] = code << (16-j);
1545 h->maxcode[j] = 0xffffffff;
1548 memset(h->fast, 255, 1 << FAST_BITS);
1549 for (i=0; i < k; ++i) {
1551 if (s <= FAST_BITS) {
1552 int c = h->code[i] << (FAST_BITS-s);
1553 int m = 1 << (FAST_BITS-s);
1554 for (j=0; j < m; ++j) {
1564 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1567 for (i=0; i < (1 << FAST_BITS); ++i) {
1571 int rs = h->values[fast];
1572 int run = (rs >> 4) & 15;
1573 int magbits = rs & 15;
1574 int len = h->size[fast];
1576 if (magbits && len + magbits <= FAST_BITS) {
1578 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1579 int m = 1 << (magbits - 1);
1580 if (k < m) k += (-1 << magbits) + 1;
1582 if (k >= -128 && k <= 127)
1583 fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
1589 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1592 int b = j->nomore ? 0 : stbi__get8(j->s);
1594 int c = stbi__get8(j->s);
1596 j->marker = (
unsigned char) c;
1601 j->code_buffer |= b << (24 - j->code_bits);
1603 }
while (j->code_bits <= 24);
1607 static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1610 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1615 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1619 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1623 if (s > j->code_bits)
1625 j->code_buffer <<= s;
1627 return h->values[k];
1636 temp = j->code_buffer >> 16;
1637 for (k=FAST_BITS+1 ; ; ++k)
1638 if (temp < h->maxcode[k])
1646 if (k > j->code_bits)
1650 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1651 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1655 j->code_buffer <<= k;
1656 return h->values[c];
1660 static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1664 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1668 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1670 sgn = (stbi__int32)j->code_buffer >> 31;
1671 k = stbi_lrot(j->code_buffer, n);
1672 STBI_ASSERT(n >= 0 && n < (
int) (
sizeof(stbi__bmask)/
sizeof(*stbi__bmask)));
1673 j->code_buffer = k & ~stbi__bmask[n];
1674 k &= stbi__bmask[n];
1676 return k + (stbi__jbias[n] & ~sgn);
1680 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
1683 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1684 k = stbi_lrot(j->code_buffer, n);
1685 j->code_buffer = k & ~stbi__bmask[n];
1686 k &= stbi__bmask[n];
1691 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
1694 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1696 j->code_buffer <<= 1;
1698 return k & 0x80000000;
1703 static stbi_uc stbi__jpeg_dezigzag[64+15] =
1705 0, 1, 8, 16, 9, 2, 3, 10,
1706 17, 24, 32, 25, 18, 11, 4, 5,
1707 12, 19, 26, 33, 40, 48, 41, 34,
1708 27, 20, 13, 6, 7, 14, 21, 28,
1709 35, 42, 49, 56, 57, 50, 43, 36,
1710 29, 22, 15, 23, 30, 37, 44, 51,
1711 58, 59, 52, 45, 38, 31, 39, 46,
1712 53, 60, 61, 54, 47, 55, 62, 63,
1714 63, 63, 63, 63, 63, 63, 63, 63,
1715 63, 63, 63, 63, 63, 63, 63
1719 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)
1724 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1725 t = stbi__jpeg_huff_decode(j, hdc);
1726 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1729 memset(data,0,64*
sizeof(data[0]));
1731 diff = t ? stbi__extend_receive(j, t) : 0;
1732 dc = j->img_comp[b].dc_pred + diff;
1733 j->img_comp[b].dc_pred = dc;
1734 data[0] = (short) (dc * dequant[0]);
1741 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1742 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1747 j->code_buffer <<= s;
1750 zig = stbi__jpeg_dezigzag[k++];
1751 data[zig] = (short) ((r >> 8) * dequant[zig]);
1753 int rs = stbi__jpeg_huff_decode(j, hac);
1754 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1758 if (rs != 0xf0)
break;
1763 zig = stbi__jpeg_dezigzag[k++];
1764 data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
1771 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
1775 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1777 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1779 if (j->succ_high == 0) {
1781 memset(data,0,64*
sizeof(data[0]));
1782 t = stbi__jpeg_huff_decode(j, hdc);
1783 diff = t ? stbi__extend_receive(j, t) : 0;
1785 dc = j->img_comp[b].dc_pred + diff;
1786 j->img_comp[b].dc_pred = dc;
1787 data[0] = (short) (dc << j->succ_low);
1790 if (stbi__jpeg_get_bit(j))
1791 data[0] += (
short) (1 << j->succ_low);
1798 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
1801 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1803 if (j->succ_high == 0) {
1804 int shift = j->succ_low;
1815 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1816 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1821 j->code_buffer <<= s;
1823 zig = stbi__jpeg_dezigzag[k++];
1824 data[zig] = (short) ((r >> 8) << shift);
1826 int rs = stbi__jpeg_huff_decode(j, hac);
1827 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1832 j->eob_run = (1 << r);
1834 j->eob_run += stbi__jpeg_get_bits(j, r);
1841 zig = stbi__jpeg_dezigzag[k++];
1842 data[zig] = (short) (stbi__extend_receive(j,s) << shift);
1845 }
while (k <= j->spec_end);
1849 short bit = (short) (1 << j->succ_low);
1853 for (k = j->spec_start; k <= j->spec_end; ++k) {
1854 short *p = &data[stbi__jpeg_dezigzag[k]];
1856 if (stbi__jpeg_get_bit(j))
1857 if ((*p & bit)==0) {
1868 int rs = stbi__jpeg_huff_decode(j, hac);
1869 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1874 j->eob_run = (1 << r) - 1;
1876 j->eob_run += stbi__jpeg_get_bits(j, r);
1884 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1886 if (stbi__jpeg_get_bit(j))
1893 while (k <= j->spec_end) {
1894 short *p = &data[stbi__jpeg_dezigzag[k++]];
1896 if (stbi__jpeg_get_bit(j))
1897 if ((*p & bit)==0) {
1911 }
while (k <= j->spec_end);
1918 stbi_inline
static stbi_uc stbi__clamp(
int x)
1921 if ((
unsigned int) x > 255) {
1922 if (x < 0)
return 0;
1923 if (x > 255)
return 255;
1928 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) 1929 #define stbi__fsh(x) ((x) << 12) 1932 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ 1933 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ 1936 p1 = (p2+p3) * stbi__f2f(0.5411961f); \ 1937 t2 = p1 + p3*stbi__f2f(-1.847759065f); \ 1938 t3 = p1 + p2*stbi__f2f( 0.765366865f); \ 1941 t0 = stbi__fsh(p2+p3); \ 1942 t1 = stbi__fsh(p2-p3); \ 1955 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ 1956 t0 = t0*stbi__f2f( 0.298631336f); \ 1957 t1 = t1*stbi__f2f( 2.053119869f); \ 1958 t2 = t2*stbi__f2f( 3.072711026f); \ 1959 t3 = t3*stbi__f2f( 1.501321110f); \ 1960 p1 = p5 + p1*stbi__f2f(-0.899976223f); \ 1961 p2 = p5 + p2*stbi__f2f(-2.562915447f); \ 1962 p3 = p3*stbi__f2f(-1.961570560f); \ 1963 p4 = p4*stbi__f2f(-0.390180644f); \ 1969 static void stbi__idct_block(
stbi_uc *out,
int out_stride,
short data[64])
1971 int i,val[64],*v=val;
1976 for (i=0; i < 8; ++i,++d, ++v) {
1978 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
1979 && d[40]==0 && d[48]==0 && d[56]==0) {
1984 int dcterm = d[0] << 2;
1985 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1987 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
1990 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
1991 v[ 0] = (x0+t3) >> 10;
1992 v[56] = (x0-t3) >> 10;
1993 v[ 8] = (x1+t2) >> 10;
1994 v[48] = (x1-t2) >> 10;
1995 v[16] = (x2+t1) >> 10;
1996 v[40] = (x2-t1) >> 10;
1997 v[24] = (x3+t0) >> 10;
1998 v[32] = (x3-t0) >> 10;
2002 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
2004 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
2011 x0 += 65536 + (128<<17);
2012 x1 += 65536 + (128<<17);
2013 x2 += 65536 + (128<<17);
2014 x3 += 65536 + (128<<17);
2017 o[0] = stbi__clamp((x0+t3) >> 17);
2018 o[7] = stbi__clamp((x0-t3) >> 17);
2019 o[1] = stbi__clamp((x1+t2) >> 17);
2020 o[6] = stbi__clamp((x1-t2) >> 17);
2021 o[2] = stbi__clamp((x2+t1) >> 17);
2022 o[5] = stbi__clamp((x2-t1) >> 17);
2023 o[3] = stbi__clamp((x3+t0) >> 17);
2024 o[4] = stbi__clamp((x3-t0) >> 17);
2032 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2035 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2039 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) 2043 #define dct_rot(out0,out1, x,y,c0,c1) \ 2044 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ 2045 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ 2046 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ 2047 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ 2048 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ 2049 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) 2052 #define dct_widen(out, in) \ 2053 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ 2054 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) 2057 #define dct_wadd(out, a, b) \ 2058 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ 2059 __m128i out##_h = _mm_add_epi32(a##_h, b##_h) 2062 #define dct_wsub(out, a, b) \ 2063 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ 2064 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) 2067 #define dct_bfly32o(out0, out1, a,b,bias,s) \ 2069 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ 2070 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ 2071 dct_wadd(sum, abiased, b); \ 2072 dct_wsub(dif, abiased, b); \ 2073 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ 2074 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ 2078 #define dct_interleave8(a, b) \ 2080 a = _mm_unpacklo_epi8(a, b); \ 2081 b = _mm_unpackhi_epi8(tmp, b) 2084 #define dct_interleave16(a, b) \ 2086 a = _mm_unpacklo_epi16(a, b); \ 2087 b = _mm_unpackhi_epi16(tmp, b) 2089 #define dct_pass(bias,shift) \ 2092 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ 2093 __m128i sum04 = _mm_add_epi16(row0, row4); \ 2094 __m128i dif04 = _mm_sub_epi16(row0, row4); \ 2095 dct_widen(t0e, sum04); \ 2096 dct_widen(t1e, dif04); \ 2097 dct_wadd(x0, t0e, t3e); \ 2098 dct_wsub(x3, t0e, t3e); \ 2099 dct_wadd(x1, t1e, t2e); \ 2100 dct_wsub(x2, t1e, t2e); \ 2102 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ 2103 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ 2104 __m128i sum17 = _mm_add_epi16(row1, row7); \ 2105 __m128i sum35 = _mm_add_epi16(row3, row5); \ 2106 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ 2107 dct_wadd(x4, y0o, y4o); \ 2108 dct_wadd(x5, y1o, y5o); \ 2109 dct_wadd(x6, y2o, y5o); \ 2110 dct_wadd(x7, y3o, y4o); \ 2111 dct_bfly32o(row0,row7, x0,x7,bias,shift); \ 2112 dct_bfly32o(row1,row6, x1,x6,bias,shift); \ 2113 dct_bfly32o(row2,row5, x2,x5,bias,shift); \ 2114 dct_bfly32o(row3,row4, x3,x4,bias,shift); \ 2117 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2118 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2119 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2120 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2121 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2122 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2123 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2124 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
2127 __m128i bias_0 = _mm_set1_epi32(512);
2128 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2131 row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
2132 row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
2133 row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
2134 row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
2135 row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
2136 row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
2137 row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
2138 row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
2141 dct_pass(bias_0, 10);
2145 dct_interleave16(row0, row4);
2146 dct_interleave16(row1, row5);
2147 dct_interleave16(row2, row6);
2148 dct_interleave16(row3, row7);
2151 dct_interleave16(row0, row2);
2152 dct_interleave16(row1, row3);
2153 dct_interleave16(row4, row6);
2154 dct_interleave16(row5, row7);
2157 dct_interleave16(row0, row1);
2158 dct_interleave16(row2, row3);
2159 dct_interleave16(row4, row5);
2160 dct_interleave16(row6, row7);
2164 dct_pass(bias_1, 17);
2168 __m128i p0 = _mm_packus_epi16(row0, row1);
2169 __m128i p1 = _mm_packus_epi16(row2, row3);
2170 __m128i p2 = _mm_packus_epi16(row4, row5);
2171 __m128i p3 = _mm_packus_epi16(row6, row7);
2174 dct_interleave8(p0, p2);
2175 dct_interleave8(p1, p3);
2178 dct_interleave8(p0, p1);
2179 dct_interleave8(p2, p3);
2182 dct_interleave8(p0, p2);
2183 dct_interleave8(p1, p3);
2186 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2187 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2188 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2189 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2190 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2191 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2192 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2193 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2202 #undef dct_interleave8 2203 #undef dct_interleave16 2213 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2215 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2217 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2218 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2219 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2220 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2221 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2222 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2223 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2224 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2225 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2226 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2227 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2228 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2230 #define dct_long_mul(out, inq, coeff) \ 2231 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ 2232 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) 2234 #define dct_long_mac(out, acc, inq, coeff) \ 2235 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ 2236 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) 2238 #define dct_widen(out, inq) \ 2239 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ 2240 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) 2243 #define dct_wadd(out, a, b) \ 2244 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ 2245 int32x4_t out##_h = vaddq_s32(a##_h, b##_h) 2248 #define dct_wsub(out, a, b) \ 2249 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ 2250 int32x4_t out##_h = vsubq_s32(a##_h, b##_h) 2253 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \ 2255 dct_wadd(sum, a, b); \ 2256 dct_wsub(dif, a, b); \ 2257 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ 2258 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ 2261 #define dct_pass(shiftop, shift) \ 2264 int16x8_t sum26 = vaddq_s16(row2, row6); \ 2265 dct_long_mul(p1e, sum26, rot0_0); \ 2266 dct_long_mac(t2e, p1e, row6, rot0_1); \ 2267 dct_long_mac(t3e, p1e, row2, rot0_2); \ 2268 int16x8_t sum04 = vaddq_s16(row0, row4); \ 2269 int16x8_t dif04 = vsubq_s16(row0, row4); \ 2270 dct_widen(t0e, sum04); \ 2271 dct_widen(t1e, dif04); \ 2272 dct_wadd(x0, t0e, t3e); \ 2273 dct_wsub(x3, t0e, t3e); \ 2274 dct_wadd(x1, t1e, t2e); \ 2275 dct_wsub(x2, t1e, t2e); \ 2277 int16x8_t sum15 = vaddq_s16(row1, row5); \ 2278 int16x8_t sum17 = vaddq_s16(row1, row7); \ 2279 int16x8_t sum35 = vaddq_s16(row3, row5); \ 2280 int16x8_t sum37 = vaddq_s16(row3, row7); \ 2281 int16x8_t sumodd = vaddq_s16(sum17, sum35); \ 2282 dct_long_mul(p5o, sumodd, rot1_0); \ 2283 dct_long_mac(p1o, p5o, sum17, rot1_1); \ 2284 dct_long_mac(p2o, p5o, sum35, rot1_2); \ 2285 dct_long_mul(p3o, sum37, rot2_0); \ 2286 dct_long_mul(p4o, sum15, rot2_1); \ 2287 dct_wadd(sump13o, p1o, p3o); \ 2288 dct_wadd(sump24o, p2o, p4o); \ 2289 dct_wadd(sump23o, p2o, p3o); \ 2290 dct_wadd(sump14o, p1o, p4o); \ 2291 dct_long_mac(x4, sump13o, row7, rot3_0); \ 2292 dct_long_mac(x5, sump24o, row5, rot3_1); \ 2293 dct_long_mac(x6, sump23o, row3, rot3_2); \ 2294 dct_long_mac(x7, sump14o, row1, rot3_3); \ 2295 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ 2296 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ 2297 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ 2298 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ 2302 row0 = vld1q_s16(data + 0*8);
2303 row1 = vld1q_s16(data + 1*8);
2304 row2 = vld1q_s16(data + 2*8);
2305 row3 = vld1q_s16(data + 3*8);
2306 row4 = vld1q_s16(data + 4*8);
2307 row5 = vld1q_s16(data + 5*8);
2308 row6 = vld1q_s16(data + 6*8);
2309 row7 = vld1q_s16(data + 7*8);
2312 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2315 dct_pass(vrshrn_n_s32, 10);
2321 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } 2322 #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]); } 2323 #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)); } 2326 dct_trn16(row0, row1);
2327 dct_trn16(row2, row3);
2328 dct_trn16(row4, row5);
2329 dct_trn16(row6, row7);
2332 dct_trn32(row0, row2);
2333 dct_trn32(row1, row3);
2334 dct_trn32(row4, row6);
2335 dct_trn32(row5, row7);
2338 dct_trn64(row0, row4);
2339 dct_trn64(row1, row5);
2340 dct_trn64(row2, row6);
2341 dct_trn64(row3, row7);
2352 dct_pass(vshrn_n_s32, 16);
2356 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2357 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2358 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2359 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2360 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2361 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2362 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2363 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2366 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } 2367 #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]); } 2368 #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]); } 2380 dct_trn8_16(p0, p2);
2381 dct_trn8_16(p1, p3);
2382 dct_trn8_16(p4, p6);
2383 dct_trn8_16(p5, p7);
2386 dct_trn8_32(p0, p4);
2387 dct_trn8_32(p1, p5);
2388 dct_trn8_32(p2, p6);
2389 dct_trn8_32(p3, p7);
2392 vst1_u8(out, p0); out += out_stride;
2393 vst1_u8(out, p1); out += out_stride;
2394 vst1_u8(out, p2); out += out_stride;
2395 vst1_u8(out, p3); out += out_stride;
2396 vst1_u8(out, p4); out += out_stride;
2397 vst1_u8(out, p5); out += out_stride;
2398 vst1_u8(out, p6); out += out_stride;
2417 #define STBI__MARKER_none 0xff 2421 static stbi_uc stbi__get_marker(stbi__jpeg *j)
2424 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2425 x = stbi__get8(j->s);
2426 if (x != 0xff)
return STBI__MARKER_none;
2428 x = stbi__get8(j->s);
2434 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) 2438 static void stbi__jpeg_reset(stbi__jpeg *j)
2443 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
2444 j->marker = STBI__MARKER_none;
2445 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2451 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2453 stbi__jpeg_reset(z);
2454 if (!z->progressive) {
2455 if (z->scan_n == 1) {
2457 STBI_SIMD_ALIGN(
short, data[64]);
2458 int n = z->order[0];
2463 int w = (z->img_comp[n].x+7) >> 3;
2464 int h = (z->img_comp[n].y+7) >> 3;
2465 for (j=0; j < h; ++j) {
2466 for (i=0; i < w; ++i) {
2467 int ha = z->img_comp[n].ha;
2468 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;
2469 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2471 if (--z->todo <= 0) {
2472 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2475 if (!STBI__RESTART(z->marker))
return 1;
2476 stbi__jpeg_reset(z);
2483 STBI_SIMD_ALIGN(
short, data[64]);
2484 for (j=0; j < z->img_mcu_y; ++j) {
2485 for (i=0; i < z->img_mcu_x; ++i) {
2487 for (k=0; k < z->scan_n; ++k) {
2488 int n = z->order[k];
2491 for (y=0; y < z->img_comp[n].v; ++y) {
2492 for (x=0; x < z->img_comp[n].h; ++x) {
2493 int x2 = (i*z->img_comp[n].h + x)*8;
2494 int y2 = (j*z->img_comp[n].v + y)*8;
2495 int ha = z->img_comp[n].ha;
2496 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;
2497 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2503 if (--z->todo <= 0) {
2504 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2505 if (!STBI__RESTART(z->marker))
return 1;
2506 stbi__jpeg_reset(z);
2513 if (z->scan_n == 1) {
2515 int n = z->order[0];
2520 int w = (z->img_comp[n].x+7) >> 3;
2521 int h = (z->img_comp[n].y+7) >> 3;
2522 for (j=0; j < h; ++j) {
2523 for (i=0; i < w; ++i) {
2524 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2525 if (z->spec_start == 0) {
2526 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2529 int ha = z->img_comp[n].ha;
2530 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2534 if (--z->todo <= 0) {
2535 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2536 if (!STBI__RESTART(z->marker))
return 1;
2537 stbi__jpeg_reset(z);
2544 for (j=0; j < z->img_mcu_y; ++j) {
2545 for (i=0; i < z->img_mcu_x; ++i) {
2547 for (k=0; k < z->scan_n; ++k) {
2548 int n = z->order[k];
2551 for (y=0; y < z->img_comp[n].v; ++y) {
2552 for (x=0; x < z->img_comp[n].h; ++x) {
2553 int x2 = (i*z->img_comp[n].h + x);
2554 int y2 = (j*z->img_comp[n].v + y);
2555 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2556 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2563 if (--z->todo <= 0) {
2564 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2565 if (!STBI__RESTART(z->marker))
return 1;
2566 stbi__jpeg_reset(z);
2575 static void stbi__jpeg_dequantize(
short *data,
stbi_uc *dequant)
2578 for (i=0; i < 64; ++i)
2579 data[i] *= dequant[i];
2582 static void stbi__jpeg_finish(stbi__jpeg *z)
2584 if (z->progressive) {
2587 for (n=0; n < z->s->img_n; ++n) {
2588 int w = (z->img_comp[n].x+7) >> 3;
2589 int h = (z->img_comp[n].y+7) >> 3;
2590 for (j=0; j < h; ++j) {
2591 for (i=0; i < w; ++i) {
2592 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2593 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2594 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2601 static int stbi__process_marker(stbi__jpeg *z,
int m)
2605 case STBI__MARKER_none:
2606 return stbi__err(
"expected marker",
"Corrupt JPEG");
2609 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2610 z->restart_interval = stbi__get16be(z->s);
2614 L = stbi__get16be(z->s)-2;
2616 int q = stbi__get8(z->s);
2619 if (p != 0)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2620 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2621 for (i=0; i < 64; ++i)
2622 z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
2628 L = stbi__get16be(z->s)-2;
2631 int sizes[16],i,n=0;
2632 int q = stbi__get8(z->s);
2635 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2636 for (i=0; i < 16; ++i) {
2637 sizes[i] = stbi__get8(z->s);
2642 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
2643 v = z->huff_dc[th].values;
2645 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
2646 v = z->huff_ac[th].values;
2648 for (i=0; i < n; ++i)
2649 v[i] = stbi__get8(z->s);
2651 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2657 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2658 stbi__skip(z->s, stbi__get16be(z->s)-2);
2665 static int stbi__process_scan_header(stbi__jpeg *z)
2668 int Ls = stbi__get16be(z->s);
2669 z->scan_n = stbi__get8(z->s);
2670 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");
2671 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2672 for (i=0; i < z->scan_n; ++i) {
2673 int id = stbi__get8(z->s), which;
2674 int q = stbi__get8(z->s);
2675 for (which = 0; which < z->s->img_n; ++which)
2676 if (z->img_comp[which].id ==
id)
2678 if (which == z->s->img_n)
return 0;
2679 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2680 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2681 z->order[i] = which;
2686 z->spec_start = stbi__get8(z->s);
2687 z->spec_end = stbi__get8(z->s);
2688 aa = stbi__get8(z->s);
2689 z->succ_high = (aa >> 4);
2690 z->succ_low = (aa & 15);
2691 if (z->progressive) {
2692 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2693 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2695 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2696 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2704 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
2706 stbi__context *s = z->s;
2707 int Lf,p,i,q, h_max=1,v_max=1,c;
2708 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2709 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
2710 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
2711 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
2713 if (c != 3 && c != 1)
return stbi__err(
"bad component count",
"Corrupt JPEG");
2715 for (i=0; i < c; ++i) {
2716 z->img_comp[i].data = NULL;
2717 z->img_comp[i].linebuf = NULL;
2720 if (Lf != 8+3*s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2723 for (i=0; i < s->img_n; ++i) {
2724 static unsigned char rgb[3] = {
'R',
'G',
'B' };
2725 z->img_comp[i].id = stbi__get8(s);
2726 if (z->img_comp[i].id != i+1)
2727 if (z->img_comp[i].id != i) {
2729 if (z->img_comp[i].id != rgb[i])
2730 return stbi__err(
"bad component ID",
"Corrupt JPEG");
2734 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");
2735 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");
2736 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
2739 if (scan != STBI__SCAN_load)
return 1;
2741 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
2743 for (i=0; i < s->img_n; ++i) {
2744 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
2745 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
2749 z->img_h_max = h_max;
2750 z->img_v_max = v_max;
2751 z->img_mcu_w = h_max * 8;
2752 z->img_mcu_h = v_max * 8;
2753 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
2754 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
2756 for (i=0; i < s->img_n; ++i) {
2758 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
2759 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
2764 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
2765 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
2766 z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
2768 if (z->img_comp[i].raw_data == NULL) {
2769 for(--i; i >= 0; --i) {
2770 STBI_FREE(z->img_comp[i].raw_data);
2771 z->img_comp[i].raw_data = NULL;
2773 return stbi__err(
"outofmem",
"Out of memory");
2776 z->img_comp[i].data = (
stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
2777 z->img_comp[i].linebuf = NULL;
2778 if (z->progressive) {
2779 z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;
2780 z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
2781 z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 *
sizeof(
short) + 15);
2782 z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
2784 z->img_comp[i].coeff = 0;
2785 z->img_comp[i].raw_coeff = 0;
2793 #define stbi__DNL(x) ((x) == 0xdc) 2794 #define stbi__SOI(x) ((x) == 0xd8) 2795 #define stbi__EOI(x) ((x) == 0xd9) 2796 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) 2797 #define stbi__SOS(x) ((x) == 0xda) 2799 #define stbi__SOF_progressive(x) ((x) == 0xc2) 2801 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
2804 z->marker = STBI__MARKER_none;
2805 m = stbi__get_marker(z);
2806 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
2807 if (scan == STBI__SCAN_type)
return 1;
2808 m = stbi__get_marker(z);
2809 while (!stbi__SOF(m)) {
2810 if (!stbi__process_marker(z,m))
return 0;
2811 m = stbi__get_marker(z);
2812 while (m == STBI__MARKER_none) {
2814 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
2815 m = stbi__get_marker(z);
2818 z->progressive = stbi__SOF_progressive(m);
2819 if (!stbi__process_frame_header(z, scan))
return 0;
2824 static int stbi__decode_jpeg_image(stbi__jpeg *j)
2827 for (m = 0; m < 4; m++) {
2828 j->img_comp[m].raw_data = NULL;
2829 j->img_comp[m].raw_coeff = NULL;
2831 j->restart_interval = 0;
2832 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
2833 m = stbi__get_marker(j);
2834 while (!stbi__EOI(m)) {
2836 if (!stbi__process_scan_header(j))
return 0;
2837 if (!stbi__parse_entropy_coded_data(j))
return 0;
2838 if (j->marker == STBI__MARKER_none ) {
2840 while (!stbi__at_eof(j->s)) {
2841 int x = stbi__get8(j->s);
2843 j->marker = stbi__get8(j->s);
2845 }
else if (x != 0) {
2846 return stbi__err(
"junk before marker",
"Corrupt JPEG");
2852 if (!stbi__process_marker(j, m))
return 0;
2854 m = stbi__get_marker(j);
2857 stbi__jpeg_finish(j);
2866 #define stbi__div4(x) ((stbi_uc) ((x) >> 2)) 2871 STBI_NOTUSED(in_far);
2882 for (i=0; i < w; ++i)
2883 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
2895 out[0] = out[1] = input[0];
2900 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
2901 for (i=1; i < w-1; ++i) {
2902 int n = 3*input[i]+2;
2903 out[i*2+0] = stbi__div4(n+input[i-1]);
2904 out[i*2+1] = stbi__div4(n+input[i+1]);
2906 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
2907 out[i*2+1] = input[w-1];
2909 STBI_NOTUSED(in_far);
2915 #define stbi__div16(x) ((stbi_uc) ((x) >> 4)) 2922 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2926 t1 = 3*in_near[0] + in_far[0];
2927 out[0] = stbi__div4(t1+2);
2928 for (i=1; i < w; ++i) {
2930 t1 = 3*in_near[i]+in_far[i];
2931 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
2932 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
2934 out[w*2-1] = stbi__div4(t1+2);
2941 #if defined(STBI_SSE2) || defined(STBI_NEON) 2948 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2952 t1 = 3*in_near[0] + in_far[0];
2956 for (; i < ((w-1) & ~7); i += 8) {
2957 #if defined(STBI_SSE2) 2960 __m128i zero = _mm_setzero_si128();
2961 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
2962 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
2963 __m128i farw = _mm_unpacklo_epi8(farb, zero);
2964 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
2965 __m128i diff = _mm_sub_epi16(farw, nearw);
2966 __m128i nears = _mm_slli_epi16(nearw, 2);
2967 __m128i curr = _mm_add_epi16(nears, diff);
2974 __m128i prv0 = _mm_slli_si128(curr, 2);
2975 __m128i nxt0 = _mm_srli_si128(curr, 2);
2976 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
2977 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
2983 __m128i bias = _mm_set1_epi16(8);
2984 __m128i curs = _mm_slli_epi16(curr, 2);
2985 __m128i prvd = _mm_sub_epi16(prev, curr);
2986 __m128i nxtd = _mm_sub_epi16(next, curr);
2987 __m128i curb = _mm_add_epi16(curs, bias);
2988 __m128i even = _mm_add_epi16(prvd, curb);
2989 __m128i odd = _mm_add_epi16(nxtd, curb);
2992 __m128i int0 = _mm_unpacklo_epi16(even, odd);
2993 __m128i int1 = _mm_unpackhi_epi16(even, odd);
2994 __m128i de0 = _mm_srli_epi16(int0, 4);
2995 __m128i de1 = _mm_srli_epi16(int1, 4);
2998 __m128i outv = _mm_packus_epi16(de0, de1);
2999 _mm_storeu_si128((__m128i *) (out + i*2), outv);
3000 #elif defined(STBI_NEON) 3003 uint8x8_t farb = vld1_u8(in_far + i);
3004 uint8x8_t nearb = vld1_u8(in_near + i);
3005 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3006 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3007 int16x8_t curr = vaddq_s16(nears, diff);
3014 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3015 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3016 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3017 int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3023 int16x8_t curs = vshlq_n_s16(curr, 2);
3024 int16x8_t prvd = vsubq_s16(prev, curr);
3025 int16x8_t nxtd = vsubq_s16(next, curr);
3026 int16x8_t even = vaddq_s16(curs, prvd);
3027 int16x8_t odd = vaddq_s16(curs, nxtd);
3031 o.val[0] = vqrshrun_n_s16(even, 4);
3032 o.val[1] = vqrshrun_n_s16(odd, 4);
3033 vst2_u8(out + i*2, o);
3037 t1 = 3*in_near[i+7] + in_far[i+7];
3041 t1 = 3*in_near[i] + in_far[i];
3042 out[i*2] = stbi__div16(3*t1 + t0 + 8);
3044 for (++i; i < w; ++i) {
3046 t1 = 3*in_near[i]+in_far[i];
3047 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3048 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3050 out[w*2-1] = stbi__div4(t1+2);
3062 STBI_NOTUSED(in_far);
3063 for (i=0; i < w; ++i)
3064 for (j=0; j < hs; ++j)
3065 out[i*hs+j] = in_near[i];
3069 #ifdef STBI_JPEG_OLD 3072 #define float2fixed(x) ((int) ((x) * 65536 + 0.5)) 3076 for (i=0; i < count; ++i) {
3077 int y_fixed = (y[i] << 16) + 32768;
3079 int cr = pcr[i] - 128;
3080 int cb = pcb[i] - 128;
3081 r = y_fixed + cr*float2fixed(1.40200f);
3082 g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
3083 b = y_fixed + cb*float2fixed(1.77200f);
3087 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3088 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3089 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3100 #define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) 3104 for (i=0; i < count; ++i) {
3105 int y_fixed = (y[i] << 20) + (1<<19);
3107 int cr = pcr[i] - 128;
3108 int cb = pcb[i] - 128;
3109 r = y_fixed + cr* float2fixed(1.40200f);
3110 g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3111 b = y_fixed + cb* float2fixed(1.77200f);
3115 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3116 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3117 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3127 #if defined(STBI_SSE2) || defined(STBI_NEON) 3138 __m128i signflip = _mm_set1_epi8(-0x80);
3139 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200f*4096.0f+0.5f));
3140 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
3141 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
3142 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200f*4096.0f+0.5f));
3143 __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
3144 __m128i xw = _mm_set1_epi16(255);
3146 for (; i+7 < count; i += 8) {
3148 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3149 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3150 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3151 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3152 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3155 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3156 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3157 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3160 __m128i yws = _mm_srli_epi16(yw, 4);
3161 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3162 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3163 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3164 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3165 __m128i rws = _mm_add_epi16(cr0, yws);
3166 __m128i gwt = _mm_add_epi16(cb0, yws);
3167 __m128i bws = _mm_add_epi16(yws, cb1);
3168 __m128i gws = _mm_add_epi16(gwt, cr1);
3171 __m128i rw = _mm_srai_epi16(rws, 4);
3172 __m128i bw = _mm_srai_epi16(bws, 4);
3173 __m128i gw = _mm_srai_epi16(gws, 4);
3176 __m128i brb = _mm_packus_epi16(rw, bw);
3177 __m128i gxb = _mm_packus_epi16(gw, xw);
3180 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3181 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3182 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3183 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3186 _mm_storeu_si128((__m128i *) (out + 0), o0);
3187 _mm_storeu_si128((__m128i *) (out + 16), o1);
3197 uint8x8_t signflip = vdup_n_u8(0x80);
3198 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200f*4096.0f+0.5f));
3199 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
3200 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
3201 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200f*4096.0f+0.5f));
3203 for (; i+7 < count; i += 8) {
3205 uint8x8_t y_bytes = vld1_u8(y + i);
3206 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3207 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3208 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3209 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3212 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3213 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3214 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3217 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3218 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3219 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3220 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3221 int16x8_t rws = vaddq_s16(yws, cr0);
3222 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3223 int16x8_t bws = vaddq_s16(yws, cb1);
3227 o.val[0] = vqrshrun_n_s16(rws, 4);
3228 o.val[1] = vqrshrun_n_s16(gws, 4);
3229 o.val[2] = vqrshrun_n_s16(bws, 4);
3230 o.val[3] = vdup_n_u8(255);
3239 for (; i < count; ++i) {
3240 int y_fixed = (y[i] << 20) + (1<<19);
3242 int cr = pcr[i] - 128;
3243 int cb = pcb[i] - 128;
3244 r = y_fixed + cr* float2fixed(1.40200f);
3245 g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3246 b = y_fixed + cb* float2fixed(1.77200f);
3250 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3251 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3252 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3263 static void stbi__setup_jpeg(stbi__jpeg *j)
3265 j->idct_block_kernel = stbi__idct_block;
3266 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3267 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3270 if (stbi__sse2_available()) {
3271 j->idct_block_kernel = stbi__idct_simd;
3272 #ifndef STBI_JPEG_OLD 3273 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3275 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3280 j->idct_block_kernel = stbi__idct_simd;
3281 #ifndef STBI_JPEG_OLD 3282 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3284 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3289 static void stbi__cleanup_jpeg(stbi__jpeg *j)
3292 for (i=0; i < j->s->img_n; ++i) {
3293 if (j->img_comp[i].raw_data) {
3294 STBI_FREE(j->img_comp[i].raw_data);
3295 j->img_comp[i].raw_data = NULL;
3296 j->img_comp[i].data = NULL;
3298 if (j->img_comp[i].raw_coeff) {
3299 STBI_FREE(j->img_comp[i].raw_coeff);
3300 j->img_comp[i].raw_coeff = 0;
3301 j->img_comp[i].coeff = 0;
3303 if (j->img_comp[i].linebuf) {
3304 STBI_FREE(j->img_comp[i].linebuf);
3305 j->img_comp[i].linebuf = NULL;
3312 resample_row_func resample;
3320 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3326 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3329 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3332 n = req_comp ? req_comp : z->s->img_n;
3334 if (z->s->img_n == 3 && n < 3)
3337 decode_n = z->s->img_n;
3346 stbi__resample res_comp[4];
3348 for (k=0; k < decode_n; ++k) {
3349 stbi__resample *r = &res_comp[k];
3353 z->img_comp[k].linebuf = (
stbi_uc *) stbi__malloc(z->s->img_x + 3);
3354 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3356 r->hs = z->img_h_max / z->img_comp[k].h;
3357 r->vs = z->img_v_max / z->img_comp[k].v;
3358 r->ystep = r->vs >> 1;
3359 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3361 r->line0 = r->line1 = z->img_comp[k].data;
3363 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3364 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3365 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3366 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3367 else r->resample = stbi__resample_row_generic;
3371 output = (
stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
3372 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3375 for (j=0; j < z->s->img_y; ++j) {
3376 stbi_uc *out = output + n * z->s->img_x * j;
3377 for (k=0; k < decode_n; ++k) {
3378 stbi__resample *r = &res_comp[k];
3379 int y_bot = r->ystep >= (r->vs >> 1);
3380 coutput[k] = r->resample(z->img_comp[k].linebuf,
3381 y_bot ? r->line1 : r->line0,
3382 y_bot ? r->line0 : r->line1,
3384 if (++r->ystep >= r->vs) {
3386 r->line0 = r->line1;
3387 if (++r->ypos < z->img_comp[k].y)
3388 r->line1 += z->img_comp[k].w2;
3393 if (z->s->img_n == 3) {
3395 for (i=0; i < z->s->img_x; ++i) {
3397 out[1] = coutput[1][i];
3398 out[2] = coutput[2][i];
3403 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3406 for (i=0; i < z->s->img_x; ++i) {
3407 out[0] = out[1] = out[2] = y[i];
3414 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3416 for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3419 stbi__cleanup_jpeg(z);
3420 *out_x = z->s->img_x;
3421 *out_y = z->s->img_y;
3422 if (comp) *comp = z->s->img_n;
3427 static unsigned char *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
3429 unsigned char* result;
3430 stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(
sizeof(stbi__jpeg));
3432 stbi__setup_jpeg(j);
3433 result = load_jpeg_image(j, x,y,comp,req_comp);
3438 static int stbi__jpeg_test(stbi__context *s)
3443 stbi__setup_jpeg(&j);
3444 r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
3449 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
3451 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3452 stbi__rewind( j->s );
3455 if (x) *x = j->s->img_x;
3456 if (y) *y = j->s->img_y;
3457 if (comp) *comp = j->s->img_n;
3461 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
3464 stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(
sizeof(stbi__jpeg)));
3466 result = stbi__jpeg_info_raw(j, x, y, comp);
3479 #ifndef STBI_NO_ZLIB 3482 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables 3483 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) 3489 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3490 stbi__uint16 firstcode[16];
3492 stbi__uint16 firstsymbol[16];
3494 stbi__uint16 value[288];
3497 stbi_inline
static int stbi__bitreverse16(
int n)
3499 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3500 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3501 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3502 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3506 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3508 STBI_ASSERT(bits <= 16);
3511 return stbi__bitreverse16(v) >> (16-bits);
3514 static int stbi__zbuild_huffman(stbi__zhuffman *z,
stbi_uc *sizelist,
int num)
3517 int code, next_code[16], sizes[17];
3520 memset(sizes, 0,
sizeof(sizes));
3521 memset(z->fast, 0,
sizeof(z->fast));
3522 for (i=0; i < num; ++i)
3523 ++sizes[sizelist[i]];
3525 for (i=1; i < 16; ++i)
3526 if (sizes[i] > (1 << i))
3527 return stbi__err(
"bad sizes",
"Corrupt PNG");
3529 for (i=1; i < 16; ++i) {
3530 next_code[i] = code;
3531 z->firstcode[i] = (stbi__uint16) code;
3532 z->firstsymbol[i] = (stbi__uint16) k;
3533 code = (code + sizes[i]);
3535 if (code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3536 z->maxcode[i] = code << (16-i);
3540 z->maxcode[16] = 0x10000;
3541 for (i=0; i < num; ++i) {
3542 int s = sizelist[i];
3544 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3545 stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
3547 z->value[c] = (stbi__uint16) i;
3548 if (s <= STBI__ZFAST_BITS) {
3549 int j = stbi__bit_reverse(next_code[s],s);
3550 while (j < (1 << STBI__ZFAST_BITS)) {
3569 stbi_uc *zbuffer, *zbuffer_end;
3571 stbi__uint32 code_buffer;
3578 stbi__zhuffman z_length, z_distance;
3581 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
3583 if (z->zbuffer >= z->zbuffer_end)
return 0;
3584 return *z->zbuffer++;
3587 static void stbi__fill_bits(stbi__zbuf *z)
3590 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3591 z->code_buffer |= (
unsigned int) stbi__zget8(z) << z->num_bits;
3593 }
while (z->num_bits <= 24);
3596 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
3599 if (z->num_bits < n) stbi__fill_bits(z);
3600 k = z->code_buffer & ((1 << n) - 1);
3601 z->code_buffer >>= n;
3606 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
3611 k = stbi__bit_reverse(a->code_buffer, 16);
3612 for (s=STBI__ZFAST_BITS+1; ; ++s)
3613 if (k < z->maxcode[s])
3615 if (s == 16)
return -1;
3617 b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
3618 STBI_ASSERT(z->size[b] == s);
3619 a->code_buffer >>= s;
3624 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3627 if (a->num_bits < 16) stbi__fill_bits(a);
3628 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3631 a->code_buffer >>= s;
3635 return stbi__zhuffman_decode_slowpath(a, z);
3638 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
3641 int cur, limit, old_limit;
3643 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3644 cur = (int) (z->zout - z->zout_start);
3645 limit = old_limit = (int) (z->zout_end - z->zout_start);
3646 while (cur + n > limit)
3648 q = (
char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
3649 STBI_NOTUSED(old_limit);
3650 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
3653 z->zout_end = q + limit;
3657 static int stbi__zlength_base[31] = {
3658 3,4,5,6,7,8,9,10,11,13,
3659 15,17,19,23,27,31,35,43,51,59,
3660 67,83,99,115,131,163,195,227,258,0,0 };
3662 static int stbi__zlength_extra[31]=
3663 { 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 };
3665 static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3666 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
3668 static int stbi__zdist_extra[32] =
3669 { 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};
3671 static int stbi__parse_huffman_block(stbi__zbuf *a)
3673 char *zout = a->zout;
3675 int z = stbi__zhuffman_decode(a, &a->z_length);
3677 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3678 if (zout >= a->zout_end) {
3679 if (!stbi__zexpand(a, zout, 1))
return 0;
3691 len = stbi__zlength_base[z];
3692 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
3693 z = stbi__zhuffman_decode(a, &a->z_distance);
3694 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3695 dist = stbi__zdist_base[z];
3696 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
3697 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
3698 if (zout + len > a->zout_end) {
3699 if (!stbi__zexpand(a, zout, len))
return 0;
3702 p = (
stbi_uc *) (zout - dist);
3705 if (len) {
do *zout++ = v;
while (--len); }
3707 if (len) {
do *zout++ = *p++;
while (--len); }
3713 static int stbi__compute_huffman_codes(stbi__zbuf *a)
3715 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 };
3716 stbi__zhuffman z_codelength;
3721 int hlit = stbi__zreceive(a,5) + 257;
3722 int hdist = stbi__zreceive(a,5) + 1;
3723 int hclen = stbi__zreceive(a,4) + 4;
3725 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
3726 for (i=0; i < hclen; ++i) {
3727 int s = stbi__zreceive(a,3);
3728 codelength_sizes[length_dezigzag[i]] = (
stbi_uc) s;
3730 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
3733 while (n < hlit + hdist) {
3734 int c = stbi__zhuffman_decode(a, &z_codelength);
3735 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3739 c = stbi__zreceive(a,2)+3;
3740 memset(lencodes+n, lencodes[n-1], c);
3742 }
else if (c == 17) {
3743 c = stbi__zreceive(a,3)+3;
3744 memset(lencodes+n, 0, c);
3747 STBI_ASSERT(c == 18);
3748 c = stbi__zreceive(a,7)+11;
3749 memset(lencodes+n, 0, c);
3753 if (n != hlit+hdist)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3754 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
3755 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
3759 static int stbi__parse_uncompressed_block(stbi__zbuf *a)
3763 if (a->num_bits & 7)
3764 stbi__zreceive(a, a->num_bits & 7);
3767 while (a->num_bits > 0) {
3768 header[k++] = (
stbi_uc) (a->code_buffer & 255);
3769 a->code_buffer >>= 8;
3772 STBI_ASSERT(a->num_bits == 0);
3775 header[k++] = stbi__zget8(a);
3776 len = header[1] * 256 + header[0];
3777 nlen = header[3] * 256 + header[2];
3778 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
3779 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
3780 if (a->zout + len > a->zout_end)
3781 if (!stbi__zexpand(a, a->zout, len))
return 0;
3782 memcpy(a->zout, a->zbuffer, len);
3788 static int stbi__parse_zlib_header(stbi__zbuf *a)
3790 int cmf = stbi__zget8(a);
3793 int flg = stbi__zget8(a);
3794 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
3795 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
3796 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
3802 static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
3803 static void stbi__init_zdefaults(
void)
3806 for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
3807 for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
3808 for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
3809 for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
3811 for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
3814 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
3818 if (!stbi__parse_zlib_header(a))
return 0;
3822 final = stbi__zreceive(a,1);
3823 type = stbi__zreceive(a,2);
3825 if (!stbi__parse_uncompressed_block(a))
return 0;
3826 }
else if (type == 3) {
3831 if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
3832 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288))
return 0;
3833 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
3835 if (!stbi__compute_huffman_codes(a))
return 0;
3837 if (!stbi__parse_huffman_block(a))
return 0;
3843 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
3845 a->zout_start = obuf;
3847 a->zout_end = obuf + olen;
3848 a->z_expandable = exp;
3850 return stbi__parse_zlib(a, parse_header);
3856 char *p = (
char *) stbi__malloc(initial_size);
3857 if (p == NULL)
return NULL;
3858 a.zbuffer = (
stbi_uc *) buffer;
3859 a.zbuffer_end = (
stbi_uc *) buffer + len;
3860 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
3861 if (outlen) *outlen = (int) (a.zout - a.zout_start);
3862 return a.zout_start;
3864 STBI_FREE(a.zout_start);
3877 char *p = (
char *) stbi__malloc(initial_size);
3878 if (p == NULL)
return NULL;
3879 a.zbuffer = (
stbi_uc *) buffer;
3880 a.zbuffer_end = (
stbi_uc *) buffer + len;
3881 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
3882 if (outlen) *outlen = (int) (a.zout - a.zout_start);
3883 return a.zout_start;
3885 STBI_FREE(a.zout_start);
3893 a.zbuffer = (
stbi_uc *) ibuffer;
3894 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3895 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
3896 return (
int) (a.zout - a.zout_start);
3904 char *p = (
char *) stbi__malloc(16384);
3905 if (p == NULL)
return NULL;
3906 a.zbuffer = (
stbi_uc *) buffer;
3907 a.zbuffer_end = (
stbi_uc *) buffer+len;
3908 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
3909 if (outlen) *outlen = (int) (a.zout - a.zout_start);
3910 return a.zout_start;
3912 STBI_FREE(a.zout_start);
3920 a.zbuffer = (
stbi_uc *) ibuffer;
3921 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3922 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
3923 return (
int) (a.zout - a.zout_start);
3942 stbi__uint32 length;
3946 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
3949 c.length = stbi__get32be(s);
3950 c.type = stbi__get32be(s);
3954 static int stbi__check_png_header(stbi__context *s)
3956 static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
3958 for (i=0; i < 8; ++i)
3959 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
3966 stbi_uc *idata, *expanded, *out;
3982 static stbi_uc first_row_filter[5] =
3991 static int stbi__paeth(
int a,
int b,
int c)
3997 if (pa <= pb && pa <= pc)
return a;
3998 if (pb <= pc)
return b;
4002 static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4005 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)
4007 int bytes = (depth == 16? 2 : 1);
4008 stbi__context *s = a->s;
4009 stbi__uint32 i,j,stride = x*out_n*bytes;
4010 stbi__uint32 img_len, img_width_bytes;
4012 int img_n = s->img_n;
4014 int output_bytes = out_n*bytes;
4015 int filter_bytes = img_n*bytes;
4018 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
4019 a->out = (
stbi_uc *) stbi__malloc(x * y * output_bytes);
4020 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
4022 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4023 img_len = (img_width_bytes + 1) * y;
4024 if (s->img_x == x && s->img_y == y) {
4025 if (raw_len != img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4027 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4030 for (j=0; j < y; ++j) {
4031 stbi_uc *cur = a->out + stride*j;
4032 stbi_uc *prior = cur - stride;
4033 int filter = *raw++;
4036 return stbi__err(
"invalid filter",
"Corrupt PNG");
4039 STBI_ASSERT(img_width_bytes <= x);
4040 cur += x*out_n - img_width_bytes;
4042 width = img_width_bytes;
4046 if (j == 0) filter = first_row_filter[filter];
4049 for (k=0; k < filter_bytes; ++k) {
4051 case STBI__F_none : cur[k] = raw[k];
break;
4052 case STBI__F_sub : cur[k] = raw[k];
break;
4053 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4054 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
4055 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
4056 case STBI__F_avg_first : cur[k] = raw[k];
break;
4057 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4067 }
else if (depth == 16) {
4068 if (img_n != out_n) {
4069 cur[filter_bytes] = 255;
4070 cur[filter_bytes+1] = 255;
4072 raw += filter_bytes;
4073 cur += output_bytes;
4074 prior += output_bytes;
4082 if (depth < 8 || img_n == out_n) {
4083 int nk = (width - 1)*filter_bytes;
4086 for (k=0; k < nk; ++k) 4089 case STBI__F_none: memcpy(cur, raw, nk);
break;
4090 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]);
break;
4091 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4092 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1));
break;
4093 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes]));
break;
4094 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1));
break;
4095 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0));
break;
4100 STBI_ASSERT(img_n+1 == out_n);
4103 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ 4104 for (k=0; k < filter_bytes; ++k) 4106 CASE(STBI__F_none) cur[k] = raw[k];
break;
4107 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]);
break;
4108 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4109 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1));
break;
4110 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes]));
break;
4111 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1));
break;
4112 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0));
break;
4119 cur = a->out + stride*j;
4120 for (i=0; i < x; ++i,cur+=output_bytes) {
4121 cur[filter_bytes+1] = 255;
4131 for (j=0; j < y; ++j) {
4132 stbi_uc *cur = a->out + stride*j;
4133 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
4136 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4145 for (k=x*img_n; k >= 2; k-=2, ++in) {
4146 *cur++ = scale * ((*in >> 4) );
4147 *cur++ = scale * ((*in ) & 0x0f);
4149 if (k > 0) *cur++ = scale * ((*in >> 4) );
4150 }
else if (depth == 2) {
4151 for (k=x*img_n; k >= 4; k-=4, ++in) {
4152 *cur++ = scale * ((*in >> 6) );
4153 *cur++ = scale * ((*in >> 4) & 0x03);
4154 *cur++ = scale * ((*in >> 2) & 0x03);
4155 *cur++ = scale * ((*in ) & 0x03);
4157 if (k > 0) *cur++ = scale * ((*in >> 6) );
4158 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4159 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4160 }
else if (depth == 1) {
4161 for (k=x*img_n; k >= 8; k-=8, ++in) {
4162 *cur++ = scale * ((*in >> 7) );
4163 *cur++ = scale * ((*in >> 6) & 0x01);
4164 *cur++ = scale * ((*in >> 5) & 0x01);
4165 *cur++ = scale * ((*in >> 4) & 0x01);
4166 *cur++ = scale * ((*in >> 3) & 0x01);
4167 *cur++ = scale * ((*in >> 2) & 0x01);
4168 *cur++ = scale * ((*in >> 1) & 0x01);
4169 *cur++ = scale * ((*in ) & 0x01);
4171 if (k > 0) *cur++ = scale * ((*in >> 7) );
4172 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4173 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4174 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4175 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4176 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4177 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4179 if (img_n != out_n) {
4182 cur = a->out + stride*j;
4184 for (q=x-1; q >= 0; --q) {
4186 cur[q*2+0] = cur[q];
4189 STBI_ASSERT(img_n == 3);
4190 for (q=x-1; q >= 0; --q) {
4192 cur[q*4+2] = cur[q*3+2];
4193 cur[q*4+1] = cur[q*3+1];
4194 cur[q*4+0] = cur[q*3+0];
4199 }
else if (depth == 16) {
4205 stbi__uint16 *cur16 = (stbi__uint16*)cur;
4207 for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
4208 *cur16 = (cur[0] << 8) | cur[1];
4215 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)
4220 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4223 final = (
stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
4224 for (p=0; p < 7; ++p) {
4225 int xorig[] = { 0,4,0,2,0,1,0 };
4226 int yorig[] = { 0,0,4,0,2,0,1 };
4227 int xspc[] = { 8,8,4,4,2,2,1 };
4228 int yspc[] = { 8,8,8,4,4,2,2 };
4231 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4232 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4234 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4235 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4239 for (j=0; j < y; ++j) {
4240 for (i=0; i < x; ++i) {
4241 int out_y = j*yspc[p]+yorig[p];
4242 int out_x = i*xspc[p]+xorig[p];
4243 memcpy(
final + out_y*a->s->img_x*out_n + out_x*out_n,
4244 a->out + (j*x+i)*out_n, out_n);
4248 image_data += img_len;
4249 image_data_len -= img_len;
4257 static int stbi__compute_transparency(stbi__png *z,
stbi_uc tc[3],
int out_n)
4259 stbi__context *s = z->s;
4260 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4265 STBI_ASSERT(out_n == 2 || out_n == 4);
4268 for (i=0; i < pixel_count; ++i) {
4269 p[1] = (p[0] == tc[0] ? 0 : 255);
4273 for (i=0; i < pixel_count; ++i) {
4274 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4282 static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3],
int out_n)
4284 stbi__context *s = z->s;
4285 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4286 stbi__uint16 *p = (stbi__uint16*) z->out;
4290 STBI_ASSERT(out_n == 2 || out_n == 4);
4293 for (i = 0; i < pixel_count; ++i) {
4294 p[1] = (p[0] == tc[0] ? 0 : 65535);
4298 for (i = 0; i < pixel_count; ++i) {
4299 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4307 static int stbi__expand_png_palette(stbi__png *a,
stbi_uc *palette,
int len,
int pal_img_n)
4309 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4310 stbi_uc *p, *temp_out, *orig = a->out;
4312 p = (
stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
4313 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4318 if (pal_img_n == 3) {
4319 for (i=0; i < pixel_count; ++i) {
4322 p[1] = palette[n+1];
4323 p[2] = palette[n+2];
4327 for (i=0; i < pixel_count; ++i) {
4330 p[1] = palette[n+1];
4331 p[2] = palette[n+2];
4332 p[3] = palette[n+3];
4344 static int stbi__reduce_png(stbi__png *p)
4347 int img_len = p->s->img_x * p->s->img_y * p->s->img_out_n;
4349 stbi__uint16 *orig = (stbi__uint16*)p->out;
4351 if (p->depth != 16)
return 1;
4353 reduced = (
stbi_uc *)stbi__malloc(img_len);
4354 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4356 for (i = 0; i < img_len; ++i) reduced[i] = (
stbi_uc)((orig[i] >> 8) & 0xFF);
4364 static int stbi__unpremultiply_on_load = 0;
4365 static int stbi__de_iphone_flag = 0;
4369 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4374 stbi__de_iphone_flag = flag_true_if_should_convert;
4377 static void stbi__de_iphone(stbi__png *z)
4379 stbi__context *s = z->s;
4380 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4383 if (s->img_out_n == 3) {
4384 for (i=0; i < pixel_count; ++i) {
4391 STBI_ASSERT(s->img_out_n == 4);
4392 if (stbi__unpremultiply_on_load) {
4394 for (i=0; i < pixel_count; ++i) {
4398 p[0] = p[2] * 255 / a;
4399 p[1] = p[1] * 255 / a;
4409 for (i=0; i < pixel_count; ++i) {
4419 #define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) 4421 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
4423 stbi_uc palette[1024], pal_img_n=0;
4425 stbi__uint16 tc16[3];
4426 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4427 int first=1,k,interlace=0, color=0, is_iphone=0;
4428 stbi__context *s = z->s;
4434 if (!stbi__check_png_header(s))
return 0;
4436 if (scan == STBI__SCAN_type)
return 1;
4439 stbi__pngchunk c = stbi__get_chunk_header(s);
4441 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4443 stbi__skip(s, c.length);
4445 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4447 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4449 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4450 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4451 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4452 z->depth = stbi__get8(s);
if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)
return stbi__err(
"1/2/4/8/16-bit only",
"PNG not supported: 1/2/4/8/16-bit only");
4453 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4454 if (color == 3 && z->depth == 16)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4455 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4456 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4457 filter= stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4458 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4459 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4461 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4462 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4463 if (scan == STBI__SCAN_header)
return 1;
4468 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4474 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4475 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4476 if (c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4477 pal_len = c.length / 3;
4478 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4479 for (i=0; i < pal_len; ++i) {
4480 palette[i*4+0] = stbi__get8(s);
4481 palette[i*4+1] = stbi__get8(s);
4482 palette[i*4+2] = stbi__get8(s);
4483 palette[i*4+3] = 255;
4488 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4489 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4490 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4492 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4493 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4494 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4496 for (i=0; i < c.length; ++i)
4497 palette[i*4+3] = stbi__get8(s);
4499 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4500 if (c.length != (stbi__uint32) s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4502 if (z->depth == 16) {
4503 for (k = 0; k < s->img_n; ++k) tc16[k] = stbi__get16be(s);
4505 for (k = 0; k < s->img_n; ++k) tc[k] = (
stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth];
4511 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4512 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4513 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4514 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4515 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
4516 if (ioff + c.length > idata_limit) {
4517 stbi__uint32 idata_limit_old = idata_limit;
4519 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4520 while (ioff + c.length > idata_limit)
4522 STBI_NOTUSED(idata_limit_old);
4523 p = (
stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4526 if (!stbi__getn(s, z->idata+ioff,c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4531 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4532 stbi__uint32 raw_len, bpl;
4533 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4534 if (scan != STBI__SCAN_load)
return 1;
4535 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4537 bpl = (s->img_x * z->depth + 7) / 8;
4538 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4540 if (z->expanded == NULL)
return 0;
4541 STBI_FREE(z->idata); z->idata = NULL;
4542 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
4543 s->img_out_n = s->img_n+1;
4545 s->img_out_n = s->img_n;
4546 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace))
return 0;
4548 if (z->depth == 16) {
4549 if (!stbi__compute_transparency16(z, tc16, s->img_out_n))
return 0;
4551 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4554 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4558 s->img_n = pal_img_n;
4559 s->img_out_n = pal_img_n;
4560 if (req_comp >= 3) s->img_out_n = req_comp;
4561 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4564 STBI_FREE(z->expanded); z->expanded = NULL;
4570 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4571 if ((c.type & (1 << 29)) == 0) {
4572 #ifndef STBI_NO_FAILURE_STRINGS 4574 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4575 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4576 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4577 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4578 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4580 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4582 stbi__skip(s, c.length);
4590 static unsigned char *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp)
4592 unsigned char *result=NULL;
4593 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4594 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4595 if (p->depth == 16) {
4596 if (!stbi__reduce_png(p)) {
4602 if (req_comp && req_comp != p->s->img_out_n) {
4603 result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4604 p->s->img_out_n = req_comp;
4605 if (result == NULL)
return result;
4609 if (n) *n = p->s->img_n;
4611 STBI_FREE(p->out); p->out = NULL;
4612 STBI_FREE(p->expanded); p->expanded = NULL;
4613 STBI_FREE(p->idata); p->idata = NULL;
4618 static unsigned char *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4622 return stbi__do_png(&p, x,y,comp,req_comp);
4625 static int stbi__png_test(stbi__context *s)
4628 r = stbi__check_png_header(s);
4633 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
4635 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
4636 stbi__rewind( p->s );
4639 if (x) *x = p->s->img_x;
4640 if (y) *y = p->s->img_y;
4641 if (comp) *comp = p->s->img_n;
4645 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
4649 return stbi__png_info_raw(&p, x, y, comp);
4656 static int stbi__bmp_test_raw(stbi__context *s)
4660 if (stbi__get8(s) !=
'B')
return 0;
4661 if (stbi__get8(s) !=
'M')
return 0;
4666 sz = stbi__get32le(s);
4667 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4671 static int stbi__bmp_test(stbi__context *s)
4673 int r = stbi__bmp_test_raw(s);
4680 static int stbi__high_bit(
unsigned int z)
4683 if (z == 0)
return -1;
4684 if (z >= 0x10000) n += 16, z >>= 16;
4685 if (z >= 0x00100) n += 8, z >>= 8;
4686 if (z >= 0x00010) n += 4, z >>= 4;
4687 if (z >= 0x00004) n += 2, z >>= 2;
4688 if (z >= 0x00002) n += 1, z >>= 1;
4692 static int stbi__bitcount(
unsigned int a)
4694 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
4695 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
4696 a = (a + (a >> 4)) & 0x0f0f0f0f;
4698 a = (a + (a >> 16));
4702 static int stbi__shiftsigned(
int v,
int shift,
int bits)
4707 if (shift < 0) v <<= -shift;
4721 int bpp, offset, hsz;
4722 unsigned int mr,mg,mb,ma, all_a;
4725 static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
4728 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
4732 info->offset = stbi__get32le(s);
4733 info->hsz = hsz = stbi__get32le(s);
4734 info->mr = info->mg = info->mb = info->ma = 0;
4736 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
4738 s->img_x = stbi__get16le(s);
4739 s->img_y = stbi__get16le(s);
4741 s->img_x = stbi__get32le(s);
4742 s->img_y = stbi__get32le(s);
4744 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
4745 info->bpp = stbi__get16le(s);
4746 if (info->bpp == 1)
return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
4748 int compress = stbi__get32le(s);
4749 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
4755 if (hsz == 40 || hsz == 56) {
4762 if (info->bpp == 16 || info->bpp == 32) {
4763 if (compress == 0) {
4764 if (info->bpp == 32) {
4765 info->mr = 0xffu << 16;
4766 info->mg = 0xffu << 8;
4767 info->mb = 0xffu << 0;
4768 info->ma = 0xffu << 24;
4771 info->mr = 31u << 10;
4772 info->mg = 31u << 5;
4773 info->mb = 31u << 0;
4775 }
else if (compress == 3) {
4776 info->mr = stbi__get32le(s);
4777 info->mg = stbi__get32le(s);
4778 info->mb = stbi__get32le(s);
4780 if (info->mr == info->mg && info->mg == info->mb) {
4782 return stbi__errpuc(
"bad BMP",
"bad BMP");
4785 return stbi__errpuc(
"bad BMP",
"bad BMP");
4789 if (hsz != 108 && hsz != 124)
4790 return stbi__errpuc(
"bad BMP",
"bad BMP");
4791 info->mr = stbi__get32le(s);
4792 info->mg = stbi__get32le(s);
4793 info->mb = stbi__get32le(s);
4794 info->ma = stbi__get32le(s);
4796 for (i=0; i < 12; ++i)
4810 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4813 unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
4815 int psize=0,i,j,width;
4816 int flip_vertically,
pad, target;
4817 stbi__bmp_data info;
4820 if (stbi__bmp_parse_header(s, &info) == NULL)
4823 flip_vertically = ((int) s->img_y) > 0;
4824 s->img_y = abs((
int) s->img_y);
4832 if (info.hsz == 12) {
4834 psize = (info.offset - 14 - 24) / 3;
4837 psize = (info.offset - 14 - info.hsz) >> 2;
4840 s->img_n = ma ? 4 : 3;
4841 if (req_comp && req_comp >= 3)
4846 out = (
stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);
4847 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
4848 if (info.bpp < 16) {
4850 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
4851 for (i=0; i < psize; ++i) {
4852 pal[i][2] = stbi__get8(s);
4853 pal[i][1] = stbi__get8(s);
4854 pal[i][0] = stbi__get8(s);
4855 if (info.hsz != 12) stbi__get8(s);
4858 stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
4859 if (info.bpp == 4) width = (s->img_x + 1) >> 1;
4860 else if (info.bpp == 8) width = s->img_x;
4861 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
4863 for (j=0; j < (int) s->img_y; ++j) {
4864 for (i=0; i < (int) s->img_x; i += 2) {
4865 int v=stbi__get8(s),v2=0;
4866 if (info.bpp == 4) {
4870 out[z++] = pal[v][0];
4871 out[z++] = pal[v][1];
4872 out[z++] = pal[v][2];
4873 if (target == 4) out[z++] = 255;
4874 if (i+1 == (
int) s->img_x)
break;
4875 v = (info.bpp == 8) ? stbi__get8(s) : v2;
4876 out[z++] = pal[v][0];
4877 out[z++] = pal[v][1];
4878 out[z++] = pal[v][2];
4879 if (target == 4) out[z++] = 255;
4884 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
4887 stbi__skip(s, info.offset - 14 - info.hsz);
4888 if (info.bpp == 24) width = 3 * s->img_x;
4889 else if (info.bpp == 16) width = 2*s->img_x;
4892 if (info.bpp == 24) {
4894 }
else if (info.bpp == 32) {
4895 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
4899 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
4901 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
4902 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
4903 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
4904 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
4906 for (j=0; j < (int) s->img_y; ++j) {
4908 for (i=0; i < (int) s->img_x; ++i) {
4910 out[z+2] = stbi__get8(s);
4911 out[z+1] = stbi__get8(s);
4912 out[z+0] = stbi__get8(s);
4914 a = (easy == 2 ? stbi__get8(s) : 255);
4916 if (target == 4) out[z++] = a;
4920 for (i=0; i < (int) s->img_x; ++i) {
4921 stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
4923 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
4924 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
4925 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
4926 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
4928 if (target == 4) out[z++] = STBI__BYTECAST(a);
4936 if (target == 4 && all_a == 0)
4937 for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
4940 if (flip_vertically) {
4942 for (j=0; j < (int) s->img_y>>1; ++j) {
4943 stbi_uc *p1 = out + j *s->img_x*target;
4944 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
4945 for (i=0; i < (int) s->img_x*target; ++i) {
4946 t = p1[i], p1[i] = p2[i], p2[i] = t;
4951 if (req_comp && req_comp != target) {
4952 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
4953 if (out == NULL)
return out;
4958 if (comp) *comp = s->img_n;
4967 static int stbi__tga_get_comp(
int bits_per_pixel,
int is_grey,
int* is_rgb16)
4970 if(is_rgb16) *is_rgb16 = 0;
4971 switch(bits_per_pixel) {
4975 case 15:
if(is_rgb16) *is_rgb16 = 1;
4978 case 32:
return bits_per_pixel/8;
4983 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
4985 int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
4986 int sz, tga_colormap_type;
4988 tga_colormap_type = stbi__get8(s);
4989 if( tga_colormap_type > 1 ) {
4993 tga_image_type = stbi__get8(s);
4994 if ( tga_colormap_type == 1 ) {
4995 if (tga_image_type != 1 && tga_image_type != 9) {
5001 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5006 tga_colormap_bpp = sz;
5008 if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5013 tga_colormap_bpp = 0;
5015 tga_w = stbi__get16le(s);
5020 tga_h = stbi__get16le(s);
5025 tga_bits_per_pixel = stbi__get8(s);
5027 if (tga_colormap_bpp != 0) {
5028 if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5034 tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5036 tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5044 if (comp) *comp = tga_comp;
5048 static int stbi__tga_test(stbi__context *s)
5051 int sz, tga_color_type;
5053 tga_color_type = stbi__get8(s);
5054 if ( tga_color_type > 1 )
goto errorEnd;
5056 if ( tga_color_type == 1 ) {
5057 if (sz != 1 && sz != 9)
goto errorEnd;
5060 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5063 if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) )
goto errorEnd;
5066 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5067 if ( stbi__get16le(s) < 1 )
goto errorEnd;
5069 if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) )
goto errorEnd;
5070 if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) )
goto errorEnd;
5080 void stbi__tga_read_rgb16(stbi__context *s,
stbi_uc* out)
5082 stbi__uint16 px = stbi__get16le(s);
5083 stbi__uint16 fiveBitMask = 31;
5085 int r = (px >> 10) & fiveBitMask;
5086 int g = (px >> 5) & fiveBitMask;
5087 int b = px & fiveBitMask;
5089 out[0] = (r * 255)/31;
5090 out[1] = (g * 255)/31;
5091 out[2] = (b * 255)/31;
5099 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5102 int tga_offset = stbi__get8(s);
5103 int tga_indexed = stbi__get8(s);
5104 int tga_image_type = stbi__get8(s);
5106 int tga_palette_start = stbi__get16le(s);
5107 int tga_palette_len = stbi__get16le(s);
5108 int tga_palette_bits = stbi__get8(s);
5109 int tga_x_origin = stbi__get16le(s);
5110 int tga_y_origin = stbi__get16le(s);
5111 int tga_width = stbi__get16le(s);
5112 int tga_height = stbi__get16le(s);
5113 int tga_bits_per_pixel = stbi__get8(s);
5114 int tga_comp, tga_rgb16=0;
5115 int tga_inverted = stbi__get8(s);
5118 unsigned char *tga_data;
5119 unsigned char *tga_palette = NULL;
5121 unsigned char raw_data[4];
5123 int RLE_repeating = 0;
5124 int read_next_pixel = 1;
5127 if ( tga_image_type >= 8 )
5129 tga_image_type -= 8;
5132 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5135 if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5136 else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5139 return stbi__errpuc(
"bad format",
"Can't find out TGA pixelformat");
5144 if (comp) *comp = tga_comp;
5146 tga_data = (
unsigned char*)stbi__malloc( (
size_t)tga_width * tga_height * tga_comp );
5147 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
5150 stbi__skip(s, tga_offset );
5152 if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
5153 for (i=0; i < tga_height; ++i) {
5154 int row = tga_inverted ? tga_height -i - 1 : i;
5155 stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5156 stbi__getn(s, tga_row, tga_width * tga_comp);
5163 stbi__skip(s, tga_palette_start );
5165 tga_palette = (
unsigned char*)stbi__malloc( tga_palette_len * tga_comp );
5167 STBI_FREE(tga_data);
5168 return stbi__errpuc(
"outofmem",
"Out of memory");
5171 stbi_uc *pal_entry = tga_palette;
5173 for (i=0; i < tga_palette_len; ++i) {
5174 stbi__tga_read_rgb16(s, pal_entry);
5175 pal_entry += tga_comp;
5177 }
else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5178 STBI_FREE(tga_data);
5179 STBI_FREE(tga_palette);
5180 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
5184 for (i=0; i < tga_width * tga_height; ++i)
5189 if ( RLE_count == 0 )
5192 int RLE_cmd = stbi__get8(s);
5193 RLE_count = 1 + (RLE_cmd & 127);
5194 RLE_repeating = RLE_cmd >> 7;
5195 read_next_pixel = 1;
5196 }
else if ( !RLE_repeating )
5198 read_next_pixel = 1;
5202 read_next_pixel = 1;
5205 if ( read_next_pixel )
5211 int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5212 if ( pal_idx >= tga_palette_len ) {
5216 pal_idx *= tga_comp;
5217 for (j = 0; j < tga_comp; ++j) {
5218 raw_data[j] = tga_palette[pal_idx+j];
5220 }
else if(tga_rgb16) {
5222 stbi__tga_read_rgb16(s, raw_data);
5225 for (j = 0; j < tga_comp; ++j) {
5226 raw_data[j] = stbi__get8(s);
5230 read_next_pixel = 0;
5234 for (j = 0; j < tga_comp; ++j)
5235 tga_data[i*tga_comp+j] = raw_data[j];
5243 for (j = 0; j*2 < tga_height; ++j)
5245 int index1 = j * tga_width * tga_comp;
5246 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5247 for (i = tga_width * tga_comp; i > 0; --i)
5249 unsigned char temp = tga_data[index1];
5250 tga_data[index1] = tga_data[index2];
5251 tga_data[index2] = temp;
5258 if ( tga_palette != NULL )
5260 STBI_FREE( tga_palette );
5265 if (tga_comp >= 3 && !tga_rgb16)
5267 unsigned char* tga_pixel = tga_data;
5268 for (i=0; i < tga_width * tga_height; ++i)
5270 unsigned char temp = tga_pixel[0];
5271 tga_pixel[0] = tga_pixel[2];
5272 tga_pixel[2] = temp;
5273 tga_pixel += tga_comp;
5278 if (req_comp && req_comp != tga_comp)
5279 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5283 tga_palette_start = tga_palette_len = tga_palette_bits =
5284 tga_x_origin = tga_y_origin = 0;
5294 static int stbi__psd_test(stbi__context *s)
5296 int r = (stbi__get32be(s) == 0x38425053);
5301 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5304 int channelCount, compression;
5305 int channel, i, count, len;
5311 if (stbi__get32be(s) != 0x38425053)
5312 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5315 if (stbi__get16be(s) != 1)
5316 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5322 channelCount = stbi__get16be(s);
5323 if (channelCount < 0 || channelCount > 16)
5324 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5327 h = stbi__get32be(s);
5328 w = stbi__get32be(s);
5331 bitdepth = stbi__get16be(s);
5332 if (bitdepth != 8 && bitdepth != 16)
5333 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
5345 if (stbi__get16be(s) != 3)
5346 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5349 stbi__skip(s,stbi__get32be(s) );
5352 stbi__skip(s, stbi__get32be(s) );
5355 stbi__skip(s, stbi__get32be(s) );
5361 compression = stbi__get16be(s);
5362 if (compression > 1)
5363 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5366 out = (
stbi_uc *) stbi__malloc(4 * w*h);
5367 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5385 stbi__skip(s, h * channelCount * 2 );
5388 for (channel = 0; channel < 4; channel++) {
5392 if (channel >= channelCount) {
5394 for (i = 0; i < pixelCount; i++, p += 4)
5395 *p = (channel == 3 ? 255 : 0);
5399 while (count < pixelCount) {
5400 len = stbi__get8(s);
5403 }
else if (len < 128) {
5412 }
else if (len > 128) {
5418 val = stbi__get8(s);
5435 for (channel = 0; channel < 4; channel++) {
5439 if (channel >= channelCount) {
5441 stbi_uc val = channel == 3 ? 255 : 0;
5442 for (i = 0; i < pixelCount; i++, p += 4)
5446 if (bitdepth == 16) {
5447 for (i = 0; i < pixelCount; i++, p += 4)
5448 *p = (
stbi_uc) (stbi__get16be(s) >> 8);
5450 for (i = 0; i < pixelCount; i++, p += 4)
5457 if (channelCount >= 4) {
5458 for (i=0; i < w*h; ++i) {
5459 unsigned char *pixel = out + 4*i;
5460 if (pixel[3] != 0 && pixel[3] != 255) {
5462 float a = pixel[3] / 255.0f;
5463 float ra = 1.0f / a;
5464 float inv_a = 255.0f * (1 - ra);
5465 pixel[0] = (
unsigned char) (pixel[0]*ra + inv_a);
5466 pixel[1] = (
unsigned char) (pixel[1]*ra + inv_a);
5467 pixel[2] = (
unsigned char) (pixel[2]*ra + inv_a);
5472 if (req_comp && req_comp != 4) {
5473 out = stbi__convert_format(out, 4, req_comp, w, h);
5474 if (out == NULL)
return out;
5477 if (comp) *comp = 4;
5493 static int stbi__pic_is4(stbi__context *s,
const char *str)
5497 if (stbi__get8(s) != (
stbi_uc)str[i])
5503 static int stbi__pic_test_core(stbi__context *s)
5507 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
5513 if (!stbi__pic_is4(s,
"PICT"))
5524 static stbi_uc *stbi__readval(stbi__context *s,
int channel,
stbi_uc *dest)
5528 for (i=0; i<4; ++i, mask>>=1) {
5529 if (channel & mask) {
5530 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
5531 dest[i]=stbi__get8(s);
5538 static void stbi__copyval(
int channel,
stbi_uc *dest,
const stbi_uc *src)
5542 for (i=0;i<4; ++i, mask>>=1)
5547 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp,
stbi_uc *result)
5549 int act_comp=0,num_packets=0,y,chained;
5550 stbi__pic_packet packets[10];
5555 stbi__pic_packet *packet;
5557 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
5558 return stbi__errpuc(
"bad format",
"too many packets");
5560 packet = &packets[num_packets++];
5562 chained = stbi__get8(s);
5563 packet->size = stbi__get8(s);
5564 packet->type = stbi__get8(s);
5565 packet->channel = stbi__get8(s);
5567 act_comp |= packet->channel;
5569 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
5570 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
5573 *comp = (act_comp & 0x10 ? 4 : 3);
5575 for(y=0; y<height; ++y) {
5578 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
5579 stbi__pic_packet *packet = &packets[packet_idx];
5580 stbi_uc *dest = result+y*width*4;
5582 switch (packet->type) {
5584 return stbi__errpuc(
"bad format",
"packet has bad compression type");
5589 for(x=0;x<width;++x, dest+=4)
5590 if (!stbi__readval(s,packet->channel,dest))
5602 count=stbi__get8(s);
5603 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
5608 if (!stbi__readval(s,packet->channel,value))
return 0;
5610 for(i=0; i<count; ++i,dest+=4)
5611 stbi__copyval(packet->channel,dest,value);
5620 int count = stbi__get8(s), i;
5621 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
5627 count = stbi__get16be(s);
5631 return stbi__errpuc(
"bad file",
"scanline overrun");
5633 if (!stbi__readval(s,packet->channel,value))
5636 for(i=0;i<count;++i, dest += 4)
5637 stbi__copyval(packet->channel,dest,value);
5640 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
5642 for(i=0;i<count;++i, dest+=4)
5643 if (!stbi__readval(s,packet->channel,dest))
5657 static stbi_uc *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp)
5662 for (i=0; i<92; ++i)
5665 x = stbi__get16be(s);
5666 y = stbi__get16be(s);
5667 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
5668 if ((1 << 28) / x < y)
return stbi__errpuc(
"too large",
"Image too large to decode");
5675 result = (
stbi_uc *) stbi__malloc(x*y*4);
5676 memset(result, 0xff, x*y*4);
5678 if (!stbi__pic_load_core(s,x,y,comp, result)) {
5684 if (req_comp == 0) req_comp = *comp;
5685 result=stbi__convert_format(result,4,req_comp,x,y);
5690 static int stbi__pic_test(stbi__context *s)
5692 int r = stbi__pic_test_core(s);
5713 int flags, bgindex, ratio, transparent, eflags, delay;
5716 stbi__gif_lzw codes[4096];
5720 int start_x, start_y;
5726 static int stbi__gif_test_raw(stbi__context *s)
5729 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
5731 if (sz !=
'9' && sz !=
'7')
return 0;
5732 if (stbi__get8(s) !=
'a')
return 0;
5736 static int stbi__gif_test(stbi__context *s)
5738 int r = stbi__gif_test_raw(s);
5743 static void stbi__gif_parse_colortable(stbi__context *s,
stbi_uc pal[256][4],
int num_entries,
int transp)
5746 for (i=0; i < num_entries; ++i) {
5747 pal[i][2] = stbi__get8(s);
5748 pal[i][1] = stbi__get8(s);
5749 pal[i][0] = stbi__get8(s);
5750 pal[i][3] = transp == i ? 0 : 255;
5754 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
5757 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
5758 return stbi__err(
"not GIF",
"Corrupt GIF");
5760 version = stbi__get8(s);
5761 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
5762 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
5764 stbi__g_failure_reason =
"";
5765 g->w = stbi__get16le(s);
5766 g->h = stbi__get16le(s);
5767 g->flags = stbi__get8(s);
5768 g->bgindex = stbi__get8(s);
5769 g->ratio = stbi__get8(s);
5770 g->transparent = -1;
5772 if (comp != 0) *comp = 4;
5774 if (is_info)
return 1;
5776 if (g->flags & 0x80)
5777 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
5782 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
5784 stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
5785 if (!stbi__gif_header(s, g, comp, 1)) {
5796 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
5802 if (g->codes[code].prefix >= 0)
5803 stbi__out_gif_code(g, g->codes[code].prefix);
5805 if (g->cur_y >= g->max_y)
return;
5807 p = &g->out[g->cur_x + g->cur_y];
5808 c = &g->color_table[g->codes[code].suffix * 4];
5818 if (g->cur_x >= g->max_x) {
5819 g->cur_x = g->start_x;
5820 g->cur_y += g->step;
5822 while (g->cur_y >= g->max_y && g->parse > 0) {
5823 g->step = (1 << g->parse) * g->line_size;
5824 g->cur_y = g->start_y + (g->step >> 1);
5830 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
5833 stbi__int32 len, init_code;
5835 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
5838 lzw_cs = stbi__get8(s);
5839 if (lzw_cs > 12)
return NULL;
5840 clear = 1 << lzw_cs;
5842 codesize = lzw_cs + 1;
5843 codemask = (1 << codesize) - 1;
5846 for (init_code = 0; init_code < clear; init_code++) {
5847 g->codes[init_code].prefix = -1;
5848 g->codes[init_code].first = (
stbi_uc) init_code;
5849 g->codes[init_code].suffix = (
stbi_uc) init_code;
5858 if (valid_bits < codesize) {
5860 len = stbi__get8(s);
5865 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
5868 stbi__int32 code = bits & codemask;
5870 valid_bits -= codesize;
5872 if (code == clear) {
5873 codesize = lzw_cs + 1;
5874 codemask = (1 << codesize) - 1;
5878 }
else if (code == clear + 1) {
5880 while ((len = stbi__get8(s)) > 0)
5883 }
else if (code <= avail) {
5884 if (first)
return stbi__errpuc(
"no clear code",
"Corrupt GIF");
5887 p = &g->codes[avail++];
5888 if (avail > 4096)
return stbi__errpuc(
"too many codes",
"Corrupt GIF");
5889 p->prefix = (stbi__int16) oldcode;
5890 p->first = g->codes[oldcode].first;
5891 p->suffix = (code == avail) ? p->first : g->codes[code].first;
5892 }
else if (code == avail)
5893 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5895 stbi__out_gif_code(g, (stbi__uint16) code);
5897 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
5899 codemask = (1 << codesize) - 1;
5904 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5910 static void stbi__fill_gif_background(stbi__gif *g,
int x0,
int y0,
int x1,
int y1)
5913 stbi_uc *c = g->pal[g->bgindex];
5914 for (y = y0; y < y1; y += 4 * g->w) {
5915 for (x = x0; x < x1; x += 4) {
5926 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp)
5931 if (g->out == 0 && !stbi__gif_header(s, g, comp,0))
5935 g->out = (
stbi_uc *) stbi__malloc(4 * g->w * g->h);
5936 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5938 switch ((g->eflags & 0x1C) >> 2) {
5940 stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);
5943 if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
5944 g->old_out = prev_out;
5947 if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
5948 stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
5952 for (i = g->start_y; i < g->max_y; i += 4 * g->w)
5953 memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
5959 switch (stbi__get8(s)) {
5962 int prev_trans = -1;
5963 stbi__int32 x, y, w, h;
5966 x = stbi__get16le(s);
5967 y = stbi__get16le(s);
5968 w = stbi__get16le(s);
5969 h = stbi__get16le(s);
5970 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
5971 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
5973 g->line_size = g->w * 4;
5975 g->start_y = y * g->line_size;
5976 g->max_x = g->start_x + w * 4;
5977 g->max_y = g->start_y + h * g->line_size;
5978 g->cur_x = g->start_x;
5979 g->cur_y = g->start_y;
5981 g->lflags = stbi__get8(s);
5983 if (g->lflags & 0x40) {
5984 g->step = 8 * g->line_size;
5987 g->step = g->line_size;
5991 if (g->lflags & 0x80) {
5992 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
5993 g->color_table = (
stbi_uc *) g->lpal;
5994 }
else if (g->flags & 0x80) {
5995 if (g->transparent >= 0 && (g->eflags & 0x01)) {
5996 prev_trans = g->pal[g->transparent][3];
5997 g->pal[g->transparent][3] = 0;
5999 g->color_table = (
stbi_uc *) g->pal;
6001 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
6003 o = stbi__process_gif_raster(s, g);
6004 if (o == NULL)
return NULL;
6006 if (prev_trans != -1)
6007 g->pal[g->transparent][3] = (
stbi_uc) prev_trans;
6015 if (stbi__get8(s) == 0xF9) {
6016 len = stbi__get8(s);
6018 g->eflags = stbi__get8(s);
6019 g->delay = stbi__get16le(s);
6020 g->transparent = stbi__get8(s);
6026 while ((len = stbi__get8(s)) != 0)
6035 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
6039 STBI_NOTUSED(req_comp);
6042 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
6045 stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
6046 memset(g, 0,
sizeof(*g));
6048 u = stbi__gif_load_next(s, g, comp, req_comp);
6049 if (u == (
stbi_uc *) s) u = 0;
6053 if (req_comp && req_comp != 4)
6054 u = stbi__convert_format(u, 4, req_comp, g->w, g->h);
6062 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
6064 return stbi__gif_info_raw(s,x,y,comp);
6072 static int stbi__hdr_test_core(stbi__context *s)
6074 const char *signature =
"#?RADIANCE\n";
6076 for (i=0; signature[i]; ++i)
6077 if (stbi__get8(s) != signature[i])
6082 static int stbi__hdr_test(stbi__context* s)
6084 int r = stbi__hdr_test_core(s);
6089 #define STBI__HDR_BUFLEN 1024 6090 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
6095 c = (char) stbi__get8(z);
6097 while (!stbi__at_eof(z) && c !=
'\n') {
6099 if (len == STBI__HDR_BUFLEN-1) {
6101 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
6105 c = (char) stbi__get8(z);
6112 static void stbi__hdr_convert(
float *output,
stbi_uc *input,
int req_comp)
6114 if ( input[3] != 0 ) {
6117 f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
6119 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
6121 output[0] = input[0] * f1;
6122 output[1] = input[1] * f1;
6123 output[2] = input[2] * f1;
6125 if (req_comp == 2) output[1] = 1;
6126 if (req_comp == 4) output[3] = 1;
6129 case 4: output[3] = 1;
6130 case 3: output[0] = output[1] = output[2] = 0;
6132 case 2: output[1] = 1;
6133 case 1: output[0] = 0;
6139 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
6141 char buffer[STBI__HDR_BUFLEN];
6148 unsigned char count, value;
6149 int i, j, k, c1,c2, z;
6153 if (strcmp(stbi__hdr_gettoken(s,buffer),
"#?RADIANCE") != 0)
6154 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
6158 token = stbi__hdr_gettoken(s,buffer);
6159 if (token[0] == 0)
break;
6160 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6163 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
6167 token = stbi__hdr_gettoken(s,buffer);
6168 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6170 height = (int) strtol(token, &token, 10);
6171 while (*token ==
' ') ++token;
6172 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
6174 width = (int) strtol(token, NULL, 10);
6179 if (comp) *comp = 3;
6180 if (req_comp == 0) req_comp = 3;
6183 hdr_data = (
float *) stbi__malloc(height * width * req_comp *
sizeof(
float));
6187 if ( width < 8 || width >= 32768) {
6189 for (j=0; j < height; ++j) {
6190 for (i=0; i < width; ++i) {
6193 stbi__getn(s, rgbe, 4);
6194 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
6201 for (j = 0; j < height; ++j) {
6204 len = stbi__get8(s);
6205 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
6212 rgbe[3] = (
stbi_uc) stbi__get8(s);
6213 stbi__hdr_convert(hdr_data, rgbe, req_comp);
6216 STBI_FREE(scanline);
6217 goto main_decode_loop;
6220 len |= stbi__get8(s);
6221 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
6222 if (scanline == NULL) scanline = (
stbi_uc *) stbi__malloc(width * 4);
6224 for (k = 0; k < 4; ++k) {
6227 count = stbi__get8(s);
6230 value = stbi__get8(s);
6232 for (z = 0; z < count; ++z)
6233 scanline[i++ * 4 + k] = value;
6236 for (z = 0; z < count; ++z)
6237 scanline[i++ * 4 + k] = stbi__get8(s);
6241 for (i=0; i < width; ++i)
6242 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
6244 STBI_FREE(scanline);
6250 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
6252 char buffer[STBI__HDR_BUFLEN];
6256 if (stbi__hdr_test(s) == 0) {
6262 token = stbi__hdr_gettoken(s,buffer);
6263 if (token[0] == 0)
break;
6264 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6271 token = stbi__hdr_gettoken(s,buffer);
6272 if (strncmp(token,
"-Y ", 3)) {
6277 *y = (int) strtol(token, &token, 10);
6278 while (*token ==
' ') ++token;
6279 if (strncmp(token,
"+X ", 3)) {
6284 *x = (int) strtol(token, NULL, 10);
6288 #endif // STBI_NO_HDR 6291 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
6294 stbi__bmp_data info;
6297 p = stbi__bmp_parse_header(s, &info);
6303 *comp = info.ma ? 4 : 3;
6309 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
6312 if (stbi__get32be(s) != 0x38425053) {
6316 if (stbi__get16be(s) != 1) {
6321 channelCount = stbi__get16be(s);
6322 if (channelCount < 0 || channelCount > 16) {
6326 *y = stbi__get32be(s);
6327 *x = stbi__get32be(s);
6328 if (stbi__get16be(s) != 8) {
6332 if (stbi__get16be(s) != 3) {
6342 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
6344 int act_comp=0,num_packets=0,chained;
6345 stbi__pic_packet packets[10];
6347 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
6354 *x = stbi__get16be(s);
6355 *y = stbi__get16be(s);
6356 if (stbi__at_eof(s)) {
6360 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
6368 stbi__pic_packet *packet;
6370 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
6373 packet = &packets[num_packets++];
6374 chained = stbi__get8(s);
6375 packet->size = stbi__get8(s);
6376 packet->type = stbi__get8(s);
6377 packet->channel = stbi__get8(s);
6378 act_comp |= packet->channel;
6380 if (stbi__at_eof(s)) {
6384 if (packet->size != 8) {
6390 *comp = (act_comp & 0x10 ? 4 : 3);
6410 static int stbi__pnm_test(stbi__context *s)
6413 p = (char) stbi__get8(s);
6414 t = (char) stbi__get8(s);
6415 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6422 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
6425 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
6431 out = (
stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y);
6432 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6433 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
6435 if (req_comp && req_comp != s->img_n) {
6436 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
6437 if (out == NULL)
return out;
6442 static int stbi__pnm_isspace(
char c)
6444 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
6447 static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
6450 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
6451 *c = (char) stbi__get8(s);
6453 if (stbi__at_eof(s) || *c !=
'#')
6456 while (!stbi__at_eof(s) && *c !=
'\n' && *c !=
'\r' )
6457 *c = (
char) stbi__get8(s);
6461 static int stbi__pnm_isdigit(
char c)
6463 return c >=
'0' && c <=
'9';
6466 static int stbi__pnm_getinteger(stbi__context *s,
char *c)
6470 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
6471 value = value*10 + (*c -
'0');
6472 *c = (char) stbi__get8(s);
6478 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
6486 p = (char) stbi__get8(s);
6487 t = (char) stbi__get8(s);
6488 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6493 *comp = (t ==
'6') ? 3 : 1;
6495 c = (char) stbi__get8(s);
6496 stbi__pnm_skip_whitespace(s, &c);
6498 *x = stbi__pnm_getinteger(s, &c);
6499 stbi__pnm_skip_whitespace(s, &c);
6501 *y = stbi__pnm_getinteger(s, &c);
6502 stbi__pnm_skip_whitespace(s, &c);
6504 maxv = stbi__pnm_getinteger(s, &c);
6507 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
6513 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
6515 #ifndef STBI_NO_JPEG 6516 if (stbi__jpeg_info(s, x, y, comp))
return 1;
6520 if (stbi__png_info(s, x, y, comp))
return 1;
6524 if (stbi__gif_info(s, x, y, comp))
return 1;
6528 if (stbi__bmp_info(s, x, y, comp))
return 1;
6532 if (stbi__psd_info(s, x, y, comp))
return 1;
6536 if (stbi__pic_info(s, x, y, comp))
return 1;
6540 if (stbi__pnm_info(s, x, y, comp))
return 1;
6544 if (stbi__hdr_info(s, x, y, comp))
return 1;
6549 if (stbi__tga_info(s, x, y, comp))
6552 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
6555 #ifndef STBI_NO_STDIO 6558 FILE *f = stbi__fopen(filename,
"rb");
6560 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
6570 long pos = ftell(f);
6571 stbi__start_file(&s, f);
6572 r = stbi__info_main(&s,x,y,comp);
6573 fseek(f,pos,SEEK_SET);
6576 #endif // !STBI_NO_STDIO 6581 stbi__start_mem(&s,buffer,len);
6582 return stbi__info_main(&s,x,y,comp);
6589 return stbi__info_main(&s,x,y,comp);
6592 #endif // STB_IMAGE_IMPLEMENTATION #define STBIDEF
Definition: stb_image.h:417
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:403
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
STBIDEF const char * stbi_failure_reason(void)
void pad(std::vector< FILE * > &disks, uint64_t &offset)
Definition: BinaryFusionUtil.h:45
STBIDEF void stbi_hdr_to_ldr_scale(float scale)
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
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:404
Definition: stb_image.h:429
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:405
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp)
Definition: stb_image.h:402
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:408
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:400
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)