202 #ifndef STBI_INCLUDE_STB_IMAGE_H
203 #define STBI_INCLUDE_STB_IMAGE_H
375 #ifndef STBI_NO_STDIO
377 #endif // STBI_NO_STDIO
379 #define STBI_VERSION 1
397 #ifdef STB_IMAGE_STATIC
398 #define STBIDEF static
400 #define STBIDEF extern
414 int (*read) (
void *user,
char *data,
int size);
415 void (*skip) (
void *user,
int n);
416 int (*eof) (
void *user);
423 #ifndef STBI_NO_STDIO
428 #ifndef STBI_NO_LINEAR
429 STBIDEF float *
stbi_loadf (
char const *filename,
int *x,
int *y,
int *comp,
int req_comp);
433 #ifndef STBI_NO_STDIO
443 #ifndef STBI_NO_LINEAR
446 #endif // STBI_NO_HDR
451 #ifndef STBI_NO_STDIO
454 #endif // STBI_NO_STDIO
468 #ifndef STBI_NO_STDIO
504 #endif // STBI_INCLUDE_STB_IMAGE_H
506 #ifdef STB_IMAGE_IMPLEMENTATION
508 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
509 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
510 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
511 || defined(STBI_ONLY_ZLIB)
512 #ifndef STBI_ONLY_JPEG
515 #ifndef STBI_ONLY_PNG
518 #ifndef STBI_ONLY_BMP
521 #ifndef STBI_ONLY_PSD
524 #ifndef STBI_ONLY_TGA
527 #ifndef STBI_ONLY_GIF
530 #ifndef STBI_ONLY_HDR
533 #ifndef STBI_ONLY_PIC
536 #ifndef STBI_ONLY_PNM
541 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
551 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
555 #ifndef STBI_NO_STDIO
561 #define STBI_ASSERT(x) assert(x)
567 #define stbi_inline inline
572 #define stbi_inline __forceinline
577 typedef unsigned short stbi__uint16;
578 typedef signed short stbi__int16;
579 typedef unsigned int stbi__uint32;
580 typedef signed int stbi__int32;
583 typedef uint16_t stbi__uint16;
584 typedef int16_t stbi__int16;
585 typedef uint32_t stbi__uint32;
586 typedef int32_t stbi__int32;
590 typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
593 #define STBI_NOTUSED(v) (void)(v)
595 #define STBI_NOTUSED(v) (void)sizeof(v)
599 #define STBI_HAS_LROTL
602 #ifdef STBI_HAS_LROTL
603 #define stbi_lrot(x,y) _lrotl(x,y)
605 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
608 #if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC)
610 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC)
613 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC."
617 #define STBI_MALLOC(sz) malloc(sz)
618 #define STBI_REALLOC(p,sz) realloc(p,sz)
619 #define STBI_FREE(p) free(p)
622 #if !defined(STBI_NO_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86))
624 #include <emmintrin.h>
628 #if _MSC_VER >= 1400 // not VC6
630 static int stbi__cpuid3(
void)
637 static int stbi__cpuid3(
void)
649 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
651 static int stbi__sse2_available()
653 int info3 = stbi__cpuid3();
654 return ((info3 >> 26) & 1) != 0;
656 #else // assume GCC-style if not VC++
657 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
659 static int stbi__sse2_available()
661 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later
663 return __builtin_cpu_supports(
"sse2");
674 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)
679 #include <arm_neon.h>
681 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
684 #ifndef STBI_SIMD_ALIGN
685 #define STBI_SIMD_ALIGN(type, name) type name
696 stbi__uint32 img_x, img_y;
697 int img_n, img_out_n;
702 int read_from_callbacks;
706 stbi_uc *img_buffer, *img_buffer_end;
711 static void stbi__refill_buffer(stbi__context *s);
714 static void stbi__start_mem(stbi__context *s,
stbi_uc const *buffer,
int len)
717 s->read_from_callbacks = 0;
718 s->img_buffer = s->img_buffer_original = (
stbi_uc *) buffer;
719 s->img_buffer_end = (
stbi_uc *) buffer+len;
723 static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user)
726 s->io_user_data = user;
727 s->buflen =
sizeof(s->buffer_start);
728 s->read_from_callbacks = 1;
729 s->img_buffer_original = s->buffer_start;
730 stbi__refill_buffer(s);
733 #ifndef STBI_NO_STDIO
735 static int stbi__stdio_read(
void *user,
char *data,
int size)
737 return (
int) fread(data,1,size,(FILE*) user);
740 static void stbi__stdio_skip(
void *user,
int n)
742 fseek((FILE*) user, n, SEEK_CUR);
745 static int stbi__stdio_eof(
void *user)
747 return feof((FILE*) user);
757 static void stbi__start_file(stbi__context *s, FILE *f)
759 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *) f);
764 #endif // !STBI_NO_STDIO
766 static void stbi__rewind(stbi__context *s)
771 s->img_buffer = s->img_buffer_original;
775 static int stbi__jpeg_test(stbi__context *s);
776 static stbi_uc *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
777 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
781 static int stbi__png_test(stbi__context *s);
782 static stbi_uc *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
783 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
787 static int stbi__bmp_test(stbi__context *s);
788 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
789 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
793 static int stbi__tga_test(stbi__context *s);
794 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
795 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
799 static int stbi__psd_test(stbi__context *s);
800 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
801 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
805 static int stbi__hdr_test(stbi__context *s);
806 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
807 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
811 static int stbi__pic_test(stbi__context *s);
812 static stbi_uc *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
813 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
817 static int stbi__gif_test(stbi__context *s);
818 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
819 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
823 static int stbi__pnm_test(stbi__context *s);
824 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
825 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
829 static const char *stbi__g_failure_reason;
833 return stbi__g_failure_reason;
836 static int stbi__err(
const char *str)
838 stbi__g_failure_reason = str;
842 static void *stbi__malloc(
size_t size)
844 return STBI_MALLOC(size);
851 #ifdef STBI_NO_FAILURE_STRINGS
852 #define stbi__err(x,y) 0
853 #elif defined(STBI_FAILURE_USERMSG)
854 #define stbi__err(x,y) stbi__err(y)
856 #define stbi__err(x,y) stbi__err(x)
859 #define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL))
860 #define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL))
864 STBI_FREE(retval_from_stbi_load);
867 #ifndef STBI_NO_LINEAR
868 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp);
872 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
875 static unsigned char *stbi_load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
878 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s,x,y,comp,req_comp);
881 if (stbi__png_test(s))
return stbi__png_load(s,x,y,comp,req_comp);
884 if (stbi__bmp_test(s))
return stbi__bmp_load(s,x,y,comp,req_comp);
887 if (stbi__gif_test(s))
return stbi__gif_load(s,x,y,comp,req_comp);
890 if (stbi__psd_test(s))
return stbi__psd_load(s,x,y,comp,req_comp);
893 if (stbi__pic_test(s))
return stbi__pic_load(s,x,y,comp,req_comp);
896 if (stbi__pnm_test(s))
return stbi__pnm_load(s,x,y,comp,req_comp);
900 if (stbi__hdr_test(s)) {
901 float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);
902 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
908 if (stbi__tga_test(s))
909 return stbi__tga_load(s,x,y,comp,req_comp);
912 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
915 #ifndef STBI_NO_STDIO
917 static FILE *stbi__fopen(
char const *filename,
char const *mode)
920 #if defined(_MSC_VER) && _MSC_VER >= 1400
921 if (0 != fopen_s(&f, filename, mode))
924 f = fopen(filename, mode);
932 FILE *f = stbi__fopen(filename,
"rb");
933 unsigned char *result;
934 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
942 unsigned char *result;
944 stbi__start_file(&s,f);
945 result = stbi_load_main(&s,x,y,comp,req_comp);
948 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
957 stbi__start_mem(&s,buffer,len);
958 return stbi_load_main(&s,x,y,comp,req_comp);
965 return stbi_load_main(&s,x,y,comp,req_comp);
968 #ifndef STBI_NO_LINEAR
969 static float *stbi_loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
973 if (stbi__hdr_test(s))
974 return stbi__hdr_load(s,x,y,comp,req_comp);
976 data = stbi_load_main(s, x, y, comp, req_comp);
978 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
979 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
985 stbi__start_mem(&s,buffer,len);
986 return stbi_loadf_main(&s,x,y,comp,req_comp);
993 return stbi_loadf_main(&s,x,y,comp,req_comp);
996 #ifndef STBI_NO_STDIO
997 STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1000 FILE *f = stbi__fopen(filename,
"rb");
1001 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1010 stbi__start_file(&s,f);
1011 return stbi_loadf_main(&s,x,y,comp,req_comp);
1013 #endif // !STBI_NO_STDIO
1015 #endif // !STBI_NO_LINEAR
1025 stbi__start_mem(&s,buffer,len);
1026 return stbi__hdr_test(&s);
1028 STBI_NOTUSED(buffer);
1034 #ifndef STBI_NO_STDIO
1037 FILE *f = stbi__fopen(filename,
"rb");
1050 stbi__start_file(&s,f);
1051 return stbi__hdr_test(&s);
1056 #endif // !STBI_NO_STDIO
1063 return stbi__hdr_test(&s);
1069 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1070 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1072 #ifndef STBI_NO_LINEAR
1093 static void stbi__refill_buffer(stbi__context *s)
1095 int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
1099 s->read_from_callbacks = 0;
1100 s->img_buffer = s->buffer_start;
1101 s->img_buffer_end = s->buffer_start+1;
1104 s->img_buffer = s->buffer_start;
1105 s->img_buffer_end = s->buffer_start + n;
1109 stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1111 if (s->img_buffer < s->img_buffer_end)
1112 return *s->img_buffer++;
1113 if (s->read_from_callbacks) {
1114 stbi__refill_buffer(s);
1115 return *s->img_buffer++;
1120 stbi_inline
static int stbi__at_eof(stbi__context *s)
1123 if (!(s->io.eof)(s->io_user_data))
return 0;
1126 if (s->read_from_callbacks == 0)
return 1;
1129 return s->img_buffer >= s->img_buffer_end;
1132 static void stbi__skip(stbi__context *s,
int n)
1135 int blen = (int) (s->img_buffer_end - s->img_buffer);
1137 s->img_buffer = s->img_buffer_end;
1138 (s->io.skip)(s->io_user_data, n - blen);
1145 static int stbi__getn(stbi__context *s,
stbi_uc *buffer,
int n)
1148 int blen = (int) (s->img_buffer_end - s->img_buffer);
1152 memcpy(buffer, s->img_buffer, blen);
1154 count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
1155 res = (count == (n-blen));
1156 s->img_buffer = s->img_buffer_end;
1161 if (s->img_buffer+n <= s->img_buffer_end) {
1162 memcpy(buffer, s->img_buffer, n);
1169 static int stbi__get16be(stbi__context *s)
1171 int z = stbi__get8(s);
1172 return (z << 8) + stbi__get8(s);
1175 static stbi__uint32 stbi__get32be(stbi__context *s)
1177 stbi__uint32 z = stbi__get16be(s);
1178 return (z << 16) + stbi__get16be(s);
1181 static int stbi__get16le(stbi__context *s)
1183 int z = stbi__get8(s);
1184 return z + (stbi__get8(s) << 8);
1187 static stbi__uint32 stbi__get32le(stbi__context *s)
1189 stbi__uint32 z = stbi__get16le(s);
1190 return z + (stbi__get16le(s) << 16);
1193 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
1207 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1209 return (
stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
1212 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1215 unsigned char *good;
1217 if (req_comp == img_n)
return data;
1220 good = (
unsigned char *) stbi__malloc(req_comp * x * y);
1223 return stbi__errpuc(
"outofmem",
"Out of memory");
1226 for (j=0; j < (int) y; ++j) {
1227 unsigned char *src = data + j * x * img_n ;
1228 unsigned char *dest = good + j * x * req_comp;
1230 #define COMBO(a,b) ((a)*8+(b))
1231 #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1234 switch (COMBO(img_n, req_comp)) {
1235 CASE(1,2) dest[0]=src[0], dest[1]=255; break;
1236 CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1237 CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
1238 CASE(2,1) dest[0]=src[0]; break;
1239 CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1240 CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
1241 CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
1242 CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1243 CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
1244 CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1245 CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
1246 CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
1256 #ifndef STBI_NO_LINEAR
1257 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp)
1260 float *output = (
float *) stbi__malloc(x * y * comp *
sizeof(
float));
1261 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1263 if (comp & 1) n = comp;
else n = comp-1;
1264 for (i=0; i < x*y; ++i) {
1265 for (k=0; k < n; ++k) {
1266 output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1268 if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
1276 #define stbi__float2int(x) ((int) (x))
1277 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1281 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1283 if (comp & 1) n = comp;
else n = comp-1;
1284 for (i=0; i < x*y; ++i) {
1285 for (k=0; k < n; ++k) {
1286 float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1288 if (z > 255) z = 255;
1289 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1292 float z = data[i*comp+k] * 255 + 0.5f;
1294 if (z > 255) z = 255;
1295 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1324 #ifndef STBI_NO_JPEG
1327 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
1333 stbi__uint16 code[256];
1336 unsigned int maxcode[18];
1343 stbi__huffman huff_dc[4];
1344 stbi__huffman huff_ac[4];
1346 stbi__int16 fast_ac[4][1 << FAST_BITS];
1349 int img_h_max, img_v_max;
1350 int img_mcu_x, img_mcu_y;
1351 int img_mcu_w, img_mcu_h;
1364 void *raw_data, *raw_coeff;
1367 int coeff_w, coeff_h;
1370 stbi__uint32 code_buffer;
1372 unsigned char marker;
1382 int scan_n, order[4];
1383 int restart_interval, todo;
1386 void (*idct_block_kernel)(
stbi_uc *out,
int out_stride,
short data[64]);
1391 static int stbi__build_huffman(stbi__huffman *h,
int *count)
1395 for (i=0; i < 16; ++i)
1396 for (j=0; j < count[i]; ++j)
1397 h->size[k++] = (
stbi_uc) (i+1);
1403 for(j=1; j <= 16; ++j) {
1405 h->delta[j] = k - code;
1406 if (h->size[k] == j) {
1407 while (h->size[k] == j)
1408 h->code[k++] = (stbi__uint16) (code++);
1409 if (code-1 >= (1 << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1412 h->maxcode[j] = code << (16-j);
1415 h->maxcode[j] = 0xffffffff;
1418 memset(h->fast, 255, 1 << FAST_BITS);
1419 for (i=0; i < k; ++i) {
1421 if (s <= FAST_BITS) {
1422 int c = h->code[i] << (FAST_BITS-s);
1423 int m = 1 << (FAST_BITS-s);
1424 for (j=0; j < m; ++j) {
1434 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1437 for (i=0; i < (1 << FAST_BITS); ++i) {
1441 int rs = h->values[fast];
1442 int run = (rs >> 4) & 15;
1443 int magbits = rs & 15;
1444 int len = h->size[fast];
1446 if (magbits && len + magbits <= FAST_BITS) {
1448 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1449 int m = 1 << (magbits - 1);
1450 if (k < m) k += (-1 << magbits) + 1;
1452 if (k >= -128 && k <= 127)
1453 fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
1459 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1462 int b = j->nomore ? 0 : stbi__get8(j->s);
1464 int c = stbi__get8(j->s);
1466 j->marker = (
unsigned char) c;
1471 j->code_buffer |= b << (24 - j->code_bits);
1473 }
while (j->code_bits <= 24);
1477 static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1480 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1485 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1489 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1493 if (s > j->code_bits)
1495 j->code_buffer <<= s;
1497 return h->values[k];
1506 temp = j->code_buffer >> 16;
1507 for (k=FAST_BITS+1 ; ; ++k)
1508 if (temp < h->maxcode[k])
1516 if (k > j->code_bits)
1520 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1521 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1525 j->code_buffer <<= k;
1526 return h->values[c];
1530 static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1534 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1538 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1540 sgn = (stbi__int32)j->code_buffer >> 31;
1541 k = stbi_lrot(j->code_buffer, n);
1542 j->code_buffer = k & ~stbi__bmask[n];
1543 k &= stbi__bmask[n];
1545 return k + (stbi__jbias[n] & ~sgn);
1549 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
1552 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1553 k = stbi_lrot(j->code_buffer, n);
1554 j->code_buffer = k & ~stbi__bmask[n];
1555 k &= stbi__bmask[n];
1560 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
1563 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1565 j->code_buffer <<= 1;
1567 return k & 0x80000000;
1572 static stbi_uc stbi__jpeg_dezigzag[64+15] =
1574 0, 1, 8, 16, 9, 2, 3, 10,
1575 17, 24, 32, 25, 18, 11, 4, 5,
1576 12, 19, 26, 33, 40, 48, 41, 34,
1577 27, 20, 13, 6, 7, 14, 21, 28,
1578 35, 42, 49, 56, 57, 50, 43, 36,
1579 29, 22, 15, 23, 30, 37, 44, 51,
1580 58, 59, 52, 45, 38, 31, 39, 46,
1581 53, 60, 61, 54, 47, 55, 62, 63,
1583 63, 63, 63, 63, 63, 63, 63, 63,
1584 63, 63, 63, 63, 63, 63, 63
1588 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)
1593 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1594 t = stbi__jpeg_huff_decode(j, hdc);
1595 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1598 memset(data,0,64*
sizeof(data[0]));
1600 diff = t ? stbi__extend_receive(j, t) : 0;
1601 dc = j->img_comp[b].dc_pred + diff;
1602 j->img_comp[b].dc_pred = dc;
1603 data[0] = (short) (dc * dequant[0]);
1610 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1611 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1616 j->code_buffer <<= s;
1619 zig = stbi__jpeg_dezigzag[k++];
1620 data[zig] = (short) ((r >> 8) * dequant[zig]);
1622 int rs = stbi__jpeg_huff_decode(j, hac);
1623 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1627 if (rs != 0xf0)
break;
1632 zig = stbi__jpeg_dezigzag[k++];
1633 data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
1640 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
1644 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1646 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1648 if (j->succ_high == 0) {
1650 memset(data,0,64*
sizeof(data[0]));
1651 t = stbi__jpeg_huff_decode(j, hdc);
1652 diff = t ? stbi__extend_receive(j, t) : 0;
1654 dc = j->img_comp[b].dc_pred + diff;
1655 j->img_comp[b].dc_pred = dc;
1656 data[0] = (short) (dc << j->succ_low);
1659 if (stbi__jpeg_get_bit(j))
1660 data[0] += (
short) (1 << j->succ_low);
1667 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
1670 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1672 if (j->succ_high == 0) {
1673 int shift = j->succ_low;
1684 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1685 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1690 j->code_buffer <<= s;
1692 zig = stbi__jpeg_dezigzag[k++];
1693 data[zig] = (short) ((r >> 8) << shift);
1695 int rs = stbi__jpeg_huff_decode(j, hac);
1696 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1701 j->eob_run = (1 << r);
1703 j->eob_run += stbi__jpeg_get_bits(j, r);
1710 zig = stbi__jpeg_dezigzag[k++];
1711 data[zig] = (short) (stbi__extend_receive(j,s) << shift);
1714 }
while (k <= j->spec_end);
1718 short bit = (short) (1 << j->succ_low);
1722 for (k = j->spec_start; k <= j->spec_end; ++k) {
1723 short *p = &data[stbi__jpeg_dezigzag[k]];
1725 if (stbi__jpeg_get_bit(j))
1736 int rs = stbi__jpeg_huff_decode(j, hac);
1737 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1742 j->eob_run = (1 << r) - 1;
1744 j->eob_run += stbi__jpeg_get_bits(j, r);
1749 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1751 if (stbi__jpeg_get_bit(j))
1758 while (k <= j->spec_end) {
1759 short *p = &data[stbi__jpeg_dezigzag[k]];
1761 if (stbi__jpeg_get_bit(j))
1771 data[stbi__jpeg_dezigzag[k++]] = s;
1778 }
while (k <= j->spec_end);
1785 stbi_inline
static stbi_uc stbi__clamp(
int x)
1788 if ((
unsigned int) x > 255) {
1789 if (x < 0)
return 0;
1790 if (x > 255)
return 255;
1795 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
1796 #define stbi__fsh(x) ((x) << 12)
1799 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
1800 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
1803 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
1804 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
1805 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
1808 t0 = stbi__fsh(p2+p3); \
1809 t1 = stbi__fsh(p2-p3); \
1822 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
1823 t0 = t0*stbi__f2f( 0.298631336f); \
1824 t1 = t1*stbi__f2f( 2.053119869f); \
1825 t2 = t2*stbi__f2f( 3.072711026f); \
1826 t3 = t3*stbi__f2f( 1.501321110f); \
1827 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
1828 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
1829 p3 = p3*stbi__f2f(-1.961570560f); \
1830 p4 = p4*stbi__f2f(-0.390180644f); \
1836 static void stbi__idct_block(
stbi_uc *out,
int out_stride,
short data[64])
1838 int i,val[64],*v=val;
1843 for (i=0; i < 8; ++i,++d, ++v) {
1845 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
1846 && d[40]==0 && d[48]==0 && d[56]==0) {
1851 int dcterm = d[0] << 2;
1852 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1854 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
1857 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
1858 v[ 0] = (x0+t3) >> 10;
1859 v[56] = (x0-t3) >> 10;
1860 v[ 8] = (x1+t2) >> 10;
1861 v[48] = (x1-t2) >> 10;
1862 v[16] = (x2+t1) >> 10;
1863 v[40] = (x2-t1) >> 10;
1864 v[24] = (x3+t0) >> 10;
1865 v[32] = (x3-t0) >> 10;
1869 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
1871 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
1878 x0 += 65536 + (128<<17);
1879 x1 += 65536 + (128<<17);
1880 x2 += 65536 + (128<<17);
1881 x3 += 65536 + (128<<17);
1884 o[0] = stbi__clamp((x0+t3) >> 17);
1885 o[7] = stbi__clamp((x0-t3) >> 17);
1886 o[1] = stbi__clamp((x1+t2) >> 17);
1887 o[6] = stbi__clamp((x1-t2) >> 17);
1888 o[2] = stbi__clamp((x2+t1) >> 17);
1889 o[5] = stbi__clamp((x2-t1) >> 17);
1890 o[3] = stbi__clamp((x3+t0) >> 17);
1891 o[4] = stbi__clamp((x3-t0) >> 17);
1899 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
1902 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
1906 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
1910 #define dct_rot(out0,out1, x,y,c0,c1) \
1911 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
1912 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
1913 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
1914 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
1915 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
1916 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
1919 #define dct_widen(out, in) \
1920 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
1921 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
1924 #define dct_wadd(out, a, b) \
1925 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
1926 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
1929 #define dct_wsub(out, a, b) \
1930 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
1931 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
1934 #define dct_bfly32o(out0, out1, a,b,bias,s) \
1936 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
1937 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
1938 dct_wadd(sum, abiased, b); \
1939 dct_wsub(dif, abiased, b); \
1940 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
1941 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
1945 #define dct_interleave8(a, b) \
1947 a = _mm_unpacklo_epi8(a, b); \
1948 b = _mm_unpackhi_epi8(tmp, b)
1951 #define dct_interleave16(a, b) \
1953 a = _mm_unpacklo_epi16(a, b); \
1954 b = _mm_unpackhi_epi16(tmp, b)
1956 #define dct_pass(bias,shift) \
1959 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
1960 __m128i sum04 = _mm_add_epi16(row0, row4); \
1961 __m128i dif04 = _mm_sub_epi16(row0, row4); \
1962 dct_widen(t0e, sum04); \
1963 dct_widen(t1e, dif04); \
1964 dct_wadd(x0, t0e, t3e); \
1965 dct_wsub(x3, t0e, t3e); \
1966 dct_wadd(x1, t1e, t2e); \
1967 dct_wsub(x2, t1e, t2e); \
1969 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
1970 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
1971 __m128i sum17 = _mm_add_epi16(row1, row7); \
1972 __m128i sum35 = _mm_add_epi16(row3, row5); \
1973 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
1974 dct_wadd(x4, y0o, y4o); \
1975 dct_wadd(x5, y1o, y5o); \
1976 dct_wadd(x6, y2o, y5o); \
1977 dct_wadd(x7, y3o, y4o); \
1978 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
1979 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
1980 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
1981 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
1984 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
1985 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
1986 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
1987 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
1988 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
1989 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
1990 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
1991 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
1994 __m128i bias_0 = _mm_set1_epi32(512);
1995 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
1998 row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
1999 row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
2000 row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
2001 row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
2002 row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
2003 row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
2004 row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
2005 row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
2008 dct_pass(bias_0, 10);
2012 dct_interleave16(row0, row4);
2013 dct_interleave16(row1, row5);
2014 dct_interleave16(row2, row6);
2015 dct_interleave16(row3, row7);
2018 dct_interleave16(row0, row2);
2019 dct_interleave16(row1, row3);
2020 dct_interleave16(row4, row6);
2021 dct_interleave16(row5, row7);
2024 dct_interleave16(row0, row1);
2025 dct_interleave16(row2, row3);
2026 dct_interleave16(row4, row5);
2027 dct_interleave16(row6, row7);
2031 dct_pass(bias_1, 17);
2035 __m128i p0 = _mm_packus_epi16(row0, row1);
2036 __m128i p1 = _mm_packus_epi16(row2, row3);
2037 __m128i p2 = _mm_packus_epi16(row4, row5);
2038 __m128i p3 = _mm_packus_epi16(row6, row7);
2041 dct_interleave8(p0, p2);
2042 dct_interleave8(p1, p3);
2045 dct_interleave8(p0, p1);
2046 dct_interleave8(p2, p3);
2049 dct_interleave8(p0, p2);
2050 dct_interleave8(p1, p3);
2053 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2054 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2055 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2056 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2057 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2058 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2059 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2060 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2069 #undef dct_interleave8
2070 #undef dct_interleave16
2080 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2082 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2084 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2085 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2086 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2087 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2088 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2089 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2090 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2091 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2092 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2093 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2094 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2095 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2097 #define dct_long_mul(out, inq, coeff) \
2098 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2099 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2101 #define dct_long_mac(out, acc, inq, coeff) \
2102 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2103 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2105 #define dct_widen(out, inq) \
2106 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2107 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2110 #define dct_wadd(out, a, b) \
2111 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2112 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2115 #define dct_wsub(out, a, b) \
2116 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2117 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2120 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2122 dct_wadd(sum, a, b); \
2123 dct_wsub(dif, a, b); \
2124 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2125 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2128 #define dct_pass(shiftop, shift) \
2131 int16x8_t sum26 = vaddq_s16(row2, row6); \
2132 dct_long_mul(p1e, sum26, rot0_0); \
2133 dct_long_mac(t2e, p1e, row6, rot0_1); \
2134 dct_long_mac(t3e, p1e, row2, rot0_2); \
2135 int16x8_t sum04 = vaddq_s16(row0, row4); \
2136 int16x8_t dif04 = vsubq_s16(row0, row4); \
2137 dct_widen(t0e, sum04); \
2138 dct_widen(t1e, dif04); \
2139 dct_wadd(x0, t0e, t3e); \
2140 dct_wsub(x3, t0e, t3e); \
2141 dct_wadd(x1, t1e, t2e); \
2142 dct_wsub(x2, t1e, t2e); \
2144 int16x8_t sum15 = vaddq_s16(row1, row5); \
2145 int16x8_t sum17 = vaddq_s16(row1, row7); \
2146 int16x8_t sum35 = vaddq_s16(row3, row5); \
2147 int16x8_t sum37 = vaddq_s16(row3, row7); \
2148 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2149 dct_long_mul(p5o, sumodd, rot1_0); \
2150 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2151 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2152 dct_long_mul(p3o, sum37, rot2_0); \
2153 dct_long_mul(p4o, sum15, rot2_1); \
2154 dct_wadd(sump13o, p1o, p3o); \
2155 dct_wadd(sump24o, p2o, p4o); \
2156 dct_wadd(sump23o, p2o, p3o); \
2157 dct_wadd(sump14o, p1o, p4o); \
2158 dct_long_mac(x4, sump13o, row7, rot3_0); \
2159 dct_long_mac(x5, sump24o, row5, rot3_1); \
2160 dct_long_mac(x6, sump23o, row3, rot3_2); \
2161 dct_long_mac(x7, sump14o, row1, rot3_3); \
2162 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2163 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2164 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2165 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2169 row0 = vld1q_s16(data + 0*8);
2170 row1 = vld1q_s16(data + 1*8);
2171 row2 = vld1q_s16(data + 2*8);
2172 row3 = vld1q_s16(data + 3*8);
2173 row4 = vld1q_s16(data + 4*8);
2174 row5 = vld1q_s16(data + 5*8);
2175 row6 = vld1q_s16(data + 6*8);
2176 row7 = vld1q_s16(data + 7*8);
2179 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2182 dct_pass(vrshrn_n_s32, 10);
2188 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2189 #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]); }
2190 #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)); }
2193 dct_trn16(row0, row1);
2194 dct_trn16(row2, row3);
2195 dct_trn16(row4, row5);
2196 dct_trn16(row6, row7);
2199 dct_trn32(row0, row2);
2200 dct_trn32(row1, row3);
2201 dct_trn32(row4, row6);
2202 dct_trn32(row5, row7);
2205 dct_trn64(row0, row4);
2206 dct_trn64(row1, row5);
2207 dct_trn64(row2, row6);
2208 dct_trn64(row3, row7);
2219 dct_pass(vshrn_n_s32, 16);
2223 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2224 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2225 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2226 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2227 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2228 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2229 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2230 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2233 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2234 #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]); }
2235 #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]); }
2247 dct_trn8_16(p0, p2);
2248 dct_trn8_16(p1, p3);
2249 dct_trn8_16(p4, p6);
2250 dct_trn8_16(p5, p7);
2253 dct_trn8_32(p0, p4);
2254 dct_trn8_32(p1, p5);
2255 dct_trn8_32(p2, p6);
2256 dct_trn8_32(p3, p7);
2259 vst1_u8(out, p0); out += out_stride;
2260 vst1_u8(out, p1); out += out_stride;
2261 vst1_u8(out, p2); out += out_stride;
2262 vst1_u8(out, p3); out += out_stride;
2263 vst1_u8(out, p4); out += out_stride;
2264 vst1_u8(out, p5); out += out_stride;
2265 vst1_u8(out, p6); out += out_stride;
2284 #define STBI__MARKER_none 0xff
2288 static stbi_uc stbi__get_marker(stbi__jpeg *j)
2291 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2292 x = stbi__get8(j->s);
2293 if (x != 0xff)
return STBI__MARKER_none;
2295 x = stbi__get8(j->s);
2301 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2305 static void stbi__jpeg_reset(stbi__jpeg *j)
2310 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
2311 j->marker = STBI__MARKER_none;
2312 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2318 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2320 stbi__jpeg_reset(z);
2321 if (!z->progressive) {
2322 if (z->scan_n == 1) {
2324 STBI_SIMD_ALIGN(
short, data[64]);
2325 int n = z->order[0];
2330 int w = (z->img_comp[n].x+7) >> 3;
2331 int h = (z->img_comp[n].y+7) >> 3;
2332 for (j=0; j < h; ++j) {
2333 for (i=0; i < w; ++i) {
2334 int ha = z->img_comp[n].ha;
2335 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;
2336 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2338 if (--z->todo <= 0) {
2339 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2342 if (!STBI__RESTART(z->marker))
return 1;
2343 stbi__jpeg_reset(z);
2350 STBI_SIMD_ALIGN(
short, data[64]);
2351 for (j=0; j < z->img_mcu_y; ++j) {
2352 for (i=0; i < z->img_mcu_x; ++i) {
2354 for (k=0; k < z->scan_n; ++k) {
2355 int n = z->order[k];
2358 for (y=0; y < z->img_comp[n].v; ++y) {
2359 for (x=0; x < z->img_comp[n].h; ++x) {
2360 int x2 = (i*z->img_comp[n].h + x)*8;
2361 int y2 = (j*z->img_comp[n].v + y)*8;
2362 int ha = z->img_comp[n].ha;
2363 if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq]))
return 0;
2364 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2370 if (--z->todo <= 0) {
2371 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2372 if (!STBI__RESTART(z->marker))
return 1;
2373 stbi__jpeg_reset(z);
2380 if (z->scan_n == 1) {
2382 int n = z->order[0];
2387 int w = (z->img_comp[n].x+7) >> 3;
2388 int h = (z->img_comp[n].y+7) >> 3;
2389 for (j=0; j < h; ++j) {
2390 for (i=0; i < w; ++i) {
2391 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2392 if (z->spec_start == 0) {
2393 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2396 int ha = z->img_comp[n].ha;
2397 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2401 if (--z->todo <= 0) {
2402 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2403 if (!STBI__RESTART(z->marker))
return 1;
2404 stbi__jpeg_reset(z);
2411 for (j=0; j < z->img_mcu_y; ++j) {
2412 for (i=0; i < z->img_mcu_x; ++i) {
2414 for (k=0; k < z->scan_n; ++k) {
2415 int n = z->order[k];
2418 for (y=0; y < z->img_comp[n].v; ++y) {
2419 for (x=0; x < z->img_comp[n].h; ++x) {
2420 int x2 = (i*z->img_comp[n].h + x);
2421 int y2 = (j*z->img_comp[n].v + y);
2422 int ha = z->img_comp[n].ha;
2423 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2424 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2431 if (--z->todo <= 0) {
2432 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2433 if (!STBI__RESTART(z->marker))
return 1;
2434 stbi__jpeg_reset(z);
2443 static void stbi__jpeg_dequantize(
short *data,
stbi_uc *dequant)
2446 for (i=0; i < 64; ++i)
2447 data[i] *= dequant[i];
2450 static void stbi__jpeg_finish(stbi__jpeg *z)
2452 if (z->progressive) {
2455 for (n=0; n < z->s->img_n; ++n) {
2456 int w = (z->img_comp[n].x+7) >> 3;
2457 int h = (z->img_comp[n].y+7) >> 3;
2458 for (j=0; j < h; ++j) {
2459 for (i=0; i < w; ++i) {
2460 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2461 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2462 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2469 static int stbi__process_marker(stbi__jpeg *z,
int m)
2473 case STBI__MARKER_none:
2474 return stbi__err(
"expected marker",
"Corrupt JPEG");
2477 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2478 z->restart_interval = stbi__get16be(z->s);
2482 L = stbi__get16be(z->s)-2;
2484 int q = stbi__get8(z->s);
2487 if (p != 0)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2488 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2489 for (i=0; i < 64; ++i)
2490 z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
2496 L = stbi__get16be(z->s)-2;
2499 int sizes[16],i,n=0;
2500 int q = stbi__get8(z->s);
2503 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2504 for (i=0; i < 16; ++i) {
2505 sizes[i] = stbi__get8(z->s);
2510 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
2511 v = z->huff_dc[th].values;
2513 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
2514 v = z->huff_ac[th].values;
2516 for (i=0; i < n; ++i)
2517 v[i] = stbi__get8(z->s);
2519 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2525 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2526 stbi__skip(z->s, stbi__get16be(z->s)-2);
2533 static int stbi__process_scan_header(stbi__jpeg *z)
2536 int Ls = stbi__get16be(z->s);
2537 z->scan_n = stbi__get8(z->s);
2538 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");
2539 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2540 for (i=0; i < z->scan_n; ++i) {
2541 int id = stbi__get8(z->s), which;
2542 int q = stbi__get8(z->s);
2543 for (which = 0; which < z->s->img_n; ++which)
2544 if (z->img_comp[which].id ==
id)
2546 if (which == z->s->img_n)
return 0;
2547 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2548 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2549 z->order[i] = which;
2554 z->spec_start = stbi__get8(z->s);
2555 z->spec_end = stbi__get8(z->s);
2556 aa = stbi__get8(z->s);
2557 z->succ_high = (aa >> 4);
2558 z->succ_low = (aa & 15);
2559 if (z->progressive) {
2560 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2561 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2563 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2564 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2572 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
2574 stbi__context *s = z->s;
2575 int Lf,p,i,q, h_max=1,v_max=1,c;
2576 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2577 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
2578 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
2579 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
2581 if (c != 3 && c != 1)
return stbi__err(
"bad component count",
"Corrupt JPEG");
2583 for (i=0; i < c; ++i) {
2584 z->img_comp[i].data = NULL;
2585 z->img_comp[i].linebuf = NULL;
2588 if (Lf != 8+3*s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2590 for (i=0; i < s->img_n; ++i) {
2591 z->img_comp[i].id = stbi__get8(s);
2592 if (z->img_comp[i].id != i+1)
2593 if (z->img_comp[i].id != i)
2594 return stbi__err(
"bad component ID",
"Corrupt JPEG");
2596 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");
2597 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");
2598 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
2601 if (scan != STBI__SCAN_load)
return 1;
2603 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
2605 for (i=0; i < s->img_n; ++i) {
2606 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
2607 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
2611 z->img_h_max = h_max;
2612 z->img_v_max = v_max;
2613 z->img_mcu_w = h_max * 8;
2614 z->img_mcu_h = v_max * 8;
2615 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
2616 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
2618 for (i=0; i < s->img_n; ++i) {
2620 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
2621 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
2626 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
2627 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
2628 z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
2630 if (z->img_comp[i].raw_data == NULL) {
2631 for(--i; i >= 0; --i) {
2632 STBI_FREE(z->img_comp[i].raw_data);
2633 z->img_comp[i].data = NULL;
2635 return stbi__err(
"outofmem",
"Out of memory");
2638 z->img_comp[i].data = (
stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
2639 z->img_comp[i].linebuf = NULL;
2640 if (z->progressive) {
2641 z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;
2642 z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
2643 z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 *
sizeof(
short) + 15);
2644 z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
2646 z->img_comp[i].coeff = 0;
2647 z->img_comp[i].raw_coeff = 0;
2655 #define stbi__DNL(x) ((x) == 0xdc)
2656 #define stbi__SOI(x) ((x) == 0xd8)
2657 #define stbi__EOI(x) ((x) == 0xd9)
2658 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
2659 #define stbi__SOS(x) ((x) == 0xda)
2661 #define stbi__SOF_progressive(x) ((x) == 0xc2)
2663 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
2666 z->marker = STBI__MARKER_none;
2667 m = stbi__get_marker(z);
2668 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
2669 if (scan == STBI__SCAN_type)
return 1;
2670 m = stbi__get_marker(z);
2671 while (!stbi__SOF(m)) {
2672 if (!stbi__process_marker(z,m))
return 0;
2673 m = stbi__get_marker(z);
2674 while (m == STBI__MARKER_none) {
2676 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
2677 m = stbi__get_marker(z);
2680 z->progressive = stbi__SOF_progressive(m);
2681 if (!stbi__process_frame_header(z, scan))
return 0;
2686 static int stbi__decode_jpeg_image(stbi__jpeg *j)
2689 j->restart_interval = 0;
2690 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
2691 m = stbi__get_marker(j);
2692 while (!stbi__EOI(m)) {
2694 if (!stbi__process_scan_header(j))
return 0;
2695 if (!stbi__parse_entropy_coded_data(j))
return 0;
2696 if (j->marker == STBI__MARKER_none ) {
2698 while (!stbi__at_eof(j->s)) {
2699 int x = stbi__get8(j->s);
2701 j->marker = stbi__get8(j->s);
2703 }
else if (x != 0) {
2704 return stbi__err(
"junk before marker",
"Corrupt JPEG");
2710 if (!stbi__process_marker(j, m))
return 0;
2712 m = stbi__get_marker(j);
2715 stbi__jpeg_finish(j);
2724 #define stbi__div4(x) ((stbi_uc) ((x) >> 2))
2729 STBI_NOTUSED(in_far);
2740 for (i=0; i < w; ++i)
2741 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
2753 out[0] = out[1] = input[0];
2758 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
2759 for (i=1; i < w-1; ++i) {
2760 int n = 3*input[i]+2;
2761 out[i*2+0] = stbi__div4(n+input[i-1]);
2762 out[i*2+1] = stbi__div4(n+input[i+1]);
2764 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
2765 out[i*2+1] = input[w-1];
2767 STBI_NOTUSED(in_far);
2773 #define stbi__div16(x) ((stbi_uc) ((x) >> 4))
2780 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2784 t1 = 3*in_near[0] + in_far[0];
2785 out[0] = stbi__div4(t1+2);
2786 for (i=1; i < w; ++i) {
2788 t1 = 3*in_near[i]+in_far[i];
2789 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
2790 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
2792 out[w*2-1] = stbi__div4(t1+2);
2799 #if defined(STBI_SSE2) || defined(STBI_NEON)
2806 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2810 t1 = 3*in_near[0] + in_far[0];
2814 for (; i < ((w-1) & ~7); i += 8) {
2815 #if defined(STBI_SSE2)
2818 __m128i zero = _mm_setzero_si128();
2819 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
2820 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
2821 __m128i farw = _mm_unpacklo_epi8(farb, zero);
2822 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
2823 __m128i diff = _mm_sub_epi16(farw, nearw);
2824 __m128i nears = _mm_slli_epi16(nearw, 2);
2825 __m128i curr = _mm_add_epi16(nears, diff);
2832 __m128i prv0 = _mm_slli_si128(curr, 2);
2833 __m128i nxt0 = _mm_srli_si128(curr, 2);
2834 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
2835 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
2841 __m128i bias = _mm_set1_epi16(8);
2842 __m128i curs = _mm_slli_epi16(curr, 2);
2843 __m128i prvd = _mm_sub_epi16(prev, curr);
2844 __m128i nxtd = _mm_sub_epi16(next, curr);
2845 __m128i curb = _mm_add_epi16(curs, bias);
2846 __m128i even = _mm_add_epi16(prvd, curb);
2847 __m128i odd = _mm_add_epi16(nxtd, curb);
2850 __m128i int0 = _mm_unpacklo_epi16(even, odd);
2851 __m128i int1 = _mm_unpackhi_epi16(even, odd);
2852 __m128i de0 = _mm_srli_epi16(int0, 4);
2853 __m128i de1 = _mm_srli_epi16(int1, 4);
2856 __m128i outv = _mm_packus_epi16(de0, de1);
2857 _mm_storeu_si128((__m128i *) (out + i*2), outv);
2858 #elif defined(STBI_NEON)
2861 uint8x8_t farb = vld1_u8(in_far + i);
2862 uint8x8_t nearb = vld1_u8(in_near + i);
2863 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
2864 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
2865 int16x8_t curr = vaddq_s16(nears, diff);
2872 int16x8_t prv0 = vextq_s16(curr, curr, 7);
2873 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
2874 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
2875 int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
2881 int16x8_t curs = vshlq_n_s16(curr, 2);
2882 int16x8_t prvd = vsubq_s16(prev, curr);
2883 int16x8_t nxtd = vsubq_s16(next, curr);
2884 int16x8_t even = vaddq_s16(curs, prvd);
2885 int16x8_t odd = vaddq_s16(curs, nxtd);
2889 o.val[0] = vqrshrun_n_s16(even, 4);
2890 o.val[1] = vqrshrun_n_s16(odd, 4);
2891 vst2_u8(out + i*2, o);
2895 t1 = 3*in_near[i+7] + in_far[i+7];
2899 t1 = 3*in_near[i] + in_far[i];
2900 out[i*2] = stbi__div16(3*t1 + t0 + 8);
2902 for (++i; i < w; ++i) {
2904 t1 = 3*in_near[i]+in_far[i];
2905 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
2906 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
2908 out[w*2-1] = stbi__div4(t1+2);
2920 STBI_NOTUSED(in_far);
2921 for (i=0; i < w; ++i)
2922 for (j=0; j < hs; ++j)
2923 out[i*hs+j] = in_near[i];
2927 #ifdef STBI_JPEG_OLD
2930 #define float2fixed(x) ((int) ((x) * 65536 + 0.5))
2934 for (i=0; i < count; ++i) {
2935 int y_fixed = (y[i] << 16) + 32768;
2937 int cr = pcr[i] - 128;
2938 int cb = pcb[i] - 128;
2939 r = y_fixed + cr*float2fixed(1.40200f);
2940 g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
2941 b = y_fixed + cb*float2fixed(1.77200f);
2945 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
2946 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
2947 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
2958 #define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
2962 for (i=0; i < count; ++i) {
2963 int y_fixed = (y[i] << 20) + (1<<19);
2965 int cr = pcr[i] - 128;
2966 int cb = pcb[i] - 128;
2967 r = y_fixed + cr* float2fixed(1.40200f);
2968 g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
2969 b = y_fixed + cb* float2fixed(1.77200f);
2973 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
2974 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
2975 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
2985 #if defined(STBI_SSE2) || defined(STBI_NEON)
2996 __m128i signflip = _mm_set1_epi8(-0x80);
2997 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200f*4096.0f+0.5f));
2998 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
2999 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
3000 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200f*4096.0f+0.5f));
3001 __m128i y_bias = _mm_set1_epi8((
char) 128);
3002 __m128i xw = _mm_set1_epi16(255);
3004 for (; i+7 < count; i += 8) {
3006 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3007 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3008 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3009 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3010 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3013 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3014 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3015 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3018 __m128i yws = _mm_srli_epi16(yw, 4);
3019 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3020 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3021 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3022 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3023 __m128i rws = _mm_add_epi16(cr0, yws);
3024 __m128i gwt = _mm_add_epi16(cb0, yws);
3025 __m128i bws = _mm_add_epi16(yws, cb1);
3026 __m128i gws = _mm_add_epi16(gwt, cr1);
3029 __m128i rw = _mm_srai_epi16(rws, 4);
3030 __m128i bw = _mm_srai_epi16(bws, 4);
3031 __m128i gw = _mm_srai_epi16(gws, 4);
3034 __m128i brb = _mm_packus_epi16(rw, bw);
3035 __m128i gxb = _mm_packus_epi16(gw, xw);
3038 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3039 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3040 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3041 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3044 _mm_storeu_si128((__m128i *) (out + 0), o0);
3045 _mm_storeu_si128((__m128i *) (out + 16), o1);
3055 uint8x8_t signflip = vdup_n_u8(0x80);
3056 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200f*4096.0f+0.5f));
3057 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
3058 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
3059 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200f*4096.0f+0.5f));
3061 for (; i+7 < count; i += 8) {
3063 uint8x8_t y_bytes = vld1_u8(y + i);
3064 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3065 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3066 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3067 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3070 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3071 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3072 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3075 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3076 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3077 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3078 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3079 int16x8_t rws = vaddq_s16(yws, cr0);
3080 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3081 int16x8_t bws = vaddq_s16(yws, cb1);
3085 o.val[0] = vqrshrun_n_s16(rws, 4);
3086 o.val[1] = vqrshrun_n_s16(gws, 4);
3087 o.val[2] = vqrshrun_n_s16(bws, 4);
3088 o.val[3] = vdup_n_u8(255);
3097 for (; i < count; ++i) {
3098 int y_fixed = (y[i] << 20) + (1<<19);
3100 int cr = pcr[i] - 128;
3101 int cb = pcb[i] - 128;
3102 r = y_fixed + cr* float2fixed(1.40200f);
3103 g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3104 b = y_fixed + cb* float2fixed(1.77200f);
3108 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3109 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3110 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3121 static void stbi__setup_jpeg(stbi__jpeg *j)
3123 j->idct_block_kernel = stbi__idct_block;
3124 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3125 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3128 if (stbi__sse2_available()) {
3129 j->idct_block_kernel = stbi__idct_simd;
3130 #ifndef STBI_JPEG_OLD
3131 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3133 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3138 j->idct_block_kernel = stbi__idct_simd;
3139 #ifndef STBI_JPEG_OLD
3140 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3142 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3147 static void stbi__cleanup_jpeg(stbi__jpeg *j)
3150 for (i=0; i < j->s->img_n; ++i) {
3151 if (j->img_comp[i].raw_data) {
3152 STBI_FREE(j->img_comp[i].raw_data);
3153 j->img_comp[i].raw_data = NULL;
3154 j->img_comp[i].data = NULL;
3156 if (j->img_comp[i].raw_coeff) {
3157 STBI_FREE(j->img_comp[i].raw_coeff);
3158 j->img_comp[i].raw_coeff = 0;
3159 j->img_comp[i].coeff = 0;
3161 if (j->img_comp[i].linebuf) {
3162 STBI_FREE(j->img_comp[i].linebuf);
3163 j->img_comp[i].linebuf = NULL;
3170 resample_row_func resample;
3178 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3184 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3187 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3190 n = req_comp ? req_comp : z->s->img_n;
3192 if (z->s->img_n == 3 && n < 3)
3195 decode_n = z->s->img_n;
3204 stbi__resample res_comp[4];
3206 for (k=0; k < decode_n; ++k) {
3207 stbi__resample *r = &res_comp[k];
3211 z->img_comp[k].linebuf = (
stbi_uc *) stbi__malloc(z->s->img_x + 3);
3212 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3214 r->hs = z->img_h_max / z->img_comp[k].h;
3215 r->vs = z->img_v_max / z->img_comp[k].v;
3216 r->ystep = r->vs >> 1;
3217 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3219 r->line0 = r->line1 = z->img_comp[k].data;
3221 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3222 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3223 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3224 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3225 else r->resample = stbi__resample_row_generic;
3229 output = (
stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
3230 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3233 for (j=0; j < z->s->img_y; ++j) {
3234 stbi_uc *out = output + n * z->s->img_x * j;
3235 for (k=0; k < decode_n; ++k) {
3236 stbi__resample *r = &res_comp[k];
3237 int y_bot = r->ystep >= (r->vs >> 1);
3238 coutput[k] = r->resample(z->img_comp[k].linebuf,
3239 y_bot ? r->line1 : r->line0,
3240 y_bot ? r->line0 : r->line1,
3242 if (++r->ystep >= r->vs) {
3244 r->line0 = r->line1;
3245 if (++r->ypos < z->img_comp[k].y)
3246 r->line1 += z->img_comp[k].w2;
3251 if (z->s->img_n == 3) {
3252 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3254 for (i=0; i < z->s->img_x; ++i) {
3255 out[0] = out[1] = out[2] = y[i];
3262 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3264 for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3267 stbi__cleanup_jpeg(z);
3268 *out_x = z->s->img_x;
3269 *out_y = z->s->img_y;
3270 if (comp) *comp = z->s->img_n;
3275 static unsigned char *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
3279 stbi__setup_jpeg(&j);
3280 return load_jpeg_image(&j, x,y,comp,req_comp);
3283 static int stbi__jpeg_test(stbi__context *s)
3288 stbi__setup_jpeg(&j);
3289 r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
3294 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
3296 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3297 stbi__rewind( j->s );
3300 if (x) *x = j->s->img_x;
3301 if (y) *y = j->s->img_y;
3302 if (comp) *comp = j->s->img_n;
3306 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
3310 return stbi__jpeg_info_raw(&j, x, y, comp);
3321 #ifndef STBI_NO_ZLIB
3324 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
3325 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
3331 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3332 stbi__uint16 firstcode[16];
3334 stbi__uint16 firstsymbol[16];
3336 stbi__uint16 value[288];
3339 stbi_inline
static int stbi__bitreverse16(
int n)
3341 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3342 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3343 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3344 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3348 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3353 return stbi__bitreverse16(v) >> (16-bits);
3356 static int stbi__zbuild_huffman(stbi__zhuffman *z,
stbi_uc *sizelist,
int num)
3359 int code, next_code[16], sizes[17];
3362 memset(sizes, 0,
sizeof(sizes));
3363 memset(z->fast, 0,
sizeof(z->fast));
3364 for (i=0; i < num; ++i)
3365 ++sizes[sizelist[i]];
3367 for (i=1; i < 16; ++i)
3370 for (i=1; i < 16; ++i) {
3371 next_code[i] = code;
3372 z->firstcode[i] = (stbi__uint16) code;
3373 z->firstsymbol[i] = (stbi__uint16) k;
3374 code = (code + sizes[i]);
3376 if (code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt JPEG");
3377 z->maxcode[i] = code << (16-i);
3381 z->maxcode[16] = 0x10000;
3382 for (i=0; i < num; ++i) {
3383 int s = sizelist[i];
3385 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3386 stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
3388 z->value[c] = (stbi__uint16) i;
3389 if (s <= STBI__ZFAST_BITS) {
3390 int k = stbi__bit_reverse(next_code[s],s);
3391 while (k < (1 << STBI__ZFAST_BITS)) {
3410 stbi_uc *zbuffer, *zbuffer_end;
3412 stbi__uint32 code_buffer;
3419 stbi__zhuffman z_length, z_distance;
3422 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
3424 if (z->zbuffer >= z->zbuffer_end)
return 0;
3425 return *z->zbuffer++;
3428 static void stbi__fill_bits(stbi__zbuf *z)
3431 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3432 z->code_buffer |= stbi__zget8(z) << z->num_bits;
3434 }
while (z->num_bits <= 24);
3437 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
3440 if (z->num_bits < n) stbi__fill_bits(z);
3441 k = z->code_buffer & ((1 << n) - 1);
3442 z->code_buffer >>= n;
3447 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
3452 k = stbi__bit_reverse(a->code_buffer, 16);
3453 for (s=STBI__ZFAST_BITS+1; ; ++s)
3454 if (k < z->maxcode[s])
3456 if (s == 16)
return -1;
3458 b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
3460 a->code_buffer >>= s;
3465 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3468 if (a->num_bits < 16) stbi__fill_bits(a);
3469 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3472 a->code_buffer >>= s;
3476 return stbi__zhuffman_decode_slowpath(a, z);
3479 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
3484 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3485 cur = (int) (z->zout - z->zout_start);
3486 limit = (int) (z->zout_end - z->zout_start);
3487 while (cur + n > limit)
3489 q = (
char *) STBI_REALLOC(z->zout_start, limit);
3490 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
3493 z->zout_end = q + limit;
3497 static int stbi__zlength_base[31] = {
3498 3,4,5,6,7,8,9,10,11,13,
3499 15,17,19,23,27,31,35,43,51,59,
3500 67,83,99,115,131,163,195,227,258,0,0 };
3502 static int stbi__zlength_extra[31]=
3503 { 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 };
3505 static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3506 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
3508 static int stbi__zdist_extra[32] =
3509 { 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};
3511 static int stbi__parse_huffman_block(stbi__zbuf *a)
3513 char *zout = a->zout;
3515 int z = stbi__zhuffman_decode(a, &a->z_length);
3517 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3518 if (zout >= a->zout_end) {
3519 if (!stbi__zexpand(a, zout, 1))
return 0;
3531 len = stbi__zlength_base[z];
3532 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
3533 z = stbi__zhuffman_decode(a, &a->z_distance);
3534 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3535 dist = stbi__zdist_base[z];
3536 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
3537 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
3538 if (zout + len > a->zout_end) {
3539 if (!stbi__zexpand(a, zout, len))
return 0;
3542 p = (
stbi_uc *) (zout - dist);
3545 do *zout++ = v;
while (--len);
3547 do *zout++ = *p++;
while (--len);
3553 static int stbi__compute_huffman_codes(stbi__zbuf *a)
3555 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 };
3556 stbi__zhuffman z_codelength;
3561 int hlit = stbi__zreceive(a,5) + 257;
3562 int hdist = stbi__zreceive(a,5) + 1;
3563 int hclen = stbi__zreceive(a,4) + 4;
3565 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
3566 for (i=0; i < hclen; ++i) {
3567 int s = stbi__zreceive(a,3);
3568 codelength_sizes[length_dezigzag[i]] = (
stbi_uc) s;
3570 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
3573 while (n < hlit + hdist) {
3574 int c = stbi__zhuffman_decode(a, &z_codelength);
3579 c = stbi__zreceive(a,2)+3;
3580 memset(lencodes+n, lencodes[n-1], c);
3582 }
else if (c == 17) {
3583 c = stbi__zreceive(a,3)+3;
3584 memset(lencodes+n, 0, c);
3588 c = stbi__zreceive(a,7)+11;
3589 memset(lencodes+n, 0, c);
3593 if (n != hlit+hdist)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3594 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
3595 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
3599 static int stbi__parse_uncomperssed_block(stbi__zbuf *a)
3603 if (a->num_bits & 7)
3604 stbi__zreceive(a, a->num_bits & 7);
3607 while (a->num_bits > 0) {
3608 header[k++] = (
stbi_uc) (a->code_buffer & 255);
3609 a->code_buffer >>= 8;
3615 header[k++] = stbi__zget8(a);
3616 len = header[1] * 256 + header[0];
3617 nlen = header[3] * 256 + header[2];
3618 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
3619 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
3620 if (a->zout + len > a->zout_end)
3621 if (!stbi__zexpand(a, a->zout, len))
return 0;
3622 memcpy(a->zout, a->zbuffer, len);
3628 static int stbi__parse_zlib_header(stbi__zbuf *a)
3630 int cmf = stbi__zget8(a);
3633 int flg = stbi__zget8(a);
3634 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
3635 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
3636 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
3642 static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
3643 static void stbi__init_zdefaults(
void)
3646 for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
3647 for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
3648 for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
3649 for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
3651 for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
3654 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
3658 if (!stbi__parse_zlib_header(a))
return 0;
3662 final = stbi__zreceive(a,1);
3663 type = stbi__zreceive(a,2);
3665 if (!stbi__parse_uncomperssed_block(a))
return 0;
3666 }
else if (type == 3) {
3671 if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
3672 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288))
return 0;
3673 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
3675 if (!stbi__compute_huffman_codes(a))
return 0;
3677 if (!stbi__parse_huffman_block(a))
return 0;
3683 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
3685 a->zout_start = obuf;
3687 a->zout_end = obuf + olen;
3688 a->z_expandable = exp;
3690 return stbi__parse_zlib(a, parse_header);
3696 char *p = (
char *) stbi__malloc(initial_size);
3697 if (p == NULL)
return NULL;
3698 a.zbuffer = (
stbi_uc *) buffer;
3699 a.zbuffer_end = (
stbi_uc *) buffer + len;
3700 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
3701 if (outlen) *outlen = (int) (a.zout - a.zout_start);
3702 return a.zout_start;
3704 STBI_FREE(a.zout_start);
3717 char *p = (
char *) stbi__malloc(initial_size);
3718 if (p == NULL)
return NULL;
3719 a.zbuffer = (
stbi_uc *) buffer;
3720 a.zbuffer_end = (
stbi_uc *) buffer + len;
3721 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
3722 if (outlen) *outlen = (int) (a.zout - a.zout_start);
3723 return a.zout_start;
3725 STBI_FREE(a.zout_start);
3733 a.zbuffer = (
stbi_uc *) ibuffer;
3734 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3735 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
3736 return (
int) (a.zout - a.zout_start);
3744 char *p = (
char *) stbi__malloc(16384);
3745 if (p == NULL)
return NULL;
3746 a.zbuffer = (
stbi_uc *) buffer;
3747 a.zbuffer_end = (
stbi_uc *) buffer+len;
3748 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
3749 if (outlen) *outlen = (int) (a.zout - a.zout_start);
3750 return a.zout_start;
3752 STBI_FREE(a.zout_start);
3760 a.zbuffer = (
stbi_uc *) ibuffer;
3761 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3762 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
3763 return (
int) (a.zout - a.zout_start);
3782 stbi__uint32 length;
3786 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
3789 c.length = stbi__get32be(s);
3790 c.type = stbi__get32be(s);
3794 static int stbi__check_png_header(stbi__context *s)
3796 static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
3798 for (i=0; i < 8; ++i)
3799 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
3806 stbi_uc *idata, *expanded, *out;
3821 static stbi_uc first_row_filter[5] =
3830 static int stbi__paeth(
int a,
int b,
int c)
3836 if (pa <= pb && pa <= pc)
return a;
3837 if (pb <= pc)
return b;
3841 static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
3844 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)
3846 stbi__context *s = a->s;
3847 stbi__uint32 i,j,stride = x*out_n;
3848 stbi__uint32 img_len, img_width_bytes;
3850 int img_n = s->img_n;
3852 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
3853 a->out = (
stbi_uc *) stbi__malloc(x * y * out_n);
3854 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
3856 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
3857 img_len = (img_width_bytes + 1) * y;
3858 if (s->img_x == x && s->img_y == y) {
3859 if (raw_len != img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
3861 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
3864 for (j=0; j < y; ++j) {
3865 stbi_uc *cur = a->out + stride*j;
3866 stbi_uc *prior = cur - stride;
3867 int filter = *raw++;
3868 int filter_bytes = img_n;
3871 return stbi__err(
"invalid filter",
"Corrupt PNG");
3875 cur += x*out_n - img_width_bytes;
3877 width = img_width_bytes;
3881 if (j == 0) filter = first_row_filter[filter];
3884 for (k=0; k < filter_bytes; ++k) {
3886 case STBI__F_none : cur[k] = raw[k];
break;
3887 case STBI__F_sub : cur[k] = raw[k];
break;
3888 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
3889 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
3890 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
3891 case STBI__F_avg_first : cur[k] = raw[k];
break;
3892 case STBI__F_paeth_first: cur[k] = raw[k];
break;
3909 if (depth < 8 || img_n == out_n) {
3910 int nk = (width - 1)*img_n;
3913 for (k=0; k < nk; ++k)
3916 case STBI__F_none: memcpy(cur, raw, nk);
break;
3917 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break;
3918 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
3919 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break;
3920 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break;
3921 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break;
3922 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break;
3930 for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
3931 for (k=0; k < img_n; ++k)
3933 CASE(STBI__F_none) cur[k] = raw[k]; break;
3934 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break;
3935 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
3936 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break;
3937 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;
3938 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break;
3939 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break;
3949 for (j=0; j < y; ++j) {
3950 stbi_uc *cur = a->out + stride*j;
3951 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
3954 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
3963 for (k=x*img_n; k >= 2; k-=2, ++in) {
3964 *cur++ = scale * ((*in >> 4) );
3965 *cur++ = scale * ((*in ) & 0x0f);
3967 if (k > 0) *cur++ = scale * ((*in >> 4) );
3968 }
else if (depth == 2) {
3969 for (k=x*img_n; k >= 4; k-=4, ++in) {
3970 *cur++ = scale * ((*in >> 6) );
3971 *cur++ = scale * ((*in >> 4) & 0x03);
3972 *cur++ = scale * ((*in >> 2) & 0x03);
3973 *cur++ = scale * ((*in ) & 0x03);
3975 if (k > 0) *cur++ = scale * ((*in >> 6) );
3976 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
3977 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
3978 }
else if (depth == 1) {
3979 for (k=x*img_n; k >= 8; k-=8, ++in) {
3980 *cur++ = scale * ((*in >> 7) );
3981 *cur++ = scale * ((*in >> 6) & 0x01);
3982 *cur++ = scale * ((*in >> 5) & 0x01);
3983 *cur++ = scale * ((*in >> 4) & 0x01);
3984 *cur++ = scale * ((*in >> 3) & 0x01);
3985 *cur++ =
scale * ((*in >> 2) & 0x01);
3986 *cur++ =
scale * ((*in >> 1) & 0x01);
3987 *cur++ =
scale * ((*in ) & 0x01);
3989 if (k > 0) *cur++ =
scale * ((*in >> 7) );
3990 if (k > 1) *cur++ =
scale * ((*in >> 6) & 0x01);
3991 if (k > 2) *cur++ =
scale * ((*in >> 5) & 0x01);
3992 if (k > 3) *cur++ =
scale * ((*in >> 4) & 0x01);
3993 if (k > 4) *cur++ =
scale * ((*in >> 3) & 0x01);
3994 if (k > 5) *cur++ =
scale * ((*in >> 2) & 0x01);
3995 if (k > 6) *cur++ =
scale * ((*in >> 1) & 0x01);
3997 if (img_n != out_n) {
3999 stbi_uc *cur = a->out + stride*j;
4002 for (i=x-1; i >= 0; --i) {
4004 cur[i*2+0] = cur[i];
4008 for (i=x-1; i >= 0; --i) {
4010 cur[i*4+2] = cur[i*3+2];
4011 cur[i*4+1] = cur[i*3+1];
4012 cur[i*4+0] = cur[i*3+0];
4022 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)
4027 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4030 final = (
stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
4031 for (p=0; p < 7; ++p) {
4032 int xorig[] = { 0,4,0,2,0,1,0 };
4033 int yorig[] = { 0,0,4,0,2,0,1 };
4034 int xspc[] = { 8,8,4,4,2,2,1 };
4035 int yspc[] = { 8,8,8,4,4,2,2 };
4038 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4039 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4041 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4042 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4046 for (j=0; j < y; ++j) {
4047 for (i=0; i < x; ++i) {
4048 int out_y = j*yspc[p]+yorig[p];
4049 int out_x = i*xspc[p]+xorig[p];
4050 memcpy(
final + out_y*a->s->img_x*out_n + out_x*out_n,
4051 a->out + (j*x+i)*out_n, out_n);
4055 image_data += img_len;
4056 image_data_len -= img_len;
4064 static int stbi__compute_transparency(stbi__png *z,
stbi_uc tc[3],
int out_n)
4066 stbi__context *s = z->s;
4067 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4075 for (i=0; i < pixel_count; ++i) {
4076 p[1] = (p[0] == tc[0] ? 0 : 255);
4080 for (i=0; i < pixel_count; ++i) {
4081 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4089 static int stbi__expand_png_palette(stbi__png *a,
stbi_uc *palette,
int len,
int pal_img_n)
4091 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4092 stbi_uc *p, *temp_out, *orig = a->out;
4094 p = (
stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
4095 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4100 if (pal_img_n == 3) {
4101 for (i=0; i < pixel_count; ++i) {
4104 p[1] = palette[n+1];
4105 p[2] = palette[n+2];
4109 for (i=0; i < pixel_count; ++i) {
4112 p[1] = palette[n+1];
4113 p[2] = palette[n+2];
4114 p[3] = palette[n+3];
4126 static int stbi__unpremultiply_on_load = 0;
4127 static int stbi__de_iphone_flag = 0;
4131 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4136 stbi__de_iphone_flag = flag_true_if_should_convert;
4139 static void stbi__de_iphone(stbi__png *z)
4141 stbi__context *s = z->s;
4142 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4145 if (s->img_out_n == 3) {
4146 for (i=0; i < pixel_count; ++i) {
4154 if (stbi__unpremultiply_on_load) {
4156 for (i=0; i < pixel_count; ++i) {
4160 p[0] = p[2] * 255 / a;
4161 p[1] = p[1] * 255 / a;
4171 for (i=0; i < pixel_count; ++i) {
4181 #define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
4183 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
4185 stbi_uc palette[1024], pal_img_n=0;
4187 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4188 int first=1,k,interlace=0, color=0, depth=0, is_iphone=0;
4189 stbi__context *s = z->s;
4195 if (!stbi__check_png_header(s))
return 0;
4197 if (scan == STBI__SCAN_type)
return 1;
4200 stbi__pngchunk c = stbi__get_chunk_header(s);
4202 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4204 stbi__skip(s, c.length);
4206 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4208 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4210 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4211 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4212 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4213 depth = stbi__get8(s);
if (depth != 1 && depth != 2 && depth != 4 && depth != 8)
return stbi__err(
"1/2/4/8-bit only",
"PNG not supported: 1/2/4/8-bit only");
4214 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4215 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4216 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4217 filter= stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4218 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4219 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4221 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4222 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4223 if (scan == STBI__SCAN_header)
return 1;
4228 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4234 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4235 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4236 if (c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4237 pal_len = c.length / 3;
4238 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4239 for (i=0; i < pal_len; ++i) {
4240 palette[i*4+0] = stbi__get8(s);
4241 palette[i*4+1] = stbi__get8(s);
4242 palette[i*4+2] = stbi__get8(s);
4243 palette[i*4+3] = 255;
4248 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4249 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4250 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4252 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4253 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4254 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4256 for (i=0; i < c.length; ++i)
4257 palette[i*4+3] = stbi__get8(s);
4259 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4260 if (c.length != (stbi__uint32) s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4262 for (k=0; k < s->img_n; ++k)
4263 tc[k] = (
stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth];
4268 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4269 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4270 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4271 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4272 if (ioff + c.length > idata_limit) {
4274 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4275 while (ioff + c.length > idata_limit)
4277 p = (
stbi_uc *) STBI_REALLOC(z->idata, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4280 if (!stbi__getn(s, z->idata+ioff,c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4285 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4286 stbi__uint32 raw_len, bpl;
4287 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4288 if (scan != STBI__SCAN_load)
return 1;
4289 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4291 bpl = (s->img_x * depth + 7) / 8;
4292 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4294 if (z->expanded == NULL)
return 0;
4295 STBI_FREE(z->idata); z->idata = NULL;
4296 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
4297 s->img_out_n = s->img_n+1;
4299 s->img_out_n = s->img_n;
4300 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace))
return 0;
4302 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4303 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4307 s->img_n = pal_img_n;
4308 s->img_out_n = pal_img_n;
4309 if (req_comp >= 3) s->img_out_n = req_comp;
4310 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4313 STBI_FREE(z->expanded); z->expanded = NULL;
4319 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4320 if ((c.type & (1 << 29)) == 0) {
4321 #ifndef STBI_NO_FAILURE_STRINGS
4323 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4324 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4325 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4326 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4327 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4329 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4331 stbi__skip(s, c.length);
4339 static unsigned char *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp)
4341 unsigned char *result=NULL;
4342 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4343 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4346 if (req_comp && req_comp != p->s->img_out_n) {
4347 result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4348 p->s->img_out_n = req_comp;
4349 if (result == NULL)
return result;
4353 if (n) *n = p->s->img_out_n;
4355 STBI_FREE(p->out); p->out = NULL;
4356 STBI_FREE(p->expanded); p->expanded = NULL;
4357 STBI_FREE(p->idata); p->idata = NULL;
4362 static unsigned char *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4366 return stbi__do_png(&p, x,y,comp,req_comp);
4369 static int stbi__png_test(stbi__context *s)
4372 r = stbi__check_png_header(s);
4377 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
4379 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
4380 stbi__rewind( p->s );
4383 if (x) *x = p->s->img_x;
4384 if (y) *y = p->s->img_y;
4385 if (comp) *comp = p->s->img_n;
4389 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
4393 return stbi__png_info_raw(&p, x, y, comp);
4400 static int stbi__bmp_test_raw(stbi__context *s)
4404 if (stbi__get8(s) !=
'B')
return 0;
4405 if (stbi__get8(s) !=
'M')
return 0;
4410 sz = stbi__get32le(s);
4411 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4415 static int stbi__bmp_test(stbi__context *s)
4417 int r = stbi__bmp_test_raw(s);
4424 static int stbi__high_bit(
unsigned int z)
4427 if (z == 0)
return -1;
4428 if (z >= 0x10000) n += 16, z >>= 16;
4429 if (z >= 0x00100) n += 8, z >>= 8;
4430 if (z >= 0x00010) n += 4, z >>= 4;
4431 if (z >= 0x00004) n += 2, z >>= 2;
4432 if (z >= 0x00002) n += 1, z >>= 1;
4436 static int stbi__bitcount(
unsigned int a)
4438 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
4439 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
4440 a = (a + (a >> 4)) & 0x0f0f0f0f;
4442 a = (a + (a >> 16));
4446 static int stbi__shiftsigned(
int v,
int shift,
int bits)
4451 if (shift < 0) v <<= -shift;
4463 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4466 unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0;
4468 int psize=0,i,j,compress=0,width;
4469 int bpp, flip_vertically, pad, target, offset, hsz;
4470 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
4474 offset = stbi__get32le(s);
4475 hsz = stbi__get32le(s);
4476 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
4478 s->img_x = stbi__get16le(s);
4479 s->img_y = stbi__get16le(s);
4481 s->img_x = stbi__get32le(s);
4482 s->img_y = stbi__get32le(s);
4484 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
4485 bpp = stbi__get16le(s);
4486 if (bpp == 1)
return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
4487 flip_vertically = ((int) s->img_y) > 0;
4488 s->img_y = abs((
int) s->img_y);
4491 psize = (offset - 14 - 24) / 3;
4493 compress = stbi__get32le(s);
4494 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
4500 if (hsz == 40 || hsz == 56) {
4507 if (bpp == 16 || bpp == 32) {
4509 if (compress == 0) {
4516 STBI_NOTUSED(fake_a);
4522 }
else if (compress == 3) {
4523 mr = stbi__get32le(s);
4524 mg = stbi__get32le(s);
4525 mb = stbi__get32le(s);
4527 if (mr == mg && mg == mb) {
4529 return stbi__errpuc(
"bad BMP",
"bad BMP");
4532 return stbi__errpuc(
"bad BMP",
"bad BMP");
4536 mr = stbi__get32le(s);
4537 mg = stbi__get32le(s);
4538 mb = stbi__get32le(s);
4539 ma = stbi__get32le(s);
4541 for (i=0; i < 12; ++i)
4551 psize = (offset - 14 - hsz) >> 2;
4553 s->img_n = ma ? 4 : 3;
4554 if (req_comp && req_comp >= 3)
4558 out = (
stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);
4559 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
4562 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
4563 for (i=0; i < psize; ++i) {
4564 pal[i][2] = stbi__get8(s);
4565 pal[i][1] = stbi__get8(s);
4566 pal[i][0] = stbi__get8(s);
4567 if (hsz != 12) stbi__get8(s);
4570 stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
4571 if (bpp == 4) width = (s->img_x + 1) >> 1;
4572 else if (bpp == 8) width = s->img_x;
4573 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
4575 for (j=0; j < (int) s->img_y; ++j) {
4576 for (i=0; i < (int) s->img_x; i += 2) {
4577 int v=stbi__get8(s),v2=0;
4582 out[z++] = pal[v][0];
4583 out[z++] = pal[v][1];
4584 out[z++] = pal[v][2];
4585 if (target == 4) out[z++] = 255;
4586 if (i+1 == (
int) s->img_x)
break;
4587 v = (bpp == 8) ? stbi__get8(s) : v2;
4588 out[z++] = pal[v][0];
4589 out[z++] = pal[v][1];
4590 out[z++] = pal[v][2];
4591 if (target == 4) out[z++] = 255;
4596 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
4599 stbi__skip(s, offset - 14 - hsz);
4600 if (bpp == 24) width = 3 * s->img_x;
4601 else if (bpp == 16) width = 2*s->img_x;
4606 }
else if (bpp == 32) {
4607 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
4611 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
4613 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
4614 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
4615 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
4616 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
4618 for (j=0; j < (int) s->img_y; ++j) {
4620 for (i=0; i < (int) s->img_x; ++i) {
4622 out[z+2] = stbi__get8(s);
4623 out[z+1] = stbi__get8(s);
4624 out[z+0] = stbi__get8(s);
4626 a = (easy == 2 ? stbi__get8(s) : 255);
4627 if (target == 4) out[z++] = a;
4630 for (i=0; i < (int) s->img_x; ++i) {
4631 stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s));
4633 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
4634 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
4635 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
4636 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
4637 if (target == 4) out[z++] = STBI__BYTECAST(a);
4643 if (flip_vertically) {
4645 for (j=0; j < (int) s->img_y>>1; ++j) {
4646 stbi_uc *p1 = out + j *s->img_x*target;
4647 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
4648 for (i=0; i < (int) s->img_x*target; ++i) {
4649 t = p1[i], p1[i] = p2[i], p2[i] = t;
4654 if (req_comp && req_comp != target) {
4655 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
4656 if (out == NULL)
return out;
4661 if (comp) *comp = s->img_n;
4669 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
4671 int tga_w, tga_h, tga_comp;
4681 if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11))
return 0;
4683 tga_w = stbi__get16le(s);
4688 tga_h = stbi__get16le(s);
4695 if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
4702 if (comp) *comp = tga_comp / 8;
4706 static int stbi__tga_test(stbi__context *s)
4712 if ( sz > 1 )
return 0;
4714 if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) )
return 0;
4720 if ( stbi__get16be(s) < 1 )
return 0;
4721 if ( stbi__get16be(s) < 1 )
return 0;
4723 if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )
4731 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4734 int tga_offset = stbi__get8(s);
4735 int tga_indexed = stbi__get8(s);
4736 int tga_image_type = stbi__get8(s);
4738 int tga_palette_start = stbi__get16le(s);
4739 int tga_palette_len = stbi__get16le(s);
4740 int tga_palette_bits = stbi__get8(s);
4741 int tga_x_origin = stbi__get16le(s);
4742 int tga_y_origin = stbi__get16le(s);
4743 int tga_width = stbi__get16le(s);
4744 int tga_height = stbi__get16le(s);
4745 int tga_bits_per_pixel = stbi__get8(s);
4746 int tga_comp = tga_bits_per_pixel / 8;
4747 int tga_inverted = stbi__get8(s);
4749 unsigned char *tga_data;
4750 unsigned char *tga_palette = NULL;
4752 unsigned char raw_data[4];
4754 int RLE_repeating = 0;
4755 int read_next_pixel = 1;
4758 if ( tga_image_type >= 8 )
4760 tga_image_type -= 8;
4764 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
4768 (tga_width < 1) || (tga_height < 1) ||
4769 (tga_image_type < 1) || (tga_image_type > 3) ||
4770 ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
4771 (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
4780 tga_comp = tga_palette_bits / 8;
4786 if (comp) *comp = tga_comp;
4788 tga_data = (
unsigned char*)stbi__malloc( tga_width * tga_height * tga_comp );
4789 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
4792 stbi__skip(s, tga_offset );
4794 if ( !tga_indexed && !tga_is_RLE) {
4795 for (i=0; i < tga_height; ++i) {
4796 int y = tga_inverted ? tga_height -i - 1 : i;
4797 stbi_uc *tga_row = tga_data + y*tga_width*tga_comp;
4798 stbi__getn(s, tga_row, tga_width * tga_comp);
4805 stbi__skip(s, tga_palette_start );
4807 tga_palette = (
unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );
4809 STBI_FREE(tga_data);
4810 return stbi__errpuc(
"outofmem",
"Out of memory");
4812 if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
4813 STBI_FREE(tga_data);
4814 STBI_FREE(tga_palette);
4815 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
4819 for (i=0; i < tga_width * tga_height; ++i)
4824 if ( RLE_count == 0 )
4827 int RLE_cmd = stbi__get8(s);
4828 RLE_count = 1 + (RLE_cmd & 127);
4829 RLE_repeating = RLE_cmd >> 7;
4830 read_next_pixel = 1;
4831 }
else if ( !RLE_repeating )
4833 read_next_pixel = 1;
4837 read_next_pixel = 1;
4840 if ( read_next_pixel )
4846 int pal_idx = stbi__get8(s);
4847 if ( pal_idx >= tga_palette_len )
4852 pal_idx *= tga_bits_per_pixel / 8;
4853 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
4855 raw_data[j] = tga_palette[pal_idx+j];
4860 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
4862 raw_data[j] = stbi__get8(s);
4866 read_next_pixel = 0;
4870 for (j = 0; j < tga_comp; ++j)
4871 tga_data[i*tga_comp+j] = raw_data[j];
4879 for (j = 0; j*2 < tga_height; ++j)
4881 int index1 = j * tga_width * tga_comp;
4882 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
4883 for (i = tga_width * tga_comp; i > 0; --i)
4885 unsigned char temp = tga_data[index1];
4886 tga_data[index1] = tga_data[index2];
4887 tga_data[index2] = temp;
4894 if ( tga_palette != NULL )
4896 STBI_FREE( tga_palette );
4903 unsigned char* tga_pixel = tga_data;
4904 for (i=0; i < tga_width * tga_height; ++i)
4906 unsigned char temp = tga_pixel[0];
4907 tga_pixel[0] = tga_pixel[2];
4908 tga_pixel[2] = temp;
4909 tga_pixel += tga_comp;
4914 if (req_comp && req_comp != tga_comp)
4915 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
4919 tga_palette_start = tga_palette_len = tga_palette_bits =
4920 tga_x_origin = tga_y_origin = 0;
4930 static int stbi__psd_test(stbi__context *s)
4932 int r = (stbi__get32be(s) == 0x38425053);
4937 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4940 int channelCount, compression;
4941 int channel, i, count, len;
4946 if (stbi__get32be(s) != 0x38425053)
4947 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
4950 if (stbi__get16be(s) != 1)
4951 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
4957 channelCount = stbi__get16be(s);
4958 if (channelCount < 0 || channelCount > 16)
4959 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
4962 h = stbi__get32be(s);
4963 w = stbi__get32be(s);
4966 if (stbi__get16be(s) != 8)
4967 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 bit");
4979 if (stbi__get16be(s) != 3)
4980 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
4983 stbi__skip(s,stbi__get32be(s) );
4986 stbi__skip(s, stbi__get32be(s) );
4989 stbi__skip(s, stbi__get32be(s) );
4995 compression = stbi__get16be(s);
4996 if (compression > 1)
4997 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5000 out = (
stbi_uc *) stbi__malloc(4 * w*h);
5001 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5019 stbi__skip(s, h * channelCount * 2 );
5022 for (channel = 0; channel < 4; channel++) {
5026 if (channel >= channelCount) {
5028 for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;
5032 while (count < pixelCount) {
5033 len = stbi__get8(s);
5036 }
else if (len < 128) {
5045 }
else if (len > 128) {
5051 val = stbi__get8(s);
5068 for (channel = 0; channel < 4; channel++) {
5072 if (channel > channelCount) {
5074 for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;
5077 for (i = 0; i < pixelCount; i++)
5078 *p = stbi__get8(s), p += 4;
5083 if (req_comp && req_comp != 4) {
5084 out = stbi__convert_format(out, 4, req_comp, w, h);
5085 if (out == NULL)
return out;
5088 if (comp) *comp = channelCount;
5104 static int stbi__pic_is4(stbi__context *s,
const char *str)
5108 if (stbi__get8(s) != (
stbi_uc)str[i])
5114 static int stbi__pic_test_core(stbi__context *s)
5118 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
5124 if (!stbi__pic_is4(s,
"PICT"))
5135 static stbi_uc *stbi__readval(stbi__context *s,
int channel,
stbi_uc *dest)
5139 for (i=0; i<4; ++i, mask>>=1) {
5140 if (channel & mask) {
5141 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
5142 dest[i]=stbi__get8(s);
5149 static void stbi__copyval(
int channel,
stbi_uc *dest,
const stbi_uc *src)
5153 for (i=0;i<4; ++i, mask>>=1)
5158 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp,
stbi_uc *result)
5160 int act_comp=0,num_packets=0,y,chained;
5161 stbi__pic_packet packets[10];
5166 stbi__pic_packet *packet;
5168 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
5169 return stbi__errpuc(
"bad format",
"too many packets");
5171 packet = &packets[num_packets++];
5173 chained = stbi__get8(s);
5174 packet->size = stbi__get8(s);
5175 packet->type = stbi__get8(s);
5176 packet->channel = stbi__get8(s);
5178 act_comp |= packet->channel;
5180 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
5181 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
5184 *comp = (act_comp & 0x10 ? 4 : 3);
5186 for(y=0; y<height; ++y) {
5189 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
5190 stbi__pic_packet *packet = &packets[packet_idx];
5191 stbi_uc *dest = result+y*width*4;
5193 switch (packet->type) {
5195 return stbi__errpuc(
"bad format",
"packet has bad compression type");
5200 for(x=0;x<width;++x, dest+=4)
5201 if (!stbi__readval(s,packet->channel,dest))
5213 count=stbi__get8(s);
5214 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
5219 if (!stbi__readval(s,packet->channel,value))
return 0;
5221 for(i=0; i<count; ++i,dest+=4)
5222 stbi__copyval(packet->channel,dest,value);
5231 int count = stbi__get8(s), i;
5232 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
5239 count = stbi__get16be(s);
5243 return stbi__errpuc(
"bad file",
"scanline overrun");
5245 if (!stbi__readval(s,packet->channel,value))
5248 for(i=0;i<count;++i, dest += 4)
5249 stbi__copyval(packet->channel,dest,value);
5252 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
5254 for(i=0;i<count;++i, dest+=4)
5255 if (!stbi__readval(s,packet->channel,dest))
5269 static stbi_uc *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp)
5274 for (i=0; i<92; ++i)
5277 x = stbi__get16be(s);
5278 y = stbi__get16be(s);
5279 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
5280 if ((1 << 28) / x < y)
return stbi__errpuc(
"too large",
"Image too large to decode");
5287 result = (
stbi_uc *) stbi__malloc(x*y*4);
5288 memset(result, 0xff, x*y*4);
5290 if (!stbi__pic_load_core(s,x,y,comp, result)) {
5296 if (req_comp == 0) req_comp = *comp;
5297 result=stbi__convert_format(result,4,req_comp,x,y);
5302 static int stbi__pic_test(stbi__context *s)
5304 int r = stbi__pic_test_core(s);
5325 int flags, bgindex, ratio, transparent, eflags;
5328 stbi__gif_lzw codes[4096];
5332 int start_x, start_y;
5338 static int stbi__gif_test_raw(stbi__context *s)
5341 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
5343 if (sz !=
'9' && sz !=
'7')
return 0;
5344 if (stbi__get8(s) !=
'a')
return 0;
5348 static int stbi__gif_test(stbi__context *s)
5350 int r = stbi__gif_test_raw(s);
5355 static void stbi__gif_parse_colortable(stbi__context *s,
stbi_uc pal[256][4],
int num_entries,
int transp)
5358 for (i=0; i < num_entries; ++i) {
5359 pal[i][2] = stbi__get8(s);
5360 pal[i][1] = stbi__get8(s);
5361 pal[i][0] = stbi__get8(s);
5362 pal[i][3] = transp == i ? 0 : 255;
5366 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
5369 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
5370 return stbi__err(
"not GIF",
"Corrupt GIF");
5372 version = stbi__get8(s);
5373 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
5374 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
5376 stbi__g_failure_reason =
"";
5377 g->w = stbi__get16le(s);
5378 g->h = stbi__get16le(s);
5379 g->flags = stbi__get8(s);
5380 g->bgindex = stbi__get8(s);
5381 g->ratio = stbi__get8(s);
5382 g->transparent = -1;
5384 if (comp != 0) *comp = 4;
5386 if (is_info)
return 1;
5388 if (g->flags & 0x80)
5389 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
5394 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
5397 if (!stbi__gif_header(s, &g, comp, 1)) {
5406 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
5412 if (g->codes[code].prefix >= 0)
5413 stbi__out_gif_code(g, g->codes[code].prefix);
5415 if (g->cur_y >= g->max_y)
return;
5417 p = &g->out[g->cur_x + g->cur_y];
5418 c = &g->color_table[g->codes[code].suffix * 4];
5428 if (g->cur_x >= g->max_x) {
5429 g->cur_x = g->start_x;
5430 g->cur_y += g->step;
5432 while (g->cur_y >= g->max_y && g->parse > 0) {
5433 g->step = (1 << g->parse) * g->line_size;
5434 g->cur_y = g->start_y + (g->step >> 1);
5440 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
5443 stbi__int32 len, code;
5445 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
5448 lzw_cs = stbi__get8(s);
5449 clear = 1 << lzw_cs;
5451 codesize = lzw_cs + 1;
5452 codemask = (1 << codesize) - 1;
5455 for (code = 0; code < clear; code++) {
5456 g->codes[code].prefix = -1;
5457 g->codes[code].first = (
stbi_uc) code;
5458 g->codes[code].suffix = (
stbi_uc) code;
5467 if (valid_bits < codesize) {
5469 len = stbi__get8(s);
5474 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
5477 stbi__int32 code = bits & codemask;
5479 valid_bits -= codesize;
5481 if (code == clear) {
5482 codesize = lzw_cs + 1;
5483 codemask = (1 << codesize) - 1;
5487 }
else if (code == clear + 1) {
5489 while ((len = stbi__get8(s)) > 0)
5492 }
else if (code <= avail) {
5493 if (first)
return stbi__errpuc(
"no clear code",
"Corrupt GIF");
5496 p = &g->codes[avail++];
5497 if (avail > 4096)
return stbi__errpuc(
"too many codes",
"Corrupt GIF");
5498 p->prefix = (stbi__int16) oldcode;
5499 p->first = g->codes[oldcode].first;
5500 p->suffix = (code == avail) ? p->first : g->codes[code].first;
5501 }
else if (code == avail)
5502 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5504 stbi__out_gif_code(g, (stbi__uint16) code);
5506 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
5508 codemask = (1 << codesize) - 1;
5513 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5519 static void stbi__fill_gif_background(stbi__gif *g)
5522 stbi_uc *c = g->pal[g->bgindex];
5524 for (i = 0; i < g->w * g->h * 4; i += 4) {
5534 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp)
5540 if (!stbi__gif_header(s, g, comp,0))
return 0;
5541 g->out = (
stbi_uc *) stbi__malloc(4 * g->w * g->h);
5542 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5543 stbi__fill_gif_background(g);
5546 if (((g->eflags & 0x1C) >> 2) == 3) {
5548 g->out = (
stbi_uc *) stbi__malloc(4 * g->w * g->h);
5549 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5550 memcpy(g->out, old_out, g->w*g->h*4);
5555 switch (stbi__get8(s)) {
5558 stbi__int32 x, y, w, h;
5561 x = stbi__get16le(s);
5562 y = stbi__get16le(s);
5563 w = stbi__get16le(s);
5564 h = stbi__get16le(s);
5565 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
5566 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
5568 g->line_size = g->w * 4;
5570 g->start_y = y * g->line_size;
5571 g->max_x = g->start_x + w * 4;
5572 g->max_y = g->start_y + h * g->line_size;
5573 g->cur_x = g->start_x;
5574 g->cur_y = g->start_y;
5576 g->lflags = stbi__get8(s);
5578 if (g->lflags & 0x40) {
5579 g->step = 8 * g->line_size;
5582 g->step = g->line_size;
5586 if (g->lflags & 0x80) {
5587 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
5588 g->color_table = (
stbi_uc *) g->lpal;
5589 }
else if (g->flags & 0x80) {
5590 for (i=0; i < 256; ++i)
5592 if (g->transparent >= 0 && (g->eflags & 0x01))
5593 g->pal[g->transparent][3] = 0;
5594 g->color_table = (
stbi_uc *) g->pal;
5596 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
5598 o = stbi__process_gif_raster(s, g);
5599 if (o == NULL)
return NULL;
5601 if (req_comp && req_comp != 4)
5602 o = stbi__convert_format(o, 4, req_comp, g->w, g->h);
5609 if (stbi__get8(s) == 0xF9) {
5610 len = stbi__get8(s);
5612 g->eflags = stbi__get8(s);
5614 g->transparent = stbi__get8(s);
5620 while ((len = stbi__get8(s)) != 0)
5629 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
5634 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5638 memset(&g, 0,
sizeof(g));
5640 u = stbi__gif_load_next(s, &g, comp, req_comp);
5641 if (u == (
stbi_uc *) s) u = 0;
5650 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
5652 return stbi__gif_info_raw(s,x,y,comp);
5660 static int stbi__hdr_test_core(stbi__context *s)
5662 const char *signature =
"#?RADIANCE\n";
5664 for (i=0; signature[i]; ++i)
5665 if (stbi__get8(s) != signature[i])
5670 static int stbi__hdr_test(stbi__context* s)
5672 int r = stbi__hdr_test_core(s);
5677 #define STBI__HDR_BUFLEN 1024
5678 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
5683 c = (char) stbi__get8(z);
5685 while (!stbi__at_eof(z) && c !=
'\n') {
5687 if (len == STBI__HDR_BUFLEN-1) {
5689 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
5693 c = (char) stbi__get8(z);
5700 static void stbi__hdr_convert(
float *output,
stbi_uc *input,
int req_comp)
5702 if ( input[3] != 0 ) {
5705 f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
5707 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
5709 output[0] = input[0] *
f1;
5710 output[1] = input[1] *
f1;
5711 output[2] = input[2] *
f1;
5713 if (req_comp == 2) output[1] = 1;
5714 if (req_comp == 4) output[3] = 1;
5717 case 4: output[3] = 1;
5718 case 3: output[0] = output[1] = output[2] = 0;
5720 case 2: output[1] = 1;
5721 case 1: output[0] = 0;
5727 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5729 char buffer[STBI__HDR_BUFLEN];
5736 unsigned char count, value;
5737 int i, j, k, c1,c2, z;
5741 if (strcmp(stbi__hdr_gettoken(s,buffer),
"#?RADIANCE") != 0)
5742 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
5746 token = stbi__hdr_gettoken(s,buffer);
5747 if (token[0] == 0)
break;
5748 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5751 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
5755 token = stbi__hdr_gettoken(s,buffer);
5756 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5758 height = (int) strtol(token, &token, 10);
5759 while (*token ==
' ') ++token;
5760 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5762 width = (int) strtol(token, NULL, 10);
5767 if (comp) *comp = 3;
5768 if (req_comp == 0) req_comp = 3;
5771 hdr_data = (
float *) stbi__malloc(height * width * req_comp *
sizeof(
float));
5775 if ( width < 8 || width >= 32768) {
5777 for (j=0; j < height; ++j) {
5778 for (i=0; i < width; ++i) {
5781 stbi__getn(s, rgbe, 4);
5782 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
5789 for (j = 0; j < height; ++j) {
5792 len = stbi__get8(s);
5793 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
5800 rgbe[3] = (
stbi_uc) stbi__get8(s);
5801 stbi__hdr_convert(hdr_data, rgbe, req_comp);
5804 STBI_FREE(scanline);
5805 goto main_decode_loop;
5808 len |= stbi__get8(s);
5809 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
5810 if (scanline == NULL) scanline = (
stbi_uc *) stbi__malloc(width * 4);
5812 for (k = 0; k < 4; ++k) {
5815 count = stbi__get8(s);
5818 value = stbi__get8(s);
5820 for (z = 0; z < count; ++z)
5821 scanline[i++ * 4 + k] = value;
5824 for (z = 0; z < count; ++z)
5825 scanline[i++ * 4 + k] = stbi__get8(s);
5829 for (i=0; i < width; ++i)
5830 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
5832 STBI_FREE(scanline);
5838 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
5840 char buffer[STBI__HDR_BUFLEN];
5844 if (strcmp(stbi__hdr_gettoken(s,buffer),
"#?RADIANCE") != 0) {
5850 token = stbi__hdr_gettoken(s,buffer);
5851 if (token[0] == 0)
break;
5852 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5859 token = stbi__hdr_gettoken(s,buffer);
5860 if (strncmp(token,
"-Y ", 3)) {
5865 *y = (int) strtol(token, &token, 10);
5866 while (*token ==
' ') ++token;
5867 if (strncmp(token,
"+X ", 3)) {
5872 *x = (int) strtol(token, NULL, 10);
5876 #endif // STBI_NO_HDR
5879 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
5882 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M') {
5887 hsz = stbi__get32le(s);
5888 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
5893 *x = stbi__get16le(s);
5894 *y = stbi__get16le(s);
5896 *x = stbi__get32le(s);
5897 *y = stbi__get32le(s);
5899 if (stbi__get16le(s) != 1) {
5903 *comp = stbi__get16le(s) / 8;
5909 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
5912 if (stbi__get32be(s) != 0x38425053) {
5916 if (stbi__get16be(s) != 1) {
5921 channelCount = stbi__get16be(s);
5922 if (channelCount < 0 || channelCount > 16) {
5926 *y = stbi__get32be(s);
5927 *x = stbi__get32be(s);
5928 if (stbi__get16be(s) != 8) {
5932 if (stbi__get16be(s) != 3) {
5942 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
5944 int act_comp=0,num_packets=0,chained;
5945 stbi__pic_packet packets[10];
5949 *x = stbi__get16be(s);
5950 *y = stbi__get16be(s);
5951 if (stbi__at_eof(s))
return 0;
5952 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
5960 stbi__pic_packet *packet;
5962 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
5965 packet = &packets[num_packets++];
5966 chained = stbi__get8(s);
5967 packet->size = stbi__get8(s);
5968 packet->type = stbi__get8(s);
5969 packet->channel = stbi__get8(s);
5970 act_comp |= packet->channel;
5972 if (stbi__at_eof(s)) {
5976 if (packet->size != 8) {
5982 *comp = (act_comp & 0x10 ? 4 : 3);
6002 static int stbi__pnm_test(stbi__context *s)
6005 p = (char) stbi__get8(s);
6006 t = (char) stbi__get8(s);
6007 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6014 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
6017 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
6023 out = (
stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y);
6024 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6025 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
6027 if (req_comp && req_comp != s->img_n) {
6028 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
6029 if (out == NULL)
return out;
6034 static int stbi__pnm_isspace(
char c)
6036 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
6039 static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
6041 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
6042 *c = (char) stbi__get8(s);
6045 static int stbi__pnm_isdigit(
char c)
6047 return c >=
'0' && c <=
'9';
6050 static int stbi__pnm_getinteger(stbi__context *s,
char *c)
6054 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
6055 value = value*10 + (*c -
'0');
6056 *c = (char) stbi__get8(s);
6062 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
6070 p = (char) stbi__get8(s);
6071 t = (char) stbi__get8(s);
6072 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6077 *comp = (t ==
'6') ? 3 : 1;
6079 c = (char) stbi__get8(s);
6080 stbi__pnm_skip_whitespace(s, &c);
6082 *x = stbi__pnm_getinteger(s, &c);
6083 stbi__pnm_skip_whitespace(s, &c);
6085 *y = stbi__pnm_getinteger(s, &c);
6086 stbi__pnm_skip_whitespace(s, &c);
6088 maxv = stbi__pnm_getinteger(s, &c);
6091 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
6097 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
6099 #ifndef STBI_NO_JPEG
6100 if (stbi__jpeg_info(s, x, y, comp))
return 1;
6104 if (stbi__png_info(s, x, y, comp))
return 1;
6108 if (stbi__gif_info(s, x, y, comp))
return 1;
6112 if (stbi__bmp_info(s, x, y, comp))
return 1;
6116 if (stbi__psd_info(s, x, y, comp))
return 1;
6120 if (stbi__pic_info(s, x, y, comp))
return 1;
6124 if (stbi__pnm_info(s, x, y, comp))
return 1;
6128 if (stbi__hdr_info(s, x, y, comp))
return 1;
6133 if (stbi__tga_info(s, x, y, comp))
6136 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
6139 #ifndef STBI_NO_STDIO
6142 FILE *f = stbi__fopen(filename,
"rb");
6144 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
6154 long pos = ftell(f);
6155 stbi__start_file(&s, f);
6156 r = stbi__info_main(&s,x,y,comp);
6157 fseek(f,pos,SEEK_SET);
6160 #endif // !STBI_NO_STDIO
6165 stbi__start_mem(&s,buffer,len);
6166 return stbi__info_main(&s,x,y,comp);
6173 return stbi__info_main(&s,x,y,comp);
6176 #endif // STB_IMAGE_IMPLEMENTATION
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)
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
STBIDEF const char * stbi_failure_reason(void)
STBIDEF void stbi_hdr_to_ldr_scale(float scale)
STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
STBIDEF float * stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
STBIDEF float * stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma)
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)
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp)
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)
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)
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)