214 #ifndef STBI_INCLUDE_STB_IMAGE_H 215 #define STBI_INCLUDE_STB_IMAGE_H 387 #ifndef STBI_NO_STDIO 391 #define STBI_VERSION 1 408 #ifdef STB_IMAGE_STATIC 409 #define STBIDEF static 411 #define STBIDEF extern 425 int (*eof) (
void *user);
432 #ifndef STBI_NO_STDIO 437 #ifndef STBI_NO_LINEAR 442 #ifndef STBI_NO_STDIO 452 #ifndef STBI_NO_LINEAR 460 #ifndef STBI_NO_STDIO 477 #ifndef STBI_NO_STDIO 513 #ifdef STB_IMAGE_IMPLEMENTATION 515 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ 516 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ 517 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ 518 || defined(STBI_ONLY_ZLIB) 519 #ifndef STBI_ONLY_JPEG 522 #ifndef STBI_ONLY_PNG 525 #ifndef STBI_ONLY_BMP 528 #ifndef STBI_ONLY_PSD 531 #ifndef STBI_ONLY_TGA 534 #ifndef STBI_ONLY_GIF 537 #ifndef STBI_ONLY_HDR 540 #ifndef STBI_ONLY_PIC 543 #ifndef STBI_ONLY_PNM 548 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) 558 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) 562 #ifndef STBI_NO_STDIO 568 #define STBI_ASSERT(x) assert(x) 574 #define stbi_inline inline 579 #define stbi_inline __forceinline 584 typedef unsigned short stbi__uint16;
585 typedef signed short stbi__int16;
586 typedef unsigned int stbi__uint32;
587 typedef signed int stbi__int32;
597 typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
600 #define STBI_NOTUSED(v) (void)(v) 602 #define STBI_NOTUSED(v) (void)sizeof(v) 606 #define STBI_HAS_LROTL 609 #ifdef STBI_HAS_LROTL 610 #define stbi_lrot(x,y) _lrotl(x,y) 612 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) 615 #if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC) 617 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) 620 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC." 624 #define STBI_MALLOC(sz) malloc(sz) 625 #define STBI_REALLOC(p,sz) realloc(p,sz) 626 #define STBI_FREE(p) free(p) 630 #if defined(__x86_64__) || defined(_M_X64) 631 #define STBI__X64_TARGET 632 #elif defined(__i386) || defined(_M_IX86) 633 #define STBI__X86_TARGET 636 #if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) 646 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) 662 #if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET) 664 #include <emmintrin.h> 670 static int stbi__cpuid3(
void)
677 static int stbi__cpuid3(
void)
689 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name 691 static int stbi__sse2_available()
693 int info3 = stbi__cpuid3();
694 return ((info3 >> 26) & 1) != 0;
697 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 699 static int stbi__sse2_available()
701 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 703 return __builtin_cpu_supports(
"sse2");
714 #if defined(STBI_NO_SIMD) && defined(STBI_NEON) 719 #include <arm_neon.h> 721 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 724 #ifndef STBI_SIMD_ALIGN 725 #define STBI_SIMD_ALIGN(type, name) type name 736 stbi__uint32 img_x, img_y;
737 int img_n, img_out_n;
742 int read_from_callbacks;
746 stbi_uc *img_buffer, *img_buffer_end;
751 static void stbi__refill_buffer(stbi__context *
s);
757 s->read_from_callbacks = 0;
766 s->io_user_data = user;
767 s->buflen =
sizeof(
s->buffer_start);
768 s->read_from_callbacks = 1;
769 s->img_buffer_original =
s->buffer_start;
770 stbi__refill_buffer(
s);
773 #ifndef STBI_NO_STDIO 775 static int stbi__stdio_read(
void *user,
char *
data,
int size)
780 static void stbi__stdio_skip(
void *user,
int n)
785 static int stbi__stdio_eof(
void *user)
797 static void stbi__start_file(stbi__context *
s,
FILE *
f)
799 stbi__start_callbacks(
s, &stbi__stdio_callbacks, (
void *)
f);
804 static void stbi__rewind(stbi__context *
s)
810 s->img_buffer =
s->img_buffer_original;
814 static int stbi__jpeg_test(stbi__context *
s);
815 static stbi_uc *stbi__jpeg_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp);
816 static int stbi__jpeg_info(stbi__context *
s,
int *
x,
int *
y,
int *comp);
820 static int stbi__png_test(stbi__context *
s);
821 static stbi_uc *stbi__png_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp);
822 static int stbi__png_info(stbi__context *
s,
int *
x,
int *
y,
int *comp);
826 static int stbi__bmp_test(stbi__context *
s);
827 static stbi_uc *stbi__bmp_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp);
828 static int stbi__bmp_info(stbi__context *
s,
int *
x,
int *
y,
int *comp);
832 static int stbi__tga_test(stbi__context *
s);
833 static stbi_uc *stbi__tga_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp);
834 static int stbi__tga_info(stbi__context *
s,
int *
x,
int *
y,
int *comp);
838 static int stbi__psd_test(stbi__context *
s);
839 static stbi_uc *stbi__psd_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp);
840 static int stbi__psd_info(stbi__context *
s,
int *
x,
int *
y,
int *comp);
844 static int stbi__hdr_test(stbi__context *
s);
845 static float *stbi__hdr_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp);
846 static int stbi__hdr_info(stbi__context *
s,
int *
x,
int *
y,
int *comp);
850 static int stbi__pic_test(stbi__context *
s);
851 static stbi_uc *stbi__pic_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp);
852 static int stbi__pic_info(stbi__context *
s,
int *
x,
int *
y,
int *comp);
856 static int stbi__gif_test(stbi__context *
s);
857 static stbi_uc *stbi__gif_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp);
858 static int stbi__gif_info(stbi__context *
s,
int *
x,
int *
y,
int *comp);
862 static int stbi__pnm_test(stbi__context *
s);
863 static stbi_uc *stbi__pnm_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp);
864 static int stbi__pnm_info(stbi__context *
s,
int *
x,
int *
y,
int *comp);
868 static const char *stbi__g_failure_reason;
872 return stbi__g_failure_reason;
875 static int stbi__err(
const char *
str)
877 stbi__g_failure_reason =
str;
881 static void *stbi__malloc(
size_t size)
883 return STBI_MALLOC(
size);
890 #ifdef STBI_NO_FAILURE_STRINGS 891 #define stbi__err(x,y) 0 892 #elif defined(STBI_FAILURE_USERMSG) 893 #define stbi__err(x,y) stbi__err(y) 895 #define stbi__err(x,y) stbi__err(x) 898 #define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL)) 899 #define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL)) 903 STBI_FREE(retval_from_stbi_load);
906 #ifndef STBI_NO_LINEAR 907 static float *stbi__ldr_to_hdr(
stbi_uc *
data,
int x,
int y,
int comp);
911 static stbi_uc *stbi__hdr_to_ldr(
float *
data,
int x,
int y,
int comp);
914 static int stbi__vertically_flip_on_load = 0;
918 stbi__vertically_flip_on_load = flag_true_if_should_flip;
921 static unsigned char *stbi__load_main(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
924 if (stbi__jpeg_test(
s))
return stbi__jpeg_load(
s,
x,
y,comp,req_comp);
927 if (stbi__png_test(
s))
return stbi__png_load(
s,
x,
y,comp,req_comp);
930 if (stbi__bmp_test(
s))
return stbi__bmp_load(
s,
x,
y,comp,req_comp);
933 if (stbi__gif_test(
s))
return stbi__gif_load(
s,
x,
y,comp,req_comp);
936 if (stbi__psd_test(
s))
return stbi__psd_load(
s,
x,
y,comp,req_comp);
939 if (stbi__pic_test(
s))
return stbi__pic_load(
s,
x,
y,comp,req_comp);
942 if (stbi__pnm_test(
s))
return stbi__pnm_load(
s,
x,
y,comp,req_comp);
946 if (stbi__hdr_test(
s)) {
947 float *hdr = stbi__hdr_load(
s,
x,
y,comp,req_comp);
948 return stbi__hdr_to_ldr(hdr, *
x, *
y, req_comp ? req_comp : *comp);
954 if (stbi__tga_test(
s))
955 return stbi__tga_load(
s,
x,
y,comp,req_comp);
958 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
961 static unsigned char *stbi__load_flip(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
963 unsigned char *
result = stbi__load_main(
s,
x,
y, comp, req_comp);
965 if (stbi__vertically_flip_on_load &&
result !=
NULL) {
967 int depth = req_comp ? req_comp : *comp;
987 static void stbi__float_postprocess(
float *
result,
int *
x,
int *
y,
int *comp,
int req_comp)
989 if (stbi__vertically_flip_on_load &&
result !=
NULL) {
991 int depth = req_comp ? req_comp : *comp;
1010 #ifndef STBI_NO_STDIO 1012 static FILE *stbi__fopen(
char const *filename,
char const *
mode)
1015 #if defined(_MSC_VER) && _MSC_VER >= 1400 1027 FILE *
f = stbi__fopen(filename,
"rb");
1029 if (!
f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1039 stbi__start_file(&
s,
f);
1040 result = stbi__load_flip(&
s,
x,
y,comp,req_comp);
1053 return stbi__load_flip(&
s,
x,
y,comp,req_comp);
1060 return stbi__load_flip(&
s,
x,
y,comp,req_comp);
1063 #ifndef STBI_NO_LINEAR 1064 static float *stbi__loadf_main(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
1066 unsigned char *
data;
1068 if (stbi__hdr_test(
s)) {
1069 float *hdr_data = stbi__hdr_load(
s,
x,
y,comp,req_comp);
1071 stbi__float_postprocess(hdr_data,
x,
y,comp,req_comp);
1075 data = stbi__load_flip(
s,
x,
y, comp, req_comp);
1077 return stbi__ldr_to_hdr(
data, *
x, *
y, req_comp ? req_comp : *comp);
1078 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1085 return stbi__loadf_main(&
s,
x,
y,comp,req_comp);
1092 return stbi__loadf_main(&
s,
x,
y,comp,req_comp);
1095 #ifndef STBI_NO_STDIO 1099 FILE *
f = stbi__fopen(filename,
"rb");
1100 if (!
f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1109 stbi__start_file(&
s,
f);
1110 return stbi__loadf_main(&
s,
x,
y,comp,req_comp);
1112 #endif // !STBI_NO_STDIO 1114 #endif // !STBI_NO_LINEAR 1125 return stbi__hdr_test(&
s);
1133 #ifndef STBI_NO_STDIO 1136 FILE *
f = stbi__fopen(filename,
"rb");
1149 stbi__start_file(&
s,
f);
1150 return stbi__hdr_test(&
s);
1155 #endif // !STBI_NO_STDIO 1162 return stbi__hdr_test(&
s);
1168 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1169 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1171 #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);
1255 int blen = (int) (
s->img_buffer_end -
s->img_buffer);
1261 count = (
s->io.read)(
s->io_user_data, (
char*)
buffer + blen,
n - blen);
1263 s->img_buffer =
s->img_buffer_end;
1268 if (
s->img_buffer+
n <= s->img_buffer_end) {
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.0
f, 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;
1399 float z =
data[i*comp+k] * 255 + 0.5f;
1401 if (
z > 255)
z = 255;
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];
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;
1498 static int stbi__build_huffman(stbi__huffman *
h,
int *
count)
1502 for (i=0; i < 16; ++i)
1510 for(
j=1;
j <= 16; ++
j) {
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;
1526 for (i=0; i < k; ++i) {
1531 for (
j=0;
j <
m; ++
j) {
1541 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *
h)
1548 int rs =
h->values[fast];
1549 int run = (rs >> 4) & 15;
1550 int magbits = rs & 15;
1551 int len =
h->size[fast];
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);
1600 if (
s >
j->code_bits)
1602 j->code_buffer <<=
s;
1604 return h->values[k];
1613 temp =
j->code_buffer >> 16;
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");
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);
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)
1750 if (
j->spec_end != 0)
1751 return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1753 if (
j->code_bits < 16)
1754 stbi__grow_buffer_unsafe(
j);
1756 if (
j->succ_high == 0)
1763 t = stbi__jpeg_huff_decode(
j, hdc);
1764 diff =
t ? stbi__extend_receive(
j,
t) : 0;
1766 dc =
j->img_comp[
b].dc_pred + diff;
1767 j->img_comp[
b].dc_pred = dc;
1768 data[0] = (short) (dc <<
j->succ_low);
1773 if (stbi__jpeg_get_bit(
j))
1774 data[0] += (
short) (1 <<
j->succ_low);
1781 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *
j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
1784 if (
j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1786 if (
j->succ_high == 0) {
1787 int shift =
j->succ_low;
1798 if (
j->code_bits < 16) stbi__grow_buffer_unsafe(
j);
1804 j->code_buffer <<=
s;
1806 zig = stbi__jpeg_dezigzag[k++];
1807 data[zig] = (short) ((
r >> 8) << shift);
1809 int rs = stbi__jpeg_huff_decode(
j, hac);
1810 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1815 j->eob_run = (1 <<
r);
1817 j->eob_run += stbi__jpeg_get_bits(
j,
r);
1824 zig = stbi__jpeg_dezigzag[k++];
1825 data[zig] = (short) (stbi__extend_receive(
j,
s) << shift);
1828 }
while (k <= j->spec_end);
1832 short bit = (short) (1 <<
j->succ_low);
1836 for (k =
j->spec_start; k <= j->spec_end; ++k) {
1837 short *
p = &
data[stbi__jpeg_dezigzag[k]];
1839 if (stbi__jpeg_get_bit(
j))
1840 if ((*
p & bit)==0) {
1851 int rs = stbi__jpeg_huff_decode(
j, hac);
1852 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1857 j->eob_run = (1 <<
r) - 1;
1859 j->eob_run += stbi__jpeg_get_bits(
j,
r);
1867 if (
s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1869 if (stbi__jpeg_get_bit(
j))
1876 while (k <= j->spec_end) {
1877 short *
p = &
data[stbi__jpeg_dezigzag[k++]];
1879 if (stbi__jpeg_get_bit(
j))
1880 if ((*
p & bit)==0) {
1894 }
while (k <= j->spec_end);
1901 stbi_inline
static stbi_uc stbi__clamp(
int x)
1904 if ((
unsigned int)
x > 255) {
1905 if (
x < 0)
return 0;
1906 if (
x > 255)
return 255;
1911 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) 1912 #define stbi__fsh(x) ((x) << 12) 1915 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ 1916 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ 1919 p1 = (p2+p3) * stbi__f2f(0.5411961f); \ 1920 t2 = p1 + p3*stbi__f2f(-1.847759065f); \ 1921 t3 = p1 + p2*stbi__f2f( 0.765366865f); \ 1924 t0 = stbi__fsh(p2+p3); \ 1925 t1 = stbi__fsh(p2-p3); \ 1938 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ 1939 t0 = t0*stbi__f2f( 0.298631336f); \ 1940 t1 = t1*stbi__f2f( 2.053119869f); \ 1941 t2 = t2*stbi__f2f( 3.072711026f); \ 1942 t3 = t3*stbi__f2f( 1.501321110f); \ 1943 p1 = p5 + p1*stbi__f2f(-0.899976223f); \ 1944 p2 = p5 + p2*stbi__f2f(-2.562915447f); \ 1945 p3 = p3*stbi__f2f(-1.961570560f); \ 1946 p4 = p4*stbi__f2f(-0.390180644f); \ 1952 static void stbi__idct_block(
stbi_uc *
out,
int out_stride,
short data[64])
1959 for (i=0; i < 8; ++i,++d, ++
v) {
1961 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
1962 && d[40]==0 && d[48]==0 && d[56]==0) {
1967 int dcterm = d[0] << 2;
1968 v[0] =
v[8] =
v[16] =
v[24] =
v[32] =
v[40] =
v[48] =
v[56] = dcterm;
1970 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
1973 x0 += 512; x1 += 512;
x2 += 512; x3 += 512;
1974 v[ 0] = (x0+t3) >> 10;
1975 v[56] = (x0-t3) >> 10;
1976 v[ 8] = (x1+t2) >> 10;
1977 v[48] = (x1-t2) >> 10;
1978 v[16] = (
x2+t1) >> 10;
1979 v[40] = (
x2-t1) >> 10;
1980 v[24] = (x3+t0) >> 10;
1981 v[32] = (x3-t0) >> 10;
1985 for (i=0,
v=
val, o=
out; i < 8; ++i,
v+=8,o+=out_stride) {
1987 STBI__IDCT_1D(
v[0],
v[1],
v[2],
v[3],
v[4],
v[5],
v[6],
v[7])
1994 x0 += 65536 + (128<<17);
1995 x1 += 65536 + (128<<17);
1996 x2 += 65536 + (128<<17);
1997 x3 += 65536 + (128<<17);
2000 o[0] = stbi__clamp((x0+t3) >> 17);
2001 o[7] = stbi__clamp((x0-t3) >> 17);
2002 o[1] = stbi__clamp((x1+t2) >> 17);
2003 o[6] = stbi__clamp((x1-t2) >> 17);
2004 o[2] = stbi__clamp((
x2+t1) >> 17);
2005 o[5] = stbi__clamp((
x2-t1) >> 17);
2006 o[3] = stbi__clamp((x3+t0) >> 17);
2007 o[4] = stbi__clamp((x3-t0) >> 17);
2016 static void stbi__idct_simd(
stbi_uc *
out,
int out_stride,
short data[64])
2019 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2023 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) 2028 #define dct_rot(out0,out1, x,y,c0,c1) \ 2029 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ 2030 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ 2031 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ 2032 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ 2033 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ 2034 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) 2037 #define dct_widen(out, in) \ 2038 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ 2039 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) 2042 #define dct_wadd(out, a, b) \ 2043 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ 2044 __m128i out##_h = _mm_add_epi32(a##_h, b##_h) 2047 #define dct_wsub(out, a, b) \ 2048 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ 2049 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) 2052 #define dct_bfly32o(out0, out1, a,b,bias,s) \ 2054 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ 2055 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ 2056 dct_wadd(sum, abiased, b); \ 2057 dct_wsub(dif, abiased, b); \ 2058 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ 2059 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ 2063 #define dct_interleave8(a, b) \ 2065 a = _mm_unpacklo_epi8(a, b); \ 2066 b = _mm_unpackhi_epi8(tmp, b) 2069 #define dct_interleave16(a, b) \ 2071 a = _mm_unpacklo_epi16(a, b); \ 2072 b = _mm_unpackhi_epi16(tmp, b) 2074 #define dct_pass(bias,shift) \ 2077 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ 2078 __m128i sum04 = _mm_add_epi16(row0, row4); \ 2079 __m128i dif04 = _mm_sub_epi16(row0, row4); \ 2080 dct_widen(t0e, sum04); \ 2081 dct_widen(t1e, dif04); \ 2082 dct_wadd(x0, t0e, t3e); \ 2083 dct_wsub(x3, t0e, t3e); \ 2084 dct_wadd(x1, t1e, t2e); \ 2085 dct_wsub(x2, t1e, t2e); \ 2087 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ 2088 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ 2089 __m128i sum17 = _mm_add_epi16(row1, row7); \ 2090 __m128i sum35 = _mm_add_epi16(row3, row5); \ 2091 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ 2092 dct_wadd(x4, y0o, y4o); \ 2093 dct_wadd(x5, y1o, y5o); \ 2094 dct_wadd(x6, y2o, y5o); \ 2095 dct_wadd(x7, y3o, y4o); \ 2096 dct_bfly32o(row0,row7, x0,x7,bias,shift); \ 2097 dct_bfly32o(row1,row6, x1,x6,bias,shift); \ 2098 dct_bfly32o(row2,row5, x2,x5,bias,shift); \ 2099 dct_bfly32o(row3,row4, x3,x4,bias,shift); \ 2102 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961
f), stbi__f2f(0.5411961
f) + stbi__f2f(-1.847759065
f));
2103 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961
f) + stbi__f2f( 0.765366865
f), stbi__f2f(0.5411961
f));
2104 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602
f) + stbi__f2f(-0.899976223
f), stbi__f2f(1.175875602
f));
2105 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602
f), stbi__f2f(1.175875602
f) + stbi__f2f(-2.562915447
f));
2106 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560
f) + stbi__f2f( 0.298631336
f), stbi__f2f(-1.961570560
f));
2107 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560
f), stbi__f2f(-1.961570560
f) + stbi__f2f( 3.072711026
f));
2108 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644
f) + stbi__f2f( 2.053119869
f), stbi__f2f(-0.390180644
f));
2109 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644
f), stbi__f2f(-0.390180644
f) + stbi__f2f( 1.501321110
f));
2112 __m128i bias_0 = _mm_set1_epi32(512);
2113 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2116 row0 = _mm_load_si128((
const __m128i *) (
data + 0*8));
2117 row1 = _mm_load_si128((
const __m128i *) (
data + 1*8));
2118 row2 = _mm_load_si128((
const __m128i *) (
data + 2*8));
2119 row3 = _mm_load_si128((
const __m128i *) (
data + 3*8));
2120 row4 = _mm_load_si128((
const __m128i *) (
data + 4*8));
2121 row5 = _mm_load_si128((
const __m128i *) (
data + 5*8));
2122 row6 = _mm_load_si128((
const __m128i *) (
data + 6*8));
2123 row7 = _mm_load_si128((
const __m128i *) (
data + 7*8));
2126 dct_pass(bias_0, 10);
2130 dct_interleave16(row0, row4);
2131 dct_interleave16(row1, row5);
2132 dct_interleave16(row2, row6);
2133 dct_interleave16(row3, row7);
2136 dct_interleave16(row0, row2);
2137 dct_interleave16(row1, row3);
2138 dct_interleave16(row4, row6);
2139 dct_interleave16(row5, row7);
2142 dct_interleave16(row0, row1);
2143 dct_interleave16(row2, row3);
2144 dct_interleave16(row4, row5);
2145 dct_interleave16(row6, row7);
2149 dct_pass(bias_1, 17);
2153 __m128i p0 = _mm_packus_epi16(row0, row1);
2154 __m128i
p1 = _mm_packus_epi16(row2, row3);
2155 __m128i
p2 = _mm_packus_epi16(row4, row5);
2156 __m128i
p3 = _mm_packus_epi16(row6, row7);
2159 dct_interleave8(p0,
p2);
2160 dct_interleave8(
p1,
p3);
2163 dct_interleave8(p0,
p1);
2164 dct_interleave8(
p2,
p3);
2167 dct_interleave8(p0,
p2);
2168 dct_interleave8(
p1,
p3);
2171 _mm_storel_epi64((__m128i *)
out, p0);
out += out_stride;
2172 _mm_storel_epi64((__m128i *)
out, _mm_shuffle_epi32(p0, 0x4e));
out += out_stride;
2173 _mm_storel_epi64((__m128i *)
out,
p2);
out += out_stride;
2174 _mm_storel_epi64((__m128i *)
out, _mm_shuffle_epi32(
p2, 0x4e));
out += out_stride;
2175 _mm_storel_epi64((__m128i *)
out,
p1);
out += out_stride;
2176 _mm_storel_epi64((__m128i *)
out, _mm_shuffle_epi32(
p1, 0x4e));
out += out_stride;
2177 _mm_storel_epi64((__m128i *)
out,
p3);
out += out_stride;
2178 _mm_storel_epi64((__m128i *)
out, _mm_shuffle_epi32(
p3, 0x4e));
2187 #undef dct_interleave8 2188 #undef dct_interleave16 2198 static void stbi__idct_simd(
stbi_uc *
out,
int out_stride,
short data[64])
2200 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2202 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961
f));
2203 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065
f));
2204 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865
f));
2205 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602
f));
2206 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223
f));
2207 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447
f));
2208 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560
f));
2209 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644
f));
2210 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336
f));
2211 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869
f));
2212 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026
f));
2213 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110
f));
2215 #define dct_long_mul(out, inq, coeff) \ 2216 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ 2217 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) 2219 #define dct_long_mac(out, acc, inq, coeff) \ 2220 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ 2221 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) 2223 #define dct_widen(out, inq) \ 2224 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ 2225 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) 2228 #define dct_wadd(out, a, b) \ 2229 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ 2230 int32x4_t out##_h = vaddq_s32(a##_h, b##_h) 2233 #define dct_wsub(out, a, b) \ 2234 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ 2235 int32x4_t out##_h = vsubq_s32(a##_h, b##_h) 2238 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \ 2240 dct_wadd(sum, a, b); \ 2241 dct_wsub(dif, a, b); \ 2242 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ 2243 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ 2246 #define dct_pass(shiftop, shift) \ 2249 int16x8_t sum26 = vaddq_s16(row2, row6); \ 2250 dct_long_mul(p1e, sum26, rot0_0); \ 2251 dct_long_mac(t2e, p1e, row6, rot0_1); \ 2252 dct_long_mac(t3e, p1e, row2, rot0_2); \ 2253 int16x8_t sum04 = vaddq_s16(row0, row4); \ 2254 int16x8_t dif04 = vsubq_s16(row0, row4); \ 2255 dct_widen(t0e, sum04); \ 2256 dct_widen(t1e, dif04); \ 2257 dct_wadd(x0, t0e, t3e); \ 2258 dct_wsub(x3, t0e, t3e); \ 2259 dct_wadd(x1, t1e, t2e); \ 2260 dct_wsub(x2, t1e, t2e); \ 2262 int16x8_t sum15 = vaddq_s16(row1, row5); \ 2263 int16x8_t sum17 = vaddq_s16(row1, row7); \ 2264 int16x8_t sum35 = vaddq_s16(row3, row5); \ 2265 int16x8_t sum37 = vaddq_s16(row3, row7); \ 2266 int16x8_t sumodd = vaddq_s16(sum17, sum35); \ 2267 dct_long_mul(p5o, sumodd, rot1_0); \ 2268 dct_long_mac(p1o, p5o, sum17, rot1_1); \ 2269 dct_long_mac(p2o, p5o, sum35, rot1_2); \ 2270 dct_long_mul(p3o, sum37, rot2_0); \ 2271 dct_long_mul(p4o, sum15, rot2_1); \ 2272 dct_wadd(sump13o, p1o, p3o); \ 2273 dct_wadd(sump24o, p2o, p4o); \ 2274 dct_wadd(sump23o, p2o, p3o); \ 2275 dct_wadd(sump14o, p1o, p4o); \ 2276 dct_long_mac(x4, sump13o, row7, rot3_0); \ 2277 dct_long_mac(x5, sump24o, row5, rot3_1); \ 2278 dct_long_mac(x6, sump23o, row3, rot3_2); \ 2279 dct_long_mac(x7, sump14o, row1, rot3_3); \ 2280 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ 2281 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ 2282 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ 2283 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ 2287 row0 = vld1q_s16(
data + 0*8);
2288 row1 = vld1q_s16(
data + 1*8);
2289 row2 = vld1q_s16(
data + 2*8);
2290 row3 = vld1q_s16(
data + 3*8);
2291 row4 = vld1q_s16(
data + 4*8);
2292 row5 = vld1q_s16(
data + 5*8);
2293 row6 = vld1q_s16(
data + 6*8);
2294 row7 = vld1q_s16(
data + 7*8);
2297 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2300 dct_pass(vrshrn_n_s32, 10);
2306 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } 2307 #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]); } 2308 #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)); } 2311 dct_trn16(row0, row1);
2312 dct_trn16(row2, row3);
2313 dct_trn16(row4, row5);
2314 dct_trn16(row6, row7);
2317 dct_trn32(row0, row2);
2318 dct_trn32(row1, row3);
2319 dct_trn32(row4, row6);
2320 dct_trn32(row5, row7);
2323 dct_trn64(row0, row4);
2324 dct_trn64(row1, row5);
2325 dct_trn64(row2, row6);
2326 dct_trn64(row3, row7);
2337 dct_pass(vshrn_n_s32, 16);
2341 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2342 uint8x8_t
p1 = vqrshrun_n_s16(row1, 1);
2343 uint8x8_t
p2 = vqrshrun_n_s16(row2, 1);
2344 uint8x8_t
p3 = vqrshrun_n_s16(row3, 1);
2345 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2346 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2347 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2348 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2351 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } 2352 #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]); } 2353 #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]); } 2365 dct_trn8_16(p0,
p2);
2366 dct_trn8_16(
p1,
p3);
2367 dct_trn8_16(p4, p6);
2368 dct_trn8_16(p5, p7);
2371 dct_trn8_32(p0, p4);
2372 dct_trn8_32(
p1, p5);
2373 dct_trn8_32(
p2, p6);
2374 dct_trn8_32(
p3, p7);
2377 vst1_u8(
out, p0);
out += out_stride;
2378 vst1_u8(
out,
p1);
out += out_stride;
2379 vst1_u8(
out,
p2);
out += out_stride;
2380 vst1_u8(
out,
p3);
out += out_stride;
2381 vst1_u8(
out, p4);
out += out_stride;
2382 vst1_u8(
out, p5);
out += out_stride;
2383 vst1_u8(
out, p6);
out += out_stride;
2402 #define STBI__MARKER_none 0xff 2407 static stbi_uc stbi__get_marker(stbi__jpeg *
j)
2410 if (
j->marker != STBI__MARKER_none) {
x =
j->marker;
j->marker = STBI__MARKER_none;
return x; }
2411 x = stbi__get8(
j->s);
2412 if (
x != 0xff)
return STBI__MARKER_none;
2414 x = stbi__get8(
j->s);
2421 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) 2426 static void stbi__jpeg_reset(stbi__jpeg *
j)
2431 j->img_comp[0].dc_pred =
j->img_comp[1].dc_pred =
j->img_comp[2].dc_pred = 0;
2432 j->marker = STBI__MARKER_none;
2433 j->todo =
j->restart_interval ?
j->restart_interval : 0x7fffffff;
2439 static int stbi__parse_entropy_coded_data(stbi__jpeg *
z)
2441 stbi__jpeg_reset(
z);
2442 if (!
z->progressive) {
2443 if (
z->scan_n == 1) {
2445 STBI_SIMD_ALIGN(
short,
data[64]);
2446 int n =
z->order[0];
2451 int w = (
z->img_comp[
n].x+7) >> 3;
2452 int h = (
z->img_comp[
n].y+7) >> 3;
2453 for (
j=0;
j <
h; ++
j) {
2454 for (i=0; i <
w; ++i) {
2455 int ha =
z->img_comp[
n].ha;
2456 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;
2457 z->idct_block_kernel(
z->img_comp[
n].data+
z->img_comp[
n].w2*
j*8+i*8,
z->img_comp[
n].w2,
data);
2459 if (--
z->todo <= 0) {
2460 if (
z->code_bits < 24) stbi__grow_buffer_unsafe(
z);
2463 if (!STBI__RESTART(
z->marker))
return 1;
2464 stbi__jpeg_reset(
z);
2471 STBI_SIMD_ALIGN(
short,
data[64]);
2472 for (
j=0;
j <
z->img_mcu_y; ++
j) {
2473 for (i=0; i <
z->img_mcu_x; ++i) {
2475 for (k=0; k <
z->scan_n; ++k) {
2476 int n =
z->order[k];
2479 for (
y=0;
y <
z->img_comp[
n].v; ++
y) {
2480 for (
x=0;
x <
z->img_comp[
n].h; ++
x) {
2481 int x2 = (i*
z->img_comp[
n].h +
x)*8;
2482 int y2 = (
j*
z->img_comp[
n].v +
y)*8;
2483 int ha =
z->img_comp[
n].ha;
2484 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;
2485 z->idct_block_kernel(
z->img_comp[
n].data+
z->img_comp[
n].w2*
y2+
x2,
z->img_comp[
n].w2,
data);
2491 if (--
z->todo <= 0) {
2492 if (
z->code_bits < 24) stbi__grow_buffer_unsafe(
z);
2493 if (!STBI__RESTART(
z->marker))
return 1;
2494 stbi__jpeg_reset(
z);
2501 if (
z->scan_n == 1) {
2503 int n =
z->order[0];
2508 int w = (
z->img_comp[
n].x+7) >> 3;
2509 int h = (
z->img_comp[
n].y+7) >> 3;
2510 for (
j=0;
j <
h; ++
j) {
2511 for (i=0; i <
w; ++i) {
2512 short *
data =
z->img_comp[
n].coeff + 64 * (i +
j *
z->img_comp[
n].coeff_w);
2513 if (
z->spec_start == 0) {
2514 if (!stbi__jpeg_decode_block_prog_dc(
z,
data, &
z->huff_dc[
z->img_comp[
n].hd],
n))
2517 int ha =
z->img_comp[
n].ha;
2518 if (!stbi__jpeg_decode_block_prog_ac(
z,
data, &
z->huff_ac[ha],
z->fast_ac[ha]))
2522 if (--
z->todo <= 0) {
2523 if (
z->code_bits < 24) stbi__grow_buffer_unsafe(
z);
2524 if (!STBI__RESTART(
z->marker))
return 1;
2525 stbi__jpeg_reset(
z);
2532 for (
j=0;
j <
z->img_mcu_y; ++
j) {
2533 for (i=0; i <
z->img_mcu_x; ++i) {
2535 for (k=0; k <
z->scan_n; ++k) {
2536 int n =
z->order[k];
2539 for (
y=0;
y <
z->img_comp[
n].v; ++
y) {
2540 for (
x=0;
x <
z->img_comp[
n].h; ++
x) {
2541 int x2 = (i*
z->img_comp[
n].h +
x);
2542 int y2 = (
j*
z->img_comp[
n].v +
y);
2543 short *
data =
z->img_comp[
n].coeff + 64 * (
x2 +
y2 *
z->img_comp[
n].coeff_w);
2544 if (!stbi__jpeg_decode_block_prog_dc(
z,
data, &
z->huff_dc[
z->img_comp[
n].hd],
n))
2551 if (--
z->todo <= 0) {
2552 if (
z->code_bits < 24) stbi__grow_buffer_unsafe(
z);
2553 if (!STBI__RESTART(
z->marker))
return 1;
2554 stbi__jpeg_reset(
z);
2563 static void stbi__jpeg_dequantize(
short *
data,
stbi_uc *dequant)
2566 for (i=0; i < 64; ++i)
2567 data[i] *= dequant[i];
2570 static void stbi__jpeg_finish(stbi__jpeg *
z)
2572 if (
z->progressive) {
2575 for (
n=0;
n <
z->s->img_n; ++
n) {
2576 int w = (
z->img_comp[
n].x+7) >> 3;
2577 int h = (
z->img_comp[
n].y+7) >> 3;
2578 for (
j=0;
j <
h; ++
j) {
2579 for (i=0; i <
w; ++i) {
2580 short *
data =
z->img_comp[
n].coeff + 64 * (i +
j *
z->img_comp[
n].coeff_w);
2581 stbi__jpeg_dequantize(
data,
z->dequant[
z->img_comp[
n].tq]);
2582 z->idct_block_kernel(
z->img_comp[
n].data+
z->img_comp[
n].w2*
j*8+i*8,
z->img_comp[
n].w2,
data);
2589 static int stbi__process_marker(stbi__jpeg *
z,
int m)
2593 case STBI__MARKER_none:
2594 return stbi__err(
"expected marker",
"Corrupt JPEG");
2597 if (stbi__get16be(
z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2598 z->restart_interval = stbi__get16be(
z->s);
2602 L = stbi__get16be(
z->s)-2;
2604 int q = stbi__get8(
z->s);
2607 if (
p != 0)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2608 if (
t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2609 for (i=0; i < 64; ++i)
2610 z->dequant[
t][stbi__jpeg_dezigzag[i]] = stbi__get8(
z->s);
2616 L = stbi__get16be(
z->s)-2;
2620 int q = stbi__get8(
z->s);
2623 if (
tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2624 for (i=0; i < 16; ++i) {
2625 sizes[i] = stbi__get8(
z->s);
2630 if (!stbi__build_huffman(
z->huff_dc+th,
sizes))
return 0;
2631 v =
z->huff_dc[th].values;
2633 if (!stbi__build_huffman(
z->huff_ac+th,
sizes))
return 0;
2634 v =
z->huff_ac[th].values;
2636 for (i=0; i <
n; ++i)
2637 v[i] = stbi__get8(
z->s);
2639 stbi__build_fast_ac(
z->fast_ac[th],
z->huff_ac + th);
2645 if ((
m >= 0xE0 &&
m <= 0xEF) ||
m == 0xFE) {
2646 stbi__skip(
z->s, stbi__get16be(
z->s)-2);
2653 static int stbi__process_scan_header(stbi__jpeg *
z)
2656 int Ls = stbi__get16be(
z->s);
2658 z->scan_n = stbi__get8(
z->s);
2660 if (
z->scan_n < 1 ||
z->scan_n > 4 ||
z->scan_n > (
int)
z->s->img_n)
2661 return stbi__err(
"bad SOS component count",
"Corrupt JPEG");
2662 if (Ls != 6+2*
z->scan_n)
2663 return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2665 for (i=0; i <
z->scan_n; ++i)
2667 int id = stbi__get8(
z->s), which;
2668 int q = stbi__get8(
z->s);
2670 for (which = 0; which <
z->s->img_n; ++which)
2671 if (
z->img_comp[which].id ==
id)
2673 if (which ==
z->s->img_n)
2676 z->img_comp[which].hd =
q >> 4;
if (
z->img_comp[which].hd > 3)
2677 return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2678 z->img_comp[which].ha =
q & 15;
if (
z->img_comp[which].ha > 3)
2679 return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2680 z->order[i] = which;
2685 z->spec_start = stbi__get8(
z->s);
2686 z->spec_end = stbi__get8(
z->s);
2687 aa = stbi__get8(
z->s);
2688 z->succ_high = (aa >> 4);
2689 z->succ_low = (aa & 15);
2690 if (
z->progressive) {
2691 if (
z->spec_start > 63 ||
z->spec_end > 63 ||
z->spec_start >
z->spec_end ||
z->succ_high > 13 ||
z->succ_low > 13)
2692 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2694 if (
z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2695 if (
z->succ_high != 0 ||
z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2703 static int stbi__process_frame_header(stbi__jpeg *
z,
int scan)
2705 stbi__context *
s =
z->s;
2706 int Lf,
p,i,
q, h_max=1,v_max=1,
c;
2707 Lf = stbi__get16be(
s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2708 p = stbi__get8(
s);
if (
p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
2709 s->img_y = stbi__get16be(
s);
if (
s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
2710 s->img_x = stbi__get16be(
s);
if (
s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
2712 if (
c != 3 &&
c != 1)
return stbi__err(
"bad component count",
"Corrupt JPEG");
2714 for (i=0; i <
c; ++i) {
2715 z->img_comp[i].data =
NULL;
2716 z->img_comp[i].linebuf =
NULL;
2719 if (Lf != 8+3*
s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2721 for (i=0; i <
s->img_n; ++i) {
2722 z->img_comp[i].id = stbi__get8(
s);
2723 if (
z->img_comp[i].id != i+1)
2724 if (
z->img_comp[i].id != i)
2725 return stbi__err(
"bad component ID",
"Corrupt JPEG");
2727 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");
2728 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");
2729 z->img_comp[i].tq = stbi__get8(
s);
if (
z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
2732 if (scan != STBI__SCAN_load)
return 1;
2734 if ((1 << 30) /
s->img_x /
s->img_n <
s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
2736 for (i=0; i <
s->img_n; ++i) {
2737 if (
z->img_comp[i].h > h_max) h_max =
z->img_comp[i].h;
2738 if (
z->img_comp[i].v > v_max) v_max =
z->img_comp[i].v;
2742 z->img_h_max = h_max;
2743 z->img_v_max = v_max;
2744 z->img_mcu_w = h_max * 8;
2745 z->img_mcu_h = v_max * 8;
2746 z->img_mcu_x = (
s->img_x +
z->img_mcu_w-1) /
z->img_mcu_w;
2747 z->img_mcu_y = (
s->img_y +
z->img_mcu_h-1) /
z->img_mcu_h;
2749 for (i=0; i <
s->img_n; ++i) {
2751 z->img_comp[i].x = (
s->img_x *
z->img_comp[i].h + h_max-1) / h_max;
2752 z->img_comp[i].y = (
s->img_y *
z->img_comp[i].v + v_max-1) / v_max;
2757 z->img_comp[i].w2 =
z->img_mcu_x *
z->img_comp[i].h * 8;
2758 z->img_comp[i].h2 =
z->img_mcu_y *
z->img_comp[i].v * 8;
2759 z->img_comp[i].raw_data = stbi__malloc(
z->img_comp[i].w2 *
z->img_comp[i].h2+15);
2761 if (
z->img_comp[i].raw_data ==
NULL) {
2762 for(--i; i >= 0; --i) {
2763 STBI_FREE(
z->img_comp[i].raw_data);
2764 z->img_comp[i].data =
NULL;
2766 return stbi__err(
"outofmem",
"Out of memory");
2769 z->img_comp[i].data = (
stbi_uc*) (((
size_t)
z->img_comp[i].raw_data + 15) & ~15);
2770 z->img_comp[i].linebuf =
NULL;
2771 if (
z->progressive) {
2772 z->img_comp[i].coeff_w = (
z->img_comp[i].w2 + 7) >> 3;
2773 z->img_comp[i].coeff_h = (
z->img_comp[i].h2 + 7) >> 3;
2774 z->img_comp[i].raw_coeff = STBI_MALLOC(
z->img_comp[i].coeff_w *
z->img_comp[i].coeff_h * 64 *
sizeof(
short) + 15);
2775 z->img_comp[i].coeff = (
short*) (((
size_t)
z->img_comp[i].raw_coeff + 15) & ~15);
2777 z->img_comp[i].coeff = 0;
2778 z->img_comp[i].raw_coeff = 0;
2786 #define stbi__DNL(x) ((x) == 0xdc) 2787 #define stbi__SOI(x) ((x) == 0xd8) 2788 #define stbi__EOI(x) ((x) == 0xd9) 2789 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) 2790 #define stbi__SOS(x) ((x) == 0xda) 2792 #define stbi__SOF_progressive(x) ((x) == 0xc2) 2794 static int stbi__decode_jpeg_header(stbi__jpeg *
z,
int scan)
2797 z->marker = STBI__MARKER_none;
2798 m = stbi__get_marker(
z);
2799 if (!stbi__SOI(
m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
2800 if (scan == STBI__SCAN_type)
return 1;
2801 m = stbi__get_marker(
z);
2802 while (!stbi__SOF(
m)) {
2803 if (!stbi__process_marker(
z,
m))
return 0;
2804 m = stbi__get_marker(
z);
2805 while (
m == STBI__MARKER_none) {
2807 if (stbi__at_eof(
z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
2808 m = stbi__get_marker(
z);
2811 z->progressive = stbi__SOF_progressive(
m);
2812 if (!stbi__process_frame_header(
z, scan))
return 0;
2817 static int stbi__decode_jpeg_image(stbi__jpeg *
j)
2820 for (
m = 0;
m < 4;
m++) {
2821 j->img_comp[
m].raw_data =
NULL;
2822 j->img_comp[
m].raw_coeff =
NULL;
2824 j->restart_interval = 0;
2825 if (!stbi__decode_jpeg_header(
j, STBI__SCAN_load))
return 0;
2826 m = stbi__get_marker(
j);
2827 while (!stbi__EOI(
m)) {
2829 if (!stbi__process_scan_header(
j))
return 0;
2830 if (!stbi__parse_entropy_coded_data(
j))
return 0;
2831 if (
j->marker == STBI__MARKER_none ) {
2833 while (!stbi__at_eof(
j->s)) {
2834 int x = stbi__get8(
j->s);
2836 j->marker = stbi__get8(
j->s);
2838 }
else if (
x != 0) {
2839 return stbi__err(
"junk before marker",
"Corrupt JPEG");
2845 if (!stbi__process_marker(
j,
m))
return 0;
2847 m = stbi__get_marker(
j);
2850 stbi__jpeg_finish(
j);
2859 #define stbi__div4(x) ((stbi_uc) ((x) >> 2)) 2864 STBI_NOTUSED(in_far);
2875 for (i=0; i <
w; ++i)
2876 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
2894 for (i=1; i <
w-1; ++i) {
2902 STBI_NOTUSED(in_far);
2908 #define stbi__div16(x) ((stbi_uc) ((x) >> 4)) 2915 out[0] =
out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2919 t1 = 3*in_near[0] + in_far[0];
2920 out[0] = stbi__div4(t1+2);
2921 for (i=1; i <
w; ++i) {
2923 t1 = 3*in_near[i]+in_far[i];
2924 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
2925 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
2927 out[
w*2-1] = stbi__div4(t1+2);
2934 #if defined(STBI_SSE2) || defined(STBI_NEON) 2941 out[0] =
out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2945 t1 = 3*in_near[0] + in_far[0];
2950 for (; i < ((
w-1) & ~7); i += 8)
2952 #if defined(STBI_SSE2) 2955 __m128i zero = _mm_setzero_si128();
2956 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
2957 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
2958 __m128i farw = _mm_unpacklo_epi8(farb, zero);
2959 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
2960 __m128i diff = _mm_sub_epi16(farw, nearw);
2961 __m128i nears = _mm_slli_epi16(nearw, 2);
2962 __m128i curr = _mm_add_epi16(nears, diff);
2970 __m128i prv0 = _mm_slli_si128(curr, 2);
2971 __m128i nxt0 = _mm_srli_si128(curr, 2);
2972 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
2973 __m128i
next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
2979 __m128i
bias = _mm_set1_epi16(8);
2980 __m128i curs = _mm_slli_epi16(curr, 2);
2981 __m128i prvd = _mm_sub_epi16(prev, curr);
2982 __m128i nxtd = _mm_sub_epi16(
next, curr);
2983 __m128i curb = _mm_add_epi16(curs,
bias);
2984 __m128i even = _mm_add_epi16(prvd, curb);
2985 __m128i odd = _mm_add_epi16(nxtd, curb);
2988 __m128i int0 = _mm_unpacklo_epi16(even, odd);
2989 __m128i int1 = _mm_unpackhi_epi16(even, odd);
2990 __m128i de0 = _mm_srli_epi16(int0, 4);
2991 __m128i de1 = _mm_srli_epi16(int1, 4);
2994 __m128i outv = _mm_packus_epi16(de0, de1);
2995 _mm_storeu_si128((__m128i *) (
out + i*2), outv);
2996 #elif defined(STBI_NEON) 2999 uint8x8_t farb = vld1_u8(in_far + i);
3000 uint8x8_t nearb = vld1_u8(in_near + i);
3001 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3002 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3003 int16x8_t curr = vaddq_s16(nears, diff);
3010 int16x8_t prv0 = vextq_s16(curr, curr, 7);
3011 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3012 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3013 int16x8_t
next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3020 int16x8_t curs = vshlq_n_s16(curr, 2);
3021 int16x8_t prvd = vsubq_s16(prev, curr);
3022 int16x8_t nxtd = vsubq_s16(
next, curr);
3023 int16x8_t even = vaddq_s16(curs, prvd);
3024 int16x8_t odd = vaddq_s16(curs, nxtd);
3028 o.val[0] = vqrshrun_n_s16(even, 4);
3029 o.val[1] = vqrshrun_n_s16(odd, 4);
3030 vst2_u8(
out + i*2, o);
3034 t1 = 3*in_near[i+7] + in_far[i+7];
3038 t1 = 3*in_near[i] + in_far[i];
3039 out[i*2] = stbi__div16(3*t1 + t0 + 8);
3041 for (++i; i <
w; ++i) {
3043 t1 = 3*in_near[i]+in_far[i];
3044 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3045 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3047 out[
w*2-1] = stbi__div4(t1+2);
3059 STBI_NOTUSED(in_far);
3060 for (i=0; i <
w; ++i)
3061 for (
j=0;
j < hs; ++
j)
3062 out[i*hs+
j] = in_near[i];
3066 #ifdef STBI_JPEG_OLD 3069 #define float2fixed(x) ((int) ((x) * 65536 + 0.5)) 3073 for (i=0; i <
count; ++i) {
3074 int y_fixed = (
y[i] << 16) + 32768;
3076 int cr = pcr[i] - 128;
3077 int cb = pcb[i] - 128;
3084 if ((
unsigned)
r > 255) {
if (
r < 0)
r = 0;
else r = 255; }
3085 if ((
unsigned)
g > 255) {
if (
g < 0)
g = 0;
else g = 255; }
3086 if ((
unsigned)
b > 255) {
if (
b < 0)
b = 0;
else b = 255; }
3097 #define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) 3101 for (i=0; i <
count; ++i) {
3102 int y_fixed = (
y[i] << 20) + (1<<19);
3104 int cr = pcr[i] - 128;
3105 int cb = pcb[i] - 128;
3112 if ((
unsigned)
r > 255) {
if (
r < 0)
r = 0;
else r = 255; }
3113 if ((
unsigned)
g > 255) {
if (
g < 0)
g = 0;
else g = 255; }
3114 if ((
unsigned)
b > 255) {
if (
b < 0)
b = 0;
else b = 255; }
3124 #if defined(STBI_SSE2) || defined(STBI_NEON) 3137 __m128i signflip = _mm_set1_epi8(-0x80);
3138 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200
f*4096.0
f+0.5
f));
3139 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414
f*4096.0
f+0.5
f));
3140 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414
f*4096.0
f+0.5
f));
3141 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200
f*4096.0
f+0.5
f));
3142 __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
3143 __m128i xw = _mm_set1_epi16(255);
3145 for (; i+7 <
count; i += 8)
3148 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (
y+i));
3149 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3150 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3151 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3152 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3155 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3156 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3157 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3160 __m128i yws = _mm_srli_epi16(yw, 4);
3161 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3162 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3163 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3164 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3165 __m128i rws = _mm_add_epi16(cr0, yws);
3166 __m128i gwt = _mm_add_epi16(cb0, yws);
3167 __m128i bws = _mm_add_epi16(yws, cb1);
3168 __m128i gws = _mm_add_epi16(gwt, cr1);
3171 __m128i rw = _mm_srai_epi16(rws, 4);
3172 __m128i bw = _mm_srai_epi16(bws, 4);
3173 __m128i gw = _mm_srai_epi16(gws, 4);
3176 __m128i brb = _mm_packus_epi16(rw, bw);
3177 __m128i gxb = _mm_packus_epi16(gw, xw);
3180 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3181 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3182 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3183 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3186 _mm_storeu_si128((__m128i *) (
out + 0), o0);
3187 _mm_storeu_si128((__m128i *) (
out + 16), o1);
3197 uint8x8_t signflip = vdup_n_u8(0x80);
3198 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200
f*4096.0
f+0.5
f));
3199 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414
f*4096.0
f+0.5
f));
3200 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414
f*4096.0
f+0.5
f));
3201 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200
f*4096.0
f+0.5
f));
3203 for (; i+7 <
count; i += 8) {
3205 uint8x8_t y_bytes = vld1_u8(
y + i);
3206 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3207 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3208 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3209 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3212 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3213 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3214 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3217 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3218 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3219 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3220 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3221 int16x8_t rws = vaddq_s16(yws, cr0);
3222 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3223 int16x8_t bws = vaddq_s16(yws, cb1);
3227 o.val[0] = vqrshrun_n_s16(rws, 4);
3228 o.val[1] = vqrshrun_n_s16(gws, 4);
3229 o.val[2] = vqrshrun_n_s16(bws, 4);
3230 o.val[3] = vdup_n_u8(255);
3239 for (; i <
count; ++i) {
3240 int y_fixed = (
y[i] << 20) + (1<<19);
3242 int cr = pcr[i] - 128;
3243 int cb = pcb[i] - 128;
3250 if ((
unsigned)
r > 255) {
if (
r < 0)
r = 0;
else r = 255; }
3251 if ((
unsigned)
g > 255) {
if (
g < 0)
g = 0;
else g = 255; }
3252 if ((
unsigned)
b > 255) {
if (
b < 0)
b = 0;
else b = 255; }
3263 static void stbi__setup_jpeg(stbi__jpeg *
j)
3265 j->idct_block_kernel = stbi__idct_block;
3266 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3267 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3270 if (stbi__sse2_available()) {
3271 j->idct_block_kernel = stbi__idct_simd;
3272 #ifndef STBI_JPEG_OLD 3273 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3275 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3280 j->idct_block_kernel = stbi__idct_simd;
3281 #ifndef STBI_JPEG_OLD 3282 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3284 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3289 static void stbi__cleanup_jpeg(stbi__jpeg *
j)
3292 for (i=0; i <
j->s->img_n; ++i) {
3293 if (
j->img_comp[i].raw_data) {
3294 STBI_FREE(
j->img_comp[i].raw_data);
3295 j->img_comp[i].raw_data =
NULL;
3296 j->img_comp[i].data =
NULL;
3298 if (
j->img_comp[i].raw_coeff) {
3299 STBI_FREE(
j->img_comp[i].raw_coeff);
3300 j->img_comp[i].raw_coeff = 0;
3301 j->img_comp[i].coeff = 0;
3303 if (
j->img_comp[i].linebuf) {
3304 STBI_FREE(
j->img_comp[i].linebuf);
3305 j->img_comp[i].linebuf =
NULL;
3312 resample_row_func resample;
3320 static stbi_uc *load_jpeg_image(stbi__jpeg *
z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3326 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3329 if (!stbi__decode_jpeg_image(
z)) { stbi__cleanup_jpeg(
z);
return NULL; }
3332 n = req_comp ? req_comp :
z->s->img_n;
3334 if (
z->s->img_n == 3 &&
n < 3)
3337 decode_n =
z->s->img_n;
3346 stbi__resample res_comp[4];
3348 for (k=0; k < decode_n; ++k) {
3349 stbi__resample *
r = &res_comp[k];
3353 z->img_comp[k].linebuf = (
stbi_uc *) stbi__malloc(
z->s->img_x + 3);
3354 if (!
z->img_comp[k].linebuf) { stbi__cleanup_jpeg(
z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3356 r->hs =
z->img_h_max /
z->img_comp[k].h;
3357 r->vs =
z->img_v_max /
z->img_comp[k].v;
3358 r->ystep =
r->vs >> 1;
3359 r->w_lores = (
z->s->img_x +
r->hs-1) /
r->hs;
3361 r->line0 =
r->line1 =
z->img_comp[k].data;
3363 if (
r->hs == 1 &&
r->vs == 1)
r->resample = resample_row_1;
3364 else if (
r->hs == 1 &&
r->vs == 2)
r->resample = stbi__resample_row_v_2;
3365 else if (
r->hs == 2 &&
r->vs == 1)
r->resample = stbi__resample_row_h_2;
3366 else if (
r->hs == 2 &&
r->vs == 2)
r->resample =
z->resample_row_hv_2_kernel;
3367 else r->resample = stbi__resample_row_generic;
3372 if (!
output) { stbi__cleanup_jpeg(
z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3375 for (
j=0;
j <
z->s->img_y; ++
j) {
3377 for (k=0; k < decode_n; ++k) {
3378 stbi__resample *
r = &res_comp[k];
3379 int y_bot =
r->ystep >= (
r->vs >> 1);
3380 coutput[k] =
r->resample(
z->img_comp[k].linebuf,
3381 y_bot ?
r->line1 :
r->line0,
3382 y_bot ?
r->line0 :
r->line1,
3384 if (++
r->ystep >=
r->vs) {
3386 r->line0 =
r->line1;
3387 if (++
r->ypos <
z->img_comp[k].y)
3388 r->line1 +=
z->img_comp[k].w2;
3393 if (
z->s->img_n == 3) {
3394 z->YCbCr_to_RGB_kernel(
out,
y, coutput[1], coutput[2],
z->s->img_x,
n);
3396 for (i=0; i <
z->s->img_x; ++i) {
3404 for (i=0; i <
z->s->img_x; ++i)
out[i] =
y[i];
3406 for (i=0; i <
z->s->img_x; ++i) *
out++ =
y[i], *
out++ = 255;
3409 stbi__cleanup_jpeg(
z);
3410 *out_x =
z->s->img_x;
3411 *out_y =
z->s->img_y;
3412 if (comp) *comp =
z->s->img_n;
3417 static unsigned char *stbi__jpeg_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
3421 stbi__setup_jpeg(&
j);
3422 return load_jpeg_image(&
j,
x,
y,comp,req_comp);
3425 static int stbi__jpeg_test(stbi__context *
s)
3430 stbi__setup_jpeg(&
j);
3431 r = stbi__decode_jpeg_header(&
j, STBI__SCAN_type);
3436 static int stbi__jpeg_info_raw(stbi__jpeg *
j,
int *
x,
int *
y,
int *comp)
3438 if (!stbi__decode_jpeg_header(
j, STBI__SCAN_header)) {
3439 stbi__rewind(
j->s );
3442 if (
x) *
x =
j->s->img_x;
3443 if (
y) *
y =
j->s->img_y;
3444 if (comp) *comp =
j->s->img_n;
3448 static int stbi__jpeg_info(stbi__context *
s,
int *
x,
int *
y,
int *comp)
3452 return stbi__jpeg_info_raw(&
j,
x,
y, comp);
3463 #ifndef STBI_NO_ZLIB 3466 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables 3467 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) 3473 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3474 stbi__uint16 firstcode[16];
3476 stbi__uint16 firstsymbol[16];
3478 stbi__uint16
value[288];
3481 stbi_inline
static int stbi__bitreverse16(
int n)
3483 n = ((
n & 0xAAAA) >> 1) | ((
n & 0x5555) << 1);
3484 n = ((
n & 0xCCCC) >> 2) | ((
n & 0x3333) << 2);
3485 n = ((
n & 0xF0F0) >> 4) | ((
n & 0x0F0F) << 4);
3486 n = ((
n & 0xFF00) >> 8) | ((
n & 0x00FF) << 8);
3490 stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3492 STBI_ASSERT(
bits <= 16);
3495 return stbi__bitreverse16(
v) >> (16-
bits);
3498 static int stbi__zbuild_huffman(stbi__zhuffman *
z,
stbi_uc *sizelist,
int num)
3505 memset(
z->fast, 0,
sizeof(
z->fast));
3506 for (i=0; i <
num; ++i)
3507 ++
sizes[sizelist[i]];
3509 for (i=1; i < 16; ++i)
3510 if (
sizes[i] > (1 << i))
3511 return stbi__err(
"bad sizes",
"Corrupt PNG");
3513 for (i=1; i < 16; ++i) {
3514 next_code[i] =
code;
3515 z->firstcode[i] = (stbi__uint16)
code;
3516 z->firstsymbol[i] = (stbi__uint16) k;
3519 if (
code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3520 z->maxcode[i] =
code << (16-i);
3524 z->maxcode[16] = 0x10000;
3525 for (i=0; i <
num; ++i) {
3526 int s = sizelist[i];
3528 int c = next_code[
s] -
z->firstcode[
s] +
z->firstsymbol[
s];
3529 stbi__uint16 fastv = (stbi__uint16) ((
s << 9) | i);
3531 z->value[
c] = (stbi__uint16) i;
3532 if (
s <= STBI__ZFAST_BITS) {
3533 int k = stbi__bit_reverse(next_code[
s],
s);
3534 while (k < (1 << STBI__ZFAST_BITS)) {
3553 stbi_uc *zbuffer, *zbuffer_end;
3555 stbi__uint32 code_buffer;
3562 stbi__zhuffman z_length, z_distance;
3565 stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *
z)
3567 if (
z->zbuffer >=
z->zbuffer_end)
return 0;
3568 return *
z->zbuffer++;
3571 static void stbi__fill_bits(stbi__zbuf *
z)
3574 STBI_ASSERT(
z->code_buffer < (1U <<
z->num_bits));
3575 z->code_buffer |= stbi__zget8(
z) <<
z->num_bits;
3577 }
while (
z->num_bits <= 24);
3580 stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *
z,
int n)
3583 if (
z->num_bits <
n) stbi__fill_bits(
z);
3584 k =
z->code_buffer & ((1 <<
n) - 1);
3585 z->code_buffer >>=
n;
3590 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *
a, stbi__zhuffman *
z)
3595 k = stbi__bit_reverse(
a->code_buffer, 16);
3596 for (
s=STBI__ZFAST_BITS+1; ; ++
s)
3597 if (k < z->maxcode[
s])
3599 if (
s == 16)
return -1;
3601 b = (k >> (16-
s)) -
z->firstcode[
s] +
z->firstsymbol[
s];
3602 STBI_ASSERT(
z->size[
b] ==
s);
3603 a->code_buffer >>=
s;
3608 stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *
a, stbi__zhuffman *
z)
3611 if (
a->num_bits < 16) stbi__fill_bits(
a);
3612 b =
z->fast[
a->code_buffer & STBI__ZFAST_MASK];
3615 a->code_buffer >>=
s;
3619 return stbi__zhuffman_decode_slowpath(
a,
z);
3622 static int stbi__zexpand(stbi__zbuf *
z,
char *zout,
int n)
3627 if (!
z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3628 cur = (int) (
z->zout -
z->zout_start);
3629 limit = (int) (
z->zout_end -
z->zout_start);
3632 q = (
char *) STBI_REALLOC(
z->zout_start,
limit);
3633 if (
q ==
NULL)
return stbi__err(
"outofmem",
"Out of memory");
3640 static int stbi__zlength_base[31] = {
3641 3,4,5,6,7,8,9,10,11,13,
3642 15,17,19,23,27,31,35,43,51,59,
3643 67,83,99,115,131,163,195,227,258,0,0 };
3645 static int stbi__zlength_extra[31]=
3646 { 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 };
3648 static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3649 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
3651 static int stbi__zdist_extra[32] =
3652 { 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};
3654 static int stbi__parse_huffman_block(stbi__zbuf *
a)
3656 char *zout =
a->zout;
3658 int z = stbi__zhuffman_decode(
a, &
a->z_length);
3660 if (
z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3661 if (zout >=
a->zout_end) {
3662 if (!stbi__zexpand(
a, zout, 1))
return 0;
3674 len = stbi__zlength_base[
z];
3675 if (stbi__zlength_extra[
z])
len += stbi__zreceive(
a, stbi__zlength_extra[
z]);
3676 z = stbi__zhuffman_decode(
a, &
a->z_distance);
3677 if (
z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3678 dist = stbi__zdist_base[
z];
3679 if (stbi__zdist_extra[
z]) dist += stbi__zreceive(
a, stbi__zdist_extra[
z]);
3680 if (zout -
a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
3681 if (zout +
len >
a->zout_end) {
3682 if (!stbi__zexpand(
a, zout,
len))
return 0;
3688 if (
len) {
do *zout++ =
v;
while (--
len); }
3690 if (
len) {
do *zout++ = *
p++;
while (--
len); }
3696 static int stbi__compute_huffman_codes(stbi__zbuf *
a)
3698 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 };
3699 stbi__zhuffman z_codelength;
3704 int hlit = stbi__zreceive(
a,5) + 257;
3705 int hdist = stbi__zreceive(
a,5) + 1;
3706 int hclen = stbi__zreceive(
a,4) + 4;
3708 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
3709 for (i=0; i < hclen; ++i) {
3710 int s = stbi__zreceive(
a,3);
3711 codelength_sizes[length_dezigzag[i]] = (
stbi_uc)
s;
3713 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
3716 while (
n < hlit + hdist) {
3717 int c = stbi__zhuffman_decode(
a, &z_codelength);
3718 if (
c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3722 c = stbi__zreceive(
a,2)+3;
3725 }
else if (
c == 17) {
3726 c = stbi__zreceive(
a,3)+3;
3730 STBI_ASSERT(
c == 18);
3731 c = stbi__zreceive(
a,7)+11;
3736 if (
n != hlit+hdist)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3737 if (!stbi__zbuild_huffman(&
a->z_length, lencodes, hlit))
return 0;
3738 if (!stbi__zbuild_huffman(&
a->z_distance, lencodes+hlit, hdist))
return 0;
3742 static int stbi__parse_uncomperssed_block(stbi__zbuf *
a)
3746 if (
a->num_bits & 7)
3747 stbi__zreceive(
a,
a->num_bits & 7);
3750 while (
a->num_bits > 0) {
3751 header[k++] = (
stbi_uc) (
a->code_buffer & 255);
3752 a->code_buffer >>= 8;
3755 STBI_ASSERT(
a->num_bits == 0);
3758 header[k++] = stbi__zget8(
a);
3759 len = header[1] * 256 + header[0];
3760 nlen = header[3] * 256 + header[2];
3761 if (nlen != (
len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
3762 if (
a->zbuffer +
len >
a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
3763 if (
a->zout +
len >
a->zout_end)
3764 if (!stbi__zexpand(
a,
a->zout,
len))
return 0;
3771 static int stbi__parse_zlib_header(stbi__zbuf *
a)
3773 int cmf = stbi__zget8(
a);
3776 int flg = stbi__zget8(
a);
3777 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
3778 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
3779 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
3785 static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
3786 static void stbi__init_zdefaults(
void)
3789 for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
3790 for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
3791 for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
3792 for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
3794 for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
3797 static int stbi__parse_zlib(stbi__zbuf *
a,
int parse_header)
3801 if (!stbi__parse_zlib_header(
a))
return 0;
3805 final = stbi__zreceive(
a,1);
3806 type = stbi__zreceive(
a,2);
3808 if (!stbi__parse_uncomperssed_block(
a))
return 0;
3809 }
else if (
type == 3) {
3814 if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
3815 if (!stbi__zbuild_huffman(&
a->z_length , stbi__zdefault_length , 288))
return 0;
3816 if (!stbi__zbuild_huffman(&
a->z_distance, stbi__zdefault_distance, 32))
return 0;
3818 if (!stbi__compute_huffman_codes(
a))
return 0;
3820 if (!stbi__parse_huffman_block(
a))
return 0;
3826 static int stbi__do_zlib(stbi__zbuf *
a,
char *obuf,
int olen,
int exp,
int parse_header)
3828 a->zout_start = obuf;
3830 a->zout_end = obuf + olen;
3831 a->z_expandable =
exp;
3833 return stbi__parse_zlib(
a, parse_header);
3839 char *
p = (
char *) stbi__malloc(initial_size);
3843 if (stbi__do_zlib(&
a,
p, initial_size, 1, 1)) {
3844 if (outlen) *outlen = (int) (
a.zout -
a.zout_start);
3845 return a.zout_start;
3847 STBI_FREE(
a.zout_start);
3860 char *
p = (
char *) stbi__malloc(initial_size);
3864 if (stbi__do_zlib(&
a,
p, initial_size, 1, parse_header)) {
3865 if (outlen) *outlen = (int) (
a.zout -
a.zout_start);
3866 return a.zout_start;
3868 STBI_FREE(
a.zout_start);
3877 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3878 if (stbi__do_zlib(&
a, obuffer, olen, 0, 1))
3879 return (
int) (
a.zout -
a.zout_start);
3887 char *
p = (
char *) stbi__malloc(16384);
3891 if (stbi__do_zlib(&
a,
p, 16384, 1, 0)) {
3892 if (outlen) *outlen = (int) (
a.zout -
a.zout_start);
3893 return a.zout_start;
3895 STBI_FREE(
a.zout_start);
3904 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3905 if (stbi__do_zlib(&
a, obuffer, olen, 0, 0))
3906 return (
int) (
a.zout -
a.zout_start);
3929 static stbi__pngchunk stbi__get_chunk_header(stbi__context *
s)
3932 c.length = stbi__get32be(
s);
3933 c.type = stbi__get32be(
s);
3937 static int stbi__check_png_header(stbi__context *
s)
3939 static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
3941 for (i=0; i < 8; ++i)
3942 if (stbi__get8(
s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
3964 static stbi_uc first_row_filter[5] =
3973 static int stbi__paeth(
int a,
int b,
int c)
3979 if (pa <= pb && pa <= pc)
return a;
3980 if (pb <= pc)
return b;
3984 static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
3987 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)
3989 stbi__context *
s =
a->s;
3991 stbi__uint32 img_len, img_width_bytes;
3993 int img_n =
s->img_n;
3995 STBI_ASSERT(out_n ==
s->img_n || out_n ==
s->img_n+1);
3996 a->out = (
stbi_uc *) stbi__malloc(
x *
y * out_n);
3997 if (!
a->out)
return stbi__err(
"outofmem",
"Out of memory");
3999 img_width_bytes = (((img_n *
x *
depth) + 7) >> 3);
4000 img_len = (img_width_bytes + 1) *
y;
4001 if (
s->img_x ==
x &&
s->img_y ==
y) {
4002 if (raw_len != img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4004 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
4007 for (
j=0;
j <
y; ++
j) {
4011 int filter_bytes = img_n;
4014 return stbi__err(
"invalid filter",
"Corrupt PNG");
4017 STBI_ASSERT(img_width_bytes <=
x);
4018 cur +=
x*out_n - img_width_bytes;
4020 width = img_width_bytes;
4027 for (k=0; k < filter_bytes; ++k) {
4029 case STBI__F_none :
cur[k] = raw[k];
break;
4030 case STBI__F_sub :
cur[k] = raw[k];
break;
4031 case STBI__F_up :
cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4032 case STBI__F_avg :
cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
4033 case STBI__F_paeth :
cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
4034 case STBI__F_avg_first :
cur[k] = raw[k];
break;
4035 case STBI__F_paeth_first:
cur[k] = raw[k];
break;
4052 if (
depth < 8 || img_n == out_n) {
4053 int nk = (
width - 1)*img_n;
4056 for (k=0; k < nk; ++k) 4059 case STBI__F_none:
memcpy(
cur, raw, nk);
break;
4060 CASE(STBI__F_sub)
cur[k] = STBI__BYTECAST(raw[k] +
cur[k-filter_bytes]);
break;
4061 CASE(STBI__F_up)
cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4062 CASE(STBI__F_avg)
cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] +
cur[k-filter_bytes])>>1));
break;
4063 CASE(STBI__F_paeth)
cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(
cur[k-filter_bytes],prior[k],prior[k-filter_bytes]));
break;
4064 CASE(STBI__F_avg_first)
cur[k] = STBI__BYTECAST(raw[k] + (
cur[k-filter_bytes] >> 1));
break;
4065 CASE(STBI__F_paeth_first)
cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(
cur[k-filter_bytes],0,0));
break;
4070 STBI_ASSERT(img_n+1 == out_n);
4073 for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \ 4074 for (k=0; k < img_n; ++k) 4076 CASE(STBI__F_none)
cur[k] = raw[k];
break;
4077 CASE(STBI__F_sub)
cur[k] = STBI__BYTECAST(raw[k] +
cur[k-out_n]);
break;
4078 CASE(STBI__F_up)
cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4079 CASE(STBI__F_avg)
cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] +
cur[k-out_n])>>1));
break;
4080 CASE(STBI__F_paeth)
cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(
cur[k-out_n],prior[k],prior[k-out_n]));
break;
4081 CASE(STBI__F_avg_first)
cur[k] = STBI__BYTECAST(raw[k] + (
cur[k-out_n] >> 1));
break;
4082 CASE(STBI__F_paeth_first)
cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(
cur[k-out_n],0,0));
break;
4092 for (
j=0;
j <
y; ++
j) {
4106 for (k=
x*img_n; k >= 2; k-=2, ++
in) {
4111 }
else if (
depth == 2) {
4112 for (k=
x*img_n; k >= 4; k-=4, ++
in) {
4119 if (k > 1) *
cur++ =
scale * ((*
in >> 4) & 0x03);
4120 if (k > 2) *
cur++ =
scale * ((*
in >> 2) & 0x03);
4121 }
else if (
depth == 1) {
4122 for (k=
x*img_n; k >= 8; k-=8, ++
in) {
4133 if (k > 1) *
cur++ =
scale * ((*
in >> 6) & 0x01);
4134 if (k > 2) *
cur++ =
scale * ((*
in >> 5) & 0x01);
4135 if (k > 3) *
cur++ =
scale * ((*
in >> 4) & 0x01);
4136 if (k > 4) *
cur++ =
scale * ((*
in >> 3) & 0x01);
4137 if (k > 5) *
cur++ =
scale * ((*
in >> 2) & 0x01);
4138 if (k > 6) *
cur++ =
scale * ((*
in >> 1) & 0x01);
4140 if (img_n != out_n) {
4145 for (i=
x-1; i >= 0; --i) {
4150 STBI_ASSERT(img_n == 3);
4151 for (i=
x-1; i >= 0; --i) {
4165 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)
4170 return stbi__create_png_image_raw(
a, image_data, image_data_len, out_n,
a->s->img_x,
a->s->img_y,
depth,
color);
4173 final = (
stbi_uc *) stbi__malloc(
a->s->img_x *
a->s->img_y * out_n);
4174 for (
p=0;
p < 7; ++
p) {
4175 int xorig[] = { 0,4,0,2,0,1,0 };
4176 int yorig[] = { 0,0,4,0,2,0,1 };
4177 int xspc[] = { 8,8,4,4,2,2,1 };
4178 int yspc[] = { 8,8,8,4,4,2,2 };
4181 x = (
a->s->img_x -
xorig[
p] + xspc[
p]-1) / xspc[
p];
4182 y = (
a->s->img_y -
yorig[
p] + yspc[
p]-1) / yspc[
p];
4184 stbi__uint32 img_len = ((((
a->s->img_n *
x *
depth) + 7) >> 3) + 1) *
y;
4185 if (!stbi__create_png_image_raw(
a, image_data, image_data_len, out_n,
x,
y,
depth,
color)) {
4189 for (
j=0;
j <
y; ++
j) {
4190 for (i=0; i <
x; ++i) {
4192 int out_x = i*xspc[
p]+
xorig[
p];
4193 memcpy(
final + out_y*
a->s->img_x*out_n + out_x*out_n,
4194 a->out + (
j*
x+i)*out_n, out_n);
4198 image_data += img_len;
4199 image_data_len -= img_len;
4207 static int stbi__compute_transparency(stbi__png *
z,
stbi_uc tc[3],
int out_n)
4209 stbi__context *
s =
z->s;
4210 stbi__uint32 i, pixel_count =
s->img_x *
s->img_y;
4215 STBI_ASSERT(out_n == 2 || out_n == 4);
4218 for (i=0; i < pixel_count; ++i) {
4219 p[1] = (
p[0] ==
tc[0] ? 0 : 255);
4223 for (i=0; i < pixel_count; ++i) {
4224 if (
p[0] ==
tc[0] &&
p[1] ==
tc[1] &&
p[2] ==
tc[2])
4232 static int stbi__expand_png_palette(stbi__png *
a,
stbi_uc *palette,
int len,
int pal_img_n)
4234 stbi__uint32 i, pixel_count =
a->s->img_x *
a->s->img_y;
4237 p = (
stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
4238 if (
p ==
NULL)
return stbi__err(
"outofmem",
"Out of memory");
4243 if (pal_img_n == 3) {
4244 for (i=0; i < pixel_count; ++i) {
4247 p[1] = palette[
n+1];
4248 p[2] = palette[
n+2];
4252 for (i=0; i < pixel_count; ++i) {
4255 p[1] = palette[
n+1];
4256 p[2] = palette[
n+2];
4257 p[3] = palette[
n+3];
4269 static int stbi__unpremultiply_on_load = 0;
4270 static int stbi__de_iphone_flag = 0;
4274 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4279 stbi__de_iphone_flag = flag_true_if_should_convert;
4282 static void stbi__de_iphone(stbi__png *
z)
4284 stbi__context *
s =
z->s;
4285 stbi__uint32 i, pixel_count =
s->img_x *
s->img_y;
4288 if (
s->img_out_n == 3) {
4289 for (i=0; i < pixel_count; ++i) {
4296 STBI_ASSERT(
s->img_out_n == 4);
4297 if (stbi__unpremultiply_on_load) {
4299 for (i=0; i < pixel_count; ++i) {
4303 p[0] =
p[2] * 255 /
a;
4304 p[1] =
p[1] * 255 /
a;
4314 for (i=0; i < pixel_count; ++i) {
4324 #define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) 4326 static int stbi__parse_png_file(stbi__png *
z,
int scan,
int req_comp)
4328 stbi_uc palette[1024], pal_img_n=0;
4330 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4332 stbi__context *
s =
z->s;
4338 if (!stbi__check_png_header(
s))
return 0;
4340 if (scan == STBI__SCAN_type)
return 1;
4343 stbi__pngchunk
c = stbi__get_chunk_header(
s);
4345 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4347 stbi__skip(
s,
c.length);
4349 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4351 if (!
first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4353 if (
c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4354 s->img_x = stbi__get32be(
s);
if (
s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4355 s->img_y = stbi__get32be(
s);
if (
s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4356 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");
4357 color = stbi__get8(
s);
if (
color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4358 if (
color == 3) pal_img_n = 3;
else if (
color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4359 comp = stbi__get8(
s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4360 filter= stbi__get8(
s);
if (
filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4361 interlace = stbi__get8(
s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4362 if (!
s->img_x || !
s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4364 s->img_n = (
color & 2 ? 3 : 1) + (
color & 4 ? 1 : 0);
4365 if ((1 << 30) /
s->img_x /
s->img_n <
s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4366 if (scan == STBI__SCAN_header)
return 1;
4371 if ((1 << 30) /
s->img_x / 4 <
s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4377 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4378 if (
first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4379 if (
c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4380 pal_len =
c.length / 3;
4381 if (pal_len * 3 !=
c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4382 for (i=0; i < pal_len; ++i) {
4383 palette[i*4+0] = stbi__get8(
s);
4384 palette[i*4+1] = stbi__get8(
s);
4385 palette[i*4+2] = stbi__get8(
s);
4386 palette[i*4+3] = 255;
4391 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4392 if (
first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4393 if (
z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4395 if (scan == STBI__SCAN_header) {
s->img_n = 4;
return 1; }
4396 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4397 if (
c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4399 for (i=0; i <
c.length; ++i)
4400 palette[i*4+3] = stbi__get8(
s);
4402 if (!(
s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4403 if (
c.length != (stbi__uint32)
s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4405 for (k=0; k <
s->img_n; ++k)
4406 tc[k] = (
stbi_uc) (stbi__get16be(
s) & 255) * stbi__depth_scale_table[
depth];
4411 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4412 if (
first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4413 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4414 if (scan == STBI__SCAN_header) {
s->img_n = pal_img_n;
return 1; }
4415 if ((
int)(ioff +
c.length) < (
int)ioff)
return 0;
4416 if (ioff +
c.length > idata_limit) {
4418 if (idata_limit == 0) idata_limit =
c.length > 4096 ?
c.length : 4096;
4419 while (ioff +
c.length > idata_limit)
4421 p = (
stbi_uc *) STBI_REALLOC(
z->idata, idata_limit);
if (
p ==
NULL)
return stbi__err(
"outofmem",
"Out of memory");
4424 if (!stbi__getn(
s,
z->idata+ioff,
c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4429 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4430 stbi__uint32 raw_len, bpl;
4431 if (
first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4432 if (scan != STBI__SCAN_load)
return 1;
4433 if (
z->idata ==
NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4435 bpl = (
s->img_x *
depth + 7) / 8;
4436 raw_len = bpl *
s->img_y *
s->img_n +
s->img_y ;
4438 if (
z->expanded ==
NULL)
return 0;
4439 STBI_FREE(
z->idata);
z->idata =
NULL;
4440 if ((req_comp ==
s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
4441 s->img_out_n =
s->img_n+1;
4443 s->img_out_n =
s->img_n;
4444 if (!stbi__create_png_image(
z,
z->expanded, raw_len,
s->img_out_n,
depth,
color, interlace))
return 0;
4446 if (!stbi__compute_transparency(
z,
tc,
s->img_out_n))
return 0;
4447 if (is_iphone && stbi__de_iphone_flag &&
s->img_out_n > 2)
4451 s->img_n = pal_img_n;
4452 s->img_out_n = pal_img_n;
4453 if (req_comp >= 3)
s->img_out_n = req_comp;
4454 if (!stbi__expand_png_palette(
z, palette, pal_len,
s->img_out_n))
4457 STBI_FREE(
z->expanded);
z->expanded =
NULL;
4463 if (
first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4464 if ((
c.type & (1 << 29)) == 0) {
4465 #ifndef STBI_NO_FAILURE_STRINGS 4467 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4468 invalid_chunk[0] = STBI__BYTECAST(
c.type >> 24);
4469 invalid_chunk[1] = STBI__BYTECAST(
c.type >> 16);
4470 invalid_chunk[2] = STBI__BYTECAST(
c.type >> 8);
4471 invalid_chunk[3] = STBI__BYTECAST(
c.type >> 0);
4473 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4475 stbi__skip(
s,
c.length);
4483 static unsigned char *stbi__do_png(stbi__png *
p,
int *
x,
int *
y,
int *
n,
int req_comp)
4486 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4487 if (stbi__parse_png_file(
p, STBI__SCAN_load, req_comp)) {
4490 if (req_comp && req_comp !=
p->s->img_out_n) {
4491 result = stbi__convert_format(
result,
p->s->img_out_n, req_comp,
p->s->img_x,
p->s->img_y);
4492 p->s->img_out_n = req_comp;
4497 if (
n) *
n =
p->s->img_out_n;
4499 STBI_FREE(
p->out);
p->out =
NULL;
4500 STBI_FREE(
p->expanded);
p->expanded =
NULL;
4501 STBI_FREE(
p->idata);
p->idata =
NULL;
4506 static unsigned char *stbi__png_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
4510 return stbi__do_png(&
p,
x,
y,comp,req_comp);
4513 static int stbi__png_test(stbi__context *
s)
4516 r = stbi__check_png_header(
s);
4521 static int stbi__png_info_raw(stbi__png *
p,
int *
x,
int *
y,
int *comp)
4523 if (!stbi__parse_png_file(
p, STBI__SCAN_header, 0)) {
4524 stbi__rewind(
p->s );
4527 if (
x) *
x =
p->s->img_x;
4528 if (
y) *
y =
p->s->img_y;
4529 if (comp) *comp =
p->s->img_n;
4533 static int stbi__png_info(stbi__context *
s,
int *
x,
int *
y,
int *comp)
4537 return stbi__png_info_raw(&
p,
x,
y, comp);
4544 static int stbi__bmp_test_raw(stbi__context *
s)
4548 if (stbi__get8(
s) !=
'B')
return 0;
4549 if (stbi__get8(
s) !=
'M')
return 0;
4554 sz = stbi__get32le(
s);
4555 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4559 static int stbi__bmp_test(stbi__context *
s)
4561 int r = stbi__bmp_test_raw(
s);
4568 static int stbi__high_bit(
unsigned int z)
4571 if (
z == 0)
return -1;
4572 if (
z >= 0x10000)
n += 16,
z >>= 16;
4573 if (
z >= 0x00100)
n += 8,
z >>= 8;
4574 if (
z >= 0x00010)
n += 4,
z >>= 4;
4575 if (
z >= 0x00004)
n += 2,
z >>= 2;
4576 if (
z >= 0x00002)
n += 1,
z >>= 1;
4580 static int stbi__bitcount(
unsigned int a)
4582 a = (
a & 0x55555555) + ((
a >> 1) & 0x55555555);
4583 a = (
a & 0x33333333) + ((
a >> 2) & 0x33333333);
4584 a = (
a + (
a >> 4)) & 0x0f0f0f0f;
4586 a = (
a + (
a >> 16));
4590 static int stbi__shiftsigned(
int v,
int shift,
int bits)
4595 if (shift < 0)
v <<= -shift;
4607 static stbi_uc *stbi__bmp_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
4610 unsigned int mr=0,mg=0,mb=0,ma=0;
4614 if (stbi__get8(
s) !=
'B' || stbi__get8(
s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
4619 hsz = stbi__get32le(
s);
4620 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
4622 s->img_x = stbi__get16le(
s);
4623 s->img_y = stbi__get16le(
s);
4625 s->img_x = stbi__get32le(
s);
4626 s->img_y = stbi__get32le(
s);
4628 if (stbi__get16le(
s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
4629 bpp = stbi__get16le(
s);
4630 if (
bpp == 1)
return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
4631 flip_vertically = ((int)
s->img_y) > 0;
4632 s->img_y = abs((
int)
s->img_y);
4635 psize = (
offset - 14 - 24) / 3;
4638 if (
compress == 1 ||
compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
4644 if (hsz == 40 || hsz == 56) {
4651 if (
bpp == 16 ||
bpp == 32)
4670 mr = stbi__get32le(
s);
4671 mg = stbi__get32le(
s);
4672 mb = stbi__get32le(
s);
4674 if (mr == mg && mg == mb) {
4676 return stbi__errpuc(
"bad BMP",
"bad BMP");
4679 return stbi__errpuc(
"bad BMP",
"bad BMP");
4682 STBI_ASSERT(hsz == 108 || hsz == 124);
4683 mr = stbi__get32le(
s);
4684 mg = stbi__get32le(
s);
4685 mb = stbi__get32le(
s);
4686 ma = stbi__get32le(
s);
4688 for (i=0; i < 12; ++i)
4698 psize = (
offset - 14 - hsz) >> 2;
4700 s->img_n = ma ? 4 : 3;
4701 if (req_comp && req_comp >= 3)
4706 if (!
out)
return stbi__errpuc(
"outofmem",
"Out of memory");
4709 if (psize == 0 || psize > 256) { STBI_FREE(
out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
4710 for (i=0; i < psize; ++i) {
4711 pal[i][2] = stbi__get8(
s);
4712 pal[i][1] = stbi__get8(
s);
4713 pal[i][0] = stbi__get8(
s);
4714 if (hsz != 12) stbi__get8(
s);
4717 stbi__skip(
s,
offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
4718 if (
bpp == 4)
width = (
s->img_x + 1) >> 1;
4720 else { STBI_FREE(
out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
4722 for (
j=0;
j < (int)
s->img_y; ++
j) {
4723 for (i=0; i < (int)
s->img_x; i += 2) {
4724 int v=stbi__get8(
s),
v2=0;
4729 out[
z++] = pal[
v][0];
4730 out[
z++] = pal[
v][1];
4731 out[
z++] = pal[
v][2];
4733 if (i+1 == (
int)
s->img_x)
break;
4734 v = (
bpp == 8) ? stbi__get8(
s) :
v2;
4735 out[
z++] = pal[
v][0];
4736 out[
z++] = pal[
v][1];
4737 out[
z++] = pal[
v][2];
4743 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
4746 stbi__skip(
s,
offset - 14 - hsz);
4753 }
else if (
bpp == 32) {
4754 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
4758 if (!mr || !mg || !mb) { STBI_FREE(
out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
4760 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
4761 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
4762 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
4763 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
4765 for (
j=0;
j < (int)
s->img_y; ++
j) {
4767 for (i=0; i < (int)
s->img_x; ++i) {
4769 out[
z+2] = stbi__get8(
s);
4770 out[
z+1] = stbi__get8(
s);
4771 out[
z+0] = stbi__get8(
s);
4773 a = (easy == 2 ? stbi__get8(
s) : 255);
4777 for (i=0; i < (int)
s->img_x; ++i) {
4778 stbi__uint32
v = (
bpp == 16 ? (stbi__uint32) stbi__get16le(
s) : stbi__get32le(
s));
4780 out[
z++] = STBI__BYTECAST(stbi__shiftsigned(
v & mr, rshift, rcount));
4781 out[
z++] = STBI__BYTECAST(stbi__shiftsigned(
v & mg, gshift, gcount));
4782 out[
z++] = STBI__BYTECAST(stbi__shiftsigned(
v & mb, bshift, bcount));
4783 a = (ma ? stbi__shiftsigned(
v & ma, ashift, acount) : 255);
4790 if (flip_vertically) {
4792 for (
j=0;
j < (int)
s->img_y>>1; ++
j) {
4795 for (i=0; i < (int)
s->img_x*
target; ++i) {
4801 if (req_comp && req_comp !=
target) {
4802 out = stbi__convert_format(
out,
target, req_comp,
s->img_x,
s->img_y);
4808 if (comp) *comp =
s->img_n;
4816 static int stbi__tga_info(stbi__context *
s,
int *
x,
int *
y,
int *comp)
4818 int tga_w, tga_h, tga_comp;
4828 if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11))
return 0;
4830 tga_w = stbi__get16le(
s);
4835 tga_h = stbi__get16le(
s);
4842 if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
4849 if (comp) *comp = tga_comp / 8;
4853 static int stbi__tga_test(stbi__context *
s)
4859 if ( sz > 1 )
return 0;
4861 if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) )
return 0;
4867 if ( stbi__get16be(
s) < 1 )
return 0;
4868 if ( stbi__get16be(
s) < 1 )
return 0;
4870 if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )
4878 static stbi_uc *stbi__tga_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
4881 int tga_offset = stbi__get8(
s);
4882 int tga_indexed = stbi__get8(
s);
4883 int tga_image_type = stbi__get8(
s);
4885 int tga_palette_start = stbi__get16le(
s);
4886 int tga_palette_len = stbi__get16le(
s);
4887 int tga_palette_bits = stbi__get8(
s);
4888 int tga_x_origin = stbi__get16le(
s);
4889 int tga_y_origin = stbi__get16le(
s);
4890 int tga_width = stbi__get16le(
s);
4891 int tga_height = stbi__get16le(
s);
4892 int tga_bits_per_pixel = stbi__get8(
s);
4893 int tga_comp = tga_bits_per_pixel / 8;
4894 int tga_inverted = stbi__get8(
s);
4896 unsigned char *tga_data;
4897 unsigned char *tga_palette =
NULL;
4899 unsigned char raw_data[4] = {0};
4901 int RLE_repeating = 0;
4902 int read_next_pixel = 1;
4905 if ( tga_image_type >= 8 )
4907 tga_image_type -= 8;
4911 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
4915 (tga_width < 1) || (tga_height < 1) ||
4916 (tga_image_type < 1) || (tga_image_type > 3) ||
4917 ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
4918 (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
4927 tga_comp = tga_palette_bits / 8;
4933 if (comp) *comp = tga_comp;
4935 tga_data = (
unsigned char*)stbi__malloc( (
size_t)tga_width * tga_height * tga_comp );
4936 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
4939 stbi__skip(
s, tga_offset );
4941 if ( !tga_indexed && !tga_is_RLE) {
4942 for (i=0; i < tga_height; ++i) {
4943 int y = tga_inverted ? tga_height -i - 1 : i;
4944 stbi_uc *tga_row = tga_data +
y*tga_width*tga_comp;
4945 stbi__getn(
s, tga_row, tga_width * tga_comp);
4952 stbi__skip(
s, tga_palette_start );
4954 tga_palette = (
unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );
4956 STBI_FREE(tga_data);
4957 return stbi__errpuc(
"outofmem",
"Out of memory");
4959 if (!stbi__getn(
s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
4960 STBI_FREE(tga_data);
4961 STBI_FREE(tga_palette);
4962 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
4966 for (i=0; i < tga_width * tga_height; ++i)
4971 if ( RLE_count == 0 )
4974 int RLE_cmd = stbi__get8(
s);
4975 RLE_count = 1 + (RLE_cmd & 127);
4976 RLE_repeating = RLE_cmd >> 7;
4977 read_next_pixel = 1;
4978 }
else if ( !RLE_repeating )
4980 read_next_pixel = 1;
4984 read_next_pixel = 1;
4987 if ( read_next_pixel )
4993 int pal_idx = stbi__get8(
s);
4994 if ( pal_idx >= tga_palette_len )
4999 pal_idx *= tga_bits_per_pixel / 8;
5000 for (
j = 0;
j*8 < tga_bits_per_pixel; ++
j)
5002 raw_data[
j] = tga_palette[pal_idx+
j];
5007 for (
j = 0;
j*8 < tga_bits_per_pixel; ++
j)
5009 raw_data[
j] = stbi__get8(
s);
5013 read_next_pixel = 0;
5017 for (
j = 0;
j < tga_comp; ++
j)
5018 tga_data[i*tga_comp+
j] = raw_data[
j];
5026 for (
j = 0;
j*2 < tga_height; ++
j)
5028 int index1 =
j * tga_width * tga_comp;
5029 int index2 = (tga_height - 1 -
j) * tga_width * tga_comp;
5030 for (i = tga_width * tga_comp; i > 0; --i)
5032 unsigned char temp = tga_data[index1];
5033 tga_data[index1] = tga_data[index2];
5034 tga_data[index2] = temp;
5041 if ( tga_palette !=
NULL )
5043 STBI_FREE( tga_palette );
5050 unsigned char* tga_pixel = tga_data;
5051 for (i=0; i < tga_width * tga_height; ++i)
5053 unsigned char temp = tga_pixel[0];
5054 tga_pixel[0] = tga_pixel[2];
5055 tga_pixel[2] = temp;
5056 tga_pixel += tga_comp;
5061 if (req_comp && req_comp != tga_comp)
5062 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5066 tga_palette_start = tga_palette_len = tga_palette_bits =
5067 tga_x_origin = tga_y_origin = 0;
5076 static int stbi__psd_test(stbi__context *
s)
5078 int r = (stbi__get32be(
s) == 0x38425053);
5083 static stbi_uc *stbi__psd_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
5086 int channelCount, compression;
5092 if (stbi__get32be(
s) != 0x38425053)
5093 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5096 if (stbi__get16be(
s) != 1)
5097 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5103 channelCount = stbi__get16be(
s);
5104 if (channelCount < 0 || channelCount > 16)
5105 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5108 h = stbi__get32be(
s);
5109 w = stbi__get32be(
s);
5112 if (stbi__get16be(
s) != 8)
5113 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 bit");
5125 if (stbi__get16be(
s) != 3)
5126 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5129 stbi__skip(
s,stbi__get32be(
s) );
5132 stbi__skip(
s, stbi__get32be(
s) );
5135 stbi__skip(
s, stbi__get32be(
s) );
5141 compression = stbi__get16be(
s);
5142 if (compression > 1)
5143 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5147 if (!
out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5163 stbi__skip(
s,
h * channelCount * 2 );
5170 if (
channel >= channelCount) {
5172 for (i = 0; i < pixelCount; i++,
p += 4)
5177 while (
count < pixelCount) {
5178 len = stbi__get8(
s);
5181 }
else if (
len < 128) {
5190 }
else if (
len > 128) {
5196 val = stbi__get8(
s);
5219 for (i = 0; i < pixelCount; i++,
p += 4)
5223 for (i = 0; i < pixelCount; i++,
p += 4)
5229 if (req_comp && req_comp != 4) {
5230 out = stbi__convert_format(
out, 4, req_comp,
w,
h);
5234 if (comp) *comp = 4;
5251 static int stbi__pic_is4(stbi__context *
s,
const char *
str)
5261 static int stbi__pic_test_core(stbi__context *
s)
5265 if (!stbi__pic_is4(
s,
"\x53\x80\xF6\x34"))
5271 if (!stbi__pic_is4(
s,
"PICT"))
5286 for (i=0; i<4; ++i, mask>>=1) {
5288 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"PIC file too short");
5289 dest[i]=stbi__get8(
s);
5300 for (i=0;i<4; ++i, mask>>=1)
5307 int act_comp=0,num_packets=0,
y,chained;
5308 stbi__pic_packet packets[10];
5315 stbi__pic_packet *packet;
5317 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
5318 return stbi__errpuc(
"bad format",
"too many packets");
5320 packet = &packets[num_packets++];
5322 chained = stbi__get8(
s);
5323 packet->size = stbi__get8(
s);
5324 packet->type = stbi__get8(
s);
5325 packet->channel = stbi__get8(
s);
5327 act_comp |= packet->channel;
5329 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
5330 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
5333 *comp = (act_comp & 0x10 ? 4 : 3);
5338 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
5339 stbi__pic_packet *packet = &packets[packet_idx];
5342 switch (packet->type) {
5344 return stbi__errpuc(
"bad format",
"packet has bad compression type");
5350 if (!stbi__readval(
s,packet->channel,dest))
5363 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
5368 if (!stbi__readval(
s,packet->channel,
value))
return 0;
5370 for(i=0; i<
count; ++i,dest+=4)
5371 stbi__copyval(packet->channel,dest,
value);
5380 int count = stbi__get8(
s), i;
5381 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
5388 count = stbi__get16be(
s);
5392 return stbi__errpuc(
"bad file",
"scanline overrun");
5394 if (!stbi__readval(
s,packet->channel,
value))
5397 for(i=0;i<
count;++i, dest += 4)
5398 stbi__copyval(packet->channel,dest,
value);
5401 if (
count>
left)
return stbi__errpuc(
"bad file",
"scanline overrun");
5403 for(i=0;i<
count;++i, dest+=4)
5404 if (!stbi__readval(
s,packet->channel,dest))
5418 static stbi_uc *stbi__pic_load(stbi__context *
s,
int *
px,
int *
py,
int *comp,
int req_comp)
5423 for (i=0; i<92; ++i)
5426 x = stbi__get16be(
s);
5427 y = stbi__get16be(
s);
5428 if (stbi__at_eof(
s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
5429 if ((1 << 28) /
x <
y)
return stbi__errpuc(
"too large",
"Image too large to decode");
5439 if (!stbi__pic_load_core(
s,
x,
y,comp,
result))
5446 if (req_comp == 0) req_comp = *comp;
5452 static int stbi__pic_test(stbi__context *
s)
5454 int r = stbi__pic_test_core(
s);
5476 int flags, bgindex, ratio, transparent, eflags;
5479 stbi__gif_lzw codes[4096];
5483 int start_x, start_y;
5489 static int stbi__gif_test_raw(stbi__context *
s)
5492 if (stbi__get8(
s) !=
'G' || stbi__get8(
s) !=
'I' || stbi__get8(
s) !=
'F' || stbi__get8(
s) !=
'8')
return 0;
5494 if (sz !=
'9' && sz !=
'7')
return 0;
5495 if (stbi__get8(
s) !=
'a')
return 0;
5499 static int stbi__gif_test(stbi__context *
s)
5501 int r = stbi__gif_test_raw(
s);
5506 static void stbi__gif_parse_colortable(stbi__context *
s,
stbi_uc pal[256][4],
int num_entries,
int transp)
5509 for (i=0; i < num_entries; ++i) {
5510 pal[i][2] = stbi__get8(
s);
5511 pal[i][1] = stbi__get8(
s);
5512 pal[i][0] = stbi__get8(
s);
5513 pal[i][3] = transp == i ? 0 : 255;
5517 static int stbi__gif_header(stbi__context *
s, stbi__gif *
g,
int *comp,
int is_info)
5520 if (stbi__get8(
s) !=
'G' || stbi__get8(
s) !=
'I' || stbi__get8(
s) !=
'F' || stbi__get8(
s) !=
'8')
5521 return stbi__err(
"not GIF",
"Corrupt GIF");
5524 if (
version !=
'7' &&
version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
5525 if (stbi__get8(
s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
5527 stbi__g_failure_reason =
"";
5528 g->w = stbi__get16le(
s);
5529 g->h = stbi__get16le(
s);
5530 g->flags = stbi__get8(
s);
5531 g->bgindex = stbi__get8(
s);
5532 g->ratio = stbi__get8(
s);
5533 g->transparent = -1;
5535 if (comp != 0) *comp = 4;
5537 if (is_info)
return 1;
5539 if (
g->flags & 0x80)
5540 stbi__gif_parse_colortable(
s,
g->pal, 2 << (
g->flags & 7), -1);
5545 static int stbi__gif_info_raw(stbi__context *
s,
int *
x,
int *
y,
int *comp)
5548 if (!stbi__gif_header(
s, &
g, comp, 1)) {
5557 static void stbi__out_gif_code(stbi__gif *
g, stbi__uint16
code)
5564 if (
g->codes[
code].prefix >= 0)
5565 stbi__out_gif_code(
g,
g->codes[
code].prefix);
5567 if (
g->cur_y >=
g->max_y)
5570 p = &
g->out[
g->cur_x +
g->cur_y];
5571 c = &
g->color_table[
g->codes[
code].suffix * 4];
5581 if (
g->cur_x >=
g->max_x) {
5582 g->cur_x =
g->start_x;
5583 g->cur_y +=
g->step;
5585 while (
g->cur_y >=
g->max_y &&
g->parse > 0) {
5586 g->step = (1 <<
g->parse) *
g->line_size;
5587 g->cur_y =
g->start_y + (
g->step >> 1);
5593 static stbi_uc *stbi__process_gif_raster(stbi__context *
s, stbi__gif *
g)
5598 stbi__int32 codesize, codemask, avail, oldcode,
bits, valid_bits, clear;
5601 lzw_cs = stbi__get8(
s);
5602 if (lzw_cs > 12)
return NULL;
5603 clear = 1 << lzw_cs;
5605 codesize = lzw_cs + 1;
5606 codemask = (1 << codesize) - 1;
5610 g->codes[
code].prefix = -1;
5621 if (valid_bits < codesize) {
5623 len = stbi__get8(
s);
5628 bits |= (stbi__int32) stbi__get8(
s) << valid_bits;
5631 stbi__int32
code =
bits & codemask;
5633 valid_bits -= codesize;
5635 if (
code == clear) {
5636 codesize = lzw_cs + 1;
5637 codemask = (1 << codesize) - 1;
5641 }
else if (
code == clear + 1) {
5643 while ((
len = stbi__get8(
s)) > 0)
5646 }
else if (
code <= avail) {
5647 if (
first)
return stbi__errpuc(
"no clear code",
"Corrupt GIF");
5650 p = &
g->codes[avail++];
5651 if (avail > 4096)
return stbi__errpuc(
"too many codes",
"Corrupt GIF");
5652 p->prefix = (stbi__int16) oldcode;
5653 p->first =
g->codes[oldcode].first;
5654 p->suffix = (
code == avail) ?
p->first :
g->codes[
code].first;
5655 }
else if (
code == avail)
5656 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5658 stbi__out_gif_code(
g, (stbi__uint16)
code);
5660 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
5662 codemask = (1 << codesize) - 1;
5667 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5673 static void stbi__fill_gif_background(stbi__gif *
g)
5678 for (i = 0; i <
g->w *
g->h * 4; i += 4)
5689 static stbi_uc *stbi__gif_load_next(stbi__context *
s, stbi__gif *
g,
int *comp,
int req_comp)
5695 if (!stbi__gif_header(
s,
g, comp,0))
5698 g->out = (
stbi_uc *) stbi__malloc(4 *
g->w *
g->h);
5699 if (
g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5700 stbi__fill_gif_background(
g);
5703 if (((
g->eflags & 0x1C) >> 2) == 3) {
5705 g->out = (
stbi_uc *) stbi__malloc(4 *
g->w *
g->h);
5706 if (
g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5712 switch (stbi__get8(
s)) {
5715 stbi__int32
x,
y,
w,
h;
5718 x = stbi__get16le(
s);
5719 y = stbi__get16le(
s);
5720 w = stbi__get16le(
s);
5721 h = stbi__get16le(
s);
5722 if (((
x +
w) > (
g->w)) || ((
y +
h) > (
g->h)))
5723 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
5725 g->line_size =
g->w * 4;
5727 g->start_y =
y *
g->line_size;
5728 g->max_x =
g->start_x +
w * 4;
5729 g->max_y =
g->start_y +
h *
g->line_size;
5730 g->cur_x =
g->start_x;
5731 g->cur_y =
g->start_y;
5733 g->lflags = stbi__get8(
s);
5735 if (
g->lflags & 0x40) {
5736 g->step = 8 *
g->line_size;
5739 g->step =
g->line_size;
5743 if (
g->lflags & 0x80) {
5744 stbi__gif_parse_colortable(
s,
g->lpal, 2 << (
g->lflags & 7),
g->eflags & 0x01 ?
g->transparent : -1);
5746 }
else if (
g->flags & 0x80) {
5747 for (i=0; i < 256; ++i)
5749 if (
g->transparent >= 0 && (
g->eflags & 0x01))
5750 g->pal[
g->transparent][3] = 0;
5753 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
5755 o = stbi__process_gif_raster(
s,
g);
5758 if (req_comp && req_comp != 4)
5759 o = stbi__convert_format(o, 4, req_comp,
g->w,
g->h);
5766 if (stbi__get8(
s) == 0xF9) {
5767 len = stbi__get8(
s);
5769 g->eflags = stbi__get8(
s);
5771 g->transparent = stbi__get8(
s);
5777 while ((
len = stbi__get8(
s)) != 0)
5786 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
5791 static stbi_uc *stbi__gif_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
5797 u = stbi__gif_load_next(
s, &
g, comp, req_comp);
5807 static int stbi__gif_info(stbi__context *
s,
int *
x,
int *
y,
int *comp)
5809 return stbi__gif_info_raw(
s,
x,
y,comp);
5817 static int stbi__hdr_test_core(stbi__context *
s)
5819 const char *signature =
"#?RADIANCE\n";
5821 for (i=0; signature[i]; ++i)
5822 if (stbi__get8(
s) != signature[i])
5827 static int stbi__hdr_test(stbi__context*
s)
5829 int r = stbi__hdr_test_core(
s);
5834 #define STBI__HDR_BUFLEN 1024 5835 static char *stbi__hdr_gettoken(stbi__context *
z,
char *
buffer)
5840 c = (char) stbi__get8(
z);
5842 while (!stbi__at_eof(
z) &&
c !=
'\n') {
5844 if (
len == STBI__HDR_BUFLEN-1) {
5846 while (!stbi__at_eof(
z) && stbi__get8(
z) !=
'\n')
5850 c = (char) stbi__get8(
z);
5859 if (
input[3] != 0 ) {
5862 f1 = (float) ldexp(1.0
f,
input[3] - (
int)(128 + 8));
5870 if (req_comp == 2)
output[1] = 1;
5871 if (req_comp == 4)
output[3] = 1;
5884 static float *stbi__hdr_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
5886 char buffer[STBI__HDR_BUFLEN];
5894 int i,
j, k, c1,c2,
z;
5898 if (
strcmp(stbi__hdr_gettoken(
s,
buffer),
"#?RADIANCE") != 0)
5899 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
5903 token = stbi__hdr_gettoken(
s,
buffer);
5904 if (token[0] == 0)
break;
5905 if (
strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5908 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
5912 token = stbi__hdr_gettoken(
s,
buffer);
5913 if (
strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5915 height = (int) strtol(token, &token, 10);
5916 while (*token ==
' ') ++token;
5917 if (
strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5924 if (comp) *comp = 3;
5925 if (req_comp == 0) req_comp = 3;
5928 hdr_data = (
float *) stbi__malloc(
height *
width * req_comp *
sizeof(
float));
5935 for (i=0; i <
width; ++i) {
5938 stbi__getn(
s, rgbe, 4);
5939 stbi__hdr_convert(hdr_data +
j *
width * req_comp + i * req_comp, rgbe, req_comp);
5949 len = stbi__get8(
s);
5950 if (c1 != 2 || c2 != 2 || (
len & 0x80)) {
5960 stbi__hdr_convert(hdr_data, rgbe, req_comp);
5963 STBI_FREE(scanline);
5964 goto main_decode_loop;
5967 len |= stbi__get8(
s);
5968 if (
len !=
width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
5971 for (k = 0; k < 4; ++k) {
5980 scanline[i++ * 4 + k] =
value;
5984 scanline[i++ * 4 + k] = stbi__get8(
s);
5988 for (i=0; i <
width; ++i)
5989 stbi__hdr_convert(hdr_data+(
j*
width + i)*req_comp, scanline + i*4, req_comp);
5991 STBI_FREE(scanline);
5997 static int stbi__hdr_info(stbi__context *
s,
int *
x,
int *
y,
int *comp)
5999 char buffer[STBI__HDR_BUFLEN];
6003 if (
strcmp(stbi__hdr_gettoken(
s,
buffer),
"#?RADIANCE") != 0) {
6009 token = stbi__hdr_gettoken(
s,
buffer);
6010 if (token[0] == 0)
break;
6011 if (
strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6018 token = stbi__hdr_gettoken(
s,
buffer);
6019 if (
strncmp(token,
"-Y ", 3)) {
6024 *
y = (int) strtol(token, &token, 10);
6025 while (*token ==
' ') ++token;
6026 if (
strncmp(token,
"+X ", 3)) {
6031 *
x = (int) strtol(token,
NULL, 10);
6038 static int stbi__bmp_info(stbi__context *
s,
int *
x,
int *
y,
int *comp)
6041 if (stbi__get8(
s) !=
'B' || stbi__get8(
s) !=
'M') {
6046 hsz = stbi__get32le(
s);
6047 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
6052 *
x = stbi__get16le(
s);
6053 *
y = stbi__get16le(
s);
6055 *
x = stbi__get32le(
s);
6056 *
y = stbi__get32le(
s);
6058 if (stbi__get16le(
s) != 1) {
6062 *comp = stbi__get16le(
s) / 8;
6068 static int stbi__psd_info(stbi__context *
s,
int *
x,
int *
y,
int *comp)
6071 if (stbi__get32be(
s) != 0x38425053) {
6075 if (stbi__get16be(
s) != 1) {
6080 channelCount = stbi__get16be(
s);
6081 if (channelCount < 0 || channelCount > 16) {
6085 *
y = stbi__get32be(
s);
6086 *
x = stbi__get32be(
s);
6087 if (stbi__get16be(
s) != 8) {
6091 if (stbi__get16be(
s) != 3) {
6101 static int stbi__pic_info(stbi__context *
s,
int *
x,
int *
y,
int *comp)
6103 int act_comp=0,num_packets=0,chained;
6104 stbi__pic_packet packets[10];
6108 *
x = stbi__get16be(
s);
6109 *
y = stbi__get16be(
s);
6110 if (stbi__at_eof(
s))
return 0;
6111 if ( (*
x) != 0 && (1 << 28) / (*
x) < (*
y)) {
6119 stbi__pic_packet *packet;
6121 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
6124 packet = &packets[num_packets++];
6125 chained = stbi__get8(
s);
6126 packet->size = stbi__get8(
s);
6127 packet->type = stbi__get8(
s);
6128 packet->channel = stbi__get8(
s);
6129 act_comp |= packet->channel;
6131 if (stbi__at_eof(
s)) {
6135 if (packet->size != 8) {
6141 *comp = (act_comp & 0x10 ? 4 : 3);
6161 static int stbi__pnm_test(stbi__context *
s)
6164 p = (char) stbi__get8(
s);
6165 t = (char) stbi__get8(
s);
6166 if (
p !=
'P' || (
t !=
'5' &&
t !=
'6')) {
6173 static stbi_uc *stbi__pnm_load(stbi__context *
s,
int *
x,
int *
y,
int *comp,
int req_comp)
6176 if (!stbi__pnm_info(
s, (
int *)&
s->img_x, (
int *)&
s->img_y, (
int *)&
s->img_n))
6182 out = (
stbi_uc *) stbi__malloc(
s->img_n *
s->img_x *
s->img_y);
6183 if (!
out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6184 stbi__getn(
s,
out,
s->img_n *
s->img_x *
s->img_y);
6186 if (req_comp && req_comp !=
s->img_n) {
6187 out = stbi__convert_format(
out,
s->img_n, req_comp,
s->img_x,
s->img_y);
6193 static int stbi__pnm_isspace(
char c)
6195 return c ==
' ' ||
c ==
'\t' ||
c ==
'\n' ||
c ==
'\v' ||
c ==
'\f' ||
c ==
'\r';
6198 static void stbi__pnm_skip_whitespace(stbi__context *
s,
char *
c)
6200 while (!stbi__at_eof(
s) && stbi__pnm_isspace(*
c))
6201 *
c = (char) stbi__get8(
s);
6204 static int stbi__pnm_isdigit(
char c)
6206 return c >=
'0' &&
c <=
'9';
6209 static int stbi__pnm_getinteger(stbi__context *
s,
char *
c)
6213 while (!stbi__at_eof(
s) && stbi__pnm_isdigit(*
c)) {
6215 *
c = (char) stbi__get8(
s);
6221 static int stbi__pnm_info(stbi__context *
s,
int *
x,
int *
y,
int *comp)
6229 p = (char) stbi__get8(
s);
6230 t = (char) stbi__get8(
s);
6231 if (
p !=
'P' || (
t !=
'5' &&
t !=
'6')) {
6236 *comp = (
t ==
'6') ? 3 : 1;
6238 c = (char) stbi__get8(
s);
6239 stbi__pnm_skip_whitespace(
s, &
c);
6241 *
x = stbi__pnm_getinteger(
s, &
c);
6242 stbi__pnm_skip_whitespace(
s, &
c);
6244 *
y = stbi__pnm_getinteger(
s, &
c);
6245 stbi__pnm_skip_whitespace(
s, &
c);
6247 maxv = stbi__pnm_getinteger(
s, &
c);
6250 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
6256 static int stbi__info_main(stbi__context *
s,
int *
x,
int *
y,
int *comp)
6258 #ifndef STBI_NO_JPEG 6259 if (stbi__jpeg_info(
s,
x,
y, comp))
return 1;
6263 if (stbi__png_info(
s,
x,
y, comp))
return 1;
6267 if (stbi__gif_info(
s,
x,
y, comp))
return 1;
6271 if (stbi__bmp_info(
s,
x,
y, comp))
return 1;
6275 if (stbi__psd_info(
s,
x,
y, comp))
return 1;
6279 if (stbi__pic_info(
s,
x,
y, comp))
return 1;
6283 if (stbi__pnm_info(
s,
x,
y, comp))
return 1;
6287 if (stbi__hdr_info(
s,
x,
y, comp))
return 1;
6292 if (stbi__tga_info(
s,
x,
y, comp))
6295 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
6298 #ifndef STBI_NO_STDIO 6301 FILE *
f = stbi__fopen(filename,
"rb");
6303 if (!
f)
return stbi__err(
"can't fopen",
"Unable to open file");
6314 stbi__start_file(&
s,
f);
6315 r = stbi__info_main(&
s,
x,
y,comp);
6325 return stbi__info_main(&
s,
x,
y,comp);
6332 return stbi__info_main(&
s,
x,
y,comp);
STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
STBIDEF int stbi_is_hdr(char const *filename)
#define ftell
Definition: file_stream_transforms.h:54
const GLint * first
Definition: glext.h:6478
STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
GLenum mode
Definition: glext.h:6857
GLuint GLfloat * val
Definition: glext.h:7847
static const unsigned int color_table[]
Definition: console.c:49
GLboolean GLenum GLenum GLvoid * values
Definition: glext.h:6318
GLuint buffer
Definition: glext.h:6555
int strncmp(const char *s1, const char *s2, size_t n)
Definition: compat_ctype.c:179
f32 py
Definition: gx_regdef.h:5101
GLenum target
Definition: glext.h:7982
Definition: stb_image.h:396
GLfixed GLfixed x2
Definition: glsym_gl.h:1051
const GLfloat * tc
Definition: glext.h:9832
Definition: libretro.h:2275
GLdouble GLdouble GLdouble r
Definition: glext.h:6406
GLuint res
Definition: glext.h:10520
GLdouble GLdouble t
Definition: glext.h:6398
static overlayled_t * cur
Definition: led_overlay.c:18
GLenum GLsizei len
Definition: glext.h:7389
STBIDEF void stbi_hdr_to_ldr_scale(float scale)
Definition: stb_image.h:398
GLsizeiptr size
Definition: glext.h:6559
STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
GLint limit
Definition: glext.h:11233
#define SEEK_CUR
Definition: zconf.h:439
GLfloat f
Definition: glext.h:8207
const portMappingElt code
Definition: portlistingparse.c:17
STBIDEF char * stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen)
GLenum GLuint id
Definition: glext.h:6233
STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
GLenum GLenum GLenum GLenum GLenum scale
Definition: glext.h:9939
#define next(ls)
Definition: llex.c:32
GLdouble s
Definition: glext.h:6390
struct passwd out
Definition: missing_libc_functions.c:51
GLdouble GLdouble z
Definition: glext.h:6514
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
typedef void(__stdcall *PFN_DESTRUCTION_CALLBACK)(void *pData)
#define exp(a)
Definition: math.h:32
GLenum GLenum GLenum input
Definition: glext.h:9938
static bool read(ElfFile &file, const std::string &filename)
Definition: main.cpp:146
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
GLsizei GLsizei GLenum GLenum const GLvoid * data
Definition: glext.h:6303
STBIDEF int stbi_is_hdr_from_file(FILE *f)
const GLubyte * c
Definition: glext.h:9812
GLboolean GLboolean GLboolean b
Definition: glext.h:6844
GLuint GLuint GLsizei count
Definition: glext.h:6292
float4 p3
Definition: remote.h:1
int strcmp(const char *s1, const char *s2)
Definition: compat_ctype.c:116
GLuint GLuint num
Definition: glext.h:10525
GLfloat GLfloat GLfloat v2
Definition: glext.h:6703
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
#define NULL
Pointer to 0.
Definition: gctypes.h:65
GLenum type
Definition: glext.h:6233
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp *numpix else pixst endif endm macro pixld1_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl mov asr adds SRC_WIDTH_FIXED bpl add asl else error unsupported endif endm macro pixld2_s mem_operand if mov asr add asl add asl mov asr sub UNIT_X add asl mov asr add asl add asl mov asr add UNIT_X add asl else pixld1_s mem_operand pixld1_s mem_operand endif endm macro pixld0_s mem_operand if asr adds SRC_WIDTH_FIXED bpl add asl elseif asr adds SRC_WIDTH_FIXED bpl add asl endif endm macro pixld_s_internal mem_operand if mem_operand pixld2_s mem_operand pixdeinterleave basereg elseif mem_operand elseif mem_operand elseif mem_operand elseif mem_operand pixld0_s mem_operand else pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else pixld0_s mem_operand pixld0_s mem_operand endif elseif mem_operand else error unsupported mem_operand if bpp mem_operand endif endm macro vuzp8 reg2 vuzp d d ®2 endm macro vzip8 reg2 vzip d d ®2 endm macro pixdeinterleave basereg basereg basereg basereg basereg endif endm macro pixinterleave basereg basereg basereg basereg basereg endif endm macro PF boost_increment endif if endif PF tst PF addne PF subne PF cmp ORIG_W if endif if endif if endif PF subge ORIG_W PF subges if endif if endif if endif endif endm macro cache_preload_simple endif if dst_r_bpp pld [DST_R, #(PREFETCH_DISTANCE_SIMPLE *dst_r_bpp/8)] endif if mask_bpp pld if[MASK, #(PREFETCH_DISTANCE_SIMPLE *mask_bpp/8)] endif endif endm macro fetch_mask_pixblock pixld mask_basereg pixblock_size MASK endm macro ensure_destination_ptr_alignment process_pixblock_tail_head if beq irp local skip1(dst_w_bpp<=(lowbit *8)) &&((lowbit *8)<(pixblock_size *dst_w_bpp)) .if lowbit< 16 tst DST_R
Definition: pixman-arm-neon-asm.h:469
#define fclose
Definition: file_stream_transforms.h:53
version
Definition: setup.py:6
#define SEEK_SET
Definition: zconf.h:438
STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
signed short int16_t
Definition: stdint.h:122
float4 p1
Definition: notHere.h:1
#define float2fixed(x)
Definition: rjpeg.c:2185
GLfloat bias
Definition: glext.h:8812
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma)
set set set set set set set macro pixldst1 abits if abits op else op endif endm macro pixldst2 abits if abits op else op endif endm macro pixldst4 abits if abits op else op endif endm macro pixldst0 abits op endm macro pixldst3 mem_operand op endm macro pixldst30 mem_operand op endm macro pixldst abits if abits elseif abits elseif abits elseif abits elseif abits pixldst0 abits else pixldst0 abits pixldst0 abits pixldst0 abits pixldst0 abits endif elseif abits else pixldst0 abits pixldst0 abits endif elseif abits else error unsupported bpp
Definition: pixman-arm-neon-asm.h:139
GLint GLint GLint GLint GLint GLint y
Definition: glext.h:6295
#define feof
Definition: file_stream_transforms.h:64
Definition: stb_image.h:399
GLenum src
Definition: glext.h:6980
f32 px
Definition: gx_regdef.h:5100
GLenum GLint GLuint mask
Definition: glext.h:6668
GLint GLint GLint GLint GLint x
Definition: glext.h:6295
GLuint in
Definition: glext.h:10523
GLuint64EXT * result
Definition: glext.h:12211
GLdouble GLdouble GLdouble GLdouble q
Definition: glext.h:6414
GLenum GLenum GLvoid * row
Definition: glext.h:6316
GLuint GLdouble GLdouble GLint GLint order
Definition: glext.h:12101
GLint GLint GLsizei GLsizei GLsizei depth
Definition: glext.h:6293
STBIDEF char * stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen)
Definition: inftrees.h:27
GLfloat GLfloat p
Definition: glext.h:9809
STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
signed int int32_t
Definition: stdint.h:123
STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
Definition: stb_image.h:395
GLfixed GLfixed GLfixed y2
Definition: glsym_gl.h:1051
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma)
#define FILE
Definition: file_stream_transforms.h:35
STBIDEF float * stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
#define pow(x, y)
Definition: math.h:22
const GLdouble * v
Definition: glext.h:6391
GLenum GLint GLenum GLsizei GLsizei GLsizei GLint GLsizei const GLvoid * bits
Definition: glext.h:11836
std::string output
Definition: Config.FromFile.cpp:44
u32 col
Definition: gx_regdef.h:5093
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
GLboolean GLboolean g
Definition: glext.h:6844
GLuint color
Definition: glext.h:6883
STBIDEF void stbi_ldr_to_hdr_scale(float scale)
GLint j
Definition: nx_glsym.h:307
STBIDEF stbi_uc * stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
float4 p2
Definition: local.h:1
STBIDEF stbi_uc * stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
Definition: glext.h:7672
GLint GLint GLsizei width
Definition: glext.h:6293
Definition: ffmpeg_fft.c:36
#define STBIDEF
Definition: stb_image.h:411
Ιστορικό Εικόνα Πληροφορίες Όλοι Οι Χρήστες Χειρίζονται Το Μενού Αριστερό Αναλογικό Αριστερό Αναλογικό Αριστερό Αναλογικό Y Αριστερό Αναλογικό Δεξί Αναλογικό X Δεξί Αναλογικό Δεξί Αναλογικό Y Δεξί Αναλογικό Σκανδάλη Όπλου Όπλο Aux A Όπλο Aux C Όπλο Select Όπλο D pad Κάτω Όπλο D pad Δεξιά Νεκρή Ζώνη Αναλογικού Σύνδεση Όλων Λήξη Χρόνου Σύνδεσης Hide Unbound Core Input Descriptors Κατάλογος Συσκευών Κατάλογος Ποντικιού Duty Cycle Keyboard Gamepad Mapping Enable Κουμπί D pad κάτω Κουμπί Κουμπί L(πίσω)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_LEFT
#define CASE(round_direction)
GLdouble GLdouble GLint GLint GLdouble GLdouble GLint GLint GLdouble GLdouble w2
Definition: glext.h:9211
GLsizei GLfixed GLfixed yorig
Definition: glsym_gl.h:1002
static char * skip(char **buf, const char *delimiters)
Definition: civetweb.c:2018
GLsizei const GLfloat * value
Definition: glext.h:6709
#define fread
Definition: file_stream_transforms.h:56
GLuint GLsizei const GLuint const GLintptr const GLsizeiptr * sizes
Definition: glsym_gl.h:634
unsigned char stbi_uc
Definition: stb_image.h:402
int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen)
Definition: compress.c:57
const GLchar * marker
Definition: glsym_es2.h:111
GLsizei stride
Definition: glext.h:6488
#define fopen
Definition: file_stream_transforms.h:52
GLsizei GLfixed xorig
Definition: glsym_gl.h:1002
Definition: stb_image.h:421
Definition: stb_image.h:397
GLubyte GLubyte GLubyte GLubyte w
Definition: glext.h:6742
GLfloat GLfloat GLfloat GLfloat h
Definition: glext.h:8390
Definition: video4linux2.c:51
#define FAST_BITS
Definition: rjpeg.c:172
GLintptr offset
Definition: glext.h:6560
GLint left
Definition: glext.h:8393
GLbitfield flags
Definition: glext.h:7828
STBIDEF void stbi_image_free(void *retval_from_stbi_load)
unsigned short uint16_t
Definition: stdint.h:125
STBIDEF float * stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
void * memset(void *b, int c, size_t len)
Definition: string.c:7
GLenum GLuint GLenum GLsizei length
Definition: glext.h:6233
GLdouble n
Definition: glext.h:8396
unsigned int uint32_t
Definition: stdint.h:126
STBIDEF float * stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
int fopen_s(FILE **pFile, const char *filename, const char *mode)
Definition: StandAlone.cpp:1437
const GLfloat * m
Definition: glext.h:11755
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp)
const char *const str
Definition: portlistingparse.c:18
GLboolean GLboolean GLboolean GLboolean a
Definition: glext.h:6844
STBIDEF const char * stbi_failure_reason(void)
#define fseek
Definition: file_stream_transforms.h:55
GLint GLint GLsizei GLsizei height
Definition: glext.h:6293
void * memcpy(void *dst, const void *src, size_t len)
Definition: string.c:26
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)