185#ifndef STBI_INCLUDE_STB_IMAGE_H
186#define STBI_INCLUDE_STB_IMAGE_H
362#define STBI_VERSION 1
380#ifdef STB_IMAGE_STATIC
381#define STBIDEF static
383#define STBIDEF extern
398 void (*
skip) (
void *user,
int n);
411#ifndef STBI_NO_LINEAR
416 #ifndef STBI_NO_STDIO
426#ifndef STBI_NO_LINEAR
491#ifdef STB_IMAGE_IMPLEMENTATION
493#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
494 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
495 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
496 || defined(STBI_ONLY_ZLIB)
497 #ifndef STBI_ONLY_JPEG
500 #ifndef STBI_ONLY_PNG
503 #ifndef STBI_ONLY_BMP
506 #ifndef STBI_ONLY_PSD
509 #ifndef STBI_ONLY_TGA
512 #ifndef STBI_ONLY_GIF
515 #ifndef STBI_ONLY_HDR
518 #ifndef STBI_ONLY_PIC
521 #ifndef STBI_ONLY_PNM
526#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
536#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
546#define STBI_ASSERT(x) assert(x)
552 #define stbi_inline inline
557 #define stbi_inline __forceinline
562typedef unsigned short stbi__uint16;
563typedef signed short stbi__int16;
564typedef unsigned int stbi__uint32;
565typedef signed int stbi__int32;
568typedef uint16_t stbi__uint16;
569typedef int16_t stbi__int16;
570typedef uint32_t stbi__uint32;
571typedef int32_t stbi__int32;
575typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
578#define STBI_NOTUSED(v) (void)(v)
580#define STBI_NOTUSED(v) (void)sizeof(v)
584#define STBI_HAS_LROTL
588 #define stbi_lrot(x,y) _lrotl(x,y)
590 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
593#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC)
595#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC)
598#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC."
602#define STBI_MALLOC(sz) malloc(sz)
603#define STBI_REALLOC(p,sz) realloc(p,sz)
604#define STBI_FREE(p) free(p)
608#if defined(__x86_64__) || defined(_M_X64)
609#define STBI__X64_TARGET
610#elif defined(__i386) || defined(_M_IX86)
611#define STBI__X86_TARGET
614#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
623#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
638#if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET)
640#include <emmintrin.h>
646static int stbi__cpuid3(
void)
653static int stbi__cpuid3(
void)
665#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
667static int stbi__sse2_available()
669 int info3 = stbi__cpuid3();
670 return ((info3 >> 26) & 1) != 0;
673#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
675static int stbi__sse2_available()
677#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408
679 return __builtin_cpu_supports(
"sse2");
690#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
697#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
700#ifndef STBI_SIMD_ALIGN
701#define STBI_SIMD_ALIGN(type, name) type name
712 stbi__uint32 img_x, img_y;
713 int img_n, img_out_n;
718 int read_from_callbacks;
722 stbi_uc *img_buffer, *img_buffer_end;
723 stbi_uc *img_buffer_original, *img_buffer_original_end;
727static void stbi__refill_buffer(stbi__context *s);
730static void stbi__start_mem(stbi__context *s,
stbi_uc const *buffer,
int len)
733 s->read_from_callbacks = 0;
734 s->img_buffer = s->img_buffer_original = (
stbi_uc *) buffer;
735 s->img_buffer_end = s->img_buffer_original_end = (
stbi_uc *) buffer+len;
739static void stbi__start_callbacks(stbi__context *s,
stbi_io_callbacks *c,
void *user)
742 s->io_user_data = user;
743 s->buflen =
sizeof(s->buffer_start);
744 s->read_from_callbacks = 1;
745 s->img_buffer_original = s->buffer_start;
746 stbi__refill_buffer(s);
747 s->img_buffer_original_end = s->img_buffer_end;
752static int stbi__stdio_read(
void *user,
char *
data,
int size)
754 return (
int) fread(
data,1,
size,(FILE*) user);
757static void stbi__stdio_skip(
void *user,
int n)
759 fseek((FILE*) user, n, SEEK_CUR);
762static int stbi__stdio_eof(
void *user)
764 return feof((FILE*) user);
774static void stbi__start_file(stbi__context *s, FILE *
f)
776 stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *)
f);
783static void stbi__rewind(stbi__context *s)
788 s->img_buffer = s->img_buffer_original;
789 s->img_buffer_end = s->img_buffer_original_end;
793static int stbi__jpeg_test(stbi__context *s);
794static stbi_uc *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
795static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp);
799static int stbi__png_test(stbi__context *s);
800static stbi_uc *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
801static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp);
805static int stbi__bmp_test(stbi__context *s);
806static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
807static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp);
811static int stbi__tga_test(stbi__context *s);
812static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
813static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp);
817static int stbi__psd_test(stbi__context *s);
818static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
819static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp);
823static int stbi__hdr_test(stbi__context *s);
824static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
825static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp);
829static int stbi__pic_test(stbi__context *s);
830static stbi_uc *stbi__pic_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
831static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp);
835static int stbi__gif_test(stbi__context *s);
836static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
837static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp);
841static int stbi__pnm_test(stbi__context *s);
842static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp);
843static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp);
847static const char *stbi__g_failure_reason;
851 return stbi__g_failure_reason;
854static int stbi__err(
const char *
str)
856 stbi__g_failure_reason =
str;
860static void *stbi__malloc(
size_t size)
862 return STBI_MALLOC(
size);
869#ifdef STBI_NO_FAILURE_STRINGS
870 #define stbi__err(x,y) 0
871#elif defined(STBI_FAILURE_USERMSG)
872 #define stbi__err(x,y) stbi__err(y)
874 #define stbi__err(x,y) stbi__err(x)
877#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
878#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
882 STBI_FREE(retval_from_stbi_load);
885#ifndef STBI_NO_LINEAR
886static float *stbi__ldr_to_hdr(
stbi_uc *
data,
int x,
int y,
int comp);
890static stbi_uc *stbi__hdr_to_ldr(
float *
data,
int x,
int y,
int comp);
893static int stbi__vertically_flip_on_load = 0;
897 stbi__vertically_flip_on_load = flag_true_if_should_flip;
900static unsigned char *stbi__load_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
903 if (stbi__jpeg_test(s))
return stbi__jpeg_load(s,x,y,comp,req_comp);
906 if (stbi__png_test(s))
return stbi__png_load(s,x,y,comp,req_comp);
909 if (stbi__bmp_test(s))
return stbi__bmp_load(s,x,y,comp,req_comp);
912 if (stbi__gif_test(s))
return stbi__gif_load(s,x,y,comp,req_comp);
915 if (stbi__psd_test(s))
return stbi__psd_load(s,x,y,comp,req_comp);
918 if (stbi__pic_test(s))
return stbi__pic_load(s,x,y,comp,req_comp);
921 if (stbi__pnm_test(s))
return stbi__pnm_load(s,x,y,comp,req_comp);
925 if (stbi__hdr_test(s)) {
926 float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);
927 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
933 if (stbi__tga_test(s))
934 return stbi__tga_load(s,x,y,comp,req_comp);
937 return stbi__errpuc(
"unknown image type",
"Image not of any known type, or corrupt");
940static unsigned char *stbi__load_flip(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
942 unsigned char *result = stbi__load_main(s, x, y, comp, req_comp);
944 if (stbi__vertically_flip_on_load && result != NULL) {
946 int depth = req_comp ? req_comp : *comp;
951 for (row = 0; row < (h>>1); row++) {
952 for (col = 0; col < w; col++) {
953 for (z = 0; z < depth; z++) {
954 temp = result[(row * w + col) * depth + z];
955 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
956 result[((h - row - 1) * w + col) * depth + z] = temp;
966static void stbi__float_postprocess(
float *result,
int *x,
int *y,
int *comp,
int req_comp)
968 if (stbi__vertically_flip_on_load && result != NULL) {
970 int depth = req_comp ? req_comp : *comp;
975 for (row = 0; row < (h>>1); row++) {
976 for (col = 0; col < w; col++) {
977 for (z = 0; z < depth; z++) {
978 temp = result[(row * w + col) * depth + z];
979 result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
980 result[((h - row - 1) * w + col) * depth + z] = temp;
990static FILE *stbi__fopen(
char const *filename,
char const *mode)
993#if defined(_MSC_VER) && _MSC_VER >= 1400
994 if (0 != fopen_s(&
f, filename, mode))
997 f = fopen(filename, mode);
1005 FILE *
f = stbi__fopen(filename,
"rb");
1006 unsigned char *result;
1007 if (!
f)
return stbi__errpuc(
"can't fopen",
"Unable to open file");
1015 unsigned char *result;
1017 stbi__start_file(&s,
f);
1018 result = stbi__load_flip(&s,x,y,comp,req_comp);
1021 fseek(
f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1030 stbi__start_mem(&s,buffer,len);
1031 return stbi__load_flip(&s,x,y,comp,req_comp);
1038 return stbi__load_flip(&s,x,y,comp,req_comp);
1041#ifndef STBI_NO_LINEAR
1042static float *stbi__loadf_main(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
1044 unsigned char *
data;
1046 if (stbi__hdr_test(s)) {
1047 float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp);
1049 stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1053 data = stbi__load_flip(s, x, y, comp, req_comp);
1055 return stbi__ldr_to_hdr(
data, *x, *y, req_comp ? req_comp : *comp);
1056 return stbi__errpf(
"unknown image type",
"Image not of any known type, or corrupt");
1062 stbi__start_mem(&s,buffer,len);
1063 return stbi__loadf_main(&s,x,y,comp,req_comp);
1070 return stbi__loadf_main(&s,x,y,comp,req_comp);
1073#ifndef STBI_NO_STDIO
1074STBIDEF float *
stbi_loadf(
char const *filename,
int *x,
int *y,
int *comp,
int req_comp)
1077 FILE *
f = stbi__fopen(filename,
"rb");
1078 if (!
f)
return stbi__errpf(
"can't fopen",
"Unable to open file");
1087 stbi__start_file(&s,
f);
1088 return stbi__loadf_main(&s,x,y,comp,req_comp);
1102 stbi__start_mem(&s,buffer,len);
1103 return stbi__hdr_test(&s);
1105 STBI_NOTUSED(buffer);
1111#ifndef STBI_NO_STDIO
1114 FILE *
f = stbi__fopen(filename,
"rb");
1127 stbi__start_file(&s,
f);
1128 return stbi__hdr_test(&s);
1141 return stbi__hdr_test(&s);
1149static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1150static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1152#ifndef STBI_NO_LINEAR
1173static void stbi__refill_buffer(stbi__context *s)
1175 int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
1179 s->read_from_callbacks = 0;
1180 s->img_buffer = s->buffer_start;
1181 s->img_buffer_end = s->buffer_start+1;
1184 s->img_buffer = s->buffer_start;
1185 s->img_buffer_end = s->buffer_start + n;
1189stbi_inline
static stbi_uc stbi__get8(stbi__context *s)
1191 if (s->img_buffer < s->img_buffer_end)
1192 return *s->img_buffer++;
1193 if (s->read_from_callbacks) {
1194 stbi__refill_buffer(s);
1195 return *s->img_buffer++;
1200stbi_inline
static int stbi__at_eof(stbi__context *s)
1203 if (!(s->io.eof)(s->io_user_data))
return 0;
1206 if (s->read_from_callbacks == 0)
return 1;
1209 return s->img_buffer >= s->img_buffer_end;
1212static void stbi__skip(stbi__context *s,
int n)
1215 s->img_buffer = s->img_buffer_end;
1219 int blen = (int) (s->img_buffer_end - s->img_buffer);
1221 s->img_buffer = s->img_buffer_end;
1222 (s->io.skip)(s->io_user_data, n - blen);
1229static int stbi__getn(stbi__context *s,
stbi_uc *buffer,
int n)
1232 int blen = (int) (s->img_buffer_end - s->img_buffer);
1236 memcpy(buffer, s->img_buffer, blen);
1238 count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
1239 res = (
count == (n-blen));
1240 s->img_buffer = s->img_buffer_end;
1245 if (s->img_buffer+n <= s->img_buffer_end) {
1246 memcpy(buffer, s->img_buffer, n);
1253static int stbi__get16be(stbi__context *s)
1255 int z = stbi__get8(s);
1256 return (z << 8) + stbi__get8(s);
1259static stbi__uint32 stbi__get32be(stbi__context *s)
1261 stbi__uint32 z = stbi__get16be(s);
1262 return (z << 16) + stbi__get16be(s);
1265#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1268static int stbi__get16le(stbi__context *s)
1270 int z = stbi__get8(s);
1271 return z + (stbi__get8(s) << 8);
1276static stbi__uint32 stbi__get32le(stbi__context *s)
1278 stbi__uint32 z = stbi__get16le(s);
1279 return z + (stbi__get16le(s) << 16);
1283#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255))
1297static stbi_uc stbi__compute_y(
int r,
int g,
int b)
1299 return (
stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
1302static unsigned char *stbi__convert_format(
unsigned char *
data,
int img_n,
int req_comp,
unsigned int x,
unsigned int y)
1305 unsigned char *good;
1307 if (req_comp == img_n)
return data;
1308 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1310 good = (
unsigned char *) stbi__malloc(req_comp * x * y);
1313 return stbi__errpuc(
"outofmem",
"Out of memory");
1316 for (j=0; j < (int) y; ++j) {
1317 unsigned char *
src =
data + j * x * img_n ;
1318 unsigned char *dest = good + j * x * req_comp;
1320 #define COMBO(a,b) ((a)*8+(b))
1321 #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1324 switch (COMBO(img_n, req_comp)) {
1325 CASE(1,2) dest[0]=
src[0], dest[1]=255; break;
1326 CASE(1,3) dest[0]=dest[1]=dest[2]=
src[0]; break;
1327 CASE(1,4) dest[0]=dest[1]=dest[2]=
src[0], dest[3]=255; break;
1328 CASE(2,1) dest[0]=
src[0]; break;
1329 CASE(2,3) dest[0]=dest[1]=dest[2]=
src[0]; break;
1330 CASE(2,4) dest[0]=dest[1]=dest[2]=
src[0], dest[3]=
src[1]; break;
1331 CASE(3,4) dest[0]=
src[0],dest[1]=
src[1],dest[2]=
src[2],dest[3]=255; break;
1332 CASE(3,1) dest[0]=stbi__compute_y(
src[0],
src[1],
src[2]); break;
1333 CASE(3,2) dest[0]=stbi__compute_y(
src[0],
src[1],
src[2]), dest[1] = 255; break;
1334 CASE(4,1) dest[0]=stbi__compute_y(
src[0],
src[1],
src[2]); break;
1335 CASE(4,2) dest[0]=stbi__compute_y(
src[0],
src[1],
src[2]), dest[1] =
src[3]; break;
1336 CASE(4,3) dest[0]=
src[0],dest[1]=
src[1],dest[2]=
src[2]; break;
1337 default: STBI_ASSERT(0);
1346#ifndef STBI_NO_LINEAR
1347static float *stbi__ldr_to_hdr(
stbi_uc *
data,
int x,
int y,
int comp)
1350 float *output = (
float *) stbi__malloc(x * y * comp *
sizeof(
float));
1351 if (output == NULL) { STBI_FREE(
data);
return stbi__errpf(
"outofmem",
"Out of memory"); }
1353 if (comp & 1) n = comp;
else n = comp-1;
1354 for (i=0; i < x*y; ++i) {
1355 for (k=0; k < n; ++k) {
1356 output[i*comp + k] = (float) (pow(
data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1358 if (k < comp) output[i*comp + k] =
data[i*comp+k]/255.0f;
1366#define stbi__float2int(x) ((int) (x))
1367static stbi_uc *stbi__hdr_to_ldr(
float *
data,
int x,
int y,
int comp)
1371 if (output == NULL) { STBI_FREE(
data);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
1373 if (comp & 1) n = comp;
else n = comp-1;
1374 for (i=0; i < x*y; ++i) {
1375 for (k=0; k < n; ++k) {
1376 float z = (float) pow(
data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1378 if (z > 255) z = 255;
1379 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1382 float z =
data[i*comp+k] * 255 + 0.5f;
1384 if (z > 255) z = 255;
1385 output[i*comp + k] = (
stbi_uc) stbi__float2int(z);
1423 stbi__uint16
code[256];
1426 unsigned int maxcode[18];
1433 stbi__huffman huff_dc[4];
1434 stbi__huffman huff_ac[4];
1436 stbi__int16 fast_ac[4][1 << FAST_BITS];
1439 int img_h_max, img_v_max;
1440 int img_mcu_x, img_mcu_y;
1441 int img_mcu_w, img_mcu_h;
1454 void *raw_data, *raw_coeff;
1457 int coeff_w, coeff_h;
1460 stbi__uint32 code_buffer;
1462 unsigned char marker;
1472 int scan_n, order[4];
1473 int restart_interval, todo;
1476 void (*idct_block_kernel)(
stbi_uc *out,
int out_stride,
short data[64]);
1481static int stbi__build_huffman(stbi__huffman *h,
int *count)
1485 for (i=0; i < 16; ++i)
1486 for (j=0; j <
count[i]; ++j)
1487 h->size[k++] = (
stbi_uc) (i+1);
1493 for(j=1; j <= 16; ++j) {
1495 h->delta[j] = k -
code;
1496 if (h->size[k] == j) {
1497 while (h->size[k] == j)
1498 h->code[k++] = (stbi__uint16) (
code++);
1499 if (
code-1 >= (1 << j))
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
1502 h->maxcode[j] =
code << (16-j);
1505 h->maxcode[j] = 0xffffffff;
1508 memset(h->fast, 255, 1 << FAST_BITS);
1509 for (i=0; i < k; ++i) {
1511 if (s <= FAST_BITS) {
1512 int c = h->code[i] << (FAST_BITS-s);
1513 int m = 1 << (FAST_BITS-s);
1514 for (j=0; j < m; ++j) {
1524static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1527 for (i=0; i < (1 << FAST_BITS); ++i) {
1531 int rs = h->values[fast];
1532 int run = (rs >> 4) & 15;
1533 int magbits = rs & 15;
1534 int len = h->size[fast];
1536 if (magbits && len + magbits <= FAST_BITS) {
1538 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1539 int m = 1 << (magbits - 1);
1540 if (k < m) k += (-1 << magbits) + 1;
1542 if (k >= -128 && k <= 127)
1543 fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
1549static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1552 int b = j->nomore ? 0 : stbi__get8(j->s);
1554 int c = stbi__get8(j->s);
1556 j->marker = (
unsigned char) c;
1561 j->code_buffer |= b << (24 - j->code_bits);
1563 }
while (j->code_bits <= 24);
1567static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1570stbi_inline
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1575 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1579 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1583 if (s > j->code_bits)
1585 j->code_buffer <<= s;
1587 return h->values[k];
1596 temp = j->code_buffer >> 16;
1597 for (k=FAST_BITS+1 ; ; ++k)
1598 if (temp < h->maxcode[k])
1606 if (k > j->code_bits)
1610 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1611 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1615 j->code_buffer <<= k;
1616 return h->values[c];
1620static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1624stbi_inline
static int stbi__extend_receive(stbi__jpeg *j,
int n)
1628 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1630 sgn = (stbi__int32)j->code_buffer >> 31;
1631 k = stbi_lrot(j->code_buffer, n);
1632 STBI_ASSERT(n >= 0 && n < (
int) (
sizeof(stbi__bmask)/
sizeof(*stbi__bmask)));
1633 j->code_buffer = k & ~stbi__bmask[n];
1634 k &= stbi__bmask[n];
1636 return k + (stbi__jbias[n] & ~sgn);
1640stbi_inline
static int stbi__jpeg_get_bits(stbi__jpeg *j,
int n)
1643 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1644 k = stbi_lrot(j->code_buffer, n);
1645 j->code_buffer = k & ~stbi__bmask[n];
1646 k &= stbi__bmask[n];
1651stbi_inline
static int stbi__jpeg_get_bit(stbi__jpeg *j)
1654 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1656 j->code_buffer <<= 1;
1658 return k & 0x80000000;
1663static stbi_uc stbi__jpeg_dezigzag[64+15] =
1665 0, 1, 8, 16, 9, 2, 3, 10,
1666 17, 24, 32, 25, 18, 11, 4, 5,
1667 12, 19, 26, 33, 40, 48, 41, 34,
1668 27, 20, 13, 6, 7, 14, 21, 28,
1669 35, 42, 49, 56, 57, 50, 43, 36,
1670 29, 22, 15, 23, 30, 37, 44, 51,
1671 58, 59, 52, 45, 38, 31, 39, 46,
1672 53, 60, 61, 54, 47, 55, 62, 63,
1674 63, 63, 63, 63, 63, 63, 63, 63,
1675 63, 63, 63, 63, 63, 63, 63
1679static 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)
1684 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1685 t = stbi__jpeg_huff_decode(j, hdc);
1686 if (t < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1691 diff = t ? stbi__extend_receive(j, t) : 0;
1692 dc = j->img_comp[b].dc_pred + diff;
1693 j->img_comp[b].dc_pred = dc;
1694 data[0] = (short) (dc * dequant[0]);
1701 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1702 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1707 j->code_buffer <<= s;
1710 zig = stbi__jpeg_dezigzag[k++];
1711 data[zig] = (short) ((r >> 8) * dequant[zig]);
1713 int rs = stbi__jpeg_huff_decode(j, hac);
1714 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1718 if (rs != 0xf0)
break;
1723 zig = stbi__jpeg_dezigzag[k++];
1724 data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
1731static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j,
short data[64], stbi__huffman *hdc,
int b)
1735 if (j->spec_end != 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1737 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1739 if (j->succ_high == 0) {
1742 t = stbi__jpeg_huff_decode(j, hdc);
1743 diff = t ? stbi__extend_receive(j, t) : 0;
1745 dc = j->img_comp[b].dc_pred + diff;
1746 j->img_comp[b].dc_pred = dc;
1747 data[0] = (short) (dc << j->succ_low);
1750 if (stbi__jpeg_get_bit(j))
1751 data[0] += (short) (1 << j->succ_low);
1758static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j,
short data[64], stbi__huffman *hac, stbi__int16 *fac)
1761 if (j->spec_start == 0)
return stbi__err(
"can't merge dc and ac",
"Corrupt JPEG");
1763 if (j->succ_high == 0) {
1764 int shift = j->succ_low;
1775 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1776 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1781 j->code_buffer <<= s;
1783 zig = stbi__jpeg_dezigzag[k++];
1784 data[zig] = (short) ((r >> 8) << shift);
1786 int rs = stbi__jpeg_huff_decode(j, hac);
1787 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1792 j->eob_run = (1 << r);
1794 j->eob_run += stbi__jpeg_get_bits(j, r);
1801 zig = stbi__jpeg_dezigzag[k++];
1802 data[zig] = (short) (stbi__extend_receive(j,s) << shift);
1805 }
while (k <= j->spec_end);
1809 short bit = (short) (1 << j->succ_low);
1813 for (k = j->spec_start; k <= j->spec_end; ++k) {
1814 short *p = &
data[stbi__jpeg_dezigzag[k]];
1816 if (stbi__jpeg_get_bit(j))
1817 if ((*p & bit)==0) {
1828 int rs = stbi__jpeg_huff_decode(j, hac);
1829 if (rs < 0)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1834 j->eob_run = (1 << r) - 1;
1836 j->eob_run += stbi__jpeg_get_bits(j, r);
1844 if (s != 1)
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
1846 if (stbi__jpeg_get_bit(j))
1853 while (k <= j->spec_end) {
1854 short *p = &
data[stbi__jpeg_dezigzag[k++]];
1856 if (stbi__jpeg_get_bit(j))
1857 if ((*p & bit)==0) {
1871 }
while (k <= j->spec_end);
1878stbi_inline
static stbi_uc stbi__clamp(
int x)
1881 if ((
unsigned int) x > 255) {
1882 if (x < 0)
return 0;
1883 if (x > 255)
return 255;
1888#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
1889#define stbi__fsh(x) ((x) << 12)
1892#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
1893 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
1896 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
1897 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
1898 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
1901 t0 = stbi__fsh(p2+p3); \
1902 t1 = stbi__fsh(p2-p3); \
1915 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
1916 t0 = t0*stbi__f2f( 0.298631336f); \
1917 t1 = t1*stbi__f2f( 2.053119869f); \
1918 t2 = t2*stbi__f2f( 3.072711026f); \
1919 t3 = t3*stbi__f2f( 1.501321110f); \
1920 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
1921 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
1922 p3 = p3*stbi__f2f(-1.961570560f); \
1923 p4 = p4*stbi__f2f(-0.390180644f); \
1929static void stbi__idct_block(
stbi_uc *out,
int out_stride,
short data[64])
1931 int i,val[64],*v=val;
1936 for (i=0; i < 8; ++i,++
d, ++v) {
1938 if (
d[ 8]==0 &&
d[16]==0 &&
d[24]==0 &&
d[32]==0
1939 &&
d[40]==0 &&
d[48]==0 &&
d[56]==0) {
1944 int dcterm =
d[0] << 2;
1945 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1947 STBI__IDCT_1D(
d[ 0],
d[ 8],
d[16],
d[24],
d[32],
d[40],
d[48],
d[56])
1950 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
1951 v[ 0] = (x0+t3) >> 10;
1952 v[56] = (x0-t3) >> 10;
1953 v[ 8] = (x1+t2) >> 10;
1954 v[48] = (x1-t2) >> 10;
1955 v[16] = (x2+t1) >> 10;
1956 v[40] = (x2-t1) >> 10;
1957 v[24] = (x3+t0) >> 10;
1958 v[32] = (x3-t0) >> 10;
1962 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
1964 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
1971 x0 += 65536 + (128<<17);
1972 x1 += 65536 + (128<<17);
1973 x2 += 65536 + (128<<17);
1974 x3 += 65536 + (128<<17);
1977 o[0] = stbi__clamp((x0+t3) >> 17);
1978 o[7] = stbi__clamp((x0-t3) >> 17);
1979 o[1] = stbi__clamp((x1+t2) >> 17);
1980 o[6] = stbi__clamp((x1-t2) >> 17);
1981 o[2] = stbi__clamp((x2+t1) >> 17);
1982 o[5] = stbi__clamp((x2-t1) >> 17);
1983 o[3] = stbi__clamp((x3+t0) >> 17);
1984 o[4] = stbi__clamp((x3-t0) >> 17);
1992static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
1995 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
1999 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2003 #define dct_rot(out0,out1, x,y,c0,c1) \
2004 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2005 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2006 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2007 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2008 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2009 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2012 #define dct_widen(out, in) \
2013 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2014 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2017 #define dct_wadd(out, a, b) \
2018 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2019 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2022 #define dct_wsub(out, a, b) \
2023 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2024 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2027 #define dct_bfly32o(out0, out1, a,b,bias,s) \
2029 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2030 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2031 dct_wadd(sum, abiased, b); \
2032 dct_wsub(dif, abiased, b); \
2033 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2034 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2038 #define dct_interleave8(a, b) \
2040 a = _mm_unpacklo_epi8(a, b); \
2041 b = _mm_unpackhi_epi8(tmp, b)
2044 #define dct_interleave16(a, b) \
2046 a = _mm_unpacklo_epi16(a, b); \
2047 b = _mm_unpackhi_epi16(tmp, b)
2049 #define dct_pass(bias,shift) \
2052 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2053 __m128i sum04 = _mm_add_epi16(row0, row4); \
2054 __m128i dif04 = _mm_sub_epi16(row0, row4); \
2055 dct_widen(t0e, sum04); \
2056 dct_widen(t1e, dif04); \
2057 dct_wadd(x0, t0e, t3e); \
2058 dct_wsub(x3, t0e, t3e); \
2059 dct_wadd(x1, t1e, t2e); \
2060 dct_wsub(x2, t1e, t2e); \
2062 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2063 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2064 __m128i sum17 = _mm_add_epi16(row1, row7); \
2065 __m128i sum35 = _mm_add_epi16(row3, row5); \
2066 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2067 dct_wadd(x4, y0o, y4o); \
2068 dct_wadd(x5, y1o, y5o); \
2069 dct_wadd(x6, y2o, y5o); \
2070 dct_wadd(x7, y3o, y4o); \
2071 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2072 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2073 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2074 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2077 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2078 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2079 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2080 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2081 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2082 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2083 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2084 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
2087 __m128i bias_0 = _mm_set1_epi32(512);
2088 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2091 row0 = _mm_load_si128((
const __m128i *) (
data + 0*8));
2092 row1 = _mm_load_si128((
const __m128i *) (
data + 1*8));
2093 row2 = _mm_load_si128((
const __m128i *) (
data + 2*8));
2094 row3 = _mm_load_si128((
const __m128i *) (
data + 3*8));
2095 row4 = _mm_load_si128((
const __m128i *) (
data + 4*8));
2096 row5 = _mm_load_si128((
const __m128i *) (
data + 5*8));
2097 row6 = _mm_load_si128((
const __m128i *) (
data + 6*8));
2098 row7 = _mm_load_si128((
const __m128i *) (
data + 7*8));
2101 dct_pass(bias_0, 10);
2105 dct_interleave16(row0, row4);
2106 dct_interleave16(row1, row5);
2107 dct_interleave16(row2, row6);
2108 dct_interleave16(row3, row7);
2111 dct_interleave16(row0, row2);
2112 dct_interleave16(row1, row3);
2113 dct_interleave16(row4, row6);
2114 dct_interleave16(row5, row7);
2117 dct_interleave16(row0, row1);
2118 dct_interleave16(row2, row3);
2119 dct_interleave16(row4, row5);
2120 dct_interleave16(row6, row7);
2124 dct_pass(bias_1, 17);
2128 __m128i p0 = _mm_packus_epi16(row0, row1);
2129 __m128i p1 = _mm_packus_epi16(row2, row3);
2130 __m128i p2 = _mm_packus_epi16(row4, row5);
2131 __m128i p3 = _mm_packus_epi16(row6, row7);
2134 dct_interleave8(p0, p2);
2135 dct_interleave8(p1, p3);
2138 dct_interleave8(p0, p1);
2139 dct_interleave8(p2, p3);
2142 dct_interleave8(p0, p2);
2143 dct_interleave8(p1, p3);
2146 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2147 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2148 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2149 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2150 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2151 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2152 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2153 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2162#undef dct_interleave8
2163#undef dct_interleave16
2173static void stbi__idct_simd(
stbi_uc *out,
int out_stride,
short data[64])
2175 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2177 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2178 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2179 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2180 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2181 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2182 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2183 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2184 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2185 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2186 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2187 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2188 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2190#define dct_long_mul(out, inq, coeff) \
2191 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2192 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2194#define dct_long_mac(out, acc, inq, coeff) \
2195 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2196 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2198#define dct_widen(out, inq) \
2199 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2200 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2203#define dct_wadd(out, a, b) \
2204 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2205 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2208#define dct_wsub(out, a, b) \
2209 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2210 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2213#define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2215 dct_wadd(sum, a, b); \
2216 dct_wsub(dif, a, b); \
2217 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2218 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2221#define dct_pass(shiftop, shift) \
2224 int16x8_t sum26 = vaddq_s16(row2, row6); \
2225 dct_long_mul(p1e, sum26, rot0_0); \
2226 dct_long_mac(t2e, p1e, row6, rot0_1); \
2227 dct_long_mac(t3e, p1e, row2, rot0_2); \
2228 int16x8_t sum04 = vaddq_s16(row0, row4); \
2229 int16x8_t dif04 = vsubq_s16(row0, row4); \
2230 dct_widen(t0e, sum04); \
2231 dct_widen(t1e, dif04); \
2232 dct_wadd(x0, t0e, t3e); \
2233 dct_wsub(x3, t0e, t3e); \
2234 dct_wadd(x1, t1e, t2e); \
2235 dct_wsub(x2, t1e, t2e); \
2237 int16x8_t sum15 = vaddq_s16(row1, row5); \
2238 int16x8_t sum17 = vaddq_s16(row1, row7); \
2239 int16x8_t sum35 = vaddq_s16(row3, row5); \
2240 int16x8_t sum37 = vaddq_s16(row3, row7); \
2241 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2242 dct_long_mul(p5o, sumodd, rot1_0); \
2243 dct_long_mac(p1o, p5o, sum17, rot1_1); \
2244 dct_long_mac(p2o, p5o, sum35, rot1_2); \
2245 dct_long_mul(p3o, sum37, rot2_0); \
2246 dct_long_mul(p4o, sum15, rot2_1); \
2247 dct_wadd(sump13o, p1o, p3o); \
2248 dct_wadd(sump24o, p2o, p4o); \
2249 dct_wadd(sump23o, p2o, p3o); \
2250 dct_wadd(sump14o, p1o, p4o); \
2251 dct_long_mac(x4, sump13o, row7, rot3_0); \
2252 dct_long_mac(x5, sump24o, row5, rot3_1); \
2253 dct_long_mac(x6, sump23o, row3, rot3_2); \
2254 dct_long_mac(x7, sump14o, row1, rot3_3); \
2255 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2256 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2257 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2258 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2262 row0 = vld1q_s16(
data + 0*8);
2263 row1 = vld1q_s16(
data + 1*8);
2264 row2 = vld1q_s16(
data + 2*8);
2265 row3 = vld1q_s16(
data + 3*8);
2266 row4 = vld1q_s16(
data + 4*8);
2267 row5 = vld1q_s16(
data + 5*8);
2268 row6 = vld1q_s16(
data + 6*8);
2269 row7 = vld1q_s16(
data + 7*8);
2272 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2275 dct_pass(vrshrn_n_s32, 10);
2281#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2282#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]); }
2283#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)); }
2286 dct_trn16(row0, row1);
2287 dct_trn16(row2, row3);
2288 dct_trn16(row4, row5);
2289 dct_trn16(row6, row7);
2292 dct_trn32(row0, row2);
2293 dct_trn32(row1, row3);
2294 dct_trn32(row4, row6);
2295 dct_trn32(row5, row7);
2298 dct_trn64(row0, row4);
2299 dct_trn64(row1, row5);
2300 dct_trn64(row2, row6);
2301 dct_trn64(row3, row7);
2312 dct_pass(vshrn_n_s32, 16);
2316 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2317 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2318 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2319 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2320 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2321 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2322 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2323 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2326#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2327#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]); }
2328#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]); }
2340 dct_trn8_16(p0, p2);
2341 dct_trn8_16(p1, p3);
2342 dct_trn8_16(p4, p6);
2343 dct_trn8_16(p5, p7);
2346 dct_trn8_32(p0, p4);
2347 dct_trn8_32(p1, p5);
2348 dct_trn8_32(p2, p6);
2349 dct_trn8_32(p3, p7);
2352 vst1_u8(out, p0); out += out_stride;
2353 vst1_u8(out, p1); out += out_stride;
2354 vst1_u8(out, p2); out += out_stride;
2355 vst1_u8(out, p3); out += out_stride;
2356 vst1_u8(out, p4); out += out_stride;
2357 vst1_u8(out, p5); out += out_stride;
2358 vst1_u8(out, p6); out += out_stride;
2377#define STBI__MARKER_none 0xff
2381static stbi_uc stbi__get_marker(stbi__jpeg *j)
2384 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none;
return x; }
2385 x = stbi__get8(j->s);
2386 if (x != 0xff)
return STBI__MARKER_none;
2388 x = stbi__get8(j->s);
2394#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2398static void stbi__jpeg_reset(stbi__jpeg *j)
2403 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
2404 j->marker = STBI__MARKER_none;
2405 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2411static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2413 stbi__jpeg_reset(z);
2414 if (!z->progressive) {
2415 if (z->scan_n == 1) {
2417 STBI_SIMD_ALIGN(
short,
data[64]);
2418 int n = z->order[0];
2423 int w = (z->img_comp[n].x+7) >> 3;
2424 int h = (z->img_comp[n].y+7) >> 3;
2425 for (j=0; j < h; ++j) {
2426 for (i=0; i < w; ++i) {
2427 int ha = z->img_comp[n].ha;
2428 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;
2429 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2,
data);
2431 if (--z->todo <= 0) {
2432 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2435 if (!STBI__RESTART(z->marker))
return 1;
2436 stbi__jpeg_reset(z);
2443 STBI_SIMD_ALIGN(
short,
data[64]);
2444 for (j=0; j < z->img_mcu_y; ++j) {
2445 for (i=0; i < z->img_mcu_x; ++i) {
2447 for (k=0; k < z->scan_n; ++k) {
2448 int n = z->order[k];
2451 for (y=0; y < z->img_comp[n].v; ++y) {
2452 for (x=0; x < z->img_comp[n].h; ++x) {
2453 int x2 = (i*z->img_comp[n].h + x)*8;
2454 int y2 = (j*z->img_comp[n].v + y)*8;
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*y2+x2, z->img_comp[n].w2,
data);
2463 if (--z->todo <= 0) {
2464 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2465 if (!STBI__RESTART(z->marker))
return 1;
2466 stbi__jpeg_reset(z);
2473 if (z->scan_n == 1) {
2475 int n = z->order[0];
2480 int w = (z->img_comp[n].x+7) >> 3;
2481 int h = (z->img_comp[n].y+7) >> 3;
2482 for (j=0; j < h; ++j) {
2483 for (i=0; i < w; ++i) {
2484 short *
data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2485 if (z->spec_start == 0) {
2486 if (!stbi__jpeg_decode_block_prog_dc(z,
data, &z->huff_dc[z->img_comp[n].hd], n))
2489 int ha = z->img_comp[n].ha;
2490 if (!stbi__jpeg_decode_block_prog_ac(z,
data, &z->huff_ac[ha], z->fast_ac[ha]))
2494 if (--z->todo <= 0) {
2495 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2496 if (!STBI__RESTART(z->marker))
return 1;
2497 stbi__jpeg_reset(z);
2504 for (j=0; j < z->img_mcu_y; ++j) {
2505 for (i=0; i < z->img_mcu_x; ++i) {
2507 for (k=0; k < z->scan_n; ++k) {
2508 int n = z->order[k];
2511 for (y=0; y < z->img_comp[n].v; ++y) {
2512 for (x=0; x < z->img_comp[n].h; ++x) {
2513 int x2 = (i*z->img_comp[n].h + x);
2514 int y2 = (j*z->img_comp[n].v + y);
2515 short *
data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2516 if (!stbi__jpeg_decode_block_prog_dc(z,
data, &z->huff_dc[z->img_comp[n].hd], n))
2523 if (--z->todo <= 0) {
2524 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2525 if (!STBI__RESTART(z->marker))
return 1;
2526 stbi__jpeg_reset(z);
2535static void stbi__jpeg_dequantize(
short *
data,
stbi_uc *dequant)
2538 for (i=0; i < 64; ++i)
2539 data[i] *= dequant[i];
2542static void stbi__jpeg_finish(stbi__jpeg *z)
2544 if (z->progressive) {
2547 for (n=0; n < z->s->img_n; ++n) {
2548 int w = (z->img_comp[n].x+7) >> 3;
2549 int h = (z->img_comp[n].y+7) >> 3;
2550 for (j=0; j < h; ++j) {
2551 for (i=0; i < w; ++i) {
2552 short *
data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2553 stbi__jpeg_dequantize(
data, z->dequant[z->img_comp[n].tq]);
2554 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2,
data);
2561static int stbi__process_marker(stbi__jpeg *z,
int m)
2565 case STBI__MARKER_none:
2566 return stbi__err(
"expected marker",
"Corrupt JPEG");
2569 if (stbi__get16be(z->s) != 4)
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
2570 z->restart_interval = stbi__get16be(z->s);
2574 L = stbi__get16be(z->s)-2;
2576 int q = stbi__get8(z->s);
2579 if (p != 0)
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
2580 if (t > 3)
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
2581 for (i=0; i < 64; ++i)
2582 z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
2588 L = stbi__get16be(z->s)-2;
2591 int sizes[16],i,n=0;
2592 int q = stbi__get8(z->s);
2595 if (tc > 1 || th > 3)
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
2596 for (i=0; i < 16; ++i) {
2597 sizes[i] = stbi__get8(z->s);
2602 if (!stbi__build_huffman(z->huff_dc+th, sizes))
return 0;
2603 v = z->huff_dc[th].values;
2605 if (!stbi__build_huffman(z->huff_ac+th, sizes))
return 0;
2606 v = z->huff_ac[th].values;
2608 for (i=0; i < n; ++i)
2609 v[i] = stbi__get8(z->s);
2611 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2617 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2618 stbi__skip(z->s, stbi__get16be(z->s)-2);
2625static int stbi__process_scan_header(stbi__jpeg *z)
2628 int Ls = stbi__get16be(z->s);
2629 z->scan_n = stbi__get8(z->s);
2630 if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (
int) z->s->img_n)
return stbi__err(
"bad SOS component count",
"Corrupt JPEG");
2631 if (Ls != 6+2*z->scan_n)
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
2632 for (i=0; i < z->scan_n; ++i) {
2633 int id = stbi__get8(z->s), which;
2634 int q = stbi__get8(z->s);
2635 for (which = 0; which < z->s->img_n; ++which)
2636 if (z->img_comp[which].id ==
id)
2638 if (which == z->s->img_n)
return 0;
2639 z->img_comp[which].hd = q >> 4;
if (z->img_comp[which].hd > 3)
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
2640 z->img_comp[which].ha = q & 15;
if (z->img_comp[which].ha > 3)
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
2641 z->order[i] = which;
2646 z->spec_start = stbi__get8(z->s);
2647 z->spec_end = stbi__get8(z->s);
2648 aa = stbi__get8(z->s);
2649 z->succ_high = (aa >> 4);
2650 z->succ_low = (aa & 15);
2651 if (z->progressive) {
2652 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2653 return stbi__err(
"bad SOS",
"Corrupt JPEG");
2655 if (z->spec_start != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2656 if (z->succ_high != 0 || z->succ_low != 0)
return stbi__err(
"bad SOS",
"Corrupt JPEG");
2664static int stbi__process_frame_header(stbi__jpeg *z,
int scan)
2666 stbi__context *s = z->s;
2667 int Lf,p,i,q, h_max=1,v_max=1,c;
2668 Lf = stbi__get16be(s);
if (Lf < 11)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2669 p = stbi__get8(s);
if (p != 8)
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only");
2670 s->img_y = stbi__get16be(s);
if (s->img_y == 0)
return stbi__err(
"no header height",
"JPEG format not supported: delayed height");
2671 s->img_x = stbi__get16be(s);
if (s->img_x == 0)
return stbi__err(
"0 width",
"Corrupt JPEG");
2673 if (c != 3 && c != 1)
return stbi__err(
"bad component count",
"Corrupt JPEG");
2675 for (i=0; i < c; ++i) {
2676 z->img_comp[i].data = NULL;
2677 z->img_comp[i].linebuf = NULL;
2680 if (Lf != 8+3*s->img_n)
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
2682 for (i=0; i < s->img_n; ++i) {
2683 z->img_comp[i].id = stbi__get8(s);
2684 if (z->img_comp[i].id != i+1)
2685 if (z->img_comp[i].id != i)
2686 return stbi__err(
"bad component ID",
"Corrupt JPEG");
2688 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");
2689 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");
2690 z->img_comp[i].tq = stbi__get8(s);
if (z->img_comp[i].tq > 3)
return stbi__err(
"bad TQ",
"Corrupt JPEG");
2693 if (scan != STBI__SCAN_load)
return 1;
2695 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
2697 for (i=0; i < s->img_n; ++i) {
2698 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
2699 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
2703 z->img_h_max = h_max;
2704 z->img_v_max = v_max;
2705 z->img_mcu_w = h_max * 8;
2706 z->img_mcu_h = v_max * 8;
2707 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
2708 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
2710 for (i=0; i < s->img_n; ++i) {
2712 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
2713 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
2718 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
2719 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
2720 z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
2722 if (z->img_comp[i].raw_data == NULL) {
2723 for(--i; i >= 0; --i) {
2724 STBI_FREE(z->img_comp[i].raw_data);
2725 z->img_comp[i].raw_data = NULL;
2727 return stbi__err(
"outofmem",
"Out of memory");
2730 z->img_comp[i].data = (
stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
2731 z->img_comp[i].linebuf = NULL;
2732 if (z->progressive) {
2733 z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;
2734 z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
2735 z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 *
sizeof(
short) + 15);
2736 z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
2738 z->img_comp[i].coeff = 0;
2739 z->img_comp[i].raw_coeff = 0;
2747#define stbi__DNL(x) ((x) == 0xdc)
2748#define stbi__SOI(x) ((x) == 0xd8)
2749#define stbi__EOI(x) ((x) == 0xd9)
2750#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
2751#define stbi__SOS(x) ((x) == 0xda)
2753#define stbi__SOF_progressive(x) ((x) == 0xc2)
2755static int stbi__decode_jpeg_header(stbi__jpeg *z,
int scan)
2758 z->marker = STBI__MARKER_none;
2759 m = stbi__get_marker(z);
2760 if (!stbi__SOI(m))
return stbi__err(
"no SOI",
"Corrupt JPEG");
2761 if (scan == STBI__SCAN_type)
return 1;
2762 m = stbi__get_marker(z);
2763 while (!stbi__SOF(m)) {
2764 if (!stbi__process_marker(z,m))
return 0;
2765 m = stbi__get_marker(z);
2766 while (m == STBI__MARKER_none) {
2768 if (stbi__at_eof(z->s))
return stbi__err(
"no SOF",
"Corrupt JPEG");
2769 m = stbi__get_marker(z);
2772 z->progressive = stbi__SOF_progressive(m);
2773 if (!stbi__process_frame_header(z, scan))
return 0;
2778static int stbi__decode_jpeg_image(stbi__jpeg *j)
2781 for (m = 0; m < 4; m++) {
2782 j->img_comp[m].raw_data = NULL;
2783 j->img_comp[m].raw_coeff = NULL;
2785 j->restart_interval = 0;
2786 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load))
return 0;
2787 m = stbi__get_marker(j);
2788 while (!stbi__EOI(m)) {
2790 if (!stbi__process_scan_header(j))
return 0;
2791 if (!stbi__parse_entropy_coded_data(j))
return 0;
2792 if (j->marker == STBI__MARKER_none ) {
2794 while (!stbi__at_eof(j->s)) {
2795 int x = stbi__get8(j->s);
2797 j->marker = stbi__get8(j->s);
2799 }
else if (x != 0) {
2800 return stbi__err(
"junk before marker",
"Corrupt JPEG");
2806 if (!stbi__process_marker(j, m))
return 0;
2808 m = stbi__get_marker(j);
2811 stbi__jpeg_finish(j);
2820#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
2825 STBI_NOTUSED(in_far);
2836 for (i=0; i < w; ++i)
2837 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
2849 out[0] = out[1] = input[0];
2854 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
2855 for (i=1; i < w-1; ++i) {
2856 int n = 3*input[i]+2;
2857 out[i*2+0] = stbi__div4(n+input[i-1]);
2858 out[i*2+1] = stbi__div4(n+input[i+1]);
2860 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
2861 out[i*2+1] = input[w-1];
2863 STBI_NOTUSED(in_far);
2869#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
2876 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2880 t1 = 3*in_near[0] + in_far[0];
2881 out[0] = stbi__div4(t1+2);
2882 for (i=1; i < w; ++i) {
2884 t1 = 3*in_near[i]+in_far[i];
2885 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
2886 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
2888 out[w*2-1] = stbi__div4(t1+2);
2895#if defined(STBI_SSE2) || defined(STBI_NEON)
2902 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2906 t1 = 3*in_near[0] + in_far[0];
2910 for (; i < ((w-1) & ~7); i += 8) {
2911#if defined(STBI_SSE2)
2914 __m128i zero = _mm_setzero_si128();
2915 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
2916 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
2917 __m128i farw = _mm_unpacklo_epi8(farb, zero);
2918 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
2919 __m128i diff = _mm_sub_epi16(farw, nearw);
2920 __m128i nears = _mm_slli_epi16(nearw, 2);
2921 __m128i curr = _mm_add_epi16(nears, diff);
2928 __m128i prv0 = _mm_slli_si128(curr, 2);
2929 __m128i nxt0 = _mm_srli_si128(curr, 2);
2930 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
2931 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
2937 __m128i bias = _mm_set1_epi16(8);
2938 __m128i curs = _mm_slli_epi16(curr, 2);
2939 __m128i prvd = _mm_sub_epi16(prev, curr);
2940 __m128i nxtd = _mm_sub_epi16(next, curr);
2941 __m128i curb = _mm_add_epi16(curs, bias);
2942 __m128i
even = _mm_add_epi16(prvd, curb);
2943 __m128i odd = _mm_add_epi16(nxtd, curb);
2946 __m128i int0 = _mm_unpacklo_epi16(even, odd);
2947 __m128i int1 = _mm_unpackhi_epi16(even, odd);
2948 __m128i de0 = _mm_srli_epi16(int0, 4);
2949 __m128i de1 = _mm_srli_epi16(int1, 4);
2952 __m128i outv = _mm_packus_epi16(de0, de1);
2953 _mm_storeu_si128((__m128i *) (out + i*2), outv);
2954#elif defined(STBI_NEON)
2957 uint8x8_t farb = vld1_u8(in_far + i);
2958 uint8x8_t nearb = vld1_u8(in_near + i);
2959 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
2960 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
2961 int16x8_t curr = vaddq_s16(nears, diff);
2968 int16x8_t prv0 = vextq_s16(curr, curr, 7);
2969 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
2970 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
2971 int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
2977 int16x8_t curs = vshlq_n_s16(curr, 2);
2978 int16x8_t prvd = vsubq_s16(prev, curr);
2979 int16x8_t nxtd = vsubq_s16(next, curr);
2980 int16x8_t
even = vaddq_s16(curs, prvd);
2981 int16x8_t odd = vaddq_s16(curs, nxtd);
2985 o.val[0] = vqrshrun_n_s16(even, 4);
2986 o.val[1] = vqrshrun_n_s16(odd, 4);
2987 vst2_u8(out + i*2, o);
2991 t1 = 3*in_near[i+7] + in_far[i+7];
2995 t1 = 3*in_near[i] + in_far[i];
2996 out[i*2] = stbi__div16(3*t1 + t0 + 8);
2998 for (++i; i < w; ++i) {
3000 t1 = 3*in_near[i]+in_far[i];
3001 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3002 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3004 out[w*2-1] = stbi__div4(t1+2);
3016 STBI_NOTUSED(in_far);
3017 for (i=0; i < w; ++i)
3018 for (j=0; j < hs; ++j)
3019 out[i*hs+j] = in_near[i];
3026#define float2fixed(x) ((int) ((x) * 65536 + 0.5))
3030 for (i=0; i <
count; ++i) {
3031 int y_fixed = (y[i] << 16) + 32768;
3033 int cr = pcr[i] - 128;
3034 int cb = pcb[i] - 128;
3035 r = y_fixed + cr*float2fixed(1.40200f);
3036 g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
3037 b = y_fixed + cb*float2fixed(1.77200f);
3041 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3042 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3043 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3054#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3058 for (i=0; i <
count; ++i) {
3059 int y_fixed = (y[i] << 20) + (1<<19);
3061 int cr = pcr[i] - 128;
3062 int cb = pcb[i] - 128;
3063 r = y_fixed + cr* float2fixed(1.40200f);
3064 g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3065 b = y_fixed + cb* float2fixed(1.77200f);
3069 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3070 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3071 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3081#if defined(STBI_SSE2) || defined(STBI_NEON)
3092 __m128i signflip = _mm_set1_epi8(-0x80);
3093 __m128i cr_const0 = _mm_set1_epi16( (
short) ( 1.40200f*4096.0f+0.5f));
3094 __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
3095 __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
3096 __m128i cb_const1 = _mm_set1_epi16( (
short) ( 1.77200f*4096.0f+0.5f));
3097 __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
3098 __m128i xw = _mm_set1_epi16(255);
3100 for (; i+7 <
count; i += 8) {
3102 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3103 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3104 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3105 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip);
3106 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip);
3109 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3110 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3111 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3114 __m128i yws = _mm_srli_epi16(yw, 4);
3115 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3116 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3117 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3118 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3119 __m128i rws = _mm_add_epi16(cr0, yws);
3120 __m128i gwt = _mm_add_epi16(cb0, yws);
3121 __m128i bws = _mm_add_epi16(yws, cb1);
3122 __m128i gws = _mm_add_epi16(gwt, cr1);
3125 __m128i rw = _mm_srai_epi16(rws, 4);
3126 __m128i bw = _mm_srai_epi16(bws, 4);
3127 __m128i gw = _mm_srai_epi16(gws, 4);
3130 __m128i brb = _mm_packus_epi16(rw, bw);
3131 __m128i gxb = _mm_packus_epi16(gw, xw);
3134 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3135 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3136 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3137 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3140 _mm_storeu_si128((__m128i *) (out + 0), o0);
3141 _mm_storeu_si128((__m128i *) (out + 16), o1);
3151 uint8x8_t signflip = vdup_n_u8(0x80);
3152 int16x8_t cr_const0 = vdupq_n_s16( (
short) ( 1.40200f*4096.0f+0.5f));
3153 int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
3154 int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
3155 int16x8_t cb_const1 = vdupq_n_s16( (
short) ( 1.77200f*4096.0f+0.5f));
3157 for (; i+7 <
count; i += 8) {
3159 uint8x8_t y_bytes = vld1_u8(y + i);
3160 uint8x8_t cr_bytes = vld1_u8(pcr + i);
3161 uint8x8_t cb_bytes = vld1_u8(pcb + i);
3162 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3163 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3166 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3167 int16x8_t crw = vshll_n_s8(cr_biased, 7);
3168 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3171 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3172 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3173 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3174 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3175 int16x8_t rws = vaddq_s16(yws, cr0);
3176 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3177 int16x8_t bws = vaddq_s16(yws, cb1);
3181 o.val[0] = vqrshrun_n_s16(rws, 4);
3182 o.val[1] = vqrshrun_n_s16(gws, 4);
3183 o.val[2] = vqrshrun_n_s16(bws, 4);
3184 o.val[3] = vdup_n_u8(255);
3193 for (; i <
count; ++i) {
3194 int y_fixed = (y[i] << 20) + (1<<19);
3196 int cr = pcr[i] - 128;
3197 int cb = pcb[i] - 128;
3198 r = y_fixed + cr* float2fixed(1.40200f);
3199 g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3200 b = y_fixed + cb* float2fixed(1.77200f);
3204 if ((
unsigned) r > 255) {
if (r < 0) r = 0;
else r = 255; }
3205 if ((
unsigned) g > 255) {
if (g < 0) g = 0;
else g = 255; }
3206 if ((
unsigned) b > 255) {
if (b < 0) b = 0;
else b = 255; }
3217static void stbi__setup_jpeg(stbi__jpeg *j)
3219 j->idct_block_kernel = stbi__idct_block;
3220 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3221 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3224 if (stbi__sse2_available()) {
3225 j->idct_block_kernel = stbi__idct_simd;
3226 #ifndef STBI_JPEG_OLD
3227 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3229 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3234 j->idct_block_kernel = stbi__idct_simd;
3235 #ifndef STBI_JPEG_OLD
3236 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3238 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3243static void stbi__cleanup_jpeg(stbi__jpeg *j)
3246 for (i=0; i < j->s->img_n; ++i) {
3247 if (j->img_comp[i].raw_data) {
3248 STBI_FREE(j->img_comp[i].raw_data);
3249 j->img_comp[i].raw_data = NULL;
3250 j->img_comp[i].data = NULL;
3252 if (j->img_comp[i].raw_coeff) {
3253 STBI_FREE(j->img_comp[i].raw_coeff);
3254 j->img_comp[i].raw_coeff = 0;
3255 j->img_comp[i].coeff = 0;
3257 if (j->img_comp[i].linebuf) {
3258 STBI_FREE(j->img_comp[i].linebuf);
3259 j->img_comp[i].linebuf = NULL;
3266 resample_row_func resample;
3274static stbi_uc *load_jpeg_image(stbi__jpeg *z,
int *out_x,
int *out_y,
int *comp,
int req_comp)
3280 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
3283 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z);
return NULL; }
3286 n = req_comp ? req_comp : z->s->img_n;
3288 if (z->s->img_n == 3 && n < 3)
3291 decode_n = z->s->img_n;
3300 stbi__resample res_comp[4];
3302 for (k=0; k < decode_n; ++k) {
3303 stbi__resample *r = &res_comp[k];
3307 z->img_comp[k].linebuf = (
stbi_uc *) stbi__malloc(z->s->img_x + 3);
3308 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3310 r->hs = z->img_h_max / z->img_comp[k].h;
3311 r->vs = z->img_v_max / z->img_comp[k].v;
3312 r->ystep = r->vs >> 1;
3313 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3315 r->line0 = r->line1 = z->img_comp[k].data;
3317 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3318 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3319 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3320 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3321 else r->resample = stbi__resample_row_generic;
3325 output = (
stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
3326 if (!output) { stbi__cleanup_jpeg(z);
return stbi__errpuc(
"outofmem",
"Out of memory"); }
3329 for (j=0; j < z->s->img_y; ++j) {
3330 stbi_uc *out = output + n * z->s->img_x * j;
3331 for (k=0; k < decode_n; ++k) {
3332 stbi__resample *r = &res_comp[k];
3333 int y_bot = r->ystep >= (r->vs >> 1);
3334 coutput[k] = r->resample(z->img_comp[k].linebuf,
3335 y_bot ? r->line1 : r->line0,
3336 y_bot ? r->line0 : r->line1,
3338 if (++r->ystep >= r->vs) {
3340 r->line0 = r->line1;
3341 if (++r->ypos < z->img_comp[k].y)
3342 r->line1 += z->img_comp[k].w2;
3347 if (z->s->img_n == 3) {
3348 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3350 for (i=0; i < z->s->img_x; ++i) {
3351 out[0] = out[1] = out[2] = y[i];
3358 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3360 for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3363 stbi__cleanup_jpeg(z);
3364 *out_x = z->s->img_x;
3365 *out_y = z->s->img_y;
3366 if (comp) *comp = z->s->img_n;
3371static unsigned char *stbi__jpeg_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
3375 stbi__setup_jpeg(&j);
3376 return load_jpeg_image(&j, x,y,comp,req_comp);
3379static int stbi__jpeg_test(stbi__context *s)
3384 stbi__setup_jpeg(&j);
3385 r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
3390static int stbi__jpeg_info_raw(stbi__jpeg *j,
int *x,
int *y,
int *comp)
3392 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3393 stbi__rewind( j->s );
3396 if (x) *x = j->s->img_x;
3397 if (y) *y = j->s->img_y;
3398 if (comp) *comp = j->s->img_n;
3402static int stbi__jpeg_info(stbi__context *s,
int *x,
int *y,
int *comp)
3406 return stbi__jpeg_info_raw(&j, x, y, comp);
3420#define STBI__ZFAST_BITS 9
3421#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
3427 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3428 stbi__uint16 firstcode[16];
3430 stbi__uint16 firstsymbol[16];
3432 stbi__uint16 value[288];
3435stbi_inline
static int stbi__bitreverse16(
int n)
3437 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3438 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3439 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3440 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3444stbi_inline
static int stbi__bit_reverse(
int v,
int bits)
3446 STBI_ASSERT(bits <= 16);
3449 return stbi__bitreverse16(v) >> (16-bits);
3452static int stbi__zbuild_huffman(stbi__zhuffman *z,
stbi_uc *sizelist,
int num)
3455 int code, next_code[16], sizes[17];
3458 memset(sizes, 0,
sizeof(sizes));
3459 memset(z->fast, 0,
sizeof(z->fast));
3460 for (i=0; i <
num; ++i)
3461 ++sizes[sizelist[i]];
3463 for (i=1; i < 16; ++i)
3464 if (sizes[i] > (1 << i))
3465 return stbi__err(
"bad sizes",
"Corrupt PNG");
3467 for (i=1; i < 16; ++i) {
3468 next_code[i] =
code;
3469 z->firstcode[i] = (stbi__uint16)
code;
3470 z->firstsymbol[i] = (stbi__uint16) k;
3473 if (
code-1 >= (1 << i))
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3474 z->maxcode[i] =
code << (16-i);
3478 z->maxcode[16] = 0x10000;
3479 for (i=0; i <
num; ++i) {
3480 int s = sizelist[i];
3482 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3483 stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
3485 z->value[c] = (stbi__uint16) i;
3486 if (s <= STBI__ZFAST_BITS) {
3487 int j = stbi__bit_reverse(next_code[s],s);
3488 while (j < (1 << STBI__ZFAST_BITS)) {
3507 stbi_uc *zbuffer, *zbuffer_end;
3509 stbi__uint32 code_buffer;
3516 stbi__zhuffman z_length, z_distance;
3519stbi_inline
static stbi_uc stbi__zget8(stbi__zbuf *z)
3521 if (z->zbuffer >= z->zbuffer_end)
return 0;
3522 return *z->zbuffer++;
3525static void stbi__fill_bits(stbi__zbuf *z)
3528 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3529 z->code_buffer |= (
unsigned int) stbi__zget8(z) << z->num_bits;
3531 }
while (z->num_bits <= 24);
3534stbi_inline
static unsigned int stbi__zreceive(stbi__zbuf *z,
int n)
3537 if (z->num_bits < n) stbi__fill_bits(z);
3538 k = z->code_buffer & ((1 << n) - 1);
3539 z->code_buffer >>= n;
3544static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
3549 k = stbi__bit_reverse(a->code_buffer, 16);
3550 for (s=STBI__ZFAST_BITS+1; ; ++s)
3551 if (k < z->maxcode[s])
3553 if (s == 16)
return -1;
3555 b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
3556 STBI_ASSERT(z->size[b] == s);
3557 a->code_buffer >>= s;
3562stbi_inline
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3565 if (a->num_bits < 16) stbi__fill_bits(a);
3566 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3569 a->code_buffer >>= s;
3573 return stbi__zhuffman_decode_slowpath(a, z);
3576static int stbi__zexpand(stbi__zbuf *z,
char *zout,
int n)
3581 if (!z->z_expandable)
return stbi__err(
"output buffer limit",
"Corrupt PNG");
3582 cur = (int) (z->zout - z->zout_start);
3583 limit = (int) (z->zout_end - z->zout_start);
3584 while (cur + n > limit)
3586 q = (
char *) STBI_REALLOC(z->zout_start, limit);
3587 if (q == NULL)
return stbi__err(
"outofmem",
"Out of memory");
3590 z->zout_end = q + limit;
3594static int stbi__zlength_base[31] = {
3595 3,4,5,6,7,8,9,10,11,13,
3596 15,17,19,23,27,31,35,43,51,59,
3597 67,83,99,115,131,163,195,227,258,0,0 };
3599static int stbi__zlength_extra[31]=
3600{ 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 };
3602static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3603257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
3605static int stbi__zdist_extra[32] =
3606{ 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};
3608static int stbi__parse_huffman_block(stbi__zbuf *a)
3610 char *zout = a->zout;
3612 int z = stbi__zhuffman_decode(a, &a->z_length);
3614 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3615 if (zout >= a->zout_end) {
3616 if (!stbi__zexpand(a, zout, 1))
return 0;
3628 len = stbi__zlength_base[z];
3629 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
3630 z = stbi__zhuffman_decode(a, &a->z_distance);
3631 if (z < 0)
return stbi__err(
"bad huffman code",
"Corrupt PNG");
3632 dist = stbi__zdist_base[z];
3633 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
3634 if (zout - a->zout_start < dist)
return stbi__err(
"bad dist",
"Corrupt PNG");
3635 if (zout + len > a->zout_end) {
3636 if (!stbi__zexpand(a, zout, len))
return 0;
3639 p = (
stbi_uc *) (zout - dist);
3642 if (len) {
do *zout++ = v;
while (--len); }
3644 if (len) {
do *zout++ = *p++;
while (--len); }
3650static int stbi__compute_huffman_codes(stbi__zbuf *a)
3652 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 };
3653 stbi__zhuffman z_codelength;
3658 int hlit = stbi__zreceive(a,5) + 257;
3659 int hdist = stbi__zreceive(a,5) + 1;
3660 int hclen = stbi__zreceive(a,4) + 4;
3662 memset(codelength_sizes, 0,
sizeof(codelength_sizes));
3663 for (i=0; i < hclen; ++i) {
3664 int s = stbi__zreceive(a,3);
3665 codelength_sizes[length_dezigzag[i]] = (
stbi_uc) s;
3667 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19))
return 0;
3670 while (n < hlit + hdist) {
3671 int c = stbi__zhuffman_decode(a, &z_codelength);
3672 if (c < 0 || c >= 19)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3676 c = stbi__zreceive(a,2)+3;
3677 memset(lencodes+n, lencodes[n-1], c);
3679 }
else if (c == 17) {
3680 c = stbi__zreceive(a,3)+3;
3681 memset(lencodes+n, 0, c);
3684 STBI_ASSERT(c == 18);
3685 c = stbi__zreceive(a,7)+11;
3686 memset(lencodes+n, 0, c);
3690 if (n != hlit+hdist)
return stbi__err(
"bad codelengths",
"Corrupt PNG");
3691 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit))
return 0;
3692 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist))
return 0;
3696static int stbi__parse_uncomperssed_block(stbi__zbuf *a)
3700 if (a->num_bits & 7)
3701 stbi__zreceive(a, a->num_bits & 7);
3704 while (a->num_bits > 0) {
3706 a->code_buffer >>= 8;
3709 STBI_ASSERT(a->num_bits == 0);
3712 header[k++] = stbi__zget8(a);
3715 if (nlen != (len ^ 0xffff))
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
3716 if (a->zbuffer + len > a->zbuffer_end)
return stbi__err(
"read past buffer",
"Corrupt PNG");
3717 if (a->zout + len > a->zout_end)
3718 if (!stbi__zexpand(a, a->zout, len))
return 0;
3719 memcpy(a->zout, a->zbuffer, len);
3725static int stbi__parse_zlib_header(stbi__zbuf *a)
3727 int cmf = stbi__zget8(a);
3730 int flg = stbi__zget8(a);
3731 if ((cmf*256+flg) % 31 != 0)
return stbi__err(
"bad zlib header",
"Corrupt PNG");
3732 if (flg & 32)
return stbi__err(
"no preset dict",
"Corrupt PNG");
3733 if (cm != 8)
return stbi__err(
"bad compression",
"Corrupt PNG");
3739static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
3740static void stbi__init_zdefaults(
void)
3743 for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
3744 for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
3745 for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
3746 for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
3748 for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
3751static int stbi__parse_zlib(stbi__zbuf *a,
int parse_header)
3755 if (!stbi__parse_zlib_header(a))
return 0;
3759 final = stbi__zreceive(a,1);
3760 type = stbi__zreceive(a,2);
3762 if (!stbi__parse_uncomperssed_block(a))
return 0;
3763 }
else if (type == 3) {
3768 if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
3769 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288))
return 0;
3770 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32))
return 0;
3772 if (!stbi__compute_huffman_codes(a))
return 0;
3774 if (!stbi__parse_huffman_block(a))
return 0;
3780static int stbi__do_zlib(stbi__zbuf *a,
char *obuf,
int olen,
int exp,
int parse_header)
3782 a->zout_start = obuf;
3784 a->zout_end = obuf + olen;
3785 a->z_expandable =
exp;
3787 return stbi__parse_zlib(a, parse_header);
3793 char *p = (
char *) stbi__malloc(initial_size);
3794 if (p == NULL)
return NULL;
3795 a.zbuffer = (
stbi_uc *) buffer;
3796 a.zbuffer_end = (
stbi_uc *) buffer + len;
3797 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
3798 if (outlen) *outlen = (int) (a.zout - a.zout_start);
3799 return a.zout_start;
3801 STBI_FREE(a.zout_start);
3814 char *p = (
char *) stbi__malloc(initial_size);
3815 if (p == NULL)
return NULL;
3816 a.zbuffer = (
stbi_uc *) buffer;
3817 a.zbuffer_end = (
stbi_uc *) buffer + len;
3818 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
3819 if (outlen) *outlen = (int) (a.zout - a.zout_start);
3820 return a.zout_start;
3822 STBI_FREE(a.zout_start);
3830 a.zbuffer = (
stbi_uc *) ibuffer;
3831 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3832 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
3833 return (
int) (a.zout - a.zout_start);
3841 char *p = (
char *) stbi__malloc(16384);
3842 if (p == NULL)
return NULL;
3843 a.zbuffer = (
stbi_uc *) buffer;
3844 a.zbuffer_end = (
stbi_uc *) buffer+len;
3845 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
3846 if (outlen) *outlen = (int) (a.zout - a.zout_start);
3847 return a.zout_start;
3849 STBI_FREE(a.zout_start);
3857 a.zbuffer = (
stbi_uc *) ibuffer;
3858 a.zbuffer_end = (
stbi_uc *) ibuffer + ilen;
3859 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
3860 return (
int) (a.zout - a.zout_start);
3879 stbi__uint32 length;
3883static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
3886 c.length = stbi__get32be(s);
3887 c.type = stbi__get32be(s);
3891static int stbi__check_png_header(stbi__context *s)
3893 static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
3895 for (i=0; i < 8; ++i)
3896 if (stbi__get8(s) != png_sig[i])
return stbi__err(
"bad png sig",
"Not a PNG");
3903 stbi_uc *idata, *expanded, *out;
3918static stbi_uc first_row_filter[5] =
3927static int stbi__paeth(
int a,
int b,
int c)
3933 if (pa <= pb && pa <= pc)
return a;
3934 if (pb <= pc)
return b;
3938static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
3941static 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)
3943 stbi__context *s = a->s;
3944 stbi__uint32 i,j,stride = x*out_n;
3945 stbi__uint32 img_len, img_width_bytes;
3947 int img_n = s->img_n;
3949 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
3950 a->out = (
stbi_uc *) stbi__malloc(x * y * out_n);
3951 if (!a->out)
return stbi__err(
"outofmem",
"Out of memory");
3953 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
3954 img_len = (img_width_bytes + 1) * y;
3955 if (s->img_x == x && s->img_y == y) {
3956 if (raw_len != img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
3958 if (raw_len < img_len)
return stbi__err(
"not enough pixels",
"Corrupt PNG");
3961 for (j=0; j < y; ++j) {
3962 stbi_uc *cur = a->out + stride*j;
3963 stbi_uc *prior = cur - stride;
3965 int filter_bytes = img_n;
3968 return stbi__err(
"invalid filter",
"Corrupt PNG");
3971 STBI_ASSERT(img_width_bytes <= x);
3972 cur += x*out_n - img_width_bytes;
3974 width = img_width_bytes;
3981 for (k=0; k < filter_bytes; ++k) {
3983 case STBI__F_none : cur[k] = raw[k];
break;
3984 case STBI__F_sub : cur[k] = raw[k];
break;
3985 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
3986 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
break;
3987 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0));
break;
3988 case STBI__F_avg_first : cur[k] = raw[k];
break;
3989 case STBI__F_paeth_first: cur[k] = raw[k];
break;
4006 if (depth < 8 || img_n == out_n) {
4007 int nk = (width - 1)*img_n;
4010 for (k=0; k < nk; ++k)
4013 case STBI__F_none: memcpy(cur, raw, nk);
break;
4014 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]);
break;
4015 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4016 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1));
break;
4017 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes]));
break;
4018 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1));
break;
4019 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0));
break;
4024 STBI_ASSERT(img_n+1 == out_n);
4027 for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
4028 for (k=0; k < img_n; ++k)
4030 CASE(STBI__F_none) cur[k] = raw[k];
break;
4031 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]);
break;
4032 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
break;
4033 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1));
break;
4034 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n]));
break;
4035 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1));
break;
4036 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0));
break;
4046 for (j=0; j < y; ++j) {
4047 stbi_uc *cur = a->out + stride*j;
4048 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
4051 stbi_uc scale = (
color == 0) ? stbi__depth_scale_table[depth] : 1;
4060 for (k=x*img_n; k >= 2; k-=2, ++in) {
4061 *cur++ = scale * ((*in >> 4) );
4062 *cur++ = scale * ((*in ) & 0x0f);
4064 if (k > 0) *cur++ = scale * ((*in >> 4) );
4065 }
else if (depth == 2) {
4066 for (k=x*img_n; k >= 4; k-=4, ++in) {
4067 *cur++ = scale * ((*in >> 6) );
4068 *cur++ = scale * ((*in >> 4) & 0x03);
4069 *cur++ = scale * ((*in >> 2) & 0x03);
4070 *cur++ = scale * ((*in ) & 0x03);
4072 if (k > 0) *cur++ = scale * ((*in >> 6) );
4073 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4074 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4075 }
else if (depth == 1) {
4076 for (k=x*img_n; k >= 8; k-=8, ++in) {
4077 *cur++ = scale * ((*in >> 7) );
4078 *cur++ = scale * ((*in >> 6) & 0x01);
4079 *cur++ = scale * ((*in >> 5) & 0x01);
4080 *cur++ = scale * ((*in >> 4) & 0x01);
4081 *cur++ = scale * ((*in >> 3) & 0x01);
4082 *cur++ = scale * ((*in >> 2) & 0x01);
4083 *cur++ = scale * ((*in >> 1) & 0x01);
4084 *cur++ = scale * ((*in ) & 0x01);
4086 if (k > 0) *cur++ = scale * ((*in >> 7) );
4087 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4088 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4089 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4090 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4091 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4092 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4094 if (img_n != out_n) {
4097 cur = a->out + stride*j;
4099 for (q=x-1; q >= 0; --q) {
4101 cur[q*2+0] = cur[q];
4104 STBI_ASSERT(img_n == 3);
4105 for (q=x-1; q >= 0; --q) {
4107 cur[q*4+2] = cur[q*3+2];
4108 cur[q*4+1] = cur[q*3+1];
4109 cur[q*4+0] = cur[q*3+0];
4119static 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)
4124 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth,
color);
4127 final = (
stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
4128 for (p=0; p < 7; ++p) {
4129 int xorig[] = { 0,4,0,2,0,1,0 };
4130 int yorig[] = { 0,0,4,0,2,0,1 };
4131 int xspc[] = { 8,8,4,4,2,2,1 };
4132 int yspc[] = { 8,8,8,4,4,2,2 };
4135 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4136 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4138 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4139 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth,
color)) {
4143 for (j=0; j < y; ++j) {
4144 for (i=0; i < x; ++i) {
4145 int out_y = j*yspc[p]+yorig[p];
4146 int out_x = i*xspc[p]+xorig[p];
4147 memcpy(
final + out_y*a->s->img_x*out_n + out_x*out_n,
4148 a->out + (j*x+i)*out_n, out_n);
4152 image_data += img_len;
4153 image_data_len -= img_len;
4161static int stbi__compute_transparency(stbi__png *z,
stbi_uc tc[3],
int out_n)
4163 stbi__context *s = z->s;
4164 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4169 STBI_ASSERT(out_n == 2 || out_n == 4);
4172 for (i=0; i < pixel_count; ++i) {
4173 p[1] = (p[0] == tc[0] ? 0 : 255);
4177 for (i=0; i < pixel_count; ++i) {
4178 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4186static int stbi__expand_png_palette(stbi__png *a,
stbi_uc *palette,
int len,
int pal_img_n)
4188 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4189 stbi_uc *p, *temp_out, *orig = a->out;
4191 p = (
stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
4192 if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4197 if (pal_img_n == 3) {
4198 for (i=0; i < pixel_count; ++i) {
4201 p[1] = palette[n+1];
4202 p[2] = palette[n+2];
4206 for (i=0; i < pixel_count; ++i) {
4209 p[1] = palette[n+1];
4210 p[2] = palette[n+2];
4211 p[3] = palette[n+3];
4223static int stbi__unpremultiply_on_load = 0;
4224static int stbi__de_iphone_flag = 0;
4228 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4233 stbi__de_iphone_flag = flag_true_if_should_convert;
4236static void stbi__de_iphone(stbi__png *z)
4238 stbi__context *s = z->s;
4239 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4242 if (s->img_out_n == 3) {
4243 for (i=0; i < pixel_count; ++i) {
4250 STBI_ASSERT(s->img_out_n == 4);
4251 if (stbi__unpremultiply_on_load) {
4253 for (i=0; i < pixel_count; ++i) {
4257 p[0] = p[2] * 255 / a;
4258 p[1] = p[1] * 255 / a;
4268 for (i=0; i < pixel_count; ++i) {
4278#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
4280static int stbi__parse_png_file(stbi__png *z,
int scan,
int req_comp)
4282 stbi_uc palette[1024], pal_img_n=0;
4284 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4285 int first=1,k,interlace=0,
color=0, depth=0, is_iphone=0;
4286 stbi__context *s = z->s;
4292 if (!stbi__check_png_header(s))
return 0;
4294 if (scan == STBI__SCAN_type)
return 1;
4297 stbi__pngchunk c = stbi__get_chunk_header(s);
4299 case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
4301 stbi__skip(s, c.length);
4303 case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
4305 if (!first)
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
4307 if (c.length != 13)
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
4308 s->img_x = stbi__get32be(s);
if (s->img_x > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4309 s->img_y = stbi__get32be(s);
if (s->img_y > (1 << 24))
return stbi__err(
"too large",
"Very large image (corrupt?)");
4310 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");
4311 color = stbi__get8(s);
if (
color > 6)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4312 if (
color == 3) pal_img_n = 3;
else if (
color & 1)
return stbi__err(
"bad ctype",
"Corrupt PNG");
4313 comp = stbi__get8(s);
if (comp)
return stbi__err(
"bad comp method",
"Corrupt PNG");
4314 filter= stbi__get8(s);
if (filter)
return stbi__err(
"bad filter method",
"Corrupt PNG");
4315 interlace = stbi__get8(s);
if (interlace>1)
return stbi__err(
"bad interlace method",
"Corrupt PNG");
4316 if (!s->img_x || !s->img_y)
return stbi__err(
"0-pixel image",
"Corrupt PNG");
4318 s->img_n = (
color & 2 ? 3 : 1) + (
color & 4 ? 1 : 0);
4319 if ((1 << 30) / s->img_x / s->img_n < s->img_y)
return stbi__err(
"too large",
"Image too large to decode");
4320 if (scan == STBI__SCAN_header)
return 1;
4325 if ((1 << 30) / s->img_x / 4 < s->img_y)
return stbi__err(
"too large",
"Corrupt PNG");
4331 case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'): {
4332 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4333 if (c.length > 256*3)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4334 pal_len = c.length / 3;
4335 if (pal_len * 3 != c.length)
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
4336 for (i=0; i < pal_len; ++i) {
4337 palette[i*4+0] = stbi__get8(s);
4338 palette[i*4+1] = stbi__get8(s);
4339 palette[i*4+2] = stbi__get8(s);
4340 palette[i*4+3] = 255;
4345 case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
4346 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4347 if (z->idata)
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
4349 if (scan == STBI__SCAN_header) { s->img_n = 4;
return 1; }
4350 if (pal_len == 0)
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
4351 if (c.length > pal_len)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4353 for (i=0; i < c.length; ++i)
4354 palette[i*4+3] = stbi__get8(s);
4356 if (!(s->img_n & 1))
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
4357 if (c.length != (stbi__uint32) s->img_n*2)
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
4359 for (k=0; k < s->img_n; ++k)
4360 tc[k] = (
stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth];
4365 case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
4366 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4367 if (pal_img_n && !pal_len)
return stbi__err(
"no PLTE",
"Corrupt PNG");
4368 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n;
return 1; }
4369 if ((
int)(ioff + c.length) < (
int)ioff)
return 0;
4370 if (ioff + c.length > idata_limit) {
4372 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4373 while (ioff + c.length > idata_limit)
4375 p = (
stbi_uc *) STBI_REALLOC(z->idata, idata_limit);
if (p == NULL)
return stbi__err(
"outofmem",
"Out of memory");
4378 if (!stbi__getn(s, z->idata+ioff,c.length))
return stbi__err(
"outofdata",
"Corrupt PNG");
4383 case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
4384 stbi__uint32 raw_len, bpl;
4385 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4386 if (scan != STBI__SCAN_load)
return 1;
4387 if (z->idata == NULL)
return stbi__err(
"no IDAT",
"Corrupt PNG");
4389 bpl = (s->img_x * depth + 7) / 8;
4390 raw_len = bpl * s->img_y * s->img_n + s->img_y ;
4392 if (z->expanded == NULL)
return 0;
4393 STBI_FREE(z->idata); z->idata = NULL;
4394 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
4395 s->img_out_n = s->img_n+1;
4397 s->img_out_n = s->img_n;
4398 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth,
color, interlace))
return 0;
4400 if (!stbi__compute_transparency(z, tc, s->img_out_n))
return 0;
4401 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4405 s->img_n = pal_img_n;
4406 s->img_out_n = pal_img_n;
4407 if (req_comp >= 3) s->img_out_n = req_comp;
4408 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4411 STBI_FREE(z->expanded); z->expanded = NULL;
4417 if (first)
return stbi__err(
"first not IHDR",
"Corrupt PNG");
4418 if ((c.type & (1 << 29)) == 0) {
4419 #ifndef STBI_NO_FAILURE_STRINGS
4421 static char invalid_chunk[] =
"XXXX PNG chunk not known";
4422 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4423 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4424 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4425 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4427 return stbi__err(invalid_chunk,
"PNG not supported: unknown PNG chunk type");
4429 stbi__skip(s, c.length);
4437static unsigned char *stbi__do_png(stbi__png *p,
int *x,
int *y,
int *n,
int req_comp)
4439 unsigned char *result=NULL;
4440 if (req_comp < 0 || req_comp > 4)
return stbi__errpuc(
"bad req_comp",
"Internal error");
4441 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4444 if (req_comp && req_comp != p->s->img_out_n) {
4445 result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4446 p->s->img_out_n = req_comp;
4447 if (result == NULL)
return result;
4451 if (n) *n = p->s->img_out_n;
4453 STBI_FREE(p->out); p->out = NULL;
4454 STBI_FREE(p->expanded); p->expanded = NULL;
4455 STBI_FREE(p->idata); p->idata = NULL;
4460static unsigned char *stbi__png_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4464 return stbi__do_png(&p, x,y,comp,req_comp);
4467static int stbi__png_test(stbi__context *s)
4470 r = stbi__check_png_header(s);
4475static int stbi__png_info_raw(stbi__png *p,
int *x,
int *y,
int *comp)
4477 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
4478 stbi__rewind( p->s );
4481 if (x) *x = p->s->img_x;
4482 if (y) *y = p->s->img_y;
4483 if (comp) *comp = p->s->img_n;
4487static int stbi__png_info(stbi__context *s,
int *x,
int *y,
int *comp)
4491 return stbi__png_info_raw(&p, x, y, comp);
4498static int stbi__bmp_test_raw(stbi__context *s)
4502 if (stbi__get8(s) !=
'B')
return 0;
4503 if (stbi__get8(s) !=
'M')
return 0;
4508 sz = stbi__get32le(s);
4509 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4513static int stbi__bmp_test(stbi__context *s)
4515 int r = stbi__bmp_test_raw(s);
4522static int stbi__high_bit(
unsigned int z)
4525 if (z == 0)
return -1;
4526 if (z >= 0x10000) n += 16, z >>= 16;
4527 if (z >= 0x00100) n += 8, z >>= 8;
4528 if (z >= 0x00010) n += 4, z >>= 4;
4529 if (z >= 0x00004) n += 2, z >>= 2;
4530 if (z >= 0x00002) n += 1, z >>= 1;
4534static int stbi__bitcount(
unsigned int a)
4536 a = (a & 0x55555555) + ((a >> 1) & 0x55555555);
4537 a = (a & 0x33333333) + ((a >> 2) & 0x33333333);
4538 a = (a + (a >> 4)) & 0x0f0f0f0f;
4540 a = (a + (a >> 16));
4544static int stbi__shiftsigned(
int v,
int shift,
int bits)
4549 if (shift < 0) v <<= -shift;
4561static stbi_uc *stbi__bmp_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4564 unsigned int mr=0,mg=0,mb=0,ma=0, all_a=255;
4567 int bpp, flip_vertically, pad, target, offset, hsz;
4568 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M')
return stbi__errpuc(
"not BMP",
"Corrupt BMP");
4572 offset = stbi__get32le(s);
4573 hsz = stbi__get32le(s);
4574 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124)
return stbi__errpuc(
"unknown BMP",
"BMP type not supported: unknown");
4576 s->img_x = stbi__get16le(s);
4577 s->img_y = stbi__get16le(s);
4579 s->img_x = stbi__get32le(s);
4580 s->img_y = stbi__get32le(s);
4582 if (stbi__get16le(s) != 1)
return stbi__errpuc(
"bad BMP",
"bad BMP");
4583 bpp = stbi__get16le(s);
4584 if (bpp == 1)
return stbi__errpuc(
"monochrome",
"BMP type not supported: 1-bit");
4585 flip_vertically = ((int) s->img_y) > 0;
4586 s->img_y = abs((
int) s->img_y);
4589 psize = (offset - 14 - 24) / 3;
4592 if (
compress == 1 ||
compress == 2)
return stbi__errpuc(
"BMP RLE",
"BMP type not supported: RLE");
4598 if (hsz == 40 || hsz == 56) {
4605 if (bpp == 16 || bpp == 32) {
4620 mr = stbi__get32le(s);
4621 mg = stbi__get32le(s);
4622 mb = stbi__get32le(s);
4624 if (mr == mg && mg == mb) {
4626 return stbi__errpuc(
"bad BMP",
"bad BMP");
4629 return stbi__errpuc(
"bad BMP",
"bad BMP");
4632 STBI_ASSERT(hsz == 108 || hsz == 124);
4633 mr = stbi__get32le(s);
4634 mg = stbi__get32le(s);
4635 mb = stbi__get32le(s);
4636 ma = stbi__get32le(s);
4638 for (i=0; i < 12; ++i)
4648 psize = (offset - 14 - hsz) >> 2;
4650 s->img_n = ma ? 4 : 3;
4651 if (req_comp && req_comp >= 3)
4655 out = (
stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);
4656 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
4659 if (psize == 0 || psize > 256) { STBI_FREE(out);
return stbi__errpuc(
"invalid",
"Corrupt BMP"); }
4660 for (i=0; i < psize; ++i) {
4661 pal[i][2] = stbi__get8(s);
4662 pal[i][1] = stbi__get8(s);
4663 pal[i][0] = stbi__get8(s);
4664 if (hsz != 12) stbi__get8(s);
4667 stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
4668 if (bpp == 4) width = (s->img_x + 1) >> 1;
4669 else if (bpp == 8) width = s->img_x;
4670 else { STBI_FREE(out);
return stbi__errpuc(
"bad bpp",
"Corrupt BMP"); }
4672 for (j=0; j < (int) s->img_y; ++j) {
4673 for (i=0; i < (int) s->img_x; i += 2) {
4674 int v=stbi__get8(s),v2=0;
4679 out[z++] = pal[v][0];
4680 out[z++] = pal[v][1];
4681 out[z++] = pal[v][2];
4682 if (target == 4) out[z++] = 255;
4683 if (i+1 == (
int) s->img_x)
break;
4684 v = (bpp == 8) ? stbi__get8(s) : v2;
4685 out[z++] = pal[v][0];
4686 out[z++] = pal[v][1];
4687 out[z++] = pal[v][2];
4688 if (target == 4) out[z++] = 255;
4693 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
4696 stbi__skip(s, offset - 14 - hsz);
4697 if (bpp == 24) width = 3 * s->img_x;
4698 else if (bpp == 16) width = 2*s->img_x;
4703 }
else if (bpp == 32) {
4704 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
4708 if (!mr || !mg || !mb) { STBI_FREE(out);
return stbi__errpuc(
"bad masks",
"Corrupt BMP"); }
4710 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
4711 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
4712 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
4713 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
4715 for (j=0; j < (int) s->img_y; ++j) {
4717 for (i=0; i < (int) s->img_x; ++i) {
4719 out[z+2] = stbi__get8(s);
4720 out[z+1] = stbi__get8(s);
4721 out[z+0] = stbi__get8(s);
4723 a = (easy == 2 ? stbi__get8(s) : 255);
4725 if (target == 4) out[z++] = a;
4728 for (i=0; i < (int) s->img_x; ++i) {
4729 stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
4731 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
4732 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
4733 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
4734 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
4736 if (target == 4) out[z++] = STBI__BYTECAST(a);
4744 if (target == 4 && all_a == 0)
4745 for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
4748 if (flip_vertically) {
4750 for (j=0; j < (int) s->img_y>>1; ++j) {
4751 stbi_uc *p1 = out + j *s->img_x*target;
4752 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
4753 for (i=0; i < (int) s->img_x*target; ++i) {
4754 t = p1[i], p1[i] = p2[i], p2[i] = t;
4759 if (req_comp && req_comp != target) {
4760 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
4761 if (out == NULL)
return out;
4766 if (comp) *comp = s->img_n;
4774static int stbi__tga_info(stbi__context *s,
int *x,
int *y,
int *comp)
4776 int tga_w, tga_h, tga_comp;
4786 if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11))
return 0;
4788 tga_w = stbi__get16le(s);
4793 tga_h = stbi__get16le(s);
4800 if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
4807 if (comp) *comp = tga_comp / 8;
4811static int stbi__tga_test(stbi__context *s)
4817 if ( sz > 1 )
return 0;
4819 if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) )
return 0;
4825 if ( stbi__get16be(s) < 1 )
return 0;
4826 if ( stbi__get16be(s) < 1 )
return 0;
4828 if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )
4836static stbi_uc *stbi__tga_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
4839 int tga_offset = stbi__get8(s);
4840 int tga_indexed = stbi__get8(s);
4841 int tga_image_type = stbi__get8(s);
4843 int tga_palette_start = stbi__get16le(s);
4844 int tga_palette_len = stbi__get16le(s);
4845 int tga_palette_bits = stbi__get8(s);
4846 int tga_x_origin = stbi__get16le(s);
4847 int tga_y_origin = stbi__get16le(s);
4848 int tga_width = stbi__get16le(s);
4849 int tga_height = stbi__get16le(s);
4850 int tga_bits_per_pixel = stbi__get8(s);
4851 int tga_comp = tga_bits_per_pixel / 8;
4852 int tga_inverted = stbi__get8(s);
4854 unsigned char *tga_data;
4855 unsigned char *tga_palette = NULL;
4857 unsigned char raw_data[4];
4859 int RLE_repeating = 0;
4860 int read_next_pixel = 1;
4863 if ( tga_image_type >= 8 )
4865 tga_image_type -= 8;
4869 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
4873 (tga_width < 1) || (tga_height < 1) ||
4874 (tga_image_type < 1) || (tga_image_type > 3) ||
4875 ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
4876 (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
4885 tga_comp = tga_palette_bits / 8;
4891 if (comp) *comp = tga_comp;
4893 tga_data = (
unsigned char*)stbi__malloc( (
size_t)tga_width * tga_height * tga_comp );
4894 if (!tga_data)
return stbi__errpuc(
"outofmem",
"Out of memory");
4897 stbi__skip(s, tga_offset );
4899 if ( !tga_indexed && !tga_is_RLE) {
4900 for (i=0; i < tga_height; ++i) {
4901 int row = tga_inverted ? tga_height -i - 1 : i;
4902 stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
4903 stbi__getn(s, tga_row, tga_width * tga_comp);
4910 stbi__skip(s, tga_palette_start );
4912 tga_palette = (
unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );
4914 STBI_FREE(tga_data);
4915 return stbi__errpuc(
"outofmem",
"Out of memory");
4917 if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
4918 STBI_FREE(tga_data);
4919 STBI_FREE(tga_palette);
4920 return stbi__errpuc(
"bad palette",
"Corrupt TGA");
4924 for (i=0; i < tga_width * tga_height; ++i)
4929 if ( RLE_count == 0 )
4932 int RLE_cmd = stbi__get8(s);
4933 RLE_count = 1 + (RLE_cmd & 127);
4934 RLE_repeating = RLE_cmd >> 7;
4935 read_next_pixel = 1;
4936 }
else if ( !RLE_repeating )
4938 read_next_pixel = 1;
4942 read_next_pixel = 1;
4945 if ( read_next_pixel )
4951 int pal_idx = stbi__get8(s);
4952 if ( pal_idx >= tga_palette_len )
4957 pal_idx *= tga_bits_per_pixel / 8;
4958 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
4960 raw_data[j] = tga_palette[pal_idx+j];
4965 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
4967 raw_data[j] = stbi__get8(s);
4971 read_next_pixel = 0;
4975 for (j = 0; j < tga_comp; ++j)
4976 tga_data[i*tga_comp+j] = raw_data[j];
4984 for (j = 0; j*2 < tga_height; ++j)
4986 int index1 = j * tga_width * tga_comp;
4987 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
4988 for (i = tga_width * tga_comp; i > 0; --i)
4990 unsigned char temp = tga_data[index1];
4991 tga_data[index1] = tga_data[index2];
4992 tga_data[index2] = temp;
4999 if ( tga_palette != NULL )
5001 STBI_FREE( tga_palette );
5008 unsigned char* tga_pixel = tga_data;
5009 for (i=0; i < tga_width * tga_height; ++i)
5011 unsigned char temp = tga_pixel[0];
5012 tga_pixel[0] = tga_pixel[2];
5013 tga_pixel[2] = temp;
5014 tga_pixel += tga_comp;
5019 if (req_comp && req_comp != tga_comp)
5020 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5024 tga_palette_start = tga_palette_len = tga_palette_bits =
5025 tga_x_origin = tga_y_origin = 0;
5035static int stbi__psd_test(stbi__context *s)
5037 int r = (stbi__get32be(s) == 0x38425053);
5042static stbi_uc *stbi__psd_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5045 int channelCount, compression;
5046 int channel, i,
count, len;
5052 if (stbi__get32be(s) != 0x38425053)
5053 return stbi__errpuc(
"not PSD",
"Corrupt PSD image");
5056 if (stbi__get16be(s) != 1)
5057 return stbi__errpuc(
"wrong version",
"Unsupported version of PSD image");
5063 channelCount = stbi__get16be(s);
5064 if (channelCount < 0 || channelCount > 16)
5065 return stbi__errpuc(
"wrong channel count",
"Unsupported number of channels in PSD image");
5068 h = stbi__get32be(s);
5069 w = stbi__get32be(s);
5072 bitdepth = stbi__get16be(s);
5073 if (bitdepth != 8 && bitdepth != 16)
5074 return stbi__errpuc(
"unsupported bit depth",
"PSD bit depth is not 8 or 16 bit");
5086 if (stbi__get16be(s) != 3)
5087 return stbi__errpuc(
"wrong color format",
"PSD is not in RGB color format");
5090 stbi__skip(s,stbi__get32be(s) );
5093 stbi__skip(s, stbi__get32be(s) );
5096 stbi__skip(s, stbi__get32be(s) );
5102 compression = stbi__get16be(s);
5103 if (compression > 1)
5104 return stbi__errpuc(
"bad compression",
"PSD has an unknown compression format");
5107 out = (
stbi_uc *) stbi__malloc(4 * w*h);
5108 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
5126 stbi__skip(s, h * channelCount * 2 );
5129 for (channel = 0; channel < 4; channel++) {
5133 if (channel >= channelCount) {
5135 for (i = 0; i < pixelCount; i++, p += 4)
5136 *p = (channel == 3 ? 255 : 0);
5140 while (count < pixelCount) {
5141 len = stbi__get8(s);
5144 }
else if (len < 128) {
5153 }
else if (len > 128) {
5159 val = stbi__get8(s);
5176 for (channel = 0; channel < 4; channel++) {
5180 if (channel >= channelCount) {
5182 stbi_uc val = channel == 3 ? 255 : 0;
5183 for (i = 0; i < pixelCount; i++, p += 4)
5187 if (bitdepth == 16) {
5188 for (i = 0; i < pixelCount; i++, p += 4)
5189 *p = (
stbi_uc) (stbi__get16be(s) >> 8);
5191 for (i = 0; i < pixelCount; i++, p += 4)
5198 if (req_comp && req_comp != 4) {
5199 out = stbi__convert_format(out, 4, req_comp, w, h);
5200 if (out == NULL)
return out;
5203 if (comp) *comp = 4;
5219static int stbi__pic_is4(stbi__context *s,
const char *
str)
5229static int stbi__pic_test_core(stbi__context *s)
5233 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
5239 if (!stbi__pic_is4(s,
"PICT"))
5250static stbi_uc *stbi__readval(stbi__context *s,
int channel,
stbi_uc *dest)
5254 for (i=0; i<4; ++i, mask>>=1) {
5255 if (channel & mask) {
5256 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"PIC file too short");
5257 dest[i]=stbi__get8(s);
5268 for (i=0;i<4; ++i, mask>>=1)
5273static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp,
stbi_uc *result)
5275 int act_comp=0,num_packets=0,y,chained;
5276 stbi__pic_packet packets[10];
5281 stbi__pic_packet *packet;
5283 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
5284 return stbi__errpuc(
"bad format",
"too many packets");
5286 packet = &packets[num_packets++];
5288 chained = stbi__get8(s);
5289 packet->size = stbi__get8(s);
5290 packet->type = stbi__get8(s);
5291 packet->channel = stbi__get8(s);
5293 act_comp |= packet->channel;
5295 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
5296 if (packet->size != 8)
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
5299 *comp = (act_comp & 0x10 ? 4 : 3);
5301 for(y=0; y<
height; ++y) {
5304 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
5305 stbi__pic_packet *packet = &packets[packet_idx];
5306 stbi_uc *dest = result+y*width*4;
5308 switch (packet->type) {
5310 return stbi__errpuc(
"bad format",
"packet has bad compression type");
5315 for(x=0;x<width;++x, dest+=4)
5316 if (!stbi__readval(s,packet->channel,dest))
5328 count=stbi__get8(s);
5329 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
5334 if (!stbi__readval(s,packet->channel,value))
return 0;
5336 for(i=0; i<
count; ++i,dest+=4)
5337 stbi__copyval(packet->channel,dest,value);
5346 int count = stbi__get8(s), i;
5347 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
5353 count = stbi__get16be(s);
5357 return stbi__errpuc(
"bad file",
"scanline overrun");
5359 if (!stbi__readval(s,packet->channel,value))
5362 for(i=0;i<
count;++i, dest += 4)
5363 stbi__copyval(packet->channel,dest,value);
5366 if (count>left)
return stbi__errpuc(
"bad file",
"scanline overrun");
5368 for(i=0;i<
count;++i, dest+=4)
5369 if (!stbi__readval(s,packet->channel,dest))
5383static stbi_uc *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp)
5388 for (i=0; i<92; ++i)
5391 x = stbi__get16be(s);
5392 y = stbi__get16be(s);
5393 if (stbi__at_eof(s))
return stbi__errpuc(
"bad file",
"file too short (pic header)");
5394 if ((1 << 28) / x < y)
return stbi__errpuc(
"too large",
"Image too large to decode");
5401 result = (
stbi_uc *) stbi__malloc(x*y*4);
5402 memset(result, 0xff, x*y*4);
5404 if (!stbi__pic_load_core(s,x,y,comp, result)) {
5410 if (req_comp == 0) req_comp = *comp;
5411 result=stbi__convert_format(result,4,req_comp,x,y);
5416static int stbi__pic_test(stbi__context *s)
5418 int r = stbi__pic_test_core(s);
5439 int flags, bgindex, ratio, transparent, eflags, delay;
5442 stbi__gif_lzw codes[4096];
5446 int start_x, start_y;
5452static int stbi__gif_test_raw(stbi__context *s)
5455 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
return 0;
5457 if (sz !=
'9' && sz !=
'7')
return 0;
5458 if (stbi__get8(s) !=
'a')
return 0;
5462static int stbi__gif_test(stbi__context *s)
5464 int r = stbi__gif_test_raw(s);
5469static void stbi__gif_parse_colortable(stbi__context *s,
stbi_uc pal[256][4],
int num_entries,
int transp)
5472 for (i=0; i < num_entries; ++i) {
5473 pal[i][2] = stbi__get8(s);
5474 pal[i][1] = stbi__get8(s);
5475 pal[i][0] = stbi__get8(s);
5476 pal[i][3] = transp == i ? 0 : 255;
5480static int stbi__gif_header(stbi__context *s, stbi__gif *g,
int *comp,
int is_info)
5483 if (stbi__get8(s) !=
'G' || stbi__get8(s) !=
'I' || stbi__get8(s) !=
'F' || stbi__get8(s) !=
'8')
5484 return stbi__err(
"not GIF",
"Corrupt GIF");
5486 version = stbi__get8(s);
5487 if (version !=
'7' && version !=
'9')
return stbi__err(
"not GIF",
"Corrupt GIF");
5488 if (stbi__get8(s) !=
'a')
return stbi__err(
"not GIF",
"Corrupt GIF");
5490 stbi__g_failure_reason =
"";
5491 g->w = stbi__get16le(s);
5492 g->h = stbi__get16le(s);
5493 g->flags = stbi__get8(s);
5494 g->bgindex = stbi__get8(s);
5495 g->ratio = stbi__get8(s);
5496 g->transparent = -1;
5498 if (comp != 0) *comp = 4;
5500 if (is_info)
return 1;
5502 if (g->flags & 0x80)
5503 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
5508static int stbi__gif_info_raw(stbi__context *s,
int *x,
int *y,
int *comp)
5511 if (!stbi__gif_header(s, &g, comp, 1)) {
5520static void stbi__out_gif_code(stbi__gif *g, stbi__uint16
code)
5526 if (g->codes[
code].prefix >= 0)
5527 stbi__out_gif_code(g, g->codes[
code].prefix);
5529 if (g->cur_y >= g->max_y)
return;
5531 p = &g->out[g->cur_x + g->cur_y];
5532 c = &g->color_table[g->codes[
code].suffix * 4];
5542 if (g->cur_x >= g->max_x) {
5543 g->cur_x = g->start_x;
5544 g->cur_y += g->step;
5546 while (g->cur_y >= g->max_y && g->parse > 0) {
5547 g->step = (1 << g->parse) * g->line_size;
5548 g->cur_y = g->start_y + (g->step >> 1);
5554static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
5557 stbi__int32 len, init_code;
5559 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits,
clear;
5562 lzw_cs = stbi__get8(s);
5563 if (lzw_cs > 12)
return NULL;
5564 clear = 1 << lzw_cs;
5566 codesize = lzw_cs + 1;
5567 codemask = (1 << codesize) - 1;
5570 for (init_code = 0; init_code <
clear; init_code++) {
5571 g->codes[init_code].prefix = -1;
5572 g->codes[init_code].first = (
stbi_uc) init_code;
5573 g->codes[init_code].suffix = (
stbi_uc) init_code;
5582 if (valid_bits < codesize) {
5584 len = stbi__get8(s);
5589 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
5592 stbi__int32
code = bits & codemask;
5594 valid_bits -= codesize;
5597 codesize = lzw_cs + 1;
5598 codemask = (1 << codesize) - 1;
5604 while ((len = stbi__get8(s)) > 0)
5607 }
else if (
code <= avail) {
5608 if (first)
return stbi__errpuc(
"no clear code",
"Corrupt GIF");
5611 p = &g->codes[avail++];
5612 if (avail > 4096)
return stbi__errpuc(
"too many codes",
"Corrupt GIF");
5613 p->prefix = (stbi__int16) oldcode;
5614 p->first = g->codes[oldcode].first;
5615 p->suffix = (
code == avail) ? p->first : g->codes[
code].first;
5616 }
else if (
code == avail)
5617 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5619 stbi__out_gif_code(g, (stbi__uint16)
code);
5621 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
5623 codemask = (1 << codesize) - 1;
5628 return stbi__errpuc(
"illegal code in raster",
"Corrupt GIF");
5634static void stbi__fill_gif_background(stbi__gif *g,
int x0,
int y0,
int x1,
int y1)
5637 stbi_uc *c = g->pal[g->bgindex];
5638 for (y = y0; y < y1; y += 4 * g->w) {
5639 for (x = x0; x < x1; x += 4) {
5650static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g,
int *comp,
int req_comp)
5655 if (g->out == 0 && !stbi__gif_header(s, g, comp,0))
5659 g->out = (
stbi_uc *) stbi__malloc(4 * g->w * g->h);
5660 if (g->out == 0)
return stbi__errpuc(
"outofmem",
"Out of memory");
5662 switch ((g->eflags & 0x1C) >> 2) {
5664 stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);
5667 if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
5668 g->old_out = prev_out;
5671 if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
5672 stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
5676 for (i = g->start_y; i < g->max_y; i += 4 * g->w)
5677 memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
5683 switch (stbi__get8(s)) {
5686 int prev_trans = -1;
5687 stbi__int32 x, y, w, h;
5690 x = stbi__get16le(s);
5691 y = stbi__get16le(s);
5692 w = stbi__get16le(s);
5693 h = stbi__get16le(s);
5694 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
5695 return stbi__errpuc(
"bad Image Descriptor",
"Corrupt GIF");
5697 g->line_size = g->w * 4;
5699 g->start_y = y * g->line_size;
5700 g->max_x = g->start_x + w * 4;
5701 g->max_y = g->start_y + h * g->line_size;
5702 g->cur_x = g->start_x;
5703 g->cur_y = g->start_y;
5705 g->lflags = stbi__get8(s);
5707 if (g->lflags & 0x40) {
5708 g->step = 8 * g->line_size;
5711 g->step = g->line_size;
5715 if (g->lflags & 0x80) {
5716 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
5717 g->color_table = (
stbi_uc *) g->lpal;
5718 }
else if (g->flags & 0x80) {
5719 if (g->transparent >= 0 && (g->eflags & 0x01)) {
5720 prev_trans = g->pal[g->transparent][3];
5721 g->pal[g->transparent][3] = 0;
5723 g->color_table = (
stbi_uc *) g->pal;
5725 return stbi__errpuc(
"missing color table",
"Corrupt GIF");
5727 o = stbi__process_gif_raster(s, g);
5728 if (o == NULL)
return NULL;
5730 if (prev_trans != -1)
5731 g->pal[g->transparent][3] = (
stbi_uc) prev_trans;
5739 if (stbi__get8(s) == 0xF9) {
5740 len = stbi__get8(s);
5742 g->eflags = stbi__get8(s);
5743 g->delay = stbi__get16le(s);
5744 g->transparent = stbi__get8(s);
5750 while ((len = stbi__get8(s)) != 0)
5759 return stbi__errpuc(
"unknown code",
"Corrupt GIF");
5763 STBI_NOTUSED(req_comp);
5766static stbi_uc *stbi__gif_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5770 memset(&g, 0,
sizeof(g));
5772 u = stbi__gif_load_next(s, &g, comp, req_comp);
5773 if (u == (
stbi_uc *) s) u = 0;
5777 if (req_comp && req_comp != 4)
5778 u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
5786static int stbi__gif_info(stbi__context *s,
int *x,
int *y,
int *comp)
5788 return stbi__gif_info_raw(s,x,y,comp);
5796static int stbi__hdr_test_core(stbi__context *s)
5798 const char *signature =
"#?RADIANCE\n";
5800 for (i=0; signature[i]; ++i)
5801 if (stbi__get8(s) != signature[i])
5806static int stbi__hdr_test(stbi__context* s)
5808 int r = stbi__hdr_test_core(s);
5813#define STBI__HDR_BUFLEN 1024
5814static char *stbi__hdr_gettoken(stbi__context *z,
char *buffer)
5819 c = (char) stbi__get8(z);
5821 while (!stbi__at_eof(z) && c !=
'\n') {
5823 if (len == STBI__HDR_BUFLEN-1) {
5825 while (!stbi__at_eof(z) && stbi__get8(z) !=
'\n')
5829 c = (char) stbi__get8(z);
5836static void stbi__hdr_convert(
float *output,
stbi_uc *input,
int req_comp)
5838 if ( input[3] != 0 ) {
5841 f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
5843 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
5845 output[0] = input[0] * f1;
5846 output[1] = input[1] * f1;
5847 output[2] = input[2] * f1;
5849 if (req_comp == 2) output[1] = 1;
5850 if (req_comp == 4) output[3] = 1;
5853 case 4: output[3] = 1;
5854 case 3: output[0] = output[1] = output[2] = 0;
5856 case 2: output[1] = 1;
5857 case 1: output[0] = 0;
5863static float *stbi__hdr_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
5865 char buffer[STBI__HDR_BUFLEN];
5872 unsigned char count, value;
5873 int i, j, k, c1,c2, z;
5877 if (strcmp(stbi__hdr_gettoken(s,buffer),
"#?RADIANCE") != 0)
5878 return stbi__errpf(
"not HDR",
"Corrupt HDR image");
5882 token = stbi__hdr_gettoken(s,buffer);
5883 if (token[0] == 0)
break;
5884 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5887 if (!valid)
return stbi__errpf(
"unsupported format",
"Unsupported HDR format");
5891 token = stbi__hdr_gettoken(s,buffer);
5892 if (strncmp(token,
"-Y ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5894 height = (int) strtol(token, &token, 10);
5895 while (*token ==
' ') ++token;
5896 if (strncmp(token,
"+X ", 3))
return stbi__errpf(
"unsupported data layout",
"Unsupported HDR format");
5898 width = (int) strtol(token, NULL, 10);
5903 if (comp) *comp = 3;
5904 if (req_comp == 0) req_comp = 3;
5907 hdr_data = (
float *) stbi__malloc(
height * width * req_comp *
sizeof(
float));
5911 if ( width < 8 || width >= 32768) {
5913 for (j=0; j <
height; ++j) {
5914 for (i=0; i < width; ++i) {
5917 stbi__getn(s, rgbe, 4);
5918 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
5925 for (j = 0; j <
height; ++j) {
5928 len = stbi__get8(s);
5929 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
5936 rgbe[3] = (
stbi_uc) stbi__get8(s);
5937 stbi__hdr_convert(hdr_data, rgbe, req_comp);
5940 STBI_FREE(scanline);
5941 goto main_decode_loop;
5944 len |= stbi__get8(s);
5945 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline);
return stbi__errpf(
"invalid decoded scanline length",
"corrupt HDR"); }
5946 if (scanline == NULL) scanline = (
stbi_uc *) stbi__malloc(width * 4);
5948 for (k = 0; k < 4; ++k) {
5951 count = stbi__get8(s);
5954 value = stbi__get8(s);
5956 for (z = 0; z <
count; ++z)
5957 scanline[i++ * 4 + k] = value;
5960 for (z = 0; z <
count; ++z)
5961 scanline[i++ * 4 + k] = stbi__get8(s);
5965 for (i=0; i < width; ++i)
5966 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
5968 STBI_FREE(scanline);
5974static int stbi__hdr_info(stbi__context *s,
int *x,
int *y,
int *comp)
5976 char buffer[STBI__HDR_BUFLEN];
5980 if (strcmp(stbi__hdr_gettoken(s,buffer),
"#?RADIANCE") != 0) {
5986 token = stbi__hdr_gettoken(s,buffer);
5987 if (token[0] == 0)
break;
5988 if (strcmp(token,
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5995 token = stbi__hdr_gettoken(s,buffer);
5996 if (strncmp(token,
"-Y ", 3)) {
6001 *y = (int) strtol(token, &token, 10);
6002 while (*token ==
' ') ++token;
6003 if (strncmp(token,
"+X ", 3)) {
6008 *x = (int) strtol(token, NULL, 10);
6015static int stbi__bmp_info(stbi__context *s,
int *x,
int *y,
int *comp)
6018 if (stbi__get8(s) !=
'B' || stbi__get8(s) !=
'M') {
6023 hsz = stbi__get32le(s);
6024 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
6029 *x = stbi__get16le(s);
6030 *y = stbi__get16le(s);
6032 *x = stbi__get32le(s);
6033 *y = stbi__get32le(s);
6035 if (stbi__get16le(s) != 1) {
6039 *comp = stbi__get16le(s) / 8;
6045static int stbi__psd_info(stbi__context *s,
int *x,
int *y,
int *comp)
6048 if (stbi__get32be(s) != 0x38425053) {
6052 if (stbi__get16be(s) != 1) {
6057 channelCount = stbi__get16be(s);
6058 if (channelCount < 0 || channelCount > 16) {
6062 *y = stbi__get32be(s);
6063 *x = stbi__get32be(s);
6064 if (stbi__get16be(s) != 8) {
6068 if (stbi__get16be(s) != 3) {
6078static int stbi__pic_info(stbi__context *s,
int *x,
int *y,
int *comp)
6080 int act_comp=0,num_packets=0,chained;
6081 stbi__pic_packet packets[10];
6083 if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
6090 *x = stbi__get16be(s);
6091 *y = stbi__get16be(s);
6092 if (stbi__at_eof(s)) {
6096 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
6104 stbi__pic_packet *packet;
6106 if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
6109 packet = &packets[num_packets++];
6110 chained = stbi__get8(s);
6111 packet->size = stbi__get8(s);
6112 packet->type = stbi__get8(s);
6113 packet->channel = stbi__get8(s);
6114 act_comp |= packet->channel;
6116 if (stbi__at_eof(s)) {
6120 if (packet->size != 8) {
6126 *comp = (act_comp & 0x10 ? 4 : 3);
6146static int stbi__pnm_test(stbi__context *s)
6149 p = (char) stbi__get8(s);
6150 t = (char) stbi__get8(s);
6151 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6158static stbi_uc *stbi__pnm_load(stbi__context *s,
int *x,
int *y,
int *comp,
int req_comp)
6161 if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
6167 out = (
stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y);
6168 if (!out)
return stbi__errpuc(
"outofmem",
"Out of memory");
6169 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
6171 if (req_comp && req_comp != s->img_n) {
6172 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
6173 if (out == NULL)
return out;
6178static int stbi__pnm_isspace(
char c)
6180 return c ==
' ' || c ==
'\t' || c ==
'\n' || c ==
'\v' || c ==
'\f' || c ==
'\r';
6183static void stbi__pnm_skip_whitespace(stbi__context *s,
char *c)
6185 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
6186 *c = (char) stbi__get8(s);
6189static int stbi__pnm_isdigit(
char c)
6191 return c >=
'0' && c <=
'9';
6194static int stbi__pnm_getinteger(stbi__context *s,
char *c)
6198 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
6199 value = value*10 + (*c -
'0');
6200 *c = (char) stbi__get8(s);
6206static int stbi__pnm_info(stbi__context *s,
int *x,
int *y,
int *comp)
6214 p = (char) stbi__get8(s);
6215 t = (char) stbi__get8(s);
6216 if (p !=
'P' || (t !=
'5' && t !=
'6')) {
6221 *comp = (t ==
'6') ? 3 : 1;
6223 c = (char) stbi__get8(s);
6224 stbi__pnm_skip_whitespace(s, &c);
6226 *x = stbi__pnm_getinteger(s, &c);
6227 stbi__pnm_skip_whitespace(s, &c);
6229 *y = stbi__pnm_getinteger(s, &c);
6230 stbi__pnm_skip_whitespace(s, &c);
6232 maxv = stbi__pnm_getinteger(s, &c);
6235 return stbi__err(
"max value > 255",
"PPM image not 8-bit");
6241static int stbi__info_main(stbi__context *s,
int *x,
int *y,
int *comp)
6243 #ifndef STBI_NO_JPEG
6244 if (stbi__jpeg_info(s, x, y, comp))
return 1;
6248 if (stbi__png_info(s, x, y, comp))
return 1;
6252 if (stbi__gif_info(s, x, y, comp))
return 1;
6256 if (stbi__bmp_info(s, x, y, comp))
return 1;
6260 if (stbi__psd_info(s, x, y, comp))
return 1;
6264 if (stbi__pic_info(s, x, y, comp))
return 1;
6268 if (stbi__pnm_info(s, x, y, comp))
return 1;
6272 if (stbi__hdr_info(s, x, y, comp))
return 1;
6277 if (stbi__tga_info(s, x, y, comp))
6280 return stbi__err(
"unknown image type",
"Image not of any known type, or corrupt");
6283#ifndef STBI_NO_STDIO
6286 FILE *
f = stbi__fopen(filename,
"rb");
6288 if (!
f)
return stbi__err(
"can't fopen",
"Unable to open file");
6298 long pos = ftell(
f);
6299 stbi__start_file(&s,
f);
6300 r = stbi__info_main(&s,x,y,comp);
6301 fseek(
f,pos,SEEK_SET);
6309 stbi__start_mem(&s,buffer,len);
6310 return stbi__info_main(&s,x,y,comp);
6317 return stbi__info_main(&s,x,y,comp);
Complex exp(Complex z, int n)
Definition GameApi_pl.cc:31416
PML clear(AK orig)
Definition accel.cc:803
header('
Definition cert.php:38
void info(std::string info)
Definition check.cc:24
std::string code
Definition test.cpp:145
let hd
Definition gameapi_example.php:61
background color
Definition gameapi_example.php:46
d
Definition meshpage.php:3895
lazy data
Definition meshpage.php:1583
str
Definition meshpage.php:1778
line height
Definition meshpage.php:3536
tag src
Definition meshpage.php:1786
n< br > font size
Definition meshpage.php:3536
bool even(Object x)
Returns true if x is an even integer.
Object filter(Container c, Function f)
Takes elements from Container c that match function f, return them.
size_t count(const T &t_target, const typename T::key_type &t_key)
Definition bootstrap_stl.hpp:104
double f(const std::string &, double, bool) noexcept
Definition profile_cpp_calls_2.cpp:4
STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
@ STBI_default
Definition stb_image.h:366
@ STBI_rgb
Definition stb_image.h:370
@ STBI_rgb_alpha
Definition stb_image.h:371
@ STBI_grey
Definition stb_image.h:368
@ STBI_grey_alpha
Definition stb_image.h:369
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma)
STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
unsigned char stbi_uc
Definition stb_image.h:374
STBIDEF stbi_uc * stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
#define STBIDEF
Definition stb_image.h:383
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
STBIDEF float * stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
STBIDEF float * stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
STBIDEF float * stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp)
STBIDEF stbi_uc * stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
STBIDEF stbi_uc * stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
STBIDEF int stbi_is_hdr_from_file(FILE *f)
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma)
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
STBIDEF const char * stbi_failure_reason(void)
STBIDEF char * stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
STBIDEF float * stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
STBIDEF void stbi_image_free(void *retval_from_stbi_load)
STBIDEF char * stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen)
STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
STBIDEF void stbi_hdr_to_ldr_scale(float scale)
STBIDEF int stbi_is_hdr(char const *filename)
STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
STBIDEF stbi_uc * stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
STBIDEF void stbi_ldr_to_hdr_scale(float scale)
STBIDEF char * stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen)
Definition stb_image.h:396
int(* eof)(void *user)
Definition stb_image.h:399
int(* read)(void *user, char *data, int size)
Definition stb_image.h:397
void(* skip)(void *user, int n)
Definition stb_image.h:398
num
Definition view.php:2821
#define compress
Definition zip_file.hpp:485