214 #ifndef STBI_INCLUDE_STB_IMAGE_H 215 #define STBI_INCLUDE_STB_IMAGE_H 387 #ifndef STBI_NO_STDIO 389 #endif // STBI_NO_STDIO 391 #define STBI_VERSION 1 409 #ifdef STB_IMAGE_STATIC 410 #define STBIDEF static 412 #define STBIDEF extern 435 #ifndef STBI_NO_STDIO 440 #ifndef STBI_NO_LINEAR 445 #ifndef STBI_NO_STDIO 455 #ifndef STBI_NO_LINEAR 458 #endif // STBI_NO_HDR 463 #ifndef STBI_NO_STDIO 466 #endif // STBI_NO_STDIO 480 #ifndef STBI_NO_STDIO 518 #endif // STBI_INCLUDE_STB_IMAGE_H 520 #ifdef STB_IMAGE_IMPLEMENTATION 522 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ 523 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ 524 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ 525 || defined(STBI_ONLY_ZLIB) 526 #ifndef STBI_ONLY_JPEG 529 #ifndef STBI_ONLY_PNG 532 #ifndef STBI_ONLY_BMP 535 #ifndef STBI_ONLY_PSD 538 #ifndef STBI_ONLY_TGA 541 #ifndef STBI_ONLY_GIF 544 #ifndef STBI_ONLY_HDR 547 #ifndef STBI_ONLY_PIC 550 #ifndef STBI_ONLY_PNM 555 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) 565 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) 569 #ifndef STBI_NO_STDIO 575 #define STBI_ASSERT(x) assert(x) 581 #define stbi_inline inline 586 #define stbi_inline __forceinline 591 typedef unsigned short stbi__uint16;
592 typedef signed short stbi__int16;
593 typedef unsigned int stbi__uint32;
594 typedef signed int stbi__int32;
597 typedef uint16_t stbi__uint16;
598 typedef int16_t stbi__int16;
599 typedef uint32_t stbi__uint32;
600 typedef int32_t stbi__int32;
604 typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
607 #define STBI_NOTUSED(v) (void)(v) 609 #define STBI_NOTUSED(v) (void)sizeof(v) 613 #define STBI_HAS_LROTL 616 #ifdef STBI_HAS_LROTL 617 #define stbi_lrot(x,y) _lrotl(x,y) 619 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) 622 #if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC) 624 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) 627 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC." 631 #define STBI_MALLOC(sz) malloc(sz) 632 #define STBI_REALLOC(p,sz) realloc(p,sz) 633 #define STBI_FREE(p) free(p) 637 #if defined(__x86_64__) || defined(_M_X64) 638 #define STBI__X64_TARGET 639 #elif defined(__i386) || defined(_M_IX86) 640 #define STBI__X86_TARGET 643 #if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) 652 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) 667 #if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET) 669 #include <emmintrin.h> 673 #if _MSC_VER >= 1400 // not VC6 675 static int stbi__cpuid3(
void)
682 static int stbi__cpuid3(
void)
694 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name 696 static int stbi__sse2_available()
698 int info3 = stbi__cpuid3();
699 return ((info3 >> 26) & 1) != 0;
701 #else // assume GCC-style if not VC++ 702 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 704 static int stbi__sse2_available()
706 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later 708 return __builtin_cpu_supports(
"sse2");
719 #if defined(STBI_NO_SIMD) && defined(STBI_NEON) 724 #include <arm_neon.h> 726 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 729 #ifndef STBI_SIMD_ALIGN 730 #define STBI_SIMD_ALIGN(type, name) type name 741 stbi__uint32 img_x, img_y;
742 int img_n, img_out_n;
747 int read_from_callbacks;
751 stbi_uc *img_buffer, *img_buffer_end;
756 static void stbi__refill_buffer(stbi__context *
s);
762 s->read_from_callbacks = 0;
763 s->img_buffer = s->img_buffer_original = (
stbi_uc *) buffer;
764 s->img_buffer_end = (
stbi_uc *) buffer+len;
771 s->io_user_data = user;
772 s->buflen =
sizeof(s->buffer_start);
773 s->read_from_callbacks = 1;
774 s->img_buffer_original = s->buffer_start;
775 stbi__refill_buffer(s);
778 #ifndef STBI_NO_STDIO 780 static int stbi__stdio_read(
void *user,
char *
data,
int size)
782 return (
int) fread(data,1,size,(FILE*) user);
785 static void stbi__stdio_skip(
void *user,
int n)
787 fseek((FILE*) user, n, SEEK_CUR);
790 static int stbi__stdio_eof(
void *user)
792 return feof((FILE*) user);
802 static void stbi__start_file(stbi__context *
s, FILE *
f)
804 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *) f);
809 #endif // !STBI_NO_STDIO 811 static void stbi__rewind(stbi__context *s)
816 s->img_buffer = s->img_buffer_original;
820 static int stbi__jpeg_test(stbi__context *s);
821 static stbi_uc *stbi__jpeg_load(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp);
822 static int stbi__jpeg_info(stbi__context *s,
int *
x,
int *
y,
int *comp);
826 static int stbi__png_test(stbi__context *s);
827 static stbi_uc *stbi__png_load(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp);
828 static int stbi__png_info(stbi__context *s,
int *
x,
int *
y,
int *comp);
832 static int stbi__bmp_test(stbi__context *s);
833 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp);
834 static int stbi__bmp_info(stbi__context *s,
int *
x,
int *
y,
int *comp);
838 static int stbi__tga_test(stbi__context *s);
839 static stbi_uc *stbi__tga_load(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp);
840 static int stbi__tga_info(stbi__context *s,
int *
x,
int *
y,
int *comp);
844 static int stbi__psd_test(stbi__context *s);
845 static stbi_uc *stbi__psd_load(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp);
846 static int stbi__psd_info(stbi__context *s,
int *
x,
int *
y,
int *comp);
850 static int stbi__hdr_test(stbi__context *s);
851 static float *stbi__hdr_load(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp);
852 static int stbi__hdr_info(stbi__context *s,
int *
x,
int *
y,
int *comp);
856 static int stbi__pic_test(stbi__context *s);
857 static stbi_uc *stbi__pic_load(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp);
858 static int stbi__pic_info(stbi__context *s,
int *
x,
int *
y,
int *comp);
862 static int stbi__gif_test(stbi__context *s);
863 static stbi_uc *stbi__gif_load(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp);
864 static int stbi__gif_info(stbi__context *s,
int *
x,
int *
y,
int *comp);
868 static int stbi__pnm_test(stbi__context *s);
869 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp);
870 static int stbi__pnm_info(stbi__context *s,
int *
x,
int *
y,
int *comp);
874 static const char *stbi__g_failure_reason;
878 return stbi__g_failure_reason;
881 static int stbi__err(
const char *str)
883 stbi__g_failure_reason = str;
887 static void *stbi__malloc(
size_t size)
889 return STBI_MALLOC(size);
896 #ifdef STBI_NO_FAILURE_STRINGS 897 #define stbi__err(x,y) 0 898 #elif defined(STBI_FAILURE_USERMSG) 899 #define stbi__err(x,y) stbi__err(y) 901 #define stbi__err(x,y) stbi__err(x) 904 #define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL)) 905 #define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL)) 909 STBI_FREE(retval_from_stbi_load);
912 #ifndef STBI_NO_LINEAR 913 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp);
917 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp);
920 static int stbi__vertically_flip_on_load = 0;
924 stbi__vertically_flip_on_load = flag_true_if_should_flip;
927 static unsigned char *stbi__load_main(stbi__context *s,
int *
x,
int *
y,
int *comp,
int req_comp)
930 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s,x,y,comp,req_comp);
933 if (stbi__png_test(s))
return stbi__png_load(s,x,y,comp,req_comp);
936 if (stbi__bmp_test(s))
return stbi__bmp_load(s,x,y,comp,req_comp);
939 if (stbi__gif_test(s))
return stbi__gif_load(s,x,y,comp,req_comp);
942 if (stbi__psd_test(s))
return stbi__psd_load(s,x,y,comp,req_comp);
945 if (stbi__pic_test(s))
return stbi__pic_load(s,x,y,comp,req_comp);
948 if (stbi__pnm_test(s))
return stbi__pnm_load(s,x,y,comp,req_comp);
952 if (stbi__hdr_test(s)) {
953 float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);
954 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
960 if (stbi__tga_test(s))
961 return stbi__tga_load(s,x,y,comp,req_comp);
964 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
967 static unsigned char *stbi__load_flip(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
969 unsigned char *
result = stbi__load_main(s, x, y, comp, req_comp);
971 if (stbi__vertically_flip_on_load && result != NULL) {
973 int depth = req_comp ? req_comp : *comp;
979 for (col = 0; col <
w; col++) {
980 for (z = 0; z <
depth; z++) {
981 temp = result[(row * w + col) * depth + z];
982 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
983 result[((h - row - 1) * w + col) * depth +
z] = temp;
992 static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp)
994 if (stbi__vertically_flip_on_load && result != NULL) {
996 int depth = req_comp ? req_comp : *comp;
1002 for (col = 0; col <
w; col++) {
1003 for (z = 0; z <
depth; z++) {
1004 temp = result[(row * w + col) * depth + z];
1005 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
1006 result[((h - row - 1) * w + col) * depth +
z] = temp;
1014 #ifndef STBI_NO_STDIO 1016 static FILE *stbi__fopen(
char const *filename,
char const *
mode)
1019 #if defined(_MSC_VER) && _MSC_VER >= 1400 1020 if (0 != fopen_s(&f, filename, mode))
1023 f = fopen(filename, mode);
1031 FILE *f = stbi__fopen(filename,
"rb");
1033 if (!f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1043 stbi__start_file(&s,f);
1044 result = stbi__load_flip(&s,x,y,comp,req_comp);
1047 fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1056 stbi__start_mem(&s,buffer,len);
1057 return stbi__load_flip(&s,x,y,comp,req_comp);
1064 return stbi__load_flip(&s,x,y,comp,req_comp);
1067 #ifndef STBI_NO_LINEAR 1068 static float *stbi__loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1070 unsigned char *
data;
1072 if (stbi__hdr_test(s)) {
1073 float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp);
1075 stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1079 data = stbi__load_flip(s, x, y, comp, req_comp);
1081 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1082 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1088 stbi__start_mem(&s,buffer,len);
1089 return stbi__loadf_main(&s,x,y,comp,req_comp);
1096 return stbi__loadf_main(&s,x,y,comp,req_comp);
1099 #ifndef STBI_NO_STDIO 1100 STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1103 FILE *f = stbi__fopen(filename,
"rb");
1104 if (!f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1113 stbi__start_file(&s,f);
1114 return stbi__loadf_main(&s,x,y,comp,req_comp);
1116 #endif // !STBI_NO_STDIO 1118 #endif // !STBI_NO_LINEAR 1128 stbi__start_mem(&s,buffer,len);
1129 return stbi__hdr_test(&s);
1131 STBI_NOTUSED(buffer);
1137 #ifndef STBI_NO_STDIO 1140 FILE *f = stbi__fopen(filename,
"rb");
1153 stbi__start_file(&s,f);
1154 return stbi__hdr_test(&s);
1159 #endif // !STBI_NO_STDIO 1166 return stbi__hdr_test(&s);
1172 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1173 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1175 #ifndef STBI_NO_LINEAR 1196 static void stbi__refill_buffer(stbi__context *s)
1198 int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
1202 s->read_from_callbacks = 0;
1203 s->img_buffer = s->buffer_start;
1204 s->img_buffer_end = s->buffer_start+1;
1207 s->img_buffer = s->buffer_start;
1208 s->img_buffer_end = s->buffer_start +
n;
1212 stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1214 if (s->img_buffer < s->img_buffer_end)
1215 return *s->img_buffer++;
1216 if (s->read_from_callbacks) {
1217 stbi__refill_buffer(s);
1218 return *s->img_buffer++;
1223 stbi_inline
static int stbi__at_eof(stbi__context *s)
1226 if (!(s->io.eof)(s->io_user_data))
return 0;
1229 if (s->read_from_callbacks == 0)
return 1;
1232 return s->img_buffer >= s->img_buffer_end;
1235 static void stbi__skip(stbi__context *s,
int n)
1238 s->img_buffer = s->img_buffer_end;
1242 int blen = (
int) (s->img_buffer_end - s->img_buffer);
1244 s->img_buffer = s->img_buffer_end;
1245 (s->io.skip)(s->io_user_data, n - blen);
1252 static int stbi__getn(stbi__context *s,
stbi_uc *
buffer,
int n)
1255 int blen = (
int) (s->img_buffer_end - s->img_buffer);
1259 memcpy(buffer, s->img_buffer, blen);
1261 count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
1262 res = (count == (n-blen));
1263 s->img_buffer = s->img_buffer_end;
1268 if (s->img_buffer+
n <= s->img_buffer_end) {
1269 memcpy(buffer, s->img_buffer, n);
1276 static int stbi__get16be(stbi__context *s)
1278 int z = stbi__get8(s);
1279 return (z << 8) + stbi__get8(s);
1282 static stbi__uint32 stbi__get32be(stbi__context *s)
1284 stbi__uint32 z = stbi__get16be(s);
1285 return (z << 16) + stbi__get16be(s);
1288 static int stbi__get16le(stbi__context *s)
1290 int z = stbi__get8(s);
1291 return z + (stbi__get8(s) << 8);
1294 static stbi__uint32 stbi__get32le(stbi__context *s)
1296 stbi__uint32 z = stbi__get16le(s);
1297 return z + (stbi__get16le(s) << 16);
1300 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings 1314 static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1316 return (
stbi_uc) (((r*77) + (g*150) + (29*
b)) >> 8);
1319 static unsigned char *stbi__convert_format(
unsigned char *data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1322 unsigned char *good;
1324 if (req_comp == img_n)
return data;
1325 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1327 good = (
unsigned char *) stbi__malloc(req_comp * x * y);
1330 return stbi__errpuc(
"outofmem",
"Out of memory");
1333 for (j=0; j < (
int) y; ++j) {
1334 unsigned char *
src = data + j * x * img_n ;
1335 unsigned char *dest = good + j * x * req_comp;
1337 #define COMBO(a,b) ((a)*8+(b)) 1338 #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 1341 switch (COMBO(img_n, req_comp)) {
1342 CASE(1,2) dest[0]=src[0], dest[1]=255; break;
1343 CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1344 CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
1345 CASE(2,1) dest[0]=src[0]; break;
1346 CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1347 CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
1348 CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
1349 CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1350 CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
1351 CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1352 CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
1353 CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
1354 default: STBI_ASSERT(0);
1363 #ifndef STBI_NO_LINEAR 1364 static float *stbi__ldr_to_hdr(
stbi_uc *data,
int x,
int y,
int comp)
1367 float *output = (
float *) stbi__malloc(x * y * comp *
sizeof(
float));
1368 if (output == NULL) { STBI_FREE(data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1370 if (comp & 1) n = comp;
else n = comp-1;
1371 for (i=0; i < x*
y; ++i) {
1372 for (k=0; k <
n; ++k) {
1373 output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1375 if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
1383 #define stbi__float2int(x) ((int) (x)) 1384 static stbi_uc *stbi__hdr_to_ldr(
float *data,
int x,
int y,
int comp)
1388 if (output == NULL) { STBI_FREE(data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1390 if (comp & 1) n = comp;
else n = comp-1;
1391 for (i=0; i < x*
y; ++i) {
1392 for (k=0; k <
n; ++k) {
1393 float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1395 if (z > 255) z = 255;
1396 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1399 float z = data[i*comp+k] * 255 + 0.5f;
1401 if (z > 255) z = 255;
1402 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1431 #ifndef STBI_NO_JPEG 1434 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache 1440 stbi__uint16 code[256];
1443 unsigned int maxcode[18];
1450 stbi__huffman huff_dc[4];
1451 stbi__huffman huff_ac[4];
1453 stbi__int16 fast_ac[4][1 << FAST_BITS];
1456 int img_h_max, img_v_max;
1457 int img_mcu_x, img_mcu_y;
1458 int img_mcu_w, img_mcu_h;
1471 void *raw_data, *raw_coeff;
1474 int coeff_w, coeff_h;
1477 stbi__uint32 code_buffer;
1489 int scan_n,
order[4];
1490 int restart_interval, todo;
1493 void (*idct_block_kernel)(
stbi_uc *out,
int out_stride,
short data[64]);
1498 static int stbi__build_huffman(stbi__huffman *h,
int *
count)
1502 for (i=0; i < 16; ++i)
1503 for (j=0; j < count[i]; ++j)
1504 h->size[k++] = (
stbi_uc) (i+1);
1510 for(j=1; j <= 16; ++j) {
1512 h->delta[j] = k - code;
1513 if (h->size[k] == j) {
1514 while (h->size[k] == j)
1515 h->code[k++] = (stbi__uint16) (code++);
1516 if (code-1 >= (1 << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1519 h->maxcode[j] = code << (16-j);
1522 h->maxcode[j] = 0xffffffff;
1525 memset(h->fast, 255, 1 << FAST_BITS);
1526 for (i=0; i < k; ++i) {
1528 if (s <= FAST_BITS) {
1529 int c = h->code[i] << (FAST_BITS-
s);
1530 int m = 1 << (FAST_BITS-
s);
1531 for (j=0; j <
m; ++j) {
1541 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1544 for (i=0; i < (1 << FAST_BITS); ++i) {
1548 int rs = h->values[fast];
1549 int run = (rs >> 4) & 15;
1550 int magbits = rs & 15;
1551 int len = h->size[fast];
1553 if (magbits && len + magbits <= FAST_BITS) {
1555 int k = ((i <<
len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1556 int m = 1 << (magbits - 1);
1557 if (k < m) k += (-1 << magbits) + 1;
1559 if (k >= -128 && k <= 127)
1560 fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
1566 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1569 int b = j->nomore ? 0 : stbi__get8(j->s);
1571 int c = stbi__get8(j->s);
1573 j->marker = (
unsigned char) c;
1578 j->code_buffer |= b << (24 - j->code_bits);
1580 }
while (j->code_bits <= 24);
1584 static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1587 stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1592 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1596 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1600 if (s > j->code_bits)
1602 j->code_buffer <<=
s;
1604 return h->values[k];
1613 temp = j->code_buffer >> 16;
1614 for (k=FAST_BITS+1 ; ; ++k)
1615 if (temp < h->maxcode[k])
1623 if (k > j->code_bits)
1627 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1628 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[
c])) & stbi__bmask[h->size[
c]]) == h->code[c]);
1632 j->code_buffer <<= k;
1633 return h->values[
c];
1637 static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1641 stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1645 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1647 sgn = (stbi__int32)j->code_buffer >> 31;
1648 k = stbi_lrot(j->code_buffer, n);
1649 STBI_ASSERT(n >= 0 && n < (
int) (
sizeof(stbi__bmask)/
sizeof(*stbi__bmask)));
1650 j->code_buffer = k & ~stbi__bmask[
n];
1651 k &= stbi__bmask[
n];
1653 return k + (stbi__jbias[
n] & ~sgn);
1657 stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
1660 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1661 k = stbi_lrot(j->code_buffer, n);
1662 j->code_buffer = k & ~stbi__bmask[
n];
1663 k &= stbi__bmask[
n];
1668 stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
1671 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1673 j->code_buffer <<= 1;
1675 return k & 0x80000000;
1680 static stbi_uc stbi__jpeg_dezigzag[64+15] =
1682 0, 1, 8, 16, 9, 2, 3, 10,
1683 17, 24, 32, 25, 18, 11, 4, 5,
1684 12, 19, 26, 33, 40, 48, 41, 34,
1685 27, 20, 13, 6, 7, 14, 21, 28,
1686 35, 42, 49, 56, 57, 50, 43, 36,
1687 29, 22, 15, 23, 30, 37, 44, 51,
1688 58, 59, 52, 45, 38, 31, 39, 46,
1689 53, 60, 61, 54, 47, 55, 62, 63,
1691 63, 63, 63, 63, 63, 63, 63, 63,
1692 63, 63, 63, 63, 63, 63, 63
1696 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)
1701 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1702 t = stbi__jpeg_huff_decode(j, hdc);
1703 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1706 memset(data,0,64*
sizeof(data[0]));
1708 diff = t ? stbi__extend_receive(j, t) : 0;
1709 dc = j->img_comp[
b].dc_pred + diff;
1710 j->img_comp[
b].dc_pred = dc;
1711 data[0] = (short) (dc * dequant[0]);
1718 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1719 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1724 j->code_buffer <<=
s;
1727 zig = stbi__jpeg_dezigzag[k++];
1728 data[zig] = (short) ((r >> 8) * dequant[zig]);
1730 int rs = stbi__jpeg_huff_decode(j, hac);
1731 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1735 if (rs != 0xf0)
break;
1740 zig = stbi__jpeg_dezigzag[k++];
1741 data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
1748 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
1752 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1754 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1756 if (j->succ_high == 0) {
1758 memset(data,0,64*
sizeof(data[0]));
1759 t = stbi__jpeg_huff_decode(j, hdc);
1760 diff = t ? stbi__extend_receive(j, t) : 0;
1762 dc = j->img_comp[
b].dc_pred + diff;
1763 j->img_comp[
b].dc_pred = dc;
1764 data[0] = (short) (dc << j->succ_low);
1767 if (stbi__jpeg_get_bit(j))
1768 data[0] += (
short) (1 << j->succ_low);
1775 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
1778 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1780 if (j->succ_high == 0) {
1781 int shift = j->succ_low;
1792 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1793 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1798 j->code_buffer <<=
s;
1800 zig = stbi__jpeg_dezigzag[k++];
1801 data[zig] = (short) ((r >> 8) << shift);
1803 int rs = stbi__jpeg_huff_decode(j, hac);
1804 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1809 j->eob_run = (1 <<
r);
1811 j->eob_run += stbi__jpeg_get_bits(j, r);
1818 zig = stbi__jpeg_dezigzag[k++];
1819 data[zig] = (short) (stbi__extend_receive(j,s) << shift);
1822 }
while (k <= j->spec_end);
1826 short bit = (short) (1 << j->succ_low);
1830 for (k = j->spec_start; k <= j->spec_end; ++k) {
1831 short *
p = &data[stbi__jpeg_dezigzag[k]];
1833 if (stbi__jpeg_get_bit(j))
1834 if ((*p & bit)==0) {
1845 int rs = stbi__jpeg_huff_decode(j, hac);
1846 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1851 j->eob_run = (1 <<
r) - 1;
1853 j->eob_run += stbi__jpeg_get_bits(j, r);
1861 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1863 if (stbi__jpeg_get_bit(j))
1870 while (k <= j->spec_end) {
1871 short *p = &data[stbi__jpeg_dezigzag[k++]];
1873 if (stbi__jpeg_get_bit(j))
1874 if ((*p & bit)==0) {
1888 }
while (k <= j->spec_end);
1895 stbi_inline
static stbi_uc stbi__clamp(
int x)
1898 if ((
unsigned int) x > 255) {
1899 if (x < 0)
return 0;
1900 if (x > 255)
return 255;
1905 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) 1906 #define stbi__fsh(x) ((x) << 12) 1909 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ 1910 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ 1913 p1 = (p2+p3) * stbi__f2f(0.5411961f); \ 1914 t2 = p1 + p3*stbi__f2f(-1.847759065f); \ 1915 t3 = p1 + p2*stbi__f2f( 0.765366865f); \ 1918 t0 = stbi__fsh(p2+p3); \ 1919 t1 = stbi__fsh(p2-p3); \ 1932 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ 1933 t0 = t0*stbi__f2f( 0.298631336f); \ 1934 t1 = t1*stbi__f2f( 2.053119869f); \ 1935 t2 = t2*stbi__f2f( 3.072711026f); \ 1936 t3 = t3*stbi__f2f( 1.501321110f); \ 1937 p1 = p5 + p1*stbi__f2f(-0.899976223f); \ 1938 p2 = p5 + p2*stbi__f2f(-2.562915447f); \ 1939 p3 = p3*stbi__f2f(-1.961570560f); \ 1940 p4 = p4*stbi__f2f(-0.390180644f); \ 1946 static void stbi__idct_block(
stbi_uc *out,
int out_stride,
short data[64])
1953 for (i=0; i < 8; ++i,++d, ++
v) {
1955 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
1956 && d[40]==0 && d[48]==0 && d[56]==0) {
1961 int dcterm = d[0] << 2;
1962 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1964 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
1967 x0 += 512;
x1 += 512;
x2 += 512; x3 += 512;
1968 v[ 0] = (x0+t3) >> 10;
1969 v[56] = (x0-t3) >> 10;
1970 v[ 8] = (
x1+t2) >> 10;
1971 v[48] = (
x1-t2) >> 10;
1972 v[16] = (
x2+
t1) >> 10;
1973 v[40] = (
x2-t1) >> 10;
1974 v[24] = (x3+
t0) >> 10;
1975 v[32] = (x3-t0) >> 10;
1979 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
1981 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
1988 x0 += 65536 + (128<<17);
1989 x1 += 65536 + (128<<17);
1990 x2 += 65536 + (128<<17);
1991 x3 += 65536 + (128<<17);
1994 o[0] = stbi__clamp((x0+t3) >> 17);
1995 o[7] = stbi__clamp((x0-t3) >> 17);
1996 o[1] = stbi__clamp((
x1+t2) >> 17);
1997 o[6] = stbi__clamp((
x1-t2) >> 17);
1998 o[2] = stbi__clamp((
x2+t1) >> 17);
1999 o[5] = stbi__clamp((
x2-t1) >> 17);
2000 o[3] = stbi__clamp((x3+t0) >> 17);
2001 o[4] = stbi__clamp((x3-t0) >> 17);
2009 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2012 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2016 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) 2020 #define dct_rot(out0,out1, x,y,c0,c1) \ 2021 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ 2022 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ 2023 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ 2024 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ 2025 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ 2026 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) 2029 #define dct_widen(out, in) \ 2030 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ 2031 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) 2034 #define dct_wadd(out, a, b) \ 2035 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ 2036 __m128i out##_h = _mm_add_epi32(a##_h, b##_h) 2039 #define dct_wsub(out, a, b) \ 2040 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ 2041 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) 2044 #define dct_bfly32o(out0, out1, a,b,bias,s) \ 2046 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ 2047 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ 2048 dct_wadd(sum, abiased, b); \ 2049 dct_wsub(dif, abiased, b); \ 2050 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ 2051 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ 2055 #define dct_interleave8(a, b) \ 2057 a = _mm_unpacklo_epi8(a, b); \ 2058 b = _mm_unpackhi_epi8(tmp, b) 2061 #define dct_interleave16(a, b) \ 2063 a = _mm_unpacklo_epi16(a, b); \ 2064 b = _mm_unpackhi_epi16(tmp, b) 2066 #define dct_pass(bias,shift) \ 2069 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ 2070 __m128i sum04 = _mm_add_epi16(row0, row4); \ 2071 __m128i dif04 = _mm_sub_epi16(row0, row4); \ 2072 dct_widen(t0e, sum04); \ 2073 dct_widen(t1e, dif04); \ 2074 dct_wadd(x0, t0e, t3e); \ 2075 dct_wsub(x3, t0e, t3e); \ 2076 dct_wadd(x1, t1e, t2e); \ 2077 dct_wsub(x2, t1e, t2e); \ 2079 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ 2080 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ 2081 __m128i sum17 = _mm_add_epi16(row1, row7); \ 2082 __m128i sum35 = _mm_add_epi16(row3, row5); \ 2083 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ 2084 dct_wadd(x4, y0o, y4o); \ 2085 dct_wadd(x5, y1o, y5o); \ 2086 dct_wadd(x6, y2o, y5o); \ 2087 dct_wadd(x7, y3o, y4o); \ 2088 dct_bfly32o(row0,row7, x0,x7,bias,shift); \ 2089 dct_bfly32o(row1,row6, x1,x6,bias,shift); \ 2090 dct_bfly32o(row2,row5, x2,x5,bias,shift); \ 2091 dct_bfly32o(row3,row4, x3,x4,bias,shift); \ 2094 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2095 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2096 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2097 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2098 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2099 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2100 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2101 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
2104 __m128i bias_0 = _mm_set1_epi32(512);
2105 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2108 row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
2109 row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
2110 row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
2111 row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
2112 row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
2113 row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
2114 row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
2115 row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
2118 dct_pass(bias_0, 10);
2122 dct_interleave16(row0, row4);
2123 dct_interleave16(row1, row5);
2124 dct_interleave16(row2, row6);
2125 dct_interleave16(row3, row7);
2128 dct_interleave16(row0, row2);
2129 dct_interleave16(row1, row3);
2130 dct_interleave16(row4, row6);
2131 dct_interleave16(row5, row7);
2134 dct_interleave16(row0, row1);
2135 dct_interleave16(row2, row3);
2136 dct_interleave16(row4, row5);
2137 dct_interleave16(row6, row7);
2141 dct_pass(bias_1, 17);
2145 __m128i p0 = _mm_packus_epi16(row0, row1);
2146 __m128i p1 = _mm_packus_epi16(row2, row3);
2147 __m128i p2 = _mm_packus_epi16(row4, row5);
2148 __m128i p3 = _mm_packus_epi16(row6, row7);
2151 dct_interleave8(p0, p2);
2152 dct_interleave8(p1, p3);
2155 dct_interleave8(p0, p1);
2156 dct_interleave8(p2, p3);
2159 dct_interleave8(p0, p2);
2160 dct_interleave8(p1, p3);
2163 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2164 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2165 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2166 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2167 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2168 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2169 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2170 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2179 #undef dct_interleave8 2180 #undef dct_interleave16 2190 static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2192 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2194 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2195 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2196 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2197 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2198 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2199 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2200 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2201 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2202 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2203 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2204 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2205 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2207 #define dct_long_mul(out, inq, coeff) \ 2208 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ 2209 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) 2211 #define dct_long_mac(out, acc, inq, coeff) \ 2212 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ 2213 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) 2215 #define dct_widen(out, inq) \ 2216 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ 2217 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) 2220 #define dct_wadd(out, a, b) \ 2221 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ 2222 int32x4_t out##_h = vaddq_s32(a##_h, b##_h) 2225 #define dct_wsub(out, a, b) \ 2226 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ 2227 int32x4_t out##_h = vsubq_s32(a##_h, b##_h) 2230 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \ 2232 dct_wadd(sum, a, b); \ 2233 dct_wsub(dif, a, b); \ 2234 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ 2235 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ 2238 #define dct_pass(shiftop, shift) \ 2241 int16x8_t sum26 = vaddq_s16(row2, row6); \ 2242 dct_long_mul(p1e, sum26, rot0_0); \ 2243 dct_long_mac(t2e, p1e, row6, rot0_1); \ 2244 dct_long_mac(t3e, p1e, row2, rot0_2); \ 2245 int16x8_t sum04 = vaddq_s16(row0, row4); \ 2246 int16x8_t dif04 = vsubq_s16(row0, row4); \ 2247 dct_widen(t0e, sum04); \ 2248 dct_widen(t1e, dif04); \ 2249 dct_wadd(x0, t0e, t3e); \ 2250 dct_wsub(x3, t0e, t3e); \ 2251 dct_wadd(x1, t1e, t2e); \ 2252 dct_wsub(x2, t1e, t2e); \ 2254 int16x8_t sum15 = vaddq_s16(row1, row5); \ 2255 int16x8_t sum17 = vaddq_s16(row1, row7); \ 2256 int16x8_t sum35 = vaddq_s16(row3, row5); \ 2257 int16x8_t sum37 = vaddq_s16(row3, row7); \ 2258 int16x8_t sumodd = vaddq_s16(sum17, sum35); \ 2259 dct_long_mul(p5o, sumodd, rot1_0); \ 2260 dct_long_mac(p1o, p5o, sum17, rot1_1); \ 2261 dct_long_mac(p2o, p5o, sum35, rot1_2); \ 2262 dct_long_mul(p3o, sum37, rot2_0); \ 2263 dct_long_mul(p4o, sum15, rot2_1); \ 2264 dct_wadd(sump13o, p1o, p3o); \ 2265 dct_wadd(sump24o, p2o, p4o); \ 2266 dct_wadd(sump23o, p2o, p3o); \ 2267 dct_wadd(sump14o, p1o, p4o); \ 2268 dct_long_mac(x4, sump13o, row7, rot3_0); \ 2269 dct_long_mac(x5, sump24o, row5, rot3_1); \ 2270 dct_long_mac(x6, sump23o, row3, rot3_2); \ 2271 dct_long_mac(x7, sump14o, row1, rot3_3); \ 2272 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ 2273 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ 2274 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ 2275 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ 2279 row0 = vld1q_s16(data + 0*8);
2280 row1 = vld1q_s16(data + 1*8);
2281 row2 = vld1q_s16(data + 2*8);
2282 row3 = vld1q_s16(data + 3*8);
2283 row4 = vld1q_s16(data + 4*8);
2284 row5 = vld1q_s16(data + 5*8);
2285 row6 = vld1q_s16(data + 6*8);
2286 row7 = vld1q_s16(data + 7*8);
2289 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2292 dct_pass(vrshrn_n_s32, 10);
2298 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } 2299 #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]); } 2300 #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)); } 2303 dct_trn16(row0, row1);
2304 dct_trn16(row2, row3);
2305 dct_trn16(row4, row5);
2306 dct_trn16(row6, row7);
2309 dct_trn32(row0, row2);
2310 dct_trn32(row1, row3);
2311 dct_trn32(row4, row6);
2312 dct_trn32(row5, row7);
2315 dct_trn64(row0, row4);
2316 dct_trn64(row1, row5);
2317 dct_trn64(row2, row6);
2318 dct_trn64(row3, row7);
2329 dct_pass(vshrn_n_s32, 16);
2333 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2334 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2335 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2336 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2337 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2338 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2339 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2340 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2343 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } 2344 #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]); } 2345 #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]); } 2357 dct_trn8_16(p0, p2);
2358 dct_trn8_16(p1, p3);
2359 dct_trn8_16(p4, p6);
2360 dct_trn8_16(p5, p7);
2363 dct_trn8_32(p0, p4);
2364 dct_trn8_32(p1, p5);
2365 dct_trn8_32(p2, p6);
2366 dct_trn8_32(p3, p7);
2369 vst1_u8(out, p0); out += out_stride;
2370 vst1_u8(out, p1); out += out_stride;
2371 vst1_u8(out, p2); out += out_stride;
2372 vst1_u8(out, p3); out += out_stride;
2373 vst1_u8(out, p4); out += out_stride;
2374 vst1_u8(out, p5); out += out_stride;
2375 vst1_u8(out, p6); out += out_stride;
2394 #define STBI__MARKER_none 0xff 2398 static stbi_uc stbi__get_marker(stbi__jpeg *j)
2401 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2402 x = stbi__get8(j->s);
2403 if (x != 0xff)
return STBI__MARKER_none;
2405 x = stbi__get8(j->s);
2411 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) 2415 static void stbi__jpeg_reset(stbi__jpeg *j)
2420 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
2421 j->marker = STBI__MARKER_none;
2422 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2428 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2430 stbi__jpeg_reset(z);
2431 if (!z->progressive) {
2432 if (z->scan_n == 1) {
2434 STBI_SIMD_ALIGN(
short, data[64]);
2435 int n = z->order[0];
2440 int w = (z->img_comp[
n].x+7) >> 3;
2441 int h = (z->img_comp[
n].y+7) >> 3;
2442 for (j=0; j <
h; ++j) {
2443 for (i=0; i <
w; ++i) {
2444 int ha = z->img_comp[
n].ha;
2445 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;
2446 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2448 if (--z->todo <= 0) {
2449 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2452 if (!STBI__RESTART(z->marker))
return 1;
2453 stbi__jpeg_reset(z);
2460 STBI_SIMD_ALIGN(
short, data[64]);
2461 for (j=0; j < z->img_mcu_y; ++j) {
2462 for (i=0; i < z->img_mcu_x; ++i) {
2464 for (k=0; k < z->scan_n; ++k) {
2465 int n = z->order[k];
2468 for (y=0; y < z->img_comp[
n].v; ++
y) {
2469 for (x=0; x < z->img_comp[
n].h; ++
x) {
2470 int x2 = (i*z->img_comp[
n].h +
x)*8;
2471 int y2 = (j*z->img_comp[
n].v +
y)*8;
2472 int ha = z->img_comp[
n].ha;
2473 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;
2474 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2480 if (--z->todo <= 0) {
2481 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2482 if (!STBI__RESTART(z->marker))
return 1;
2483 stbi__jpeg_reset(z);
2490 if (z->scan_n == 1) {
2492 int n = z->order[0];
2497 int w = (z->img_comp[
n].x+7) >> 3;
2498 int h = (z->img_comp[
n].y+7) >> 3;
2499 for (j=0; j <
h; ++j) {
2500 for (i=0; i <
w; ++i) {
2501 short *data = z->img_comp[
n].coeff + 64 * (i + j * z->img_comp[
n].coeff_w);
2502 if (z->spec_start == 0) {
2503 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2506 int ha = z->img_comp[
n].ha;
2507 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2511 if (--z->todo <= 0) {
2512 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2513 if (!STBI__RESTART(z->marker))
return 1;
2514 stbi__jpeg_reset(z);
2521 for (j=0; j < z->img_mcu_y; ++j) {
2522 for (i=0; i < z->img_mcu_x; ++i) {
2524 for (k=0; k < z->scan_n; ++k) {
2525 int n = z->order[k];
2528 for (y=0; y < z->img_comp[
n].v; ++
y) {
2529 for (x=0; x < z->img_comp[
n].h; ++
x) {
2530 int x2 = (i*z->img_comp[
n].h +
x);
2531 int y2 = (j*z->img_comp[
n].v +
y);
2532 short *data = z->img_comp[
n].coeff + 64 * (x2 + y2 * z->img_comp[
n].coeff_w);
2533 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2540 if (--z->todo <= 0) {
2541 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2542 if (!STBI__RESTART(z->marker))
return 1;
2543 stbi__jpeg_reset(z);
2552 static void stbi__jpeg_dequantize(
short *data,
stbi_uc *dequant)
2555 for (i=0; i < 64; ++i)
2556 data[i] *= dequant[i];
2559 static void stbi__jpeg_finish(stbi__jpeg *z)
2561 if (z->progressive) {
2564 for (n=0; n < z->s->img_n; ++
n) {
2565 int w = (z->img_comp[
n].x+7) >> 3;
2566 int h = (z->img_comp[
n].y+7) >> 3;
2567 for (j=0; j <
h; ++j) {
2568 for (i=0; i <
w; ++i) {
2569 short *data = z->img_comp[
n].coeff + 64 * (i + j * z->img_comp[
n].coeff_w);
2570 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2571 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2578 static int stbi__process_marker(stbi__jpeg *z,
int m)
2582 case STBI__MARKER_none:
2583 return stbi__err(
"expected marker",
"Corrupt JPEG");
2586 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2587 z->restart_interval = stbi__get16be(z->s);
2591 L = stbi__get16be(z->s)-2;
2593 int q = stbi__get8(z->s);
2596 if (p != 0)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2597 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2598 for (i=0; i < 64; ++i)
2599 z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
2605 L = stbi__get16be(z->s)-2;
2608 int sizes[16],i,n=0;
2609 int q = stbi__get8(z->s);
2612 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2613 for (i=0; i < 16; ++i) {
2614 sizes[i] = stbi__get8(z->s);
2619 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
2620 v = z->huff_dc[th].values;
2622 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
2623 v = z->huff_ac[th].values;
2625 for (i=0; i <
n; ++i)
2626 v[i] = stbi__get8(z->s);
2628 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2634 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2635 stbi__skip(z->s, stbi__get16be(z->s)-2);
2642 static int stbi__process_scan_header(stbi__jpeg *z)
2645 int Ls = stbi__get16be(z->s);
2646 z->scan_n = stbi__get8(z->s);
2647 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");
2648 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2649 for (i=0; i < z->scan_n; ++i) {
2650 int id = stbi__get8(z->s), which;
2651 int q = stbi__get8(z->s);
2652 for (which = 0; which < z->s->img_n; ++which)
2653 if (z->img_comp[which].id ==
id)
2655 if (which == z->s->img_n)
return 0;
2656 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2657 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2658 z->order[i] = which;
2663 z->spec_start = stbi__get8(z->s);
2664 z->spec_end = stbi__get8(z->s);
2665 aa = stbi__get8(z->s);
2666 z->succ_high = (aa >> 4);
2667 z->succ_low = (aa & 15);
2668 if (z->progressive) {
2669 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2670 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2672 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2673 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2681 static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
2683 stbi__context *s = z->s;
2684 int Lf,
p,i,
q, h_max=1,v_max=1,
c;
2685 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2686 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
2687 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
2688 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
2690 if (c != 3 && c != 1)
return stbi__err(
"bad component count",
"Corrupt JPEG");
2692 for (i=0; i <
c; ++i) {
2693 z->img_comp[i].data = NULL;
2694 z->img_comp[i].linebuf = NULL;
2697 if (Lf != 8+3*s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2699 for (i=0; i < s->img_n; ++i) {
2700 z->img_comp[i].id = stbi__get8(s);
2701 if (z->img_comp[i].id != i+1)
2702 if (z->img_comp[i].id != i)
2703 return stbi__err(
"bad component ID",
"Corrupt JPEG");
2705 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");
2706 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");
2707 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
2710 if (scan != STBI__SCAN_load)
return 1;
2712 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
2714 for (i=0; i < s->img_n; ++i) {
2715 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
2716 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
2720 z->img_h_max = h_max;
2721 z->img_v_max = v_max;
2722 z->img_mcu_w = h_max * 8;
2723 z->img_mcu_h = v_max * 8;
2724 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
2725 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
2727 for (i=0; i < s->img_n; ++i) {
2729 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
2730 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
2735 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
2736 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
2737 z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
2739 if (z->img_comp[i].raw_data == NULL) {
2740 for(--i; i >= 0; --i) {
2741 STBI_FREE(z->img_comp[i].raw_data);
2742 z->img_comp[i].data = NULL;
2744 return stbi__err(
"outofmem",
"Out of memory");
2747 z->img_comp[i].data = (
stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
2748 z->img_comp[i].linebuf = NULL;
2749 if (z->progressive) {
2750 z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;
2751 z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
2752 z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 *
sizeof(
short) + 15);
2753 z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
2755 z->img_comp[i].coeff = 0;
2756 z->img_comp[i].raw_coeff = 0;
2764 #define stbi__DNL(x) ((x) == 0xdc) 2765 #define stbi__SOI(x) ((x) == 0xd8) 2766 #define stbi__EOI(x) ((x) == 0xd9) 2767 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) 2768 #define stbi__SOS(x) ((x) == 0xda) 2770 #define stbi__SOF_progressive(x) ((x) == 0xc2) 2772 static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
2775 z->marker = STBI__MARKER_none;
2776 m = stbi__get_marker(z);
2777 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
2778 if (scan == STBI__SCAN_type)
return 1;
2779 m = stbi__get_marker(z);
2780 while (!stbi__SOF(m)) {
2781 if (!stbi__process_marker(z,m))
return 0;
2782 m = stbi__get_marker(z);
2783 while (m == STBI__MARKER_none) {
2785 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
2786 m = stbi__get_marker(z);
2789 z->progressive = stbi__SOF_progressive(m);
2790 if (!stbi__process_frame_header(z, scan))
return 0;
2795 static int stbi__decode_jpeg_image(stbi__jpeg *j)
2798 for (m = 0; m < 4; m++) {
2799 j->img_comp[
m].raw_data = NULL;
2800 j->img_comp[
m].raw_coeff = NULL;
2802 j->restart_interval = 0;
2803 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
2804 m = stbi__get_marker(j);
2805 while (!stbi__EOI(m)) {
2807 if (!stbi__process_scan_header(j))
return 0;
2808 if (!stbi__parse_entropy_coded_data(j))
return 0;
2809 if (j->marker == STBI__MARKER_none ) {
2811 while (!stbi__at_eof(j->s)) {
2812 int x = stbi__get8(j->s);
2814 j->marker = stbi__get8(j->s);
2816 }
else if (x != 0) {
2817 return stbi__err(
"junk before marker",
"Corrupt JPEG");
2823 if (!stbi__process_marker(j, m))
return 0;
2825 m = stbi__get_marker(j);
2828 stbi__jpeg_finish(j);
2837 #define stbi__div4(x) ((stbi_uc) ((x) >> 2)) 2842 STBI_NOTUSED(in_far);
2853 for (i=0; i <
w; ++i)
2854 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
2866 out[0] = out[1] = input[0];
2871 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
2872 for (i=1; i < w-1; ++i) {
2873 int n = 3*input[i]+2;
2874 out[i*2+0] = stbi__div4(n+input[i-1]);
2875 out[i*2+1] = stbi__div4(n+input[i+1]);
2877 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
2878 out[i*2+1] = input[w-1];
2880 STBI_NOTUSED(in_far);
2886 #define stbi__div16(x) ((stbi_uc) ((x) >> 4)) 2893 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2897 t1 = 3*in_near[0] + in_far[0];
2898 out[0] = stbi__div4(t1+2);
2899 for (i=1; i <
w; ++i) {
2901 t1 = 3*in_near[i]+in_far[i];
2902 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
2903 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
2905 out[w*2-1] = stbi__div4(t1+2);
2912 #if defined(STBI_SSE2) || defined(STBI_NEON) 2919 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2923 t1 = 3*in_near[0] + in_far[0];
2927 for (; i < ((w-1) & ~7); i += 8) {
2928 #if defined(STBI_SSE2) 2931 __m128i zero = _mm_setzero_si128();
2932 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
2933 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
2934 __m128i farw = _mm_unpacklo_epi8(farb, zero);
2935 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
2936 __m128i diff = _mm_sub_epi16(farw, nearw);
2937 __m128i nears = _mm_slli_epi16(nearw, 2);
2938 __m128i curr = _mm_add_epi16(nears, diff);
2945 __m128i prv0 = _mm_slli_si128(curr, 2);
2946 __m128i nxt0 = _mm_srli_si128(curr, 2);
2947 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
2948 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
2954 __m128i
bias = _mm_set1_epi16(8);
2955 __m128i curs = _mm_slli_epi16(curr, 2);
2956 __m128i prvd = _mm_sub_epi16(prev, curr);
2957 __m128i nxtd = _mm_sub_epi16(next, curr);
2958 __m128i curb = _mm_add_epi16(curs, bias);
2959 __m128i even = _mm_add_epi16(prvd, curb);
2960 __m128i odd = _mm_add_epi16(nxtd, curb);
2963 __m128i int0 = _mm_unpacklo_epi16(even, odd);
2964 __m128i int1 = _mm_unpackhi_epi16(even, odd);
2965 __m128i de0 = _mm_srli_epi16(int0, 4);
2966 __m128i de1 = _mm_srli_epi16(int1, 4);
2969 __m128i outv = _mm_packus_epi16(de0, de1);
2970 _mm_storeu_si128((__m128i *) (out + i*2), outv);
2971 #elif defined(STBI_NEON) 2974 uint8x8_t farb = vld1_u8(in_far + i);
2975 uint8x8_t nearb = vld1_u8(in_near + i);
2976 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
2977 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
2978 int16x8_t curr = vaddq_s16(nears, diff);
2985 int16x8_t prv0 = vextq_s16(curr, curr, 7);
2986 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
2987 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
2988 int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
2994 int16x8_t curs = vshlq_n_s16(curr, 2);
2995 int16x8_t prvd = vsubq_s16(prev, curr);
2996 int16x8_t nxtd = vsubq_s16(next, curr);
2997 int16x8_t even = vaddq_s16(curs, prvd);
2998 int16x8_t odd = vaddq_s16(curs, nxtd);
3002 o.val[0] = vqrshrun_n_s16(even, 4);
3003 o.val[1] = vqrshrun_n_s16(odd, 4);
3004 vst2_u8(out + i*2, o);
3008 t1 = 3*in_near[i+7] + in_far[i+7];
3012 t1 = 3*in_near[i] + in_far[i];
3013 out[i*2] = stbi__div16(3*t1 + t0 + 8);
3015 for (++i; i <
w; ++i) {
3017 t1 = 3*in_near[i]+in_far[i];
3018 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3019 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3021 out[w*2-1] = stbi__div4(t1+2);
3033 STBI_NOTUSED(in_far);
3034 for (i=0; i <
w; ++i)
3035 for (j=0; j < hs; ++j)
3036 out[i*hs+j] = in_near[i];
3040 #ifdef STBI_JPEG_OLD 3043 #define float2fixed(x) ((int) ((x) * 65536 + 0.5)) 3047 for (i=0; i <
count; ++i) {
3048 int y_fixed = (y[i] << 16) + 32768;
3050 int cr = pcr[i] - 128;
3051 int cb = pcb[i] - 128;
3052 r = y_fixed + cr*float2fixed(1.40200f);
3053 g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
3054 b = y_fixed + cb*float2fixed(1.77200f);
3058 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3059 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3060 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3071 #define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) 3075 for (i=0; i <
count; ++i) {
3076 int y_fixed = (y[i] << 20) + (1<<19);
3078 int cr = pcr[i] - 128;
3079 int cb = pcb[i] - 128;
3080 r = y_fixed + cr* float2fixed(1.40200f);
3081 g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3082 b = y_fixed + cb* float2fixed(1.77200f);
3086 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3087 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3088 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3098 #if defined(STBI_SSE2) || defined(STBI_NEON) 3109 __m128i signflip = _mm_set1_epi8(-0x80);
3110 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200f*4096.0f+0.5f));
3111 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
3112 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
3113 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200f*4096.0f+0.5f));
3114 __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
3115 __m128i xw = _mm_set1_epi16(255);
3117 for (; i+7 <
count; i += 8) {
3119 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3120 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3121 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3122 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3123 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3126 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3127 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3128 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3131 __m128i yws = _mm_srli_epi16(yw, 4);
3132 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3133 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3134 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3135 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3136 __m128i rws = _mm_add_epi16(cr0, yws);
3137 __m128i gwt = _mm_add_epi16(cb0, yws);
3138 __m128i bws = _mm_add_epi16(yws, cb1);
3139 __m128i gws = _mm_add_epi16(gwt, cr1);
3142 __m128i rw = _mm_srai_epi16(rws, 4);
3143 __m128i bw = _mm_srai_epi16(bws, 4);
3144 __m128i gw = _mm_srai_epi16(gws, 4);
3147 __m128i brb = _mm_packus_epi16(rw, bw);
3148 __m128i gxb = _mm_packus_epi16(gw, xw);
3151 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3152 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3153 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3154 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3157 _mm_storeu_si128((__m128i *) (out + 0), o0);
3158 _mm_storeu_si128((__m128i *) (out + 16), o1);
3168 uint8x8_t signflip = vdup_n_u8(0x80);
3169 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200f*4096.0f+0.5f));
3170 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
3171 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
3172 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200f*4096.0f+0.5f));
3174 for (; i+7 <
count; i += 8) {
3176 uint8x8_t y_bytes = vld1_u8(y + i);
3177 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3178 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3179 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3180 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3183 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3184 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3185 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3188 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3189 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3190 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3191 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3192 int16x8_t rws = vaddq_s16(yws, cr0);
3193 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3194 int16x8_t bws = vaddq_s16(yws, cb1);
3198 o.val[0] = vqrshrun_n_s16(rws, 4);
3199 o.val[1] = vqrshrun_n_s16(gws, 4);
3200 o.val[2] = vqrshrun_n_s16(bws, 4);
3201 o.val[3] = vdup_n_u8(255);
3210 for (; i <
count; ++i) {
3211 int y_fixed = (y[i] << 20) + (1<<19);
3213 int cr = pcr[i] - 128;
3214 int cb = pcb[i] - 128;
3215 r = y_fixed + cr* float2fixed(1.40200f);
3216 g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3217 b = y_fixed + cb* float2fixed(1.77200f);
3221 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3222 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3223 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3234 static void stbi__setup_jpeg(stbi__jpeg *j)
3236 j->idct_block_kernel = stbi__idct_block;
3237 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3238 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3241 if (stbi__sse2_available()) {
3242 j->idct_block_kernel = stbi__idct_simd;
3243 #ifndef STBI_JPEG_OLD 3244 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3246 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3251 j->idct_block_kernel = stbi__idct_simd;
3252 #ifndef STBI_JPEG_OLD 3253 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3255 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3260 static void stbi__cleanup_jpeg(stbi__jpeg *j)
3263 for (i=0; i < j->s->img_n; ++i) {
3264 if (j->img_comp[i].raw_data) {
3265 STBI_FREE(j->img_comp[i].raw_data);
3266 j->img_comp[i].raw_data = NULL;
3267 j->img_comp[i].data = NULL;
3269 if (j->img_comp[i].raw_coeff) {
3270 STBI_FREE(j->img_comp[i].raw_coeff);
3271 j->img_comp[i].raw_coeff = 0;
3272 j->img_comp[i].coeff = 0;
3274 if (j->img_comp[i].linebuf) {
3275 STBI_FREE(j->img_comp[i].linebuf);
3276 j->img_comp[i].linebuf = NULL;
3283 resample_row_func resample;
3291 static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3297 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3300 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3303 n = req_comp ? req_comp : z->s->img_n;
3305 if (z->s->img_n == 3 && n < 3)
3308 decode_n = z->s->img_n;
3317 stbi__resample res_comp[4];
3319 for (k=0; k < decode_n; ++k) {
3320 stbi__resample *r = &res_comp[k];
3324 z->img_comp[k].linebuf = (
stbi_uc *) stbi__malloc(z->s->img_x + 3);
3325 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3327 r->hs = z->img_h_max / z->img_comp[k].h;
3328 r->vs = z->img_v_max / z->img_comp[k].v;
3329 r->ystep = r->vs >> 1;
3330 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3332 r->line0 = r->line1 = z->img_comp[k].data;
3334 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3335 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3336 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3337 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3338 else r->resample = stbi__resample_row_generic;
3342 output = (
stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
3343 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3346 for (j=0; j < z->s->img_y; ++j) {
3347 stbi_uc *out = output + n * z->s->img_x * j;
3348 for (k=0; k < decode_n; ++k) {
3349 stbi__resample *r = &res_comp[k];
3350 int y_bot = r->ystep >= (r->vs >> 1);
3351 coutput[k] = r->resample(z->img_comp[k].linebuf,
3352 y_bot ? r->line1 : r->line0,
3353 y_bot ? r->line0 : r->line1,
3355 if (++r->ystep >= r->vs) {
3357 r->line0 = r->line1;
3358 if (++r->ypos < z->img_comp[k].y)
3359 r->line1 += z->img_comp[k].w2;
3364 if (z->s->img_n == 3) {
3365 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3367 for (i=0; i < z->s->img_x; ++i) {
3368 out[0] = out[1] = out[2] = y[i];
3375 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3377 for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3380 stbi__cleanup_jpeg(z);
3381 *out_x = z->s->img_x;
3382 *out_y = z->s->img_y;
3383 if (comp) *comp = z->s->img_n;
3388 static unsigned char *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
3392 stbi__setup_jpeg(&j);
3393 return load_jpeg_image(&j, x,y,comp,req_comp);
3396 static int stbi__jpeg_test(stbi__context *s)
3401 stbi__setup_jpeg(&j);
3402 r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
3407 static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
3409 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3410 stbi__rewind( j->s );
3413 if (x) *x = j->s->img_x;
3414 if (y) *y = j->s->img_y;
3415 if (comp) *comp = j->s->img_n;
3419 static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
3423 return stbi__jpeg_info_raw(&j, x, y, comp);
3434 #ifndef STBI_NO_ZLIB 3437 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables 3438 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) 3444 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3445 stbi__uint16 firstcode[16];
3447 stbi__uint16 firstsymbol[16];
3449 stbi__uint16
value[288];
3452 stbi_inline
static int stbi__bitreverse16(
int n)
3454 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3455 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3456 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3457 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3461 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3463 STBI_ASSERT(bits <= 16);
3466 return stbi__bitreverse16(v) >> (16-
bits);
3469 static int stbi__zbuild_huffman(stbi__zhuffman *z,
stbi_uc *sizelist,
int num)
3472 int code, next_code[16], sizes[17];
3475 memset(sizes, 0,
sizeof(sizes));
3476 memset(z->fast, 0,
sizeof(z->fast));
3477 for (i=0; i <
num; ++i)
3478 ++sizes[sizelist[i]];
3480 for (i=1; i < 16; ++i)
3481 if (sizes[i] > (1 << i))
3482 return stbi__err(
"bad sizes",
"Corrupt PNG");
3484 for (i=1; i < 16; ++i) {
3485 next_code[i] = code;
3486 z->firstcode[i] = (stbi__uint16) code;
3487 z->firstsymbol[i] = (stbi__uint16) k;
3488 code = (code + sizes[i]);
3490 if (code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3491 z->maxcode[i] = code << (16-i);
3495 z->maxcode[16] = 0x10000;
3496 for (i=0; i <
num; ++i) {
3497 int s = sizelist[i];
3499 int c = next_code[
s] - z->firstcode[
s] + z->firstsymbol[
s];
3500 stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
3502 z->value[
c] = (stbi__uint16) i;
3503 if (s <= STBI__ZFAST_BITS) {
3504 int k = stbi__bit_reverse(next_code[s],s);
3505 while (k < (1 << STBI__ZFAST_BITS)) {
3524 stbi_uc *zbuffer, *zbuffer_end;
3526 stbi__uint32 code_buffer;
3533 stbi__zhuffman z_length, z_distance;
3536 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
3538 if (z->zbuffer >= z->zbuffer_end)
return 0;
3539 return *z->zbuffer++;
3542 static void stbi__fill_bits(stbi__zbuf *z)
3545 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3546 z->code_buffer |= stbi__zget8(z) << z->num_bits;
3548 }
while (z->num_bits <= 24);
3551 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
3554 if (z->num_bits < n) stbi__fill_bits(z);
3555 k = z->code_buffer & ((1 <<
n) - 1);
3556 z->code_buffer >>=
n;
3561 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *
a, stbi__zhuffman *z)
3566 k = stbi__bit_reverse(a->code_buffer, 16);
3567 for (s=STBI__ZFAST_BITS+1; ; ++
s)
3568 if (k < z->maxcode[s])
3570 if (s == 16)
return -1;
3572 b = (k >> (16-
s)) - z->firstcode[
s] + z->firstsymbol[
s];
3573 STBI_ASSERT(z->size[b] == s);
3574 a->code_buffer >>=
s;
3579 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3582 if (a->num_bits < 16) stbi__fill_bits(a);
3583 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3586 a->code_buffer >>=
s;
3590 return stbi__zhuffman_decode_slowpath(a, z);
3593 static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
3598 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3599 cur = (
int) (z->zout - z->zout_start);
3600 limit = (
int) (z->zout_end - z->zout_start);
3601 while (cur + n > limit)
3603 q = (
char *) STBI_REALLOC(z->zout_start, limit);
3604 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
3607 z->zout_end = q +
limit;
3611 static int stbi__zlength_base[31] = {
3612 3,4,5,6,7,8,9,10,11,13,
3613 15,17,19,23,27,31,35,43,51,59,
3614 67,83,99,115,131,163,195,227,258,0,0 };
3616 static int stbi__zlength_extra[31]=
3617 { 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 };
3619 static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3620 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
3622 static int stbi__zdist_extra[32] =
3623 { 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};
3625 static int stbi__parse_huffman_block(stbi__zbuf *a)
3627 char *zout = a->zout;
3629 int z = stbi__zhuffman_decode(a, &a->z_length);
3631 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3632 if (zout >= a->zout_end) {
3633 if (!stbi__zexpand(a, zout, 1))
return 0;
3645 len = stbi__zlength_base[
z];
3646 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
3647 z = stbi__zhuffman_decode(a, &a->z_distance);
3648 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3649 dist = stbi__zdist_base[
z];
3650 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
3651 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
3652 if (zout + len > a->zout_end) {
3653 if (!stbi__zexpand(a, zout, len))
return 0;
3656 p = (
stbi_uc *) (zout - dist);
3659 if (len) {
do *zout++ =
v;
while (--len); }
3661 if (len) {
do *zout++ = *p++;
while (--len); }
3667 static int stbi__compute_huffman_codes(stbi__zbuf *a)
3669 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 };
3670 stbi__zhuffman z_codelength;
3675 int hlit = stbi__zreceive(a,5) + 257;
3676 int hdist = stbi__zreceive(a,5) + 1;
3677 int hclen = stbi__zreceive(a,4) + 4;
3679 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
3680 for (i=0; i < hclen; ++i) {
3681 int s = stbi__zreceive(a,3);
3682 codelength_sizes[length_dezigzag[i]] = (
stbi_uc) s;
3684 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
3687 while (n < hlit + hdist) {
3688 int c = stbi__zhuffman_decode(a, &z_codelength);
3689 if (
c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3693 c = stbi__zreceive(a,2)+3;
3694 memset(lencodes+n, lencodes[n-1], c);
3696 }
else if (c == 17) {
3697 c = stbi__zreceive(a,3)+3;
3698 memset(lencodes+n, 0, c);
3701 STBI_ASSERT(c == 18);
3702 c = stbi__zreceive(a,7)+11;
3703 memset(lencodes+n, 0, c);
3707 if (n != hlit+hdist)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3708 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
3709 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
3713 static int stbi__parse_uncomperssed_block(stbi__zbuf *a)
3717 if (a->num_bits & 7)
3718 stbi__zreceive(a, a->num_bits & 7);
3721 while (a->num_bits > 0) {
3722 header[k++] = (
stbi_uc) (a->code_buffer & 255);
3723 a->code_buffer >>= 8;
3726 STBI_ASSERT(a->num_bits == 0);
3729 header[k++] = stbi__zget8(a);
3730 len = header[1] * 256 + header[0];
3731 nlen = header[3] * 256 + header[2];
3732 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
3733 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
3734 if (a->zout + len > a->zout_end)
3735 if (!stbi__zexpand(a, a->zout, len))
return 0;
3736 memcpy(a->zout, a->zbuffer, len);
3742 static int stbi__parse_zlib_header(stbi__zbuf *a)
3744 int cmf = stbi__zget8(a);
3747 int flg = stbi__zget8(a);
3748 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
3749 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
3750 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
3756 static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
3757 static void stbi__init_zdefaults(
void)
3760 for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
3761 for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
3762 for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
3763 for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
3765 for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
3768 static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
3772 if (!stbi__parse_zlib_header(a))
return 0;
3776 final = stbi__zreceive(a,1);
3777 type = stbi__zreceive(a,2);
3779 if (!stbi__parse_uncomperssed_block(a))
return 0;
3780 }
else if (type == 3) {
3785 if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
3786 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288))
return 0;
3787 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
3789 if (!stbi__compute_huffman_codes(a))
return 0;
3791 if (!stbi__parse_huffman_block(a))
return 0;
3797 static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
3799 a->zout_start = obuf;
3801 a->zout_end = obuf + olen;
3802 a->z_expandable = exp;
3804 return stbi__parse_zlib(a, parse_header);
3810 char *p = (
char *) stbi__malloc(initial_size);
3811 if (p == NULL)
return NULL;
3812 a.zbuffer = (
stbi_uc *) buffer;
3813 a.zbuffer_end = (
stbi_uc *) buffer + len;
3814 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
3815 if (outlen) *outlen = (
int) (a.zout - a.zout_start);
3816 return a.zout_start;
3818 STBI_FREE(a.zout_start);
3831 char *p = (
char *) stbi__malloc(initial_size);
3832 if (p == NULL)
return NULL;
3833 a.zbuffer = (
stbi_uc *) buffer;
3834 a.zbuffer_end = (
stbi_uc *) buffer + len;
3835 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
3836 if (outlen) *outlen = (
int) (a.zout - a.zout_start);
3837 return a.zout_start;
3839 STBI_FREE(a.zout_start);
3847 a.zbuffer = (
stbi_uc *) ibuffer;
3848 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3849 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
3850 return (
int) (a.zout - a.zout_start);
3858 char *p = (
char *) stbi__malloc(16384);
3859 if (p == NULL)
return NULL;
3860 a.zbuffer = (
stbi_uc *) buffer;
3861 a.zbuffer_end = (
stbi_uc *) buffer+len;
3862 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
3863 if (outlen) *outlen = (
int) (a.zout - a.zout_start);
3864 return a.zout_start;
3866 STBI_FREE(a.zout_start);
3874 a.zbuffer = (
stbi_uc *) ibuffer;
3875 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3876 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
3877 return (
int) (a.zout - a.zout_start);
3900 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
3903 c.length = stbi__get32be(s);
3904 c.type = stbi__get32be(s);
3908 static int stbi__check_png_header(stbi__context *s)
3910 static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
3912 for (i=0; i < 8; ++i)
3913 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
3920 stbi_uc *idata, *expanded, *out;
3935 static stbi_uc first_row_filter[5] =
3944 static int stbi__paeth(
int a,
int b,
int c)
3950 if (pa <= pb && pa <= pc)
return a;
3951 if (pb <= pc)
return b;
3955 static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
3958 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)
3960 stbi__context *s = a->s;
3961 stbi__uint32 i,j,
stride = x*out_n;
3962 stbi__uint32 img_len, img_width_bytes;
3964 int img_n = s->img_n;
3966 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
3967 a->out = (
stbi_uc *) stbi__malloc(x * y * out_n);
3968 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
3970 img_width_bytes = (((img_n * x *
depth) + 7) >> 3);
3971 img_len = (img_width_bytes + 1) * y;
3972 if (s->img_x == x && s->img_y == y) {
3973 if (raw_len != img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
3975 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
3978 for (j=0; j <
y; ++j) {
3979 stbi_uc *cur = a->out + stride*j;
3982 int filter_bytes = img_n;
3985 return stbi__err(
"invalid filter",
"Corrupt PNG");
3988 STBI_ASSERT(img_width_bytes <= x);
3989 cur += x*out_n - img_width_bytes;
3991 width = img_width_bytes;
3995 if (j == 0) filter = first_row_filter[
filter];
3998 for (k=0; k < filter_bytes; ++k) {
4000 case STBI__F_none : cur[k] = raw[k];
break;
4001 case STBI__F_sub : cur[k] = raw[k];
break;
4002 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4003 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
4004 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
4005 case STBI__F_avg_first : cur[k] = raw[k];
break;
4006 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4023 if (depth < 8 || img_n == out_n) {
4024 int nk = (width - 1)*img_n;
4027 for (k=0; k < nk; ++k) 4030 case STBI__F_none: memcpy(cur, raw, nk);
break;
4031 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break;
4032 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
4033 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break;
4034 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break;
4035 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break;
4036 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break;
4041 STBI_ASSERT(img_n+1 == out_n);
4044 for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ 4045 for (k=0; k < img_n; ++k) 4047 CASE(STBI__F_none) cur[k] = raw[k]; break;
4048 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break;
4049 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
4050 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break;
4051 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;
4052 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break;
4053 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break;
4063 for (j=0; j <
y; ++j) {
4064 stbi_uc *cur = a->out + stride*j;
4065 stbi_uc *
in = a->out + stride*j + x*out_n - img_width_bytes;
4068 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1;
4077 for (k=x*img_n; k >= 2; k-=2, ++
in) {
4078 *cur++ = scale * ((*in >> 4) );
4079 *cur++ = scale * ((*in ) & 0x0f);
4081 if (k > 0) *cur++ = scale * ((*in >> 4) );
4082 }
else if (depth == 2) {
4083 for (k=x*img_n; k >= 4; k-=4, ++
in) {
4084 *cur++ = scale * ((*in >> 6) );
4085 *cur++ = scale * ((*in >> 4) & 0x03);
4086 *cur++ = scale * ((*in >> 2) & 0x03);
4087 *cur++ = scale * ((*in ) & 0x03);
4089 if (k > 0) *cur++ = scale * ((*in >> 6) );
4090 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4091 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4092 }
else if (depth == 1) {
4093 for (k=x*img_n; k >= 8; k-=8, ++
in) {
4094 *cur++ = scale * ((*in >> 7) );
4095 *cur++ = scale * ((*in >> 6) & 0x01);
4096 *cur++ = scale * ((*in >> 5) & 0x01);
4097 *cur++ = scale * ((*in >> 4) & 0x01);
4098 *cur++ = scale * ((*in >> 3) & 0x01);
4099 *cur++ =
scale * ((*
in >> 2) & 0x01);
4100 *cur++ =
scale * ((*
in >> 1) & 0x01);
4101 *cur++ =
scale * ((*in ) & 0x01);
4103 if (k > 0) *cur++ =
scale * ((*
in >> 7) );
4104 if (k > 1) *cur++ =
scale * ((*
in >> 6) & 0x01);
4105 if (k > 2) *cur++ =
scale * ((*
in >> 5) & 0x01);
4106 if (k > 3) *cur++ =
scale * ((*
in >> 4) & 0x01);
4107 if (k > 4) *cur++ =
scale * ((*
in >> 3) & 0x01);
4108 if (k > 5) *cur++ =
scale * ((*
in >> 2) & 0x01);
4109 if (k > 6) *cur++ =
scale * ((*
in >> 1) & 0x01);
4111 if (img_n != out_n) {
4113 stbi_uc *cur = a->out + stride*j;
4116 for (i=x-1; i >= 0; --i) {
4118 cur[i*2+0] = cur[i];
4121 STBI_ASSERT(img_n == 3);
4122 for (i=x-1; i >= 0; --i) {
4124 cur[i*4+2] = cur[i*3+2];
4125 cur[i*4+1] = cur[i*3+1];
4126 cur[i*4+0] = cur[i*3+0];
4136 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)
4141 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4144 final = (
stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
4145 for (p=0; p < 7; ++
p) {
4146 int xorig[] = { 0,4,0,2,0,1,0 };
4147 int yorig[] = { 0,0,4,0,2,0,1 };
4148 int xspc[] = { 8,8,4,4,2,2,1 };
4149 int yspc[] = { 8,8,8,4,4,2,2 };
4152 x = (a->s->img_x - xorig[
p] + xspc[
p]-1) / xspc[p];
4153 y = (a->s->img_y - yorig[
p] + yspc[
p]-1) / yspc[p];
4155 stbi__uint32 img_len = ((((a->s->img_n * x *
depth) + 7) >> 3) + 1) *
y;
4156 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4160 for (j=0; j <
y; ++j) {
4161 for (i=0; i <
x; ++i) {
4162 int out_y = j*yspc[
p]+yorig[
p];
4163 int out_x = i*xspc[
p]+xorig[
p];
4164 memcpy(
final + out_y*a->s->img_x*out_n + out_x*out_n,
4165 a->out + (j*x+i)*out_n, out_n);
4169 image_data += img_len;
4170 image_data_len -= img_len;
4178 static int stbi__compute_transparency(stbi__png *z,
stbi_uc tc[3],
int out_n)
4180 stbi__context *s = z->s;
4181 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4186 STBI_ASSERT(out_n == 2 || out_n == 4);
4189 for (i=0; i < pixel_count; ++i) {
4190 p[1] = (p[0] == tc[0] ? 0 : 255);
4194 for (i=0; i < pixel_count; ++i) {
4195 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4203 static int stbi__expand_png_palette(stbi__png *a,
stbi_uc *palette,
int len,
int pal_img_n)
4205 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4206 stbi_uc *
p, *temp_out, *orig = a->out;
4208 p = (
stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
4209 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4214 if (pal_img_n == 3) {
4215 for (i=0; i < pixel_count; ++i) {
4218 p[1] = palette[n+1];
4219 p[2] = palette[n+2];
4223 for (i=0; i < pixel_count; ++i) {
4226 p[1] = palette[n+1];
4227 p[2] = palette[n+2];
4228 p[3] = palette[n+3];
4240 static int stbi__unpremultiply_on_load = 0;
4241 static int stbi__de_iphone_flag = 0;
4245 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4250 stbi__de_iphone_flag = flag_true_if_should_convert;
4253 static void stbi__de_iphone(stbi__png *z)
4255 stbi__context *s = z->s;
4256 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4259 if (s->img_out_n == 3) {
4260 for (i=0; i < pixel_count; ++i) {
4267 STBI_ASSERT(s->img_out_n == 4);
4268 if (stbi__unpremultiply_on_load) {
4270 for (i=0; i < pixel_count; ++i) {
4274 p[0] = p[2] * 255 /
a;
4275 p[1] = p[1] * 255 /
a;
4285 for (i=0; i < pixel_count; ++i) {
4295 #define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) 4297 static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
4299 stbi_uc palette[1024], pal_img_n=0;
4301 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4302 int first=1,k,interlace=0, color=0, depth=0, is_iphone=0;
4303 stbi__context *s = z->s;
4309 if (!stbi__check_png_header(s))
return 0;
4311 if (scan == STBI__SCAN_type)
return 1;
4314 stbi__pngchunk c = stbi__get_chunk_header(s);
4316 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4318 stbi__skip(s, c.length);
4320 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4322 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4324 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4325 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4326 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4327 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");
4328 color = stbi__get8(s);
if (color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4329 if (color == 3) pal_img_n = 3;
else if (color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4330 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4331 filter= stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4332 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4333 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4335 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4336 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4337 if (scan == STBI__SCAN_header)
return 1;
4342 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4348 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4349 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4350 if (c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4351 pal_len = c.length / 3;
4352 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4353 for (i=0; i < pal_len; ++i) {
4354 palette[i*4+0] = stbi__get8(s);
4355 palette[i*4+1] = stbi__get8(s);
4356 palette[i*4+2] = stbi__get8(s);
4357 palette[i*4+3] = 255;
4362 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4363 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4364 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4366 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4367 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4368 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4370 for (i=0; i < c.length; ++i)
4371 palette[i*4+3] = stbi__get8(s);
4373 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4374 if (c.length != (stbi__uint32) s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4376 for (k=0; k < s->img_n; ++k)
4377 tc[k] = (
stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth];
4382 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4383 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4384 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4385 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4386 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
4387 if (ioff + c.length > idata_limit) {
4389 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4390 while (ioff + c.length > idata_limit)
4392 p = (
stbi_uc *) STBI_REALLOC(z->idata, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4395 if (!stbi__getn(s, z->idata+ioff,c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4400 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4401 stbi__uint32 raw_len, bpl;
4402 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4403 if (scan != STBI__SCAN_load)
return 1;
4404 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4406 bpl = (s->img_x * depth + 7) / 8;
4407 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4409 if (z->expanded == NULL)
return 0;
4410 STBI_FREE(z->idata); z->idata = NULL;
4411 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
4412 s->img_out_n = s->img_n+1;
4414 s->img_out_n = s->img_n;
4415 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace))
return 0;
4417 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4418 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4422 s->img_n = pal_img_n;
4423 s->img_out_n = pal_img_n;
4424 if (req_comp >= 3) s->img_out_n = req_comp;
4425 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4428 STBI_FREE(z->expanded); z->expanded = NULL;
4434 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4435 if ((c.type & (1 << 29)) == 0) {
4436 #ifndef STBI_NO_FAILURE_STRINGS 4438 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4439 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4440 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4441 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4442 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4444 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4446 stbi__skip(s, c.length);
4454 static unsigned char *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp)
4456 unsigned char *result=NULL;
4457 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4458 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4461 if (req_comp && req_comp != p->s->img_out_n) {
4462 result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4463 p->s->img_out_n = req_comp;
4464 if (result == NULL)
return result;
4468 if (n) *n = p->s->img_out_n;
4470 STBI_FREE(p->out); p->out = NULL;
4471 STBI_FREE(p->expanded); p->expanded = NULL;
4472 STBI_FREE(p->idata); p->idata = NULL;
4477 static unsigned char *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4481 return stbi__do_png(&p, x,y,comp,req_comp);
4484 static int stbi__png_test(stbi__context *s)
4487 r = stbi__check_png_header(s);
4492 static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
4494 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
4495 stbi__rewind( p->s );
4498 if (x) *x = p->s->img_x;
4499 if (y) *y = p->s->img_y;
4500 if (comp) *comp = p->s->img_n;
4504 static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
4508 return stbi__png_info_raw(&p, x, y, comp);
4515 static int stbi__bmp_test_raw(stbi__context *s)
4519 if (stbi__get8(s) !=
'B')
return 0;
4520 if (stbi__get8(s) !=
'M')
return 0;
4525 sz = stbi__get32le(s);
4526 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4530 static int stbi__bmp_test(stbi__context *s)
4532 int r = stbi__bmp_test_raw(s);
4539 static int stbi__high_bit(
unsigned int z)
4542 if (z == 0)
return -1;
4543 if (z >= 0x10000) n += 16, z >>= 16;
4544 if (z >= 0x00100) n += 8, z >>= 8;
4545 if (z >= 0x00010) n += 4, z >>= 4;
4546 if (z >= 0x00004) n += 2, z >>= 2;
4547 if (z >= 0x00002) n += 1, z >>= 1;
4551 static int stbi__bitcount(
unsigned int a)
4553 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
4554 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
4555 a = (a + (a >> 4)) & 0x0f0f0f0f;
4557 a = (a + (a >> 16));
4561 static int stbi__shiftsigned(
int v,
int shift,
int bits)
4566 if (shift < 0) v <<= -shift;
4578 static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4581 unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0;
4583 int psize=0,i,j,compress=0,
width;
4585 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
4589 offset = stbi__get32le(s);
4590 hsz = stbi__get32le(s);
4591 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
4593 s->img_x = stbi__get16le(s);
4594 s->img_y = stbi__get16le(s);
4596 s->img_x = stbi__get32le(s);
4597 s->img_y = stbi__get32le(s);
4599 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
4600 bpp = stbi__get16le(s);
4601 if (bpp == 1)
return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
4602 flip_vertically = ((
int) s->img_y) > 0;
4603 s->img_y = abs((
int) s->img_y);
4606 psize = (offset - 14 - 24) / 3;
4608 compress = stbi__get32le(s);
4609 if (compress == 1 || compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
4615 if (hsz == 40 || hsz == 56) {
4622 if (bpp == 16 || bpp == 32) {
4624 if (compress == 0) {
4631 STBI_NOTUSED(fake_a);
4637 }
else if (compress == 3) {
4638 mr = stbi__get32le(s);
4639 mg = stbi__get32le(s);
4640 mb = stbi__get32le(s);
4642 if (mr == mg && mg == mb) {
4644 return stbi__errpuc(
"bad BMP",
"bad BMP");
4647 return stbi__errpuc(
"bad BMP",
"bad BMP");
4650 STBI_ASSERT(hsz == 108 || hsz == 124);
4651 mr = stbi__get32le(s);
4652 mg = stbi__get32le(s);
4653 mb = stbi__get32le(s);
4654 ma = stbi__get32le(s);
4656 for (i=0; i < 12; ++i)
4666 psize = (offset - 14 - hsz) >> 2;
4668 s->img_n = ma ? 4 : 3;
4669 if (req_comp && req_comp >= 3)
4673 out = (
stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);
4674 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
4677 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
4678 for (i=0; i < psize; ++i) {
4679 pal[i][2] = stbi__get8(s);
4680 pal[i][1] = stbi__get8(s);
4681 pal[i][0] = stbi__get8(s);
4682 if (hsz != 12) stbi__get8(s);
4685 stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
4686 if (bpp == 4) width = (s->img_x + 1) >> 1;
4687 else if (bpp == 8) width = s->img_x;
4688 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
4690 for (j=0; j < (
int) s->img_y; ++j) {
4691 for (i=0; i < (
int) s->img_x; i += 2) {
4692 int v=stbi__get8(s),
v2=0;
4697 out[z++] = pal[
v][0];
4698 out[z++] = pal[
v][1];
4699 out[z++] = pal[
v][2];
4700 if (target == 4) out[z++] = 255;
4701 if (i+1 == (
int) s->img_x)
break;
4702 v = (bpp == 8) ? stbi__get8(s) :
v2;
4703 out[z++] = pal[
v][0];
4704 out[z++] = pal[
v][1];
4705 out[z++] = pal[
v][2];
4706 if (target == 4) out[z++] = 255;
4711 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
4714 stbi__skip(s, offset - 14 - hsz);
4715 if (bpp == 24) width = 3 * s->img_x;
4716 else if (bpp == 16) width = 2*s->img_x;
4721 }
else if (bpp == 32) {
4722 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
4726 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
4728 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
4729 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
4730 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
4731 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
4733 for (j=0; j < (
int) s->img_y; ++j) {
4735 for (i=0; i < (
int) s->img_x; ++i) {
4737 out[z+2] = stbi__get8(s);
4738 out[z+1] = stbi__get8(s);
4739 out[z+0] = stbi__get8(s);
4741 a = (easy == 2 ? stbi__get8(s) : 255);
4742 if (target == 4) out[z++] =
a;
4745 for (i=0; i < (
int) s->img_x; ++i) {
4746 stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
4748 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
4749 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
4750 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
4751 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
4752 if (target == 4) out[z++] = STBI__BYTECAST(a);
4758 if (flip_vertically) {
4760 for (j=0; j < (
int) s->img_y>>1; ++j) {
4762 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
4763 for (i=0; i < (
int) s->img_x*target; ++i) {
4764 t = p1[i], p1[i] = p2[i], p2[i] =
t;
4769 if (req_comp && req_comp != target) {
4770 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
4771 if (out == NULL)
return out;
4776 if (comp) *comp = s->img_n;
4784 static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
4786 int tga_w, tga_h, tga_comp;
4796 if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11))
return 0;
4798 tga_w = stbi__get16le(s);
4803 tga_h = stbi__get16le(s);
4810 if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
4817 if (comp) *comp = tga_comp / 8;
4821 static int stbi__tga_test(stbi__context *s)
4827 if ( sz > 1 )
return 0;
4829 if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) )
return 0;
4835 if ( stbi__get16be(s) < 1 )
return 0;
4836 if ( stbi__get16be(s) < 1 )
return 0;
4838 if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )
4846 static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4849 int tga_offset = stbi__get8(s);
4850 int tga_indexed = stbi__get8(s);
4851 int tga_image_type = stbi__get8(s);
4853 int tga_palette_start = stbi__get16le(s);
4854 int tga_palette_len = stbi__get16le(s);
4855 int tga_palette_bits = stbi__get8(s);
4856 int tga_x_origin = stbi__get16le(s);
4857 int tga_y_origin = stbi__get16le(s);
4858 int tga_width = stbi__get16le(s);
4859 int tga_height = stbi__get16le(s);
4860 int tga_bits_per_pixel = stbi__get8(s);
4861 int tga_comp = tga_bits_per_pixel / 8;
4862 int tga_inverted = stbi__get8(s);
4864 unsigned char *tga_data;
4865 unsigned char *tga_palette = NULL;
4867 unsigned char raw_data[4];
4869 int RLE_repeating = 0;
4870 int read_next_pixel = 1;
4873 if ( tga_image_type >= 8 )
4875 tga_image_type -= 8;
4879 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
4883 (tga_width < 1) || (tga_height < 1) ||
4884 (tga_image_type < 1) || (tga_image_type > 3) ||
4885 ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
4886 (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
4895 tga_comp = tga_palette_bits / 8;
4901 if (comp) *comp = tga_comp;
4903 tga_data = (
unsigned char*)stbi__malloc( (
size_t)tga_width * tga_height * tga_comp );
4904 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
4907 stbi__skip(s, tga_offset );
4909 if ( !tga_indexed && !tga_is_RLE) {
4910 for (i=0; i < tga_height; ++i) {
4911 int y = tga_inverted ? tga_height -i - 1 : i;
4912 stbi_uc *tga_row = tga_data + y*tga_width*tga_comp;
4913 stbi__getn(s, tga_row, tga_width * tga_comp);
4920 stbi__skip(s, tga_palette_start );
4922 tga_palette = (
unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );
4924 STBI_FREE(tga_data);
4925 return stbi__errpuc(
"outofmem",
"Out of memory");
4927 if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
4928 STBI_FREE(tga_data);
4929 STBI_FREE(tga_palette);
4930 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
4934 for (i=0; i < tga_width * tga_height; ++i)
4939 if ( RLE_count == 0 )
4942 int RLE_cmd = stbi__get8(s);
4943 RLE_count = 1 + (RLE_cmd & 127);
4944 RLE_repeating = RLE_cmd >> 7;
4945 read_next_pixel = 1;
4946 }
else if ( !RLE_repeating )
4948 read_next_pixel = 1;
4952 read_next_pixel = 1;
4955 if ( read_next_pixel )
4961 int pal_idx = stbi__get8(s);
4962 if ( pal_idx >= tga_palette_len )
4967 pal_idx *= tga_bits_per_pixel / 8;
4968 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
4970 raw_data[j] = tga_palette[pal_idx+j];
4975 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
4977 raw_data[j] = stbi__get8(s);
4981 read_next_pixel = 0;
4985 for (j = 0; j < tga_comp; ++j)
4986 tga_data[i*tga_comp+j] = raw_data[j];
4994 for (j = 0; j*2 < tga_height; ++j)
4996 int index1 = j * tga_width * tga_comp;
4997 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
4998 for (i = tga_width * tga_comp; i > 0; --i)
5000 unsigned char temp = tga_data[index1];
5001 tga_data[index1] = tga_data[index2];
5002 tga_data[index2] = temp;
5009 if ( tga_palette != NULL )
5011 STBI_FREE( tga_palette );
5018 unsigned char* tga_pixel = tga_data;
5019 for (i=0; i < tga_width * tga_height; ++i)
5021 unsigned char temp = tga_pixel[0];
5022 tga_pixel[0] = tga_pixel[2];
5023 tga_pixel[2] = temp;
5024 tga_pixel += tga_comp;
5029 if (req_comp && req_comp != tga_comp)
5030 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5034 tga_palette_start = tga_palette_len = tga_palette_bits =
5035 tga_x_origin = tga_y_origin = 0;
5045 static int stbi__psd_test(stbi__context *s)
5047 int r = (stbi__get32be(s) == 0x38425053);
5052 static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5055 int channelCount, compression;
5061 if (stbi__get32be(s) != 0x38425053)
5062 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5065 if (stbi__get16be(s) != 1)
5066 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5072 channelCount = stbi__get16be(s);
5073 if (channelCount < 0 || channelCount > 16)
5074 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5077 h = stbi__get32be(s);
5078 w = stbi__get32be(s);
5081 if (stbi__get16be(s) != 8)
5082 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 bit");
5094 if (stbi__get16be(s) != 3)
5095 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5098 stbi__skip(s,stbi__get32be(s) );
5101 stbi__skip(s, stbi__get32be(s) );
5104 stbi__skip(s, stbi__get32be(s) );
5110 compression = stbi__get16be(s);
5111 if (compression > 1)
5112 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5115 out = (
stbi_uc *) stbi__malloc(4 * w*h);
5116 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5134 stbi__skip(s, h * channelCount * 2 );
5137 for (channel = 0; channel < 4; channel++) {
5141 if (channel >= channelCount) {
5143 for (i = 0; i < pixelCount; i++, p += 4)
5144 *p = (channel == 3 ? 255 : 0);
5148 while (count < pixelCount) {
5149 len = stbi__get8(s);
5152 }
else if (len < 128) {
5161 }
else if (len > 128) {
5167 val = stbi__get8(s);
5184 for (channel = 0; channel < 4; channel++) {
5188 if (channel > channelCount) {
5190 for (i = 0; i < pixelCount; i++, p += 4)
5191 *p = channel == 3 ? 255 : 0;
5194 for (i = 0; i < pixelCount; i++, p += 4)
5200 if (req_comp && req_comp != 4) {
5201 out = stbi__convert_format(out, 4, req_comp, w, h);
5202 if (out == NULL)
return out;
5205 if (comp) *comp = 4;
5221 static int stbi__pic_is4(stbi__context *s,
const char *str)
5225 if (stbi__get8(s) != (
stbi_uc)str[i])
5231 static int stbi__pic_test_core(stbi__context *s)
5235 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
5241 if (!stbi__pic_is4(s,
"PICT"))
5252 static stbi_uc *stbi__readval(stbi__context *s,
int channel,
stbi_uc *dest)
5256 for (i=0; i<4; ++i, mask>>=1) {
5257 if (channel & mask) {
5258 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
5259 dest[i]=stbi__get8(s);
5266 static void stbi__copyval(
int channel,
stbi_uc *dest,
const stbi_uc *src)
5270 for (i=0;i<4; ++i, mask>>=1)
5275 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp,
stbi_uc *result)
5277 int act_comp=0,num_packets=0,
y,chained;
5278 stbi__pic_packet packets[10];
5283 stbi__pic_packet *packet;
5285 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
5286 return stbi__errpuc(
"bad format",
"too many packets");
5288 packet = &packets[num_packets++];
5290 chained = stbi__get8(s);
5291 packet->size = stbi__get8(s);
5292 packet->type = stbi__get8(s);
5293 packet->channel = stbi__get8(s);
5295 act_comp |= packet->channel;
5297 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
5298 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
5301 *comp = (act_comp & 0x10 ? 4 : 3);
5306 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
5307 stbi__pic_packet *packet = &packets[packet_idx];
5308 stbi_uc *dest = result+y*width*4;
5310 switch (packet->type) {
5312 return stbi__errpuc(
"bad format",
"packet has bad compression type");
5317 for(x=0;x<
width;++
x, dest+=4)
5318 if (!stbi__readval(s,packet->channel,dest))
5330 count=stbi__get8(s);
5331 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
5336 if (!stbi__readval(s,packet->channel,value))
return 0;
5338 for(i=0; i<
count; ++i,dest+=4)
5339 stbi__copyval(packet->channel,dest,value);
5348 int count = stbi__get8(s), i;
5349 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
5356 count = stbi__get16be(s);
5360 return stbi__errpuc(
"bad file",
"scanline overrun");
5362 if (!stbi__readval(s,packet->channel,value))
5365 for(i=0;i<
count;++i, dest += 4)
5366 stbi__copyval(packet->channel,dest,value);
5369 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
5371 for(i=0;i<
count;++i, dest+=4)
5372 if (!stbi__readval(s,packet->channel,dest))
5386 static stbi_uc *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp)
5391 for (i=0; i<92; ++i)
5394 x = stbi__get16be(s);
5395 y = stbi__get16be(s);
5396 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
5397 if ((1 << 28) / x < y)
return stbi__errpuc(
"too large",
"Image too large to decode");
5404 result = (
stbi_uc *) stbi__malloc(x*y*4);
5405 memset(result, 0xff, x*y*4);
5407 if (!stbi__pic_load_core(s,x,y,comp, result)) {
5413 if (req_comp == 0) req_comp = *comp;
5414 result=stbi__convert_format(result,4,req_comp,x,y);
5419 static int stbi__pic_test(stbi__context *s)
5421 int r = stbi__pic_test_core(s);
5442 int flags, bgindex, ratio, transparent, eflags;
5445 stbi__gif_lzw codes[4096];
5449 int start_x, start_y;
5455 static int stbi__gif_test_raw(stbi__context *s)
5458 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
5460 if (sz !=
'9' && sz !=
'7')
return 0;
5461 if (stbi__get8(s) !=
'a')
return 0;
5465 static int stbi__gif_test(stbi__context *s)
5467 int r = stbi__gif_test_raw(s);
5472 static void stbi__gif_parse_colortable(stbi__context *s,
stbi_uc pal[256][4],
int num_entries,
int transp)
5475 for (i=0; i < num_entries; ++i) {
5476 pal[i][2] = stbi__get8(s);
5477 pal[i][1] = stbi__get8(s);
5478 pal[i][0] = stbi__get8(s);
5479 pal[i][3] = transp == i ? 0 : 255;
5483 static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
5486 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
5487 return stbi__err(
"not GIF",
"Corrupt GIF");
5489 version = stbi__get8(s);
5490 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
5491 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
5493 stbi__g_failure_reason =
"";
5494 g->w = stbi__get16le(s);
5495 g->h = stbi__get16le(s);
5496 g->flags = stbi__get8(s);
5497 g->bgindex = stbi__get8(s);
5498 g->ratio = stbi__get8(s);
5499 g->transparent = -1;
5501 if (comp != 0) *comp = 4;
5503 if (is_info)
return 1;
5505 if (g->flags & 0x80)
5506 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
5511 static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
5514 if (!stbi__gif_header(s, &g, comp, 1)) {
5523 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
5529 if (g->codes[code].prefix >= 0)
5530 stbi__out_gif_code(g, g->codes[code].prefix);
5532 if (g->cur_y >= g->max_y)
return;
5534 p = &g->out[g->cur_x + g->cur_y];
5535 c = &g->color_table[g->codes[code].suffix * 4];
5545 if (g->cur_x >= g->max_x) {
5546 g->cur_x = g->start_x;
5547 g->cur_y += g->step;
5549 while (g->cur_y >= g->max_y && g->parse > 0) {
5550 g->step = (1 << g->parse) * g->line_size;
5551 g->cur_y = g->start_y + (g->step >> 1);
5557 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
5560 stbi__int32
len, code;
5562 stbi__int32 codesize, codemask, avail, oldcode,
bits, valid_bits, clear;
5565 lzw_cs = stbi__get8(s);
5566 if (lzw_cs > 12)
return NULL;
5567 clear = 1 << lzw_cs;
5569 codesize = lzw_cs + 1;
5570 codemask = (1 << codesize) - 1;
5573 for (code = 0; code < clear; code++) {
5574 g->codes[code].prefix = -1;
5575 g->codes[code].first = (
stbi_uc) code;
5576 g->codes[code].suffix = (
stbi_uc) code;
5585 if (valid_bits < codesize) {
5587 len = stbi__get8(s);
5592 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
5595 stbi__int32 code = bits & codemask;
5597 valid_bits -= codesize;
5599 if (code == clear) {
5600 codesize = lzw_cs + 1;
5601 codemask = (1 << codesize) - 1;
5605 }
else if (code == clear + 1) {
5607 while ((len = stbi__get8(s)) > 0)
5610 }
else if (code <= avail) {
5611 if (first)
return stbi__errpuc(
"no clear code",
"Corrupt GIF");
5614 p = &g->codes[avail++];
5615 if (avail > 4096)
return stbi__errpuc(
"too many codes",
"Corrupt GIF");
5616 p->prefix = (stbi__int16) oldcode;
5617 p->first = g->codes[oldcode].first;
5618 p->suffix = (code == avail) ? p->first : g->codes[code].first;
5619 }
else if (code == avail)
5620 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5622 stbi__out_gif_code(g, (stbi__uint16) code);
5624 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
5626 codemask = (1 << codesize) - 1;
5631 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5637 static void stbi__fill_gif_background(stbi__gif *g)
5640 stbi_uc *c = g->pal[g->bgindex];
5642 for (i = 0; i < g->w * g->h * 4; i += 4) {
5652 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp)
5658 if (!stbi__gif_header(s, g, comp,0))
return 0;
5659 g->out = (
stbi_uc *) stbi__malloc(4 * g->w * g->h);
5660 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5661 stbi__fill_gif_background(g);
5664 if (((g->eflags & 0x1C) >> 2) == 3) {
5666 g->out = (
stbi_uc *) stbi__malloc(4 * g->w * g->h);
5667 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5668 memcpy(g->out, old_out, g->w*g->h*4);
5673 switch (stbi__get8(s)) {
5676 stbi__int32
x,
y,
w,
h;
5679 x = stbi__get16le(s);
5680 y = stbi__get16le(s);
5681 w = stbi__get16le(s);
5682 h = stbi__get16le(s);
5683 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
5684 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
5686 g->line_size = g->w * 4;
5688 g->start_y = y * g->line_size;
5689 g->max_x = g->start_x + w * 4;
5690 g->max_y = g->start_y + h * g->line_size;
5691 g->cur_x = g->start_x;
5692 g->cur_y = g->start_y;
5694 g->lflags = stbi__get8(s);
5696 if (g->lflags & 0x40) {
5697 g->step = 8 * g->line_size;
5700 g->step = g->line_size;
5704 if (g->lflags & 0x80) {
5705 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
5706 g->color_table = (
stbi_uc *) g->lpal;
5707 }
else if (g->flags & 0x80) {
5708 for (i=0; i < 256; ++i)
5710 if (g->transparent >= 0 && (g->eflags & 0x01))
5711 g->pal[g->transparent][3] = 0;
5712 g->color_table = (
stbi_uc *) g->pal;
5714 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
5716 o = stbi__process_gif_raster(s, g);
5717 if (o == NULL)
return NULL;
5719 if (req_comp && req_comp != 4)
5720 o = stbi__convert_format(o, 4, req_comp, g->w, g->h);
5727 if (stbi__get8(s) == 0xF9) {
5728 len = stbi__get8(s);
5730 g->eflags = stbi__get8(s);
5732 g->transparent = stbi__get8(s);
5738 while ((len = stbi__get8(s)) != 0)
5747 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
5752 static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5756 memset(&g, 0,
sizeof(g));
5758 u = stbi__gif_load_next(s, &g, comp, req_comp);
5759 if (u == (
stbi_uc *) s) u = 0;
5768 static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
5770 return stbi__gif_info_raw(s,x,y,comp);
5778 static int stbi__hdr_test_core(stbi__context *s)
5780 const char *signature =
"#?RADIANCE\n";
5782 for (i=0; signature[i]; ++i)
5783 if (stbi__get8(s) != signature[i])
5788 static int stbi__hdr_test(stbi__context* s)
5790 int r = stbi__hdr_test_core(s);
5795 #define STBI__HDR_BUFLEN 1024 5796 static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
5801 c = (char) stbi__get8(z);
5803 while (!stbi__at_eof(z) && c !=
'\n') {
5805 if (len == STBI__HDR_BUFLEN-1) {
5807 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
5811 c = (char) stbi__get8(z);
5818 static void stbi__hdr_convert(
float *output,
stbi_uc *input,
int req_comp)
5820 if ( input[3] != 0 ) {
5823 f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
5825 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
5827 output[0] = input[0] * f1;
5828 output[1] = input[1] * f1;
5829 output[2] = input[2] * f1;
5831 if (req_comp == 2) output[1] = 1;
5832 if (req_comp == 4) output[3] = 1;
5835 case 4: output[3] = 1;
5836 case 3: output[0] = output[1] = output[2] = 0;
5838 case 2: output[1] = 1;
5839 case 1: output[0] = 0;
5845 static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5847 char buffer[STBI__HDR_BUFLEN];
5855 int i, j, k, c1,c2,
z;
5859 if (strcmp(stbi__hdr_gettoken(s,buffer),
"#?RADIANCE") != 0)
5860 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
5864 token = stbi__hdr_gettoken(s,buffer);
5865 if (token[0] == 0)
break;
5866 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5869 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
5873 token = stbi__hdr_gettoken(s,buffer);
5874 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5876 height = (
int) strtol(token, &token, 10);
5877 while (*token ==
' ') ++token;
5878 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5880 width = (
int) strtol(token, NULL, 10);
5885 if (comp) *comp = 3;
5886 if (req_comp == 0) req_comp = 3;
5889 hdr_data = (
float *) stbi__malloc(height * width * req_comp *
sizeof(
float));
5895 for (j=0; j <
height; ++j) {
5896 for (i=0; i <
width; ++i) {
5899 stbi__getn(s, rgbe, 4);
5900 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
5907 for (j = 0; j <
height; ++j) {
5910 len = stbi__get8(s);
5911 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
5918 rgbe[3] = (
stbi_uc) stbi__get8(s);
5919 stbi__hdr_convert(hdr_data, rgbe, req_comp);
5922 STBI_FREE(scanline);
5923 goto main_decode_loop;
5926 len |= stbi__get8(s);
5927 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
5928 if (scanline == NULL) scanline = (
stbi_uc *) stbi__malloc(width * 4);
5930 for (k = 0; k < 4; ++k) {
5933 count = stbi__get8(s);
5936 value = stbi__get8(s);
5938 for (z = 0; z <
count; ++
z)
5939 scanline[i++ * 4 + k] = value;
5942 for (z = 0; z <
count; ++
z)
5943 scanline[i++ * 4 + k] = stbi__get8(s);
5947 for (i=0; i <
width; ++i)
5948 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
5950 STBI_FREE(scanline);
5956 static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
5958 char buffer[STBI__HDR_BUFLEN];
5962 if (strcmp(stbi__hdr_gettoken(s,buffer),
"#?RADIANCE") != 0) {
5968 token = stbi__hdr_gettoken(s,buffer);
5969 if (token[0] == 0)
break;
5970 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5977 token = stbi__hdr_gettoken(s,buffer);
5978 if (strncmp(token,
"-Y ", 3)) {
5983 *y = (
int) strtol(token, &token, 10);
5984 while (*token ==
' ') ++token;
5985 if (strncmp(token,
"+X ", 3)) {
5990 *x = (
int) strtol(token, NULL, 10);
5994 #endif // STBI_NO_HDR 5997 static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
6000 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M') {
6005 hsz = stbi__get32le(s);
6006 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
6011 *x = stbi__get16le(s);
6012 *y = stbi__get16le(s);
6014 *x = stbi__get32le(s);
6015 *y = stbi__get32le(s);
6017 if (stbi__get16le(s) != 1) {
6021 *comp = stbi__get16le(s) / 8;
6027 static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
6030 if (stbi__get32be(s) != 0x38425053) {
6034 if (stbi__get16be(s) != 1) {
6039 channelCount = stbi__get16be(s);
6040 if (channelCount < 0 || channelCount > 16) {
6044 *y = stbi__get32be(s);
6045 *x = stbi__get32be(s);
6046 if (stbi__get16be(s) != 8) {
6050 if (stbi__get16be(s) != 3) {
6060 static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
6062 int act_comp=0,num_packets=0,chained;
6063 stbi__pic_packet packets[10];
6067 *x = stbi__get16be(s);
6068 *y = stbi__get16be(s);
6069 if (stbi__at_eof(s))
return 0;
6070 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
6078 stbi__pic_packet *packet;
6080 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
6083 packet = &packets[num_packets++];
6084 chained = stbi__get8(s);
6085 packet->size = stbi__get8(s);
6086 packet->type = stbi__get8(s);
6087 packet->channel = stbi__get8(s);
6088 act_comp |= packet->channel;
6090 if (stbi__at_eof(s)) {
6094 if (packet->size != 8) {
6100 *comp = (act_comp & 0x10 ? 4 : 3);
6120 static int stbi__pnm_test(stbi__context *s)
6123 p = (char) stbi__get8(s);
6124 t = (char) stbi__get8(s);
6125 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6132 static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
6135 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
6141 out = (
stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y);
6142 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6143 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
6145 if (req_comp && req_comp != s->img_n) {
6146 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
6147 if (out == NULL)
return out;
6152 static int stbi__pnm_isspace(
char c)
6154 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
6157 static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
6159 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
6160 *c = (char) stbi__get8(s);
6163 static int stbi__pnm_isdigit(
char c)
6165 return c >=
'0' && c <=
'9';
6168 static int stbi__pnm_getinteger(stbi__context *s,
char *c)
6172 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
6173 value = value*10 + (*c -
'0');
6174 *c = (char) stbi__get8(s);
6180 static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
6188 p = (char) stbi__get8(s);
6189 t = (char) stbi__get8(s);
6190 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6195 *comp = (t ==
'6') ? 3 : 1;
6197 c = (char) stbi__get8(s);
6198 stbi__pnm_skip_whitespace(s, &c);
6200 *x = stbi__pnm_getinteger(s, &c);
6201 stbi__pnm_skip_whitespace(s, &c);
6203 *y = stbi__pnm_getinteger(s, &c);
6204 stbi__pnm_skip_whitespace(s, &c);
6206 maxv = stbi__pnm_getinteger(s, &c);
6209 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
6215 static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
6217 #ifndef STBI_NO_JPEG 6218 if (stbi__jpeg_info(s, x, y, comp))
return 1;
6222 if (stbi__png_info(s, x, y, comp))
return 1;
6226 if (stbi__gif_info(s, x, y, comp))
return 1;
6230 if (stbi__bmp_info(s, x, y, comp))
return 1;
6234 if (stbi__psd_info(s, x, y, comp))
return 1;
6238 if (stbi__pic_info(s, x, y, comp))
return 1;
6242 if (stbi__pnm_info(s, x, y, comp))
return 1;
6246 if (stbi__hdr_info(s, x, y, comp))
return 1;
6251 if (stbi__tga_info(s, x, y, comp))
6254 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
6257 #ifndef STBI_NO_STDIO 6260 FILE *f = stbi__fopen(filename,
"rb");
6262 if (!f)
return stbi__err(
"can't fopen",
"Unable to open file");
6272 long pos = ftell(f);
6273 stbi__start_file(&s, f);
6274 r = stbi__info_main(&s,x,y,comp);
6275 fseek(f,pos,SEEK_SET);
6278 #endif // !STBI_NO_STDIO 6283 stbi__start_mem(&s,buffer,len);
6284 return stbi__info_main(&s,x,y,comp);
6291 return stbi__info_main(&s,x,y,comp);
6294 #endif // STB_IMAGE_IMPLEMENTATION
GLfixed GLfixed GLint GLint order
GLfloat GLfloat GLfloat v2
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)
GLint GLint GLsizei GLsizei height
GLint GLint GLint GLint GLint GLint y
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t0
GLenum GLenum GLenum GLenum GLenum scale
STBIDEF void stbi_hdr_to_ldr_scale(float scale)
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat GLfloat t1
GLint GLint GLsizei GLsizei GLsizei depth
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)
GLfloat GLfloat GLfloat GLfloat h
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma)
GLfixed GLfixed GLfixed y2
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)
GLuint GLuint GLsizei count
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
GLenum GLenum GLsizei void * row
STBIDEF int stbi_is_hdr_from_file(FILE *f)
typedef int(WINAPI *PFNWGLRELEASEPBUFFERDCARBPROC)(HPBUFFERARB hPbuffer
STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * bits
GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const void * data
GLboolean GLboolean GLboolean GLboolean a
GLsizei const GLfloat * value
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp)
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble GLdouble w2
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)
GLboolean GLboolean GLboolean b
typedef void(APIENTRYP PFNGLDRAWRANGEELEMENTSPROC)(GLenum mode
STBIDEF int stbi_is_hdr(char const *filename)
GLuint GLfloat GLfloat GLfloat x1
GLenum GLsizei GLsizei GLint * values
STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
GLenum GLenum GLenum input
GLint GLint GLsizei width
STBIDEF float * stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
GLsizei GLfixed GLfixed yorig
STBIDEF void stbi_image_free(void *retval_from_stbi_load)
GLuint GLsizei GLsizei * length
GLdouble GLdouble GLdouble GLdouble q
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)
GLuint GLsizei const GLuint const GLintptr const GLsizeiptr * sizes
GLdouble GLdouble GLdouble r
GLint GLint GLint GLint GLint x
GLubyte GLubyte GLubyte GLubyte w
GLuint GLuint GLsizei GLenum type
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)