104 #ifndef STBI_INCLUDE_STB_IMAGE_H   105 #define STBI_INCLUDE_STB_IMAGE_H   305 #ifndef STBI_NO_STDIO   307 #endif // STBI_NO_STDIO   309 #define STBI_VERSION 1   321 typedef unsigned char stbi_uc;
   322 typedef unsigned short stbi_us;
   328 #ifdef STB_IMAGE_STATIC   329 #define STBIDEF static   331 #define STBIDEF extern   345    int      (*read)  (
void *user,
char *data,
int size);   
   346    void     (*skip)  (
void *user,
int n);                 
   347    int      (*eof)   (
void *user);                       
   355 STBIDEF stbi_uc *stbi_load               (
char              const *filename,           
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
   356 STBIDEF stbi_uc *stbi_load_from_memory   (stbi_uc           
const *buffer, 
int len   , 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
   357 STBIDEF stbi_uc *stbi_load_from_callbacks(
stbi_io_callbacks const *clbk  , 
void *user, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
   359 #ifndef STBI_NO_STDIO   360 STBIDEF stbi_uc *stbi_load_from_file   (FILE *f, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
   369 STBIDEF stbi_us *stbi_load_16(
char const *filename, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
   370 #ifndef STBI_NO_STDIO   371 STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
   379 #ifndef STBI_NO_LINEAR   380    STBIDEF 
float *stbi_loadf                 (
char const *filename,           
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
   381    STBIDEF 
float *stbi_loadf_from_memory     (stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
   382    STBIDEF 
float *stbi_loadf_from_callbacks  (
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y,  
int *channels_in_file, 
int desired_channels);
   384    #ifndef STBI_NO_STDIO   385    STBIDEF 
float *stbi_loadf_from_file  (FILE *f, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
   390    STBIDEF 
void   stbi_hdr_to_ldr_gamma(
float gamma);
   391    STBIDEF 
void   stbi_hdr_to_ldr_scale(
float scale);
   392 #endif // STBI_NO_HDR   394 #ifndef STBI_NO_LINEAR   395    STBIDEF 
void   stbi_ldr_to_hdr_gamma(
float gamma);
   396    STBIDEF 
void   stbi_ldr_to_hdr_scale(
float scale);
   397 #endif // STBI_NO_LINEAR   400 STBIDEF 
int    stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user);
   401 STBIDEF 
int    stbi_is_hdr_from_memory(stbi_uc 
const *buffer, 
int len);
   402 #ifndef STBI_NO_STDIO   403 STBIDEF 
int      stbi_is_hdr          (
char const *filename);
   404 STBIDEF 
int      stbi_is_hdr_from_file(FILE *f);
   405 #endif // STBI_NO_STDIO   410 STBIDEF 
const char *stbi_failure_reason  (
void);
   413 STBIDEF 
void     stbi_image_free      (
void *retval_from_stbi_load);
   416 STBIDEF 
int      stbi_info_from_memory(stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *comp);
   417 STBIDEF 
int      stbi_info_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y, 
int *comp);
   419 #ifndef STBI_NO_STDIO   420 STBIDEF 
int      stbi_info            (
char const *filename,     
int *x, 
int *y, 
int *comp);
   421 STBIDEF 
int      stbi_info_from_file  (FILE *f,                  
int *x, 
int *y, 
int *comp);
   430 STBIDEF 
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply);
   434 STBIDEF 
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert);
   437 STBIDEF 
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip);
   441 STBIDEF 
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer, 
int len, 
int initial_size, 
int *outlen);
   442 STBIDEF 
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer, 
int len, 
int initial_size, 
int *outlen, 
int parse_header);
   443 STBIDEF 
char *stbi_zlib_decode_malloc(
const char *buffer, 
int len, 
int *outlen);
   444 STBIDEF 
int   stbi_zlib_decode_buffer(
char *obuffer, 
int olen, 
const char *ibuffer, 
int ilen);
   446 STBIDEF 
char *stbi_zlib_decode_noheader_malloc(
const char *buffer, 
int len, 
int *outlen);
   447 STBIDEF 
int   stbi_zlib_decode_noheader_buffer(
char *obuffer, 
int olen, 
const char *ibuffer, 
int ilen);
   457 #endif // STBI_INCLUDE_STB_IMAGE_H   459 #ifdef STB_IMAGE_IMPLEMENTATION   461 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \   462   || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \   463   || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \   464   || defined(STBI_ONLY_ZLIB)   465    #ifndef STBI_ONLY_JPEG   468    #ifndef STBI_ONLY_PNG   471    #ifndef STBI_ONLY_BMP   474    #ifndef STBI_ONLY_PSD   477    #ifndef STBI_ONLY_TGA   480    #ifndef STBI_ONLY_GIF   483    #ifndef STBI_ONLY_HDR   486    #ifndef STBI_ONLY_PIC   489    #ifndef STBI_ONLY_PNM   494 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)   505 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)   509 #ifndef STBI_NO_STDIO   515 #define STBI_ASSERT(x) assert(x)   521    #define stbi_inline inline   526    #define stbi_inline __forceinline   531 typedef unsigned short stbi__uint16;
   532 typedef   signed short stbi__int16;
   533 typedef unsigned int   stbi__uint32;
   534 typedef   signed int   stbi__int32;
   537 typedef uint16_t stbi__uint16;
   538 typedef int16_t  stbi__int16;
   539 typedef uint32_t stbi__uint32;
   540 typedef int32_t  stbi__int32;
   544 typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
   547 #define STBI_NOTUSED(v)  (void)(v)   549 #define STBI_NOTUSED(v)  (void)sizeof(v)   553 #define STBI_HAS_LROTL   556 #ifdef STBI_HAS_LROTL   557    #define stbi_lrot(x,y)  _lrotl(x,y)   559    #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (32 - (y))))   562 #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))   564 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)   567 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."   571 #define STBI_MALLOC(sz)           malloc(sz)   572 #define STBI_REALLOC(p,newsz)     realloc(p,newsz)   573 #define STBI_FREE(p)              free(p)   576 #ifndef STBI_REALLOC_SIZED   577 #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)   581 #if defined(__x86_64__) || defined(_M_X64)   582 #define STBI__X64_TARGET   583 #elif defined(__i386) || defined(_M_IX86)   584 #define STBI__X86_TARGET   587 #if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)   598 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)   613 #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))   615 #include <emmintrin.h>   619 #if _MSC_VER >= 1400  // not VC6   621 static int stbi__cpuid3(
void)
   628 static int stbi__cpuid3(
void)
   640 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name   642 static int stbi__sse2_available()
   644    int info3 = stbi__cpuid3();
   645    return ((info3 >> 26) & 1) != 0;
   647 #else // assume GCC-style if not VC++   648 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))   650 static int stbi__sse2_available()
   661 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)   666 #include <arm_neon.h>   668 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))   671 #ifndef STBI_SIMD_ALIGN   672 #define STBI_SIMD_ALIGN(type, name) type name   683    stbi__uint32 img_x, img_y;
   684    int img_n, img_out_n;
   689    int read_from_callbacks;
   691    stbi_uc buffer_start[128];
   693    stbi_uc *img_buffer, *img_buffer_end;
   694    stbi_uc *img_buffer_original, *img_buffer_original_end;
   698 static void stbi__refill_buffer(stbi__context *s);
   701 static void stbi__start_mem(stbi__context *s, stbi_uc 
const *buffer, 
int len)
   704    s->read_from_callbacks = 0;
   705    s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
   706    s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
   710 static void stbi__start_callbacks(stbi__context *s, 
stbi_io_callbacks *c, 
void *user)
   713    s->io_user_data = user;
   714    s->buflen = 
sizeof(s->buffer_start);
   715    s->read_from_callbacks = 1;
   716    s->img_buffer_original = s->buffer_start;
   717    stbi__refill_buffer(s);
   718    s->img_buffer_original_end = s->img_buffer_end;
   721 #ifndef STBI_NO_STDIO   723 static int stbi__stdio_read(
void *user, 
char *data, 
int size)
   725    return (
int) fread(data,1,size,(FILE*) user);
   728 static void stbi__stdio_skip(
void *user, 
int n)
   730    fseek((FILE*) user, n, SEEK_CUR);
   733 static int stbi__stdio_eof(
void *user)
   735    return feof((FILE*) user);
   745 static void stbi__start_file(stbi__context *s, FILE *f)
   747    stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *) f);
   752 #endif // !STBI_NO_STDIO   754 static void stbi__rewind(stbi__context *s)
   759    s->img_buffer = s->img_buffer_original;
   760    s->img_buffer_end = s->img_buffer_original_end;
   771    int bits_per_channel;
   777 static int      stbi__jpeg_test(stbi__context *s);
   778 static void    *stbi__jpeg_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
   779 static int      stbi__jpeg_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
   783 static int      stbi__png_test(stbi__context *s);
   784 static void    *stbi__png_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
   785 static int      stbi__png_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
   789 static int      stbi__bmp_test(stbi__context *s);
   790 static void    *stbi__bmp_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
   791 static int      stbi__bmp_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
   795 static int      stbi__tga_test(stbi__context *s);
   796 static void    *stbi__tga_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
   797 static int      stbi__tga_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
   801 static int      stbi__psd_test(stbi__context *s);
   802 static void    *stbi__psd_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri, 
int bpc);
   803 static int      stbi__psd_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
   807 static int      stbi__hdr_test(stbi__context *s);
   808 static float   *stbi__hdr_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
   809 static int      stbi__hdr_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
   813 static int      stbi__pic_test(stbi__context *s);
   814 static void    *stbi__pic_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
   815 static int      stbi__pic_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
   819 static int      stbi__gif_test(stbi__context *s);
   820 static void    *stbi__gif_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
   821 static int      stbi__gif_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
   825 static int      stbi__pnm_test(stbi__context *s);
   826 static void    *stbi__pnm_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
   827 static int      stbi__pnm_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
   831 static const char *stbi__g_failure_reason;
   833 STBIDEF 
const char *stbi_failure_reason(
void)
   835    return stbi__g_failure_reason;
   838 static int stbi__err(
const char *str)
   840    stbi__g_failure_reason = str;
   844 static void *stbi__malloc(
size_t size)
   846     return STBI_MALLOC(size);
   861 static int stbi__addsizes_valid(
int a, 
int b)
   868    return a <= INT_MAX - b;
   873 static int stbi__mul2sizes_valid(
int a, 
int b)
   875    if (a < 0 || b < 0) 
return 0;
   876    if (b == 0) 
return 1; 
   878    return a <= INT_MAX/b;
   882 static int stbi__mad2sizes_valid(
int a, 
int b, 
int add)
   884    return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
   888 static int stbi__mad3sizes_valid(
int a, 
int b, 
int c, 
int add)
   890    return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
   891       stbi__addsizes_valid(a*b*c, add);
   895 static int stbi__mad4sizes_valid(
int a, 
int b, 
int c, 
int d, 
int add)
   897    return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
   898       stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
   902 static void *stbi__malloc_mad2(
int a, 
int b, 
int add)
   904    if (!stbi__mad2sizes_valid(a, b, add)) 
return NULL;
   905    return stbi__malloc(a*b + add);
   908 static void *stbi__malloc_mad3(
int a, 
int b, 
int c, 
int add)
   910    if (!stbi__mad3sizes_valid(a, b, c, add)) 
return NULL;
   911    return stbi__malloc(a*b*c + add);
   914 static void *stbi__malloc_mad4(
int a, 
int b, 
int c, 
int d, 
int add)
   916    if (!stbi__mad4sizes_valid(a, b, c, d, add)) 
return NULL;
   917    return stbi__malloc(a*b*c*d + add);
   924 #ifdef STBI_NO_FAILURE_STRINGS   925    #define stbi__err(x,y)  0   926 #elif defined(STBI_FAILURE_USERMSG)   927    #define stbi__err(x,y)  stbi__err(y)   929    #define stbi__err(x,y)  stbi__err(x)   932 #define stbi__errpf(x,y)   ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))   933 #define stbi__errpuc(x,y)  ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))   935 STBIDEF 
void stbi_image_free(
void *retval_from_stbi_load)
   937    STBI_FREE(retval_from_stbi_load);
   940 #ifndef STBI_NO_LINEAR   941 static float   *stbi__ldr_to_hdr(stbi_uc *data, 
int x, 
int y, 
int comp);
   945 static stbi_uc *stbi__hdr_to_ldr(
float   *data, 
int x, 
int y, 
int comp);
   948 static int stbi__vertically_flip_on_load = 0;
   950 STBIDEF 
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip)
   952     stbi__vertically_flip_on_load = flag_true_if_should_flip;
   955 static void *stbi__load_main(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri, 
int bpc)
   957    memset(ri, 0, 
sizeof(*ri)); 
   958    ri->bits_per_channel = 8; 
   959    ri->channel_order = STBI_ORDER_RGB; 
   960    ri->num_channels = 0;
   963    if (stbi__jpeg_test(s)) 
return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
   966    if (stbi__png_test(s))  
return stbi__png_load(s,x,y,comp,req_comp, ri);
   969    if (stbi__bmp_test(s))  
return stbi__bmp_load(s,x,y,comp,req_comp, ri);
   972    if (stbi__gif_test(s))  
return stbi__gif_load(s,x,y,comp,req_comp, ri);
   975    if (stbi__psd_test(s))  
return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
   978    if (stbi__pic_test(s))  
return stbi__pic_load(s,x,y,comp,req_comp, ri);
   981    if (stbi__pnm_test(s))  
return stbi__pnm_load(s,x,y,comp,req_comp, ri);
   985    if (stbi__hdr_test(s)) {
   986       float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
   987       return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
   993    if (stbi__tga_test(s))
   994       return stbi__tga_load(s,x,y,comp,req_comp, ri);
   997    return stbi__errpuc(
"unknown image type", 
"Image not of any known type, or corrupt");
  1000 static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, 
int w, 
int h, 
int channels)
  1003    int img_len = w * h * channels;
  1006    reduced = (stbi_uc *) stbi__malloc(img_len);
  1007    if (reduced == NULL) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
  1009    for (i = 0; i < img_len; ++i)
  1010       reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); 
  1016 static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, 
int w, 
int h, 
int channels)
  1019    int img_len = w * h * channels;
  1020    stbi__uint16 *enlarged;
  1022    enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
  1023    if (enlarged == NULL) 
return (stbi__uint16 *) stbi__errpuc(
"outofmem", 
"Out of memory");
  1025    for (i = 0; i < img_len; ++i)
  1026       enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); 
  1032 static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1034    stbi__result_info ri;
  1035    void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
  1040    if (ri.bits_per_channel != 8) {
  1041       STBI_ASSERT(ri.bits_per_channel == 16);
  1042       result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
  1043       ri.bits_per_channel = 8;
  1048    if (stbi__vertically_flip_on_load) {
  1050       int channels = req_comp ? req_comp : *comp;
  1052       stbi_uc *image = (stbi_uc *) result;
  1055       for (row = 0; row < (h>>1); row++) {
  1056          for (col = 0; col < w; col++) {
  1057             for (z = 0; z < channels; z++) {
  1058                stbi_uc temp = image[(row * w + col) * channels + z];
  1059                image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z];
  1060                image[((h - row - 1) * w + col) * channels + z] = temp;
  1066    return (
unsigned char *) result;
  1069 static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1071    stbi__result_info ri;
  1072    void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
  1077    if (ri.bits_per_channel != 16) {
  1078       STBI_ASSERT(ri.bits_per_channel == 8);
  1079       result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
  1080       ri.bits_per_channel = 16;
  1086    if (stbi__vertically_flip_on_load) {
  1088       int channels = req_comp ? req_comp : *comp;
  1090       stbi__uint16 *image = (stbi__uint16 *) result;
  1093       for (row = 0; row < (h>>1); row++) {
  1094          for (col = 0; col < w; col++) {
  1095             for (z = 0; z < channels; z++) {
  1096                stbi__uint16 temp = image[(row * w + col) * channels + z];
  1097                image[(row * w + col) * channels + z] = image[((h - row - 1) * w + col) * channels + z];
  1098                image[((h - row - 1) * w + col) * channels + z] = temp;
  1104    return (stbi__uint16 *) result;
  1108 static void stbi__float_postprocess(
float *result, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1110    if (stbi__vertically_flip_on_load && result != NULL) {
  1112       int depth = req_comp ? req_comp : *comp;
  1117       for (row = 0; row < (h>>1); row++) {
  1118          for (col = 0; col < w; col++) {
  1119             for (z = 0; z < depth; z++) {
  1120                temp = result[(row * w + col) * depth + z];
  1121                result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
  1122                result[((h - row - 1) * w + col) * depth + z] = temp;
  1130 #ifndef STBI_NO_STDIO  1132 static FILE *stbi__fopen(
char const *filename, 
char const *mode)
  1135 #if defined(_MSC_VER) && _MSC_VER >= 1400  1136    if (0 != fopen_s(&f, filename, mode))
  1139    f = fopen(filename, mode);
  1145 STBIDEF stbi_uc *stbi_load(
char const *filename, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1147    FILE *f = stbi__fopen(filename, 
"rb");
  1148    unsigned char *result;
  1149    if (!f) 
return stbi__errpuc(
"can't fopen", 
"Unable to open file");
  1150    result = stbi_load_from_file(f,x,y,comp,req_comp);
  1155 STBIDEF stbi_uc *stbi_load_from_file(FILE *f, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1157    unsigned char *result;
  1159    stbi__start_file(&s,f);
  1160    result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
  1163       fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
  1168 STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1170    stbi__uint16 *result;
  1172    stbi__start_file(&s,f);
  1173    result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
  1176       fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
  1181 STBIDEF stbi_us *stbi_load_16(
char const *filename, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1183    FILE *f = stbi__fopen(filename, 
"rb");
  1184    stbi__uint16 *result;
  1185    if (!f) 
return (stbi_us *) stbi__errpuc(
"can't fopen", 
"Unable to open file");
  1186    result = stbi_load_from_file_16(f,x,y,comp,req_comp);
  1194 STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1197    stbi__start_mem(&s,buffer,len);
  1198    return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
  1201 STBIDEF stbi_uc *stbi_load_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1205    return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
  1208 #ifndef STBI_NO_LINEAR  1209 static float *stbi__loadf_main(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1211    unsigned char *data;
  1213    if (stbi__hdr_test(s)) {
  1214       stbi__result_info ri;
  1215       float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
  1217          stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
  1221    data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
  1223       return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
  1224    return stbi__errpf(
"unknown image type", 
"Image not of any known type, or corrupt");
  1227 STBIDEF 
float *stbi_loadf_from_memory(stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1230    stbi__start_mem(&s,buffer,len);
  1231    return stbi__loadf_main(&s,x,y,comp,req_comp);
  1234 STBIDEF 
float *stbi_loadf_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1238    return stbi__loadf_main(&s,x,y,comp,req_comp);
  1241 #ifndef STBI_NO_STDIO  1242 STBIDEF 
float *stbi_loadf(
char const *filename, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1245    FILE *f = stbi__fopen(filename, 
"rb");
  1246    if (!f) 
return stbi__errpf(
"can't fopen", 
"Unable to open file");
  1247    result = stbi_loadf_from_file(f,x,y,comp,req_comp);
  1252 STBIDEF 
float *stbi_loadf_from_file(FILE *f, 
int *x, 
int *y, 
int *comp, 
int req_comp)
  1255    stbi__start_file(&s,f);
  1256    return stbi__loadf_main(&s,x,y,comp,req_comp);
  1258 #endif // !STBI_NO_STDIO  1260 #endif // !STBI_NO_LINEAR  1266 STBIDEF 
int stbi_is_hdr_from_memory(stbi_uc 
const *buffer, 
int len)
  1270    stbi__start_mem(&s,buffer,len);
  1271    return stbi__hdr_test(&s);
  1273    STBI_NOTUSED(buffer);
  1279 #ifndef STBI_NO_STDIO  1280 STBIDEF 
int      stbi_is_hdr          (
char const *filename)
  1282    FILE *f = stbi__fopen(filename, 
"rb");
  1285       result = stbi_is_hdr_from_file(f);
  1291 STBIDEF 
int      stbi_is_hdr_from_file(FILE *f)
  1295    stbi__start_file(&s,f);
  1296    return stbi__hdr_test(&s);
  1302 #endif // !STBI_NO_STDIO  1304 STBIDEF 
int      stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user)
  1309    return stbi__hdr_test(&s);
  1317 #ifndef STBI_NO_LINEAR  1318 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
  1320 STBIDEF 
void   stbi_ldr_to_hdr_gamma(
float gamma) { stbi__l2h_gamma = gamma; }
  1321 STBIDEF 
void   stbi_ldr_to_hdr_scale(
float scale) { stbi__l2h_scale = scale; }
  1324 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
  1326 STBIDEF 
void   stbi_hdr_to_ldr_gamma(
float gamma) { stbi__h2l_gamma_i = 1/gamma; }
  1327 STBIDEF 
void   stbi_hdr_to_ldr_scale(
float scale) { stbi__h2l_scale_i = 1/scale; }
  1342 static void stbi__refill_buffer(stbi__context *s)
  1344    int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
  1348       s->read_from_callbacks = 0;
  1349       s->img_buffer = s->buffer_start;
  1350       s->img_buffer_end = s->buffer_start+1;
  1353       s->img_buffer = s->buffer_start;
  1354       s->img_buffer_end = s->buffer_start + n;
  1358 stbi_inline 
static stbi_uc stbi__get8(stbi__context *s)
  1360    if (s->img_buffer < s->img_buffer_end)
  1361       return *s->img_buffer++;
  1362    if (s->read_from_callbacks) {
  1363       stbi__refill_buffer(s);
  1364       return *s->img_buffer++;
  1369 stbi_inline 
static int stbi__at_eof(stbi__context *s)
  1372       if (!(s->io.eof)(s->io_user_data)) 
return 0;
  1375       if (s->read_from_callbacks == 0) 
return 1;
  1378    return s->img_buffer >= s->img_buffer_end;
  1381 static void stbi__skip(stbi__context *s, 
int n)
  1384       s->img_buffer = s->img_buffer_end;
  1388       int blen = (int) (s->img_buffer_end - s->img_buffer);
  1390          s->img_buffer = s->img_buffer_end;
  1391          (s->io.skip)(s->io_user_data, n - blen);
  1398 static int stbi__getn(stbi__context *s, stbi_uc *buffer, 
int n)
  1401       int blen = (int) (s->img_buffer_end - s->img_buffer);
  1405          memcpy(buffer, s->img_buffer, blen);
  1407          count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
  1408          res = (count == (n-blen));
  1409          s->img_buffer = s->img_buffer_end;
  1414    if (s->img_buffer+n <= s->img_buffer_end) {
  1415       memcpy(buffer, s->img_buffer, n);
  1422 static int stbi__get16be(stbi__context *s)
  1424    int z = stbi__get8(s);
  1425    return (z << 8) + stbi__get8(s);
  1428 static stbi__uint32 stbi__get32be(stbi__context *s)
  1430    stbi__uint32 z = stbi__get16be(s);
  1431    return (z << 16) + stbi__get16be(s);
  1434 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)  1437 static int stbi__get16le(stbi__context *s)
  1439    int z = stbi__get8(s);
  1440    return z + (stbi__get8(s) << 8);
  1445 static stbi__uint32 stbi__get32le(stbi__context *s)
  1447    stbi__uint32 z = stbi__get16le(s);
  1448    return z + (stbi__get16le(s) << 16);
  1452 #define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))  // truncate int to byte without warnings  1466 static stbi_uc stbi__compute_y(
int r, 
int g, 
int b)
  1468    return (stbi_uc) (((r*77) + (g*150) +  (29*b)) >> 8);
  1471 static unsigned char *stbi__convert_format(
unsigned char *data, 
int img_n, 
int req_comp, 
unsigned int x, 
unsigned int y)
  1474    unsigned char *good;
  1476    if (req_comp == img_n) 
return data;
  1477    STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
  1479    good = (
unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
  1482       return stbi__errpuc(
"outofmem", 
"Out of memory");
  1485    for (j=0; j < (int) y; ++j) {
  1486       unsigned char *src  = data + j * x * img_n   ;
  1487       unsigned char *dest = good + j * x * req_comp;
  1489       #define STBI__COMBO(a,b)  ((a)*8+(b))  1490       #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)  1493       switch (STBI__COMBO(img_n, req_comp)) {
  1494          STBI__CASE(1,2) { dest[0]=src[0], dest[1]=255;                                     } 
break;
  1495          STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } 
break;
  1496          STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255;                     } 
break;
  1497          STBI__CASE(2,1) { dest[0]=src[0];                                                  } 
break;
  1498          STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } 
break;
  1499          STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1];                  } 
break;
  1500          STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255;        } 
break;
  1501          STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } 
break;
  1502          STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255;    } 
break;
  1503          STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } 
break;
  1504          STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } 
break;
  1505          STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2];                    } 
break;
  1506          default: STBI_ASSERT(0);
  1515 static stbi__uint16 stbi__compute_y_16(
int r, 
int g, 
int b)
  1517    return (stbi__uint16) (((r*77) + (g*150) +  (29*b)) >> 8);
  1520 static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, 
int img_n, 
int req_comp, 
unsigned int x, 
unsigned int y)
  1525    if (req_comp == img_n) 
return data;
  1526    STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
  1528    good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
  1531       return (stbi__uint16 *) stbi__errpuc(
"outofmem", 
"Out of memory");
  1534    for (j=0; j < (int) y; ++j) {
  1535       stbi__uint16 *src  = data + j * x * img_n   ;
  1536       stbi__uint16 *dest = good + j * x * req_comp;
  1538       #define STBI__COMBO(a,b)  ((a)*8+(b))  1539       #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)  1542       switch (STBI__COMBO(img_n, req_comp)) {
  1543          STBI__CASE(1,2) { dest[0]=src[0], dest[1]=0xffff;                                     } 
break;
  1544          STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } 
break;
  1545          STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=0xffff;                     } 
break;
  1546          STBI__CASE(2,1) { dest[0]=src[0];                                                     } 
break;
  1547          STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } 
break;
  1548          STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1];                     } 
break;
  1549          STBI__CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=0xffff;        } 
break;
  1550          STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } 
break;
  1551          STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = 0xffff; } 
break;
  1552          STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } 
break;
  1553          STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]), dest[1] = src[3]; } 
break;
  1554          STBI__CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2];                       } 
break;
  1555          default: STBI_ASSERT(0);
  1564 #ifndef STBI_NO_LINEAR  1565 static float   *stbi__ldr_to_hdr(stbi_uc *data, 
int x, 
int y, 
int comp)
  1569    if (!data) 
return NULL;
  1570    output = (
float *) stbi__malloc_mad4(x, y, comp, 
sizeof(
float), 0);
  1571    if (output == NULL) { STBI_FREE(data); 
return stbi__errpf(
"outofmem", 
"Out of memory"); }
  1573    if (comp & 1) n = comp; 
else n = comp-1;
  1574    for (i=0; i < x*y; ++i) {
  1575       for (k=0; k < n; ++k) {
  1576          output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
  1578       if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
  1586 #define stbi__float2int(x)   ((int) (x))  1587 static stbi_uc *stbi__hdr_to_ldr(
float   *data, 
int x, 
int y, 
int comp)
  1591    if (!data) 
return NULL;
  1592    output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
  1593    if (output == NULL) { STBI_FREE(data); 
return stbi__errpuc(
"outofmem", 
"Out of memory"); }
  1595    if (comp & 1) n = comp; 
else n = comp-1;
  1596    for (i=0; i < x*y; ++i) {
  1597       for (k=0; k < n; ++k) {
  1598          float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
  1600          if (z > 255) z = 255;
  1601          output[i*comp + k] = (stbi_uc) stbi__float2int(z);
  1604          float z = data[i*comp+k] * 255 + 0.5f;
  1606          if (z > 255) z = 255;
  1607          output[i*comp + k] = (stbi_uc) stbi__float2int(z);
  1636 #ifndef STBI_NO_JPEG  1639 #define FAST_BITS   9  // larger handles more cases; smaller stomps less cache  1643    stbi_uc  fast[1 << FAST_BITS];
  1645    stbi__uint16 code[256];
  1646    stbi_uc  values[256];
  1648    unsigned int maxcode[18];
  1655    stbi__huffman huff_dc[4];
  1656    stbi__huffman huff_ac[4];
  1657    stbi__uint16 dequant[4][64];
  1658    stbi__int16 fast_ac[4][1 << FAST_BITS];
  1661    int img_h_max, img_v_max;
  1662    int img_mcu_x, img_mcu_y;
  1663    int img_mcu_w, img_mcu_h;
  1676       void *raw_data, *raw_coeff;
  1679       int      coeff_w, coeff_h; 
  1682    stbi__uint32   code_buffer; 
  1684    unsigned char  marker;      
  1694    int            app14_color_transform; 
  1697    int scan_n, order[4];
  1698    int restart_interval, todo;
  1701    void (*idct_block_kernel)(stbi_uc *out, 
int out_stride, 
short data[64]);
  1702    void (*YCbCr_to_RGB_kernel)(stbi_uc *out, 
const stbi_uc *y, 
const stbi_uc *pcb, 
const stbi_uc *pcr, 
int count, 
int step);
  1703    stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs);
  1706 static int stbi__build_huffman(stbi__huffman *h, 
int *count)
  1710    for (i=0; i < 16; ++i)
  1711       for (j=0; j < count[i]; ++j)
  1712          h->size[k++] = (stbi_uc) (i+1);
  1718    for(j=1; j <= 16; ++j) {
  1720       h->delta[j] = k - code;
  1721       if (h->size[k] == j) {
  1722          while (h->size[k] == j)
  1723             h->code[k++] = (stbi__uint16) (code++);
  1724          if (code-1 >= (1 << j)) 
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
  1727       h->maxcode[j] = code << (16-j);
  1730    h->maxcode[j] = 0xffffffff;
  1733    memset(h->fast, 255, 1 << FAST_BITS);
  1734    for (i=0; i < k; ++i) {
  1736       if (s <= FAST_BITS) {
  1737          int c = h->code[i] << (FAST_BITS-s);
  1738          int m = 1 << (FAST_BITS-s);
  1739          for (j=0; j < m; ++j) {
  1740             h->fast[c+j] = (stbi_uc) i;
  1749 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
  1752    for (i=0; i < (1 << FAST_BITS); ++i) {
  1753       stbi_uc fast = h->fast[i];
  1756          int rs = h->values[fast];
  1757          int run = (rs >> 4) & 15;
  1758          int magbits = rs & 15;
  1759          int len = h->size[fast];
  1761          if (magbits && len + magbits <= FAST_BITS) {
  1763             int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
  1764             int m = 1 << (magbits - 1);
  1765             if (k < m) k += (~0U << magbits) + 1;
  1767             if (k >= -128 && k <= 127)
  1768                fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
  1774 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
  1777       int b = j->nomore ? 0 : stbi__get8(j->s);
  1779          int c = stbi__get8(j->s);
  1780          while (c == 0xff) c = stbi__get8(j->s); 
  1782             j->marker = (
unsigned char) c;
  1787       j->code_buffer |= b << (24 - j->code_bits);
  1789    } 
while (j->code_bits <= 24);
  1793 static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
  1796 stbi_inline 
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
  1801    if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
  1805    c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
  1809       if (s > j->code_bits)
  1811       j->code_buffer <<= s;
  1813       return h->values[k];
  1822    temp = j->code_buffer >> 16;
  1823    for (k=FAST_BITS+1 ; ; ++k)
  1824       if (temp < h->maxcode[k])
  1832    if (k > j->code_bits)
  1836    c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
  1837    STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
  1841    j->code_buffer <<= k;
  1842    return h->values[c];
  1846 static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
  1850 stbi_inline 
static int stbi__extend_receive(stbi__jpeg *j, 
int n)
  1854    if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
  1856    sgn = (stbi__int32)j->code_buffer >> 31; 
  1857    k = stbi_lrot(j->code_buffer, n);
  1858    STBI_ASSERT(n >= 0 && n < (
int) (
sizeof(stbi__bmask)/
sizeof(*stbi__bmask)));
  1859    j->code_buffer = k & ~stbi__bmask[n];
  1860    k &= stbi__bmask[n];
  1862    return k + (stbi__jbias[n] & ~sgn);
  1866 stbi_inline 
static int stbi__jpeg_get_bits(stbi__jpeg *j, 
int n)
  1869    if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
  1870    k = stbi_lrot(j->code_buffer, n);
  1871    j->code_buffer = k & ~stbi__bmask[n];
  1872    k &= stbi__bmask[n];
  1877 stbi_inline 
static int stbi__jpeg_get_bit(stbi__jpeg *j)
  1880    if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
  1882    j->code_buffer <<= 1;
  1884    return k & 0x80000000;
  1889 static stbi_uc stbi__jpeg_dezigzag[64+15] =
  1891     0,  1,  8, 16,  9,  2,  3, 10,
  1892    17, 24, 32, 25, 18, 11,  4,  5,
  1893    12, 19, 26, 33, 40, 48, 41, 34,
  1894    27, 20, 13,  6,  7, 14, 21, 28,
  1895    35, 42, 49, 56, 57, 50, 43, 36,
  1896    29, 22, 15, 23, 30, 37, 44, 51,
  1897    58, 59, 52, 45, 38, 31, 39, 46,
  1898    53, 60, 61, 54, 47, 55, 62, 63,
  1900    63, 63, 63, 63, 63, 63, 63, 63,
  1901    63, 63, 63, 63, 63, 63, 63
  1905 static int stbi__jpeg_decode_block(stbi__jpeg *j, 
short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, 
int b, stbi__uint16 *dequant)
  1910    if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
  1911    t = stbi__jpeg_huff_decode(j, hdc);
  1912    if (t < 0) 
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
  1915    memset(data,0,64*
sizeof(data[0]));
  1917    diff = t ? stbi__extend_receive(j, t) : 0;
  1918    dc = j->img_comp[b].dc_pred + diff;
  1919    j->img_comp[b].dc_pred = dc;
  1920    data[0] = (short) (dc * dequant[0]);
  1927       if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
  1928       c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
  1933          j->code_buffer <<= s;
  1936          zig = stbi__jpeg_dezigzag[k++];
  1937          data[zig] = (short) ((r >> 8) * dequant[zig]);
  1939          int rs = stbi__jpeg_huff_decode(j, hac);
  1940          if (rs < 0) 
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
  1944             if (rs != 0xf0) 
break; 
  1949             zig = stbi__jpeg_dezigzag[k++];
  1950             data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
  1957 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, 
short data[64], stbi__huffman *hdc, 
int b)
  1961    if (j->spec_end != 0) 
return stbi__err(
"can't merge dc and ac", 
"Corrupt JPEG");
  1963    if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
  1965    if (j->succ_high == 0) {
  1967       memset(data,0,64*
sizeof(data[0])); 
  1968       t = stbi__jpeg_huff_decode(j, hdc);
  1969       diff = t ? stbi__extend_receive(j, t) : 0;
  1971       dc = j->img_comp[b].dc_pred + diff;
  1972       j->img_comp[b].dc_pred = dc;
  1973       data[0] = (short) (dc << j->succ_low);
  1976       if (stbi__jpeg_get_bit(j))
  1977          data[0] += (
short) (1 << j->succ_low);
  1984 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, 
short data[64], stbi__huffman *hac, stbi__int16 *fac)
  1987    if (j->spec_start == 0) 
return stbi__err(
"can't merge dc and ac", 
"Corrupt JPEG");
  1989    if (j->succ_high == 0) {
  1990       int shift = j->succ_low;
  2001          if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
  2002          c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
  2007             j->code_buffer <<= s;
  2009             zig = stbi__jpeg_dezigzag[k++];
  2010             data[zig] = (short) ((r >> 8) << shift);
  2012             int rs = stbi__jpeg_huff_decode(j, hac);
  2013             if (rs < 0) 
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
  2018                   j->eob_run = (1 << r);
  2020                      j->eob_run += stbi__jpeg_get_bits(j, r);
  2027                zig = stbi__jpeg_dezigzag[k++];
  2028                data[zig] = (short) (stbi__extend_receive(j,s) << shift);
  2031       } 
while (k <= j->spec_end);
  2035       short bit = (short) (1 << j->succ_low);
  2039          for (k = j->spec_start; k <= j->spec_end; ++k) {
  2040             short *p = &data[stbi__jpeg_dezigzag[k]];
  2042                if (stbi__jpeg_get_bit(j))
  2043                   if ((*p & bit)==0) {
  2054             int rs = stbi__jpeg_huff_decode(j, hac); 
  2055             if (rs < 0) 
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
  2060                   j->eob_run = (1 << r) - 1;
  2062                      j->eob_run += stbi__jpeg_get_bits(j, r);
  2070                if (s != 1) 
return stbi__err(
"bad huffman code", 
"Corrupt JPEG");
  2072                if (stbi__jpeg_get_bit(j))
  2079             while (k <= j->spec_end) {
  2080                short *p = &data[stbi__jpeg_dezigzag[k++]];
  2082                   if (stbi__jpeg_get_bit(j))
  2083                      if ((*p & bit)==0) {
  2097          } 
while (k <= j->spec_end);
  2104 stbi_inline 
static stbi_uc stbi__clamp(
int x)
  2107    if ((
unsigned int) x > 255) {
  2108       if (x < 0) 
return 0;
  2109       if (x > 255) 
return 255;
  2114 #define stbi__f2f(x)  ((int) (((x) * 4096 + 0.5)))  2115 #define stbi__fsh(x)  ((x) << 12)  2118 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \  2119    int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \  2122    p1 = (p2+p3) * stbi__f2f(0.5411961f);       \  2123    t2 = p1 + p3*stbi__f2f(-1.847759065f);      \  2124    t3 = p1 + p2*stbi__f2f( 0.765366865f);      \  2127    t0 = stbi__fsh(p2+p3);                      \  2128    t1 = stbi__fsh(p2-p3);                      \  2141    p5 = (p3+p4)*stbi__f2f( 1.175875602f);      \  2142    t0 = t0*stbi__f2f( 0.298631336f);           \  2143    t1 = t1*stbi__f2f( 2.053119869f);           \  2144    t2 = t2*stbi__f2f( 3.072711026f);           \  2145    t3 = t3*stbi__f2f( 1.501321110f);           \  2146    p1 = p5 + p1*stbi__f2f(-0.899976223f);      \  2147    p2 = p5 + p2*stbi__f2f(-2.562915447f);      \  2148    p3 = p3*stbi__f2f(-1.961570560f);           \  2149    p4 = p4*stbi__f2f(-0.390180644f);           \  2155 static void stbi__idct_block(stbi_uc *out, 
int out_stride, 
short data[64])
  2157    int i,val[64],*v=val;
  2162    for (i=0; i < 8; ++i,++d, ++v) {
  2164       if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
  2165            && d[40]==0 && d[48]==0 && d[56]==0) {
  2170          int dcterm = d[0] << 2;
  2171          v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
  2173          STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
  2176          x0 += 512; x1 += 512; x2 += 512; x3 += 512;
  2177          v[ 0] = (x0+t3) >> 10;
  2178          v[56] = (x0-t3) >> 10;
  2179          v[ 8] = (x1+t2) >> 10;
  2180          v[48] = (x1-t2) >> 10;
  2181          v[16] = (x2+t1) >> 10;
  2182          v[40] = (x2-t1) >> 10;
  2183          v[24] = (x3+t0) >> 10;
  2184          v[32] = (x3-t0) >> 10;
  2188    for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
  2190       STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
  2197       x0 += 65536 + (128<<17);
  2198       x1 += 65536 + (128<<17);
  2199       x2 += 65536 + (128<<17);
  2200       x3 += 65536 + (128<<17);
  2203       o[0] = stbi__clamp((x0+t3) >> 17);
  2204       o[7] = stbi__clamp((x0-t3) >> 17);
  2205       o[1] = stbi__clamp((x1+t2) >> 17);
  2206       o[6] = stbi__clamp((x1-t2) >> 17);
  2207       o[2] = stbi__clamp((x2+t1) >> 17);
  2208       o[5] = stbi__clamp((x2-t1) >> 17);
  2209       o[3] = stbi__clamp((x3+t0) >> 17);
  2210       o[4] = stbi__clamp((x3-t0) >> 17);
  2218 static void stbi__idct_simd(stbi_uc *out, 
int out_stride, 
short data[64])
  2221    __m128i row0, row1, row2, row3, row4, row5, row6, row7;
  2225    #define dct_const(x,y)  _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))  2229    #define dct_rot(out0,out1, x,y,c0,c1) \  2230       __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \  2231       __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \  2232       __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \  2233       __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \  2234       __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \  2235       __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)  2238    #define dct_widen(out, in) \  2239       __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \  2240       __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)  2243    #define dct_wadd(out, a, b) \  2244       __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \  2245       __m128i out##_h = _mm_add_epi32(a##_h, b##_h)  2248    #define dct_wsub(out, a, b) \  2249       __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \  2250       __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)  2253    #define dct_bfly32o(out0, out1, a,b,bias,s) \  2255          __m128i abiased_l = _mm_add_epi32(a##_l, bias); \  2256          __m128i abiased_h = _mm_add_epi32(a##_h, bias); \  2257          dct_wadd(sum, abiased, b); \  2258          dct_wsub(dif, abiased, b); \  2259          out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \  2260          out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \  2264    #define dct_interleave8(a, b) \  2266       a = _mm_unpacklo_epi8(a, b); \  2267       b = _mm_unpackhi_epi8(tmp, b)  2270    #define dct_interleave16(a, b) \  2272       a = _mm_unpacklo_epi16(a, b); \  2273       b = _mm_unpackhi_epi16(tmp, b)  2275    #define dct_pass(bias,shift) \  2278          dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \  2279          __m128i sum04 = _mm_add_epi16(row0, row4); \  2280          __m128i dif04 = _mm_sub_epi16(row0, row4); \  2281          dct_widen(t0e, sum04); \  2282          dct_widen(t1e, dif04); \  2283          dct_wadd(x0, t0e, t3e); \  2284          dct_wsub(x3, t0e, t3e); \  2285          dct_wadd(x1, t1e, t2e); \  2286          dct_wsub(x2, t1e, t2e); \  2288          dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \  2289          dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \  2290          __m128i sum17 = _mm_add_epi16(row1, row7); \  2291          __m128i sum35 = _mm_add_epi16(row3, row5); \  2292          dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \  2293          dct_wadd(x4, y0o, y4o); \  2294          dct_wadd(x5, y1o, y5o); \  2295          dct_wadd(x6, y2o, y5o); \  2296          dct_wadd(x7, y3o, y4o); \  2297          dct_bfly32o(row0,row7, x0,x7,bias,shift); \  2298          dct_bfly32o(row1,row6, x1,x6,bias,shift); \  2299          dct_bfly32o(row2,row5, x2,x5,bias,shift); \  2300          dct_bfly32o(row3,row4, x3,x4,bias,shift); \  2303    __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
  2304    __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
  2305    __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
  2306    __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
  2307    __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
  2308    __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
  2309    __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
  2310    __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
  2313    __m128i bias_0 = _mm_set1_epi32(512);
  2314    __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
  2317    row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
  2318    row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
  2319    row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
  2320    row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
  2321    row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
  2322    row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
  2323    row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
  2324    row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
  2327    dct_pass(bias_0, 10);
  2331       dct_interleave16(row0, row4);
  2332       dct_interleave16(row1, row5);
  2333       dct_interleave16(row2, row6);
  2334       dct_interleave16(row3, row7);
  2337       dct_interleave16(row0, row2);
  2338       dct_interleave16(row1, row3);
  2339       dct_interleave16(row4, row6);
  2340       dct_interleave16(row5, row7);
  2343       dct_interleave16(row0, row1);
  2344       dct_interleave16(row2, row3);
  2345       dct_interleave16(row4, row5);
  2346       dct_interleave16(row6, row7);
  2350    dct_pass(bias_1, 17);
  2354       __m128i p0 = _mm_packus_epi16(row0, row1); 
  2355       __m128i p1 = _mm_packus_epi16(row2, row3);
  2356       __m128i p2 = _mm_packus_epi16(row4, row5);
  2357       __m128i p3 = _mm_packus_epi16(row6, row7);
  2360       dct_interleave8(p0, p2); 
  2361       dct_interleave8(p1, p3); 
  2364       dct_interleave8(p0, p1); 
  2365       dct_interleave8(p2, p3); 
  2368       dct_interleave8(p0, p2); 
  2369       dct_interleave8(p1, p3); 
  2372       _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
  2373       _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
  2374       _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
  2375       _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
  2376       _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
  2377       _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
  2378       _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
  2379       _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
  2388 #undef dct_interleave8  2389 #undef dct_interleave16  2399 static void stbi__idct_simd(stbi_uc *out, 
int out_stride, 
short data[64])
  2401    int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
  2403    int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
  2404    int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
  2405    int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
  2406    int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
  2407    int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
  2408    int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
  2409    int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
  2410    int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
  2411    int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
  2412    int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
  2413    int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
  2414    int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
  2416 #define dct_long_mul(out, inq, coeff) \  2417    int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \  2418    int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)  2420 #define dct_long_mac(out, acc, inq, coeff) \  2421    int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \  2422    int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)  2424 #define dct_widen(out, inq) \  2425    int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \  2426    int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)  2429 #define dct_wadd(out, a, b) \  2430    int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \  2431    int32x4_t out##_h = vaddq_s32(a##_h, b##_h)  2434 #define dct_wsub(out, a, b) \  2435    int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \  2436    int32x4_t out##_h = vsubq_s32(a##_h, b##_h)  2439 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \  2441       dct_wadd(sum, a, b); \  2442       dct_wsub(dif, a, b); \  2443       out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \  2444       out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \  2447 #define dct_pass(shiftop, shift) \  2450       int16x8_t sum26 = vaddq_s16(row2, row6); \  2451       dct_long_mul(p1e, sum26, rot0_0); \  2452       dct_long_mac(t2e, p1e, row6, rot0_1); \  2453       dct_long_mac(t3e, p1e, row2, rot0_2); \  2454       int16x8_t sum04 = vaddq_s16(row0, row4); \  2455       int16x8_t dif04 = vsubq_s16(row0, row4); \  2456       dct_widen(t0e, sum04); \  2457       dct_widen(t1e, dif04); \  2458       dct_wadd(x0, t0e, t3e); \  2459       dct_wsub(x3, t0e, t3e); \  2460       dct_wadd(x1, t1e, t2e); \  2461       dct_wsub(x2, t1e, t2e); \  2463       int16x8_t sum15 = vaddq_s16(row1, row5); \  2464       int16x8_t sum17 = vaddq_s16(row1, row7); \  2465       int16x8_t sum35 = vaddq_s16(row3, row5); \  2466       int16x8_t sum37 = vaddq_s16(row3, row7); \  2467       int16x8_t sumodd = vaddq_s16(sum17, sum35); \  2468       dct_long_mul(p5o, sumodd, rot1_0); \  2469       dct_long_mac(p1o, p5o, sum17, rot1_1); \  2470       dct_long_mac(p2o, p5o, sum35, rot1_2); \  2471       dct_long_mul(p3o, sum37, rot2_0); \  2472       dct_long_mul(p4o, sum15, rot2_1); \  2473       dct_wadd(sump13o, p1o, p3o); \  2474       dct_wadd(sump24o, p2o, p4o); \  2475       dct_wadd(sump23o, p2o, p3o); \  2476       dct_wadd(sump14o, p1o, p4o); \  2477       dct_long_mac(x4, sump13o, row7, rot3_0); \  2478       dct_long_mac(x5, sump24o, row5, rot3_1); \  2479       dct_long_mac(x6, sump23o, row3, rot3_2); \  2480       dct_long_mac(x7, sump14o, row1, rot3_3); \  2481       dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \  2482       dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \  2483       dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \  2484       dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \  2488    row0 = vld1q_s16(data + 0*8);
  2489    row1 = vld1q_s16(data + 1*8);
  2490    row2 = vld1q_s16(data + 2*8);
  2491    row3 = vld1q_s16(data + 3*8);
  2492    row4 = vld1q_s16(data + 4*8);
  2493    row5 = vld1q_s16(data + 5*8);
  2494    row6 = vld1q_s16(data + 6*8);
  2495    row7 = vld1q_s16(data + 7*8);
  2498    row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
  2501    dct_pass(vrshrn_n_s32, 10);
  2507 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }  2508 #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]); }  2509 #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)); }  2512       dct_trn16(row0, row1); 
  2513       dct_trn16(row2, row3);
  2514       dct_trn16(row4, row5);
  2515       dct_trn16(row6, row7);
  2518       dct_trn32(row0, row2); 
  2519       dct_trn32(row1, row3);
  2520       dct_trn32(row4, row6);
  2521       dct_trn32(row5, row7);
  2524       dct_trn64(row0, row4); 
  2525       dct_trn64(row1, row5);
  2526       dct_trn64(row2, row6);
  2527       dct_trn64(row3, row7);
  2538    dct_pass(vshrn_n_s32, 16);
  2542       uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
  2543       uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
  2544       uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
  2545       uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
  2546       uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
  2547       uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
  2548       uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
  2549       uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
  2552 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }  2553 #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]); }  2554 #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]); }  2566       dct_trn8_16(p0, p2);
  2567       dct_trn8_16(p1, p3);
  2568       dct_trn8_16(p4, p6);
  2569       dct_trn8_16(p5, p7);
  2572       dct_trn8_32(p0, p4);
  2573       dct_trn8_32(p1, p5);
  2574       dct_trn8_32(p2, p6);
  2575       dct_trn8_32(p3, p7);
  2578       vst1_u8(out, p0); out += out_stride;
  2579       vst1_u8(out, p1); out += out_stride;
  2580       vst1_u8(out, p2); out += out_stride;
  2581       vst1_u8(out, p3); out += out_stride;
  2582       vst1_u8(out, p4); out += out_stride;
  2583       vst1_u8(out, p5); out += out_stride;
  2584       vst1_u8(out, p6); out += out_stride;
  2603 #define STBI__MARKER_none  0xff  2607 static stbi_uc stbi__get_marker(stbi__jpeg *j)
  2610    if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; 
return x; }
  2611    x = stbi__get8(j->s);
  2612    if (x != 0xff) 
return STBI__MARKER_none;
  2614       x = stbi__get8(j->s); 
  2620 #define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)  2624 static void stbi__jpeg_reset(stbi__jpeg *j)
  2629    j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
  2630    j->marker = STBI__MARKER_none;
  2631    j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
  2637 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
  2639    stbi__jpeg_reset(z);
  2640    if (!z->progressive) {
  2641       if (z->scan_n == 1) {
  2643          STBI_SIMD_ALIGN(
short, data[64]);
  2644          int n = z->order[0];
  2649          int w = (z->img_comp[n].x+7) >> 3;
  2650          int h = (z->img_comp[n].y+7) >> 3;
  2651          for (j=0; j < h; ++j) {
  2652             for (i=0; i < w; ++i) {
  2653                int ha = z->img_comp[n].ha;
  2654                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;
  2655                z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
  2657                if (--z->todo <= 0) {
  2658                   if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
  2661                   if (!STBI__RESTART(z->marker)) 
return 1;
  2662                   stbi__jpeg_reset(z);
  2669          STBI_SIMD_ALIGN(
short, data[64]);
  2670          for (j=0; j < z->img_mcu_y; ++j) {
  2671             for (i=0; i < z->img_mcu_x; ++i) {
  2673                for (k=0; k < z->scan_n; ++k) {
  2674                   int n = z->order[k];
  2677                   for (y=0; y < z->img_comp[n].v; ++y) {
  2678                      for (x=0; x < z->img_comp[n].h; ++x) {
  2679                         int x2 = (i*z->img_comp[n].h + x)*8;
  2680                         int y2 = (j*z->img_comp[n].v + y)*8;
  2681                         int ha = z->img_comp[n].ha;
  2682                         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;
  2683                         z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
  2689                if (--z->todo <= 0) {
  2690                   if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
  2691                   if (!STBI__RESTART(z->marker)) 
return 1;
  2692                   stbi__jpeg_reset(z);
  2699       if (z->scan_n == 1) {
  2701          int n = z->order[0];
  2706          int w = (z->img_comp[n].x+7) >> 3;
  2707          int h = (z->img_comp[n].y+7) >> 3;
  2708          for (j=0; j < h; ++j) {
  2709             for (i=0; i < w; ++i) {
  2710                short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
  2711                if (z->spec_start == 0) {
  2712                   if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
  2715                   int ha = z->img_comp[n].ha;
  2716                   if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
  2720                if (--z->todo <= 0) {
  2721                   if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
  2722                   if (!STBI__RESTART(z->marker)) 
return 1;
  2723                   stbi__jpeg_reset(z);
  2730          for (j=0; j < z->img_mcu_y; ++j) {
  2731             for (i=0; i < z->img_mcu_x; ++i) {
  2733                for (k=0; k < z->scan_n; ++k) {
  2734                   int n = z->order[k];
  2737                   for (y=0; y < z->img_comp[n].v; ++y) {
  2738                      for (x=0; x < z->img_comp[n].h; ++x) {
  2739                         int x2 = (i*z->img_comp[n].h + x);
  2740                         int y2 = (j*z->img_comp[n].v + y);
  2741                         short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
  2742                         if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
  2749                if (--z->todo <= 0) {
  2750                   if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
  2751                   if (!STBI__RESTART(z->marker)) 
return 1;
  2752                   stbi__jpeg_reset(z);
  2761 static void stbi__jpeg_dequantize(
short *data, stbi__uint16 *dequant)
  2764    for (i=0; i < 64; ++i)
  2765       data[i] *= dequant[i];
  2768 static void stbi__jpeg_finish(stbi__jpeg *z)
  2770    if (z->progressive) {
  2773       for (n=0; n < z->s->img_n; ++n) {
  2774          int w = (z->img_comp[n].x+7) >> 3;
  2775          int h = (z->img_comp[n].y+7) >> 3;
  2776          for (j=0; j < h; ++j) {
  2777             for (i=0; i < w; ++i) {
  2778                short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
  2779                stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
  2780                z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
  2787 static int stbi__process_marker(stbi__jpeg *z, 
int m)
  2791       case STBI__MARKER_none: 
  2792          return stbi__err(
"expected marker",
"Corrupt JPEG");
  2795          if (stbi__get16be(z->s) != 4) 
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
  2796          z->restart_interval = stbi__get16be(z->s);
  2800          L = stbi__get16be(z->s)-2;
  2802             int q = stbi__get8(z->s);
  2803             int p = q >> 4, sixteen = (p != 0);
  2805             if (p != 0 && p != 1) 
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
  2806             if (t > 3) 
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
  2808             for (i=0; i < 64; ++i)
  2809                z->dequant[t][stbi__jpeg_dezigzag[i]] = sixteen ? stbi__get16be(z->s) : stbi__get8(z->s);
  2810             L -= (sixteen ? 129 : 65);
  2815          L = stbi__get16be(z->s)-2;
  2818             int sizes[16],i,n=0;
  2819             int q = stbi__get8(z->s);
  2822             if (tc > 1 || th > 3) 
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
  2823             for (i=0; i < 16; ++i) {
  2824                sizes[i] = stbi__get8(z->s);
  2829                if (!stbi__build_huffman(z->huff_dc+th, sizes)) 
return 0;
  2830                v = z->huff_dc[th].values;
  2832                if (!stbi__build_huffman(z->huff_ac+th, sizes)) 
return 0;
  2833                v = z->huff_ac[th].values;
  2835             for (i=0; i < n; ++i)
  2836                v[i] = stbi__get8(z->s);
  2838                stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
  2845    if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
  2846       L = stbi__get16be(z->s);
  2849             return stbi__err(
"bad COM len",
"Corrupt JPEG");
  2851             return stbi__err(
"bad APP len",
"Corrupt JPEG");
  2855       if (m == 0xE0 && L >= 5) { 
  2856          static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0'};
  2859          for (i=0; i < 5; ++i)
  2860             if (stbi__get8(z->s) != tag[i])
  2865       } 
else if (m == 0xEE && L >= 12) { 
  2866          static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0'};
  2869          for (i=0; i < 6; ++i)
  2870             if (stbi__get8(z->s) != tag[i])
  2875             stbi__get16be(z->s); 
  2876             stbi__get16be(z->s); 
  2877             z->app14_color_transform = stbi__get8(z->s); 
  2882       stbi__skip(z->s, L);
  2886    return stbi__err(
"unknown marker",
"Corrupt JPEG");
  2890 static int stbi__process_scan_header(stbi__jpeg *z)
  2893    int Ls = stbi__get16be(z->s);
  2894    z->scan_n = stbi__get8(z->s);
  2895    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");
  2896    if (Ls != 6+2*z->scan_n) 
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
  2897    for (i=0; i < z->scan_n; ++i) {
  2898       int id = stbi__get8(z->s), which;
  2899       int q = stbi__get8(z->s);
  2900       for (which = 0; which < z->s->img_n; ++which)
  2901          if (z->img_comp[which].id == 
id)
  2903       if (which == z->s->img_n) 
return 0; 
  2904       z->img_comp[which].hd = q >> 4;   
if (z->img_comp[which].hd > 3) 
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
  2905       z->img_comp[which].ha = q & 15;   
if (z->img_comp[which].ha > 3) 
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
  2906       z->order[i] = which;
  2911       z->spec_start = stbi__get8(z->s);
  2912       z->spec_end   = stbi__get8(z->s); 
  2913       aa = stbi__get8(z->s);
  2914       z->succ_high = (aa >> 4);
  2915       z->succ_low  = (aa & 15);
  2916       if (z->progressive) {
  2917          if (z->spec_start > 63 || z->spec_end > 63  || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
  2918             return stbi__err(
"bad SOS", 
"Corrupt JPEG");
  2920          if (z->spec_start != 0) 
return stbi__err(
"bad SOS",
"Corrupt JPEG");
  2921          if (z->succ_high != 0 || z->succ_low != 0) 
return stbi__err(
"bad SOS",
"Corrupt JPEG");
  2929 static int stbi__free_jpeg_components(stbi__jpeg *z, 
int ncomp, 
int why)
  2932    for (i=0; i < ncomp; ++i) {
  2933       if (z->img_comp[i].raw_data) {
  2934          STBI_FREE(z->img_comp[i].raw_data);
  2935          z->img_comp[i].raw_data = NULL;
  2936          z->img_comp[i].data = NULL;
  2938       if (z->img_comp[i].raw_coeff) {
  2939          STBI_FREE(z->img_comp[i].raw_coeff);
  2940          z->img_comp[i].raw_coeff = 0;
  2941          z->img_comp[i].coeff = 0;
  2943       if (z->img_comp[i].linebuf) {
  2944          STBI_FREE(z->img_comp[i].linebuf);
  2945          z->img_comp[i].linebuf = NULL;
  2951 static int stbi__process_frame_header(stbi__jpeg *z, 
int scan)
  2953    stbi__context *s = z->s;
  2954    int Lf,p,i,q, h_max=1,v_max=1,c;
  2955    Lf = stbi__get16be(s);         
if (Lf < 11) 
return stbi__err(
"bad SOF len",
"Corrupt JPEG"); 
  2956    p  = stbi__get8(s);            
if (p != 8) 
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only"); 
  2957    s->img_y = stbi__get16be(s);   
if (s->img_y == 0) 
return stbi__err(
"no header height", 
"JPEG format not supported: delayed height"); 
  2958    s->img_x = stbi__get16be(s);   
if (s->img_x == 0) 
return stbi__err(
"0 width",
"Corrupt JPEG"); 
  2960    if (c != 3 && c != 1 && c != 4) 
return stbi__err(
"bad component count",
"Corrupt JPEG");
  2962    for (i=0; i < c; ++i) {
  2963       z->img_comp[i].data = NULL;
  2964       z->img_comp[i].linebuf = NULL;
  2967    if (Lf != 8+3*s->img_n) 
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
  2970    for (i=0; i < s->img_n; ++i) {
  2971       static unsigned char rgb[3] = { 
'R', 
'G', 
'B' };
  2972       z->img_comp[i].id = stbi__get8(s);
  2973       if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
  2976       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");
  2977       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");
  2978       z->img_comp[i].tq = stbi__get8(s);  
if (z->img_comp[i].tq > 3) 
return stbi__err(
"bad TQ",
"Corrupt JPEG");
  2981    if (scan != STBI__SCAN_load) 
return 1;
  2983    if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) 
return stbi__err(
"too large", 
"Image too large to decode");
  2985    for (i=0; i < s->img_n; ++i) {
  2986       if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
  2987       if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
  2991    z->img_h_max = h_max;
  2992    z->img_v_max = v_max;
  2993    z->img_mcu_w = h_max * 8;
  2994    z->img_mcu_h = v_max * 8;
  2996    z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
  2997    z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
  2999    for (i=0; i < s->img_n; ++i) {
  3001       z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
  3002       z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
  3010       z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
  3011       z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
  3012       z->img_comp[i].coeff = 0;
  3013       z->img_comp[i].raw_coeff = 0;
  3014       z->img_comp[i].linebuf = NULL;
  3015       z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
  3016       if (z->img_comp[i].raw_data == NULL)
  3017          return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem", 
"Out of memory"));
  3019       z->img_comp[i].data = (stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
  3020       if (z->progressive) {
  3022          z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
  3023          z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
  3024          z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, 
sizeof(
short), 15);
  3025          if (z->img_comp[i].raw_coeff == NULL)
  3026             return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem", 
"Out of memory"));
  3027          z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
  3035 #define stbi__DNL(x)         ((x) == 0xdc)  3036 #define stbi__SOI(x)         ((x) == 0xd8)  3037 #define stbi__EOI(x)         ((x) == 0xd9)  3038 #define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)  3039 #define stbi__SOS(x)         ((x) == 0xda)  3041 #define stbi__SOF_progressive(x)   ((x) == 0xc2)  3043 static int stbi__decode_jpeg_header(stbi__jpeg *z, 
int scan)
  3047    z->app14_color_transform = -1; 
  3048    z->marker = STBI__MARKER_none; 
  3049    m = stbi__get_marker(z);
  3050    if (!stbi__SOI(m)) 
return stbi__err(
"no SOI",
"Corrupt JPEG");
  3051    if (scan == STBI__SCAN_type) 
return 1;
  3052    m = stbi__get_marker(z);
  3053    while (!stbi__SOF(m)) {
  3054       if (!stbi__process_marker(z,m)) 
return 0;
  3055       m = stbi__get_marker(z);
  3056       while (m == STBI__MARKER_none) {
  3058          if (stbi__at_eof(z->s)) 
return stbi__err(
"no SOF", 
"Corrupt JPEG");
  3059          m = stbi__get_marker(z);
  3062    z->progressive = stbi__SOF_progressive(m);
  3063    if (!stbi__process_frame_header(z, scan)) 
return 0;
  3068 static int stbi__decode_jpeg_image(stbi__jpeg *j)
  3071    for (m = 0; m < 4; m++) {
  3072       j->img_comp[m].raw_data = NULL;
  3073       j->img_comp[m].raw_coeff = NULL;
  3075    j->restart_interval = 0;
  3076    if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) 
return 0;
  3077    m = stbi__get_marker(j);
  3078    while (!stbi__EOI(m)) {
  3080          if (!stbi__process_scan_header(j)) 
return 0;
  3081          if (!stbi__parse_entropy_coded_data(j)) 
return 0;
  3082          if (j->marker == STBI__MARKER_none ) {
  3084             while (!stbi__at_eof(j->s)) {
  3085                int x = stbi__get8(j->s);
  3087                   j->marker = stbi__get8(j->s);
  3093       } 
else if (stbi__DNL(m)) {
  3094          int Ld = stbi__get16be(j->s);
  3095          stbi__uint32 NL = stbi__get16be(j->s);
  3096          if (Ld != 4) stbi__err(
"bad DNL len", 
"Corrupt JPEG");
  3097          if (NL != j->s->img_y) stbi__err(
"bad DNL height", 
"Corrupt JPEG");
  3099          if (!stbi__process_marker(j, m)) 
return 0;
  3101       m = stbi__get_marker(j);
  3104       stbi__jpeg_finish(j);
  3110 typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
  3113 #define stbi__div4(x) ((stbi_uc) ((x) >> 2))  3115 static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
  3118    STBI_NOTUSED(in_far);
  3124 static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
  3129    for (i=0; i < w; ++i)
  3130       out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
  3134 static stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
  3138    stbi_uc *input = in_near;
  3142       out[0] = out[1] = input[0];
  3147    out[1] = stbi__div4(input[0]*3 + input[1] + 2);
  3148    for (i=1; i < w-1; ++i) {
  3149       int n = 3*input[i]+2;
  3150       out[i*2+0] = stbi__div4(n+input[i-1]);
  3151       out[i*2+1] = stbi__div4(n+input[i+1]);
  3153    out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
  3154    out[i*2+1] = input[w-1];
  3156    STBI_NOTUSED(in_far);
  3162 #define stbi__div16(x) ((stbi_uc) ((x) >> 4))  3164 static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
  3169       out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
  3173    t1 = 3*in_near[0] + in_far[0];
  3174    out[0] = stbi__div4(t1+2);
  3175    for (i=1; i < w; ++i) {
  3177       t1 = 3*in_near[i]+in_far[i];
  3178       out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
  3179       out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
  3181    out[w*2-1] = stbi__div4(t1+2);
  3188 #if defined(STBI_SSE2) || defined(STBI_NEON)  3189 static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
  3195       out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
  3199    t1 = 3*in_near[0] + in_far[0];
  3203    for (; i < ((w-1) & ~7); i += 8) {
  3204 #if defined(STBI_SSE2)  3207       __m128i zero  = _mm_setzero_si128();
  3208       __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));
  3209       __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
  3210       __m128i farw  = _mm_unpacklo_epi8(farb, zero);
  3211       __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
  3212       __m128i diff  = _mm_sub_epi16(farw, nearw);
  3213       __m128i nears = _mm_slli_epi16(nearw, 2);
  3214       __m128i curr  = _mm_add_epi16(nears, diff); 
  3221       __m128i prv0 = _mm_slli_si128(curr, 2);
  3222       __m128i nxt0 = _mm_srli_si128(curr, 2);
  3223       __m128i prev = _mm_insert_epi16(prv0, t1, 0);
  3224       __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
  3230       __m128i bias  = _mm_set1_epi16(8);
  3231       __m128i curs = _mm_slli_epi16(curr, 2);
  3232       __m128i prvd = _mm_sub_epi16(prev, curr);
  3233       __m128i nxtd = _mm_sub_epi16(next, curr);
  3234       __m128i curb = _mm_add_epi16(curs, bias);
  3235       __m128i even = _mm_add_epi16(prvd, curb);
  3236       __m128i odd  = _mm_add_epi16(nxtd, curb);
  3239       __m128i int0 = _mm_unpacklo_epi16(even, odd);
  3240       __m128i int1 = _mm_unpackhi_epi16(even, odd);
  3241       __m128i de0  = _mm_srli_epi16(int0, 4);
  3242       __m128i de1  = _mm_srli_epi16(int1, 4);
  3245       __m128i outv = _mm_packus_epi16(de0, de1);
  3246       _mm_storeu_si128((__m128i *) (out + i*2), outv);
  3247 #elif defined(STBI_NEON)  3250       uint8x8_t farb  = vld1_u8(in_far + i);
  3251       uint8x8_t nearb = vld1_u8(in_near + i);
  3252       int16x8_t diff  = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
  3253       int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
  3254       int16x8_t curr  = vaddq_s16(nears, diff); 
  3261       int16x8_t prv0 = vextq_s16(curr, curr, 7);
  3262       int16x8_t nxt0 = vextq_s16(curr, curr, 1);
  3263       int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
  3264       int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
  3270       int16x8_t curs = vshlq_n_s16(curr, 2);
  3271       int16x8_t prvd = vsubq_s16(prev, curr);
  3272       int16x8_t nxtd = vsubq_s16(next, curr);
  3273       int16x8_t even = vaddq_s16(curs, prvd);
  3274       int16x8_t odd  = vaddq_s16(curs, nxtd);
  3278       o.val[0] = vqrshrun_n_s16(even, 4);
  3279       o.val[1] = vqrshrun_n_s16(odd,  4);
  3280       vst2_u8(out + i*2, o);
  3284       t1 = 3*in_near[i+7] + in_far[i+7];
  3288    t1 = 3*in_near[i] + in_far[i];
  3289    out[i*2] = stbi__div16(3*t1 + t0 + 8);
  3291    for (++i; i < w; ++i) {
  3293       t1 = 3*in_near[i]+in_far[i];
  3294       out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
  3295       out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
  3297    out[w*2-1] = stbi__div4(t1+2);
  3305 static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
  3309    STBI_NOTUSED(in_far);
  3310    for (i=0; i < w; ++i)
  3311       for (j=0; j < hs; ++j)
  3312          out[i*hs+j] = in_near[i];
  3318 #define stbi__float2fixed(x)  (((int) ((x) * 4096.0f + 0.5f)) << 8)  3319 static void stbi__YCbCr_to_RGB_row(stbi_uc *out, 
const stbi_uc *y, 
const stbi_uc *pcb, 
const stbi_uc *pcr, 
int count, 
int step)
  3322    for (i=0; i < count; ++i) {
  3323       int y_fixed = (y[i] << 20) + (1<<19); 
  3325       int cr = pcr[i] - 128;
  3326       int cb = pcb[i] - 128;
  3327       r = y_fixed +  cr* stbi__float2fixed(1.40200f);
  3328       g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
  3329       b = y_fixed                                     +   cb* stbi__float2fixed(1.77200f);
  3333       if ((
unsigned) r > 255) { 
if (r < 0) r = 0; 
else r = 255; }
  3334       if ((
unsigned) g > 255) { 
if (g < 0) g = 0; 
else g = 255; }
  3335       if ((
unsigned) b > 255) { 
if (b < 0) b = 0; 
else b = 255; }
  3336       out[0] = (stbi_uc)r;
  3337       out[1] = (stbi_uc)g;
  3338       out[2] = (stbi_uc)b;
  3344 #if defined(STBI_SSE2) || defined(STBI_NEON)  3345 static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc 
const *y, stbi_uc 
const *pcb, stbi_uc 
const *pcr, 
int count, 
int step)
  3355       __m128i signflip  = _mm_set1_epi8(-0x80);
  3356       __m128i cr_const0 = _mm_set1_epi16(   (
short) ( 1.40200f*4096.0f+0.5f));
  3357       __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
  3358       __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
  3359       __m128i cb_const1 = _mm_set1_epi16(   (
short) ( 1.77200f*4096.0f+0.5f));
  3360       __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
  3361       __m128i xw = _mm_set1_epi16(255); 
  3363       for (; i+7 < count; i += 8) {
  3365          __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
  3366          __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
  3367          __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
  3368          __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); 
  3369          __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); 
  3372          __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);
  3373          __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
  3374          __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
  3377          __m128i yws = _mm_srli_epi16(yw, 4);
  3378          __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
  3379          __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
  3380          __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
  3381          __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
  3382          __m128i rws = _mm_add_epi16(cr0, yws);
  3383          __m128i gwt = _mm_add_epi16(cb0, yws);
  3384          __m128i bws = _mm_add_epi16(yws, cb1);
  3385          __m128i gws = _mm_add_epi16(gwt, cr1);
  3388          __m128i rw = _mm_srai_epi16(rws, 4);
  3389          __m128i bw = _mm_srai_epi16(bws, 4);
  3390          __m128i gw = _mm_srai_epi16(gws, 4);
  3393          __m128i brb = _mm_packus_epi16(rw, bw);
  3394          __m128i gxb = _mm_packus_epi16(gw, xw);
  3397          __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
  3398          __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
  3399          __m128i o0 = _mm_unpacklo_epi16(t0, t1);
  3400          __m128i o1 = _mm_unpackhi_epi16(t0, t1);
  3403          _mm_storeu_si128((__m128i *) (out + 0), o0);
  3404          _mm_storeu_si128((__m128i *) (out + 16), o1);
  3414       uint8x8_t signflip = vdup_n_u8(0x80);
  3415       int16x8_t cr_const0 = vdupq_n_s16(   (
short) ( 1.40200f*4096.0f+0.5f));
  3416       int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
  3417       int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
  3418       int16x8_t cb_const1 = vdupq_n_s16(   (
short) ( 1.77200f*4096.0f+0.5f));
  3420       for (; i+7 < count; i += 8) {
  3422          uint8x8_t y_bytes  = vld1_u8(y + i);
  3423          uint8x8_t cr_bytes = vld1_u8(pcr + i);
  3424          uint8x8_t cb_bytes = vld1_u8(pcb + i);
  3425          int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
  3426          int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
  3429          int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
  3430          int16x8_t crw = vshll_n_s8(cr_biased, 7);
  3431          int16x8_t cbw = vshll_n_s8(cb_biased, 7);
  3434          int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
  3435          int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
  3436          int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
  3437          int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
  3438          int16x8_t rws = vaddq_s16(yws, cr0);
  3439          int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
  3440          int16x8_t bws = vaddq_s16(yws, cb1);
  3444          o.val[0] = vqrshrun_n_s16(rws, 4);
  3445          o.val[1] = vqrshrun_n_s16(gws, 4);
  3446          o.val[2] = vqrshrun_n_s16(bws, 4);
  3447          o.val[3] = vdup_n_u8(255);
  3456    for (; i < count; ++i) {
  3457       int y_fixed = (y[i] << 20) + (1<<19); 
  3459       int cr = pcr[i] - 128;
  3460       int cb = pcb[i] - 128;
  3461       r = y_fixed + cr* stbi__float2fixed(1.40200f);
  3462       g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
  3463       b = y_fixed                                   +   cb* stbi__float2fixed(1.77200f);
  3467       if ((
unsigned) r > 255) { 
if (r < 0) r = 0; 
else r = 255; }
  3468       if ((
unsigned) g > 255) { 
if (g < 0) g = 0; 
else g = 255; }
  3469       if ((
unsigned) b > 255) { 
if (b < 0) b = 0; 
else b = 255; }
  3470       out[0] = (stbi_uc)r;
  3471       out[1] = (stbi_uc)g;
  3472       out[2] = (stbi_uc)b;
  3480 static void stbi__setup_jpeg(stbi__jpeg *j)
  3482    j->idct_block_kernel = stbi__idct_block;
  3483    j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
  3484    j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
  3487    if (stbi__sse2_available()) {
  3488       j->idct_block_kernel = stbi__idct_simd;
  3489       j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
  3490       j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
  3495    j->idct_block_kernel = stbi__idct_simd;
  3496    j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
  3497    j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
  3502 static void stbi__cleanup_jpeg(stbi__jpeg *j)
  3504    stbi__free_jpeg_components(j, j->s->img_n, 0);
  3509    resample_row_func resample;
  3510    stbi_uc *line0,*line1;
  3518 static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
  3520    unsigned int t = x*y + 128;
  3521    return (stbi_uc) ((t + (t >>8)) >> 8);
  3524 static stbi_uc *load_jpeg_image(stbi__jpeg *z, 
int *out_x, 
int *out_y, 
int *comp, 
int req_comp)
  3526    int n, decode_n, is_rgb;
  3530    if (req_comp < 0 || req_comp > 4) 
return stbi__errpuc(
"bad req_comp", 
"Internal error");
  3533    if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); 
return NULL; }
  3536    n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
  3538    is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
  3540    if (z->s->img_n == 3 && n < 3 && !is_rgb)
  3543       decode_n = z->s->img_n;
  3550       stbi_uc *coutput[4];
  3552       stbi__resample res_comp[4];
  3554       for (k=0; k < decode_n; ++k) {
  3555          stbi__resample *r = &res_comp[k];
  3559          z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
  3560          if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); 
return stbi__errpuc(
"outofmem", 
"Out of memory"); }
  3562          r->hs      = z->img_h_max / z->img_comp[k].h;
  3563          r->vs      = z->img_v_max / z->img_comp[k].v;
  3564          r->ystep   = r->vs >> 1;
  3565          r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
  3567          r->line0   = r->line1 = z->img_comp[k].data;
  3569          if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
  3570          else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
  3571          else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
  3572          else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
  3573          else                               r->resample = stbi__resample_row_generic;
  3577       output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
  3578       if (!output) { stbi__cleanup_jpeg(z); 
return stbi__errpuc(
"outofmem", 
"Out of memory"); }
  3581       for (j=0; j < z->s->img_y; ++j) {
  3582          stbi_uc *out = output + n * z->s->img_x * j;
  3583          for (k=0; k < decode_n; ++k) {
  3584             stbi__resample *r = &res_comp[k];
  3585             int y_bot = r->ystep >= (r->vs >> 1);
  3586             coutput[k] = r->resample(z->img_comp[k].linebuf,
  3587                                      y_bot ? r->line1 : r->line0,
  3588                                      y_bot ? r->line0 : r->line1,
  3590             if (++r->ystep >= r->vs) {
  3592                r->line0 = r->line1;
  3593                if (++r->ypos < z->img_comp[k].y)
  3594                   r->line1 += z->img_comp[k].w2;
  3598             stbi_uc *y = coutput[0];
  3599             if (z->s->img_n == 3) {
  3601                   for (i=0; i < z->s->img_x; ++i) {
  3603                      out[1] = coutput[1][i];
  3604                      out[2] = coutput[2][i];
  3609                   z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
  3611             } 
else if (z->s->img_n == 4) {
  3612                if (z->app14_color_transform == 0) { 
  3613                   for (i=0; i < z->s->img_x; ++i) {
  3614                      stbi_uc k = coutput[3][i];
  3615                      out[0] = stbi__blinn_8x8(coutput[0][i], k);
  3616                      out[1] = stbi__blinn_8x8(coutput[1][i], k);
  3617                      out[2] = stbi__blinn_8x8(coutput[2][i], k);
  3621                } 
else if (z->app14_color_transform == 2) { 
  3622                   z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
  3623                   for (i=0; i < z->s->img_x; ++i) {
  3624                      stbi_uc k = coutput[3][i];
  3625                      out[0] = stbi__blinn_8x8(255 - out[0], k);
  3626                      out[1] = stbi__blinn_8x8(255 - out[1], k);
  3627                      out[2] = stbi__blinn_8x8(255 - out[2], k);
  3631                   z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
  3634                for (i=0; i < z->s->img_x; ++i) {
  3635                   out[0] = out[1] = out[2] = y[i];
  3642                   for (i=0; i < z->s->img_x; ++i)
  3643                      *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
  3645                   for (i=0; i < z->s->img_x; ++i, out += 2) {
  3646                      out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
  3650             } 
else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
  3651                for (i=0; i < z->s->img_x; ++i) {
  3652                   stbi_uc k = coutput[3][i];
  3653                   stbi_uc r = stbi__blinn_8x8(coutput[0][i], k);
  3654                   stbi_uc g = stbi__blinn_8x8(coutput[1][i], k);
  3655                   stbi_uc b = stbi__blinn_8x8(coutput[2][i], k);
  3656                   out[0] = stbi__compute_y(r, g, b);
  3660             } 
else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
  3661                for (i=0; i < z->s->img_x; ++i) {
  3662                   out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
  3667                stbi_uc *y = coutput[0];
  3669                   for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
  3671                   for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
  3675       stbi__cleanup_jpeg(z);
  3676       *out_x = z->s->img_x;
  3677       *out_y = z->s->img_y;
  3678       if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; 
  3683 static void *stbi__jpeg_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
  3685    unsigned char* result;
  3686    stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(
sizeof(stbi__jpeg));
  3689    stbi__setup_jpeg(j);
  3690    result = load_jpeg_image(j, x,y,comp,req_comp);
  3695 static int stbi__jpeg_test(stbi__context *s)
  3698    stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
  3700    stbi__setup_jpeg(j);
  3701    r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
  3707 static int stbi__jpeg_info_raw(stbi__jpeg *j, 
int *x, 
int *y, 
int *comp)
  3709    if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
  3710       stbi__rewind( j->s );
  3713    if (x) *x = j->s->img_x;
  3714    if (y) *y = j->s->img_y;
  3715    if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
  3719 static int stbi__jpeg_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  3722    stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(
sizeof(stbi__jpeg)));
  3724    result = stbi__jpeg_info_raw(j, x, y, comp);
  3737 #ifndef STBI_NO_ZLIB  3740 #define STBI__ZFAST_BITS  9 // accelerate all cases in default tables  3741 #define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1)  3747    stbi__uint16 fast[1 << STBI__ZFAST_BITS];
  3748    stbi__uint16 firstcode[16];
  3750    stbi__uint16 firstsymbol[16];
  3752    stbi__uint16 value[288];
  3755 stbi_inline 
static int stbi__bitreverse16(
int n)
  3757   n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);
  3758   n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);
  3759   n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);
  3760   n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);
  3764 stbi_inline 
static int stbi__bit_reverse(
int v, 
int bits)
  3766    STBI_ASSERT(bits <= 16);
  3769    return stbi__bitreverse16(v) >> (16-bits);
  3772 static int stbi__zbuild_huffman(stbi__zhuffman *z, 
const stbi_uc *sizelist, 
int num)
  3775    int code, next_code[16], sizes[17];
  3778    memset(sizes, 0, 
sizeof(sizes));
  3779    memset(z->fast, 0, 
sizeof(z->fast));
  3780    for (i=0; i < num; ++i)
  3781       ++sizes[sizelist[i]];
  3783    for (i=1; i < 16; ++i)
  3784       if (sizes[i] > (1 << i))
  3785          return stbi__err(
"bad sizes", 
"Corrupt PNG");
  3787    for (i=1; i < 16; ++i) {
  3788       next_code[i] = code;
  3789       z->firstcode[i] = (stbi__uint16) code;
  3790       z->firstsymbol[i] = (stbi__uint16) k;
  3791       code = (code + sizes[i]);
  3793          if (code-1 >= (1 << i)) 
return stbi__err(
"bad codelengths",
"Corrupt PNG");
  3794       z->maxcode[i] = code << (16-i); 
  3798    z->maxcode[16] = 0x10000; 
  3799    for (i=0; i < num; ++i) {
  3800       int s = sizelist[i];
  3802          int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
  3803          stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
  3804          z->size [c] = (stbi_uc     ) s;
  3805          z->value[c] = (stbi__uint16) i;
  3806          if (s <= STBI__ZFAST_BITS) {
  3807             int j = stbi__bit_reverse(next_code[s],s);
  3808             while (j < (1 << STBI__ZFAST_BITS)) {
  3827    stbi_uc *zbuffer, *zbuffer_end;
  3829    stbi__uint32 code_buffer;
  3836    stbi__zhuffman z_length, z_distance;
  3839 stbi_inline 
static stbi_uc stbi__zget8(stbi__zbuf *z)
  3841    if (z->zbuffer >= z->zbuffer_end) 
return 0;
  3842    return *z->zbuffer++;
  3845 static void stbi__fill_bits(stbi__zbuf *z)
  3848       STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
  3849       z->code_buffer |= (
unsigned int) stbi__zget8(z) << z->num_bits;
  3851    } 
while (z->num_bits <= 24);
  3854 stbi_inline 
static unsigned int stbi__zreceive(stbi__zbuf *z, 
int n)
  3857    if (z->num_bits < n) stbi__fill_bits(z);
  3858    k = z->code_buffer & ((1 << n) - 1);
  3859    z->code_buffer >>= n;
  3864 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
  3869    k = stbi__bit_reverse(a->code_buffer, 16);
  3870    for (s=STBI__ZFAST_BITS+1; ; ++s)
  3871       if (k < z->maxcode[s])
  3873    if (s == 16) 
return -1; 
  3875    b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
  3876    STBI_ASSERT(z->size[b] == s);
  3877    a->code_buffer >>= s;
  3882 stbi_inline 
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
  3885    if (a->num_bits < 16) stbi__fill_bits(a);
  3886    b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
  3889       a->code_buffer >>= s;
  3893    return stbi__zhuffman_decode_slowpath(a, z);
  3896 static int stbi__zexpand(stbi__zbuf *z, 
char *zout, 
int n)  
  3899    int cur, limit, old_limit;
  3901    if (!z->z_expandable) 
return stbi__err(
"output buffer limit",
"Corrupt PNG");
  3902    cur   = (int) (z->zout     - z->zout_start);
  3903    limit = old_limit = (int) (z->zout_end - z->zout_start);
  3904    while (cur + n > limit)
  3906    q = (
char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
  3907    STBI_NOTUSED(old_limit);
  3908    if (q == NULL) 
return stbi__err(
"outofmem", 
"Out of memory");
  3911    z->zout_end   = q + limit;
  3915 static int stbi__zlength_base[31] = {
  3916    3,4,5,6,7,8,9,10,11,13,
  3917    15,17,19,23,27,31,35,43,51,59,
  3918    67,83,99,115,131,163,195,227,258,0,0 };
  3920 static int stbi__zlength_extra[31]=
  3921 { 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 };
  3923 static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
  3924 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
  3926 static int stbi__zdist_extra[32] =
  3927 { 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};
  3929 static int stbi__parse_huffman_block(stbi__zbuf *a)
  3931    char *zout = a->zout;
  3933       int z = stbi__zhuffman_decode(a, &a->z_length);
  3935          if (z < 0) 
return stbi__err(
"bad huffman code",
"Corrupt PNG"); 
  3936          if (zout >= a->zout_end) {
  3937             if (!stbi__zexpand(a, zout, 1)) 
return 0;
  3949          len = stbi__zlength_base[z];
  3950          if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
  3951          z = stbi__zhuffman_decode(a, &a->z_distance);
  3952          if (z < 0) 
return stbi__err(
"bad huffman code",
"Corrupt PNG");
  3953          dist = stbi__zdist_base[z];
  3954          if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
  3955          if (zout - a->zout_start < dist) 
return stbi__err(
"bad dist",
"Corrupt PNG");
  3956          if (zout + len > a->zout_end) {
  3957             if (!stbi__zexpand(a, zout, len)) 
return 0;
  3960          p = (stbi_uc *) (zout - dist);
  3963             if (len) { 
do *zout++ = v; 
while (--len); }
  3965             if (len) { 
do *zout++ = *p++; 
while (--len); }
  3971 static int stbi__compute_huffman_codes(stbi__zbuf *a)
  3973    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 };
  3974    stbi__zhuffman z_codelength;
  3975    stbi_uc lencodes[286+32+137];
  3976    stbi_uc codelength_sizes[19];
  3979    int hlit  = stbi__zreceive(a,5) + 257;
  3980    int hdist = stbi__zreceive(a,5) + 1;
  3981    int hclen = stbi__zreceive(a,4) + 4;
  3982    int ntot  = hlit + hdist;
  3984    memset(codelength_sizes, 0, 
sizeof(codelength_sizes));
  3985    for (i=0; i < hclen; ++i) {
  3986       int s = stbi__zreceive(a,3);
  3987       codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
  3989    if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) 
return 0;
  3993       int c = stbi__zhuffman_decode(a, &z_codelength);
  3994       if (c < 0 || c >= 19) 
return stbi__err(
"bad codelengths", 
"Corrupt PNG");
  3996          lencodes[n++] = (stbi_uc) c;
  4000             c = stbi__zreceive(a,2)+3;
  4001             if (n == 0) 
return stbi__err(
"bad codelengths", 
"Corrupt PNG");
  4002             fill = lencodes[n-1];
  4004             c = stbi__zreceive(a,3)+3;
  4006             STBI_ASSERT(c == 18);
  4007             c = stbi__zreceive(a,7)+11;
  4009          if (ntot - n < c) 
return stbi__err(
"bad codelengths", 
"Corrupt PNG");
  4010          memset(lencodes+n, fill, c);
  4014    if (n != ntot) 
return stbi__err(
"bad codelengths",
"Corrupt PNG");
  4015    if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) 
return 0;
  4016    if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) 
return 0;
  4020 static int stbi__parse_uncompressed_block(stbi__zbuf *a)
  4024    if (a->num_bits & 7)
  4025       stbi__zreceive(a, a->num_bits & 7); 
  4028    while (a->num_bits > 0) {
  4029       header[k++] = (stbi_uc) (a->code_buffer & 255); 
  4030       a->code_buffer >>= 8;
  4033    STBI_ASSERT(a->num_bits == 0);
  4036       header[k++] = stbi__zget8(a);
  4037    len  = header[1] * 256 + header[0];
  4038    nlen = header[3] * 256 + header[2];
  4039    if (nlen != (len ^ 0xffff)) 
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
  4040    if (a->zbuffer + len > a->zbuffer_end) 
return stbi__err(
"read past buffer",
"Corrupt PNG");
  4041    if (a->zout + len > a->zout_end)
  4042       if (!stbi__zexpand(a, a->zout, len)) 
return 0;
  4043    memcpy(a->zout, a->zbuffer, len);
  4049 static int stbi__parse_zlib_header(stbi__zbuf *a)
  4051    int cmf   = stbi__zget8(a);
  4054    int flg   = stbi__zget8(a);
  4055    if ((cmf*256+flg) % 31 != 0) 
return stbi__err(
"bad zlib header",
"Corrupt PNG"); 
  4056    if (flg & 32) 
return stbi__err(
"no preset dict",
"Corrupt PNG"); 
  4057    if (cm != 8) 
return stbi__err(
"bad compression",
"Corrupt PNG"); 
  4062 static const stbi_uc stbi__zdefault_length[288] =
  4064    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
  4065    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
  4066    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
  4067    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
  4068    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
  4069    9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
  4070    9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
  4071    9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
  4072    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8
  4074 static const stbi_uc stbi__zdefault_distance[32] =
  4076    5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
  4091 static int stbi__parse_zlib(stbi__zbuf *a, 
int parse_header)
  4095       if (!stbi__parse_zlib_header(a)) 
return 0;
  4099       final = stbi__zreceive(a,1);
  4100       type = stbi__zreceive(a,2);
  4102          if (!stbi__parse_uncompressed_block(a)) 
return 0;
  4103       } 
else if (type == 3) {
  4108             if (!stbi__zbuild_huffman(&a->z_length  , stbi__zdefault_length  , 288)) 
return 0;
  4109             if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance,  32)) 
return 0;
  4111             if (!stbi__compute_huffman_codes(a)) 
return 0;
  4113          if (!stbi__parse_huffman_block(a)) 
return 0;
  4119 static int stbi__do_zlib(stbi__zbuf *a, 
char *obuf, 
int olen, 
int exp, 
int parse_header)
  4121    a->zout_start = obuf;
  4123    a->zout_end   = obuf + olen;
  4124    a->z_expandable = exp;
  4126    return stbi__parse_zlib(a, parse_header);
  4129 STBIDEF 
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer, 
int len, 
int initial_size, 
int *outlen)
  4132    char *p = (
char *) stbi__malloc(initial_size);
  4133    if (p == NULL) 
return NULL;
  4134    a.zbuffer = (stbi_uc *) buffer;
  4135    a.zbuffer_end = (stbi_uc *) buffer + len;
  4136    if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
  4137       if (outlen) *outlen = (int) (a.zout - a.zout_start);
  4138       return a.zout_start;
  4140       STBI_FREE(a.zout_start);
  4145 STBIDEF 
char *stbi_zlib_decode_malloc(
char const *buffer, 
int len, 
int *outlen)
  4147    return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
  4150 STBIDEF 
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer, 
int len, 
int initial_size, 
int *outlen, 
int parse_header)
  4153    char *p = (
char *) stbi__malloc(initial_size);
  4154    if (p == NULL) 
return NULL;
  4155    a.zbuffer = (stbi_uc *) buffer;
  4156    a.zbuffer_end = (stbi_uc *) buffer + len;
  4157    if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
  4158       if (outlen) *outlen = (int) (a.zout - a.zout_start);
  4159       return a.zout_start;
  4161       STBI_FREE(a.zout_start);
  4166 STBIDEF 
int stbi_zlib_decode_buffer(
char *obuffer, 
int olen, 
char const *ibuffer, 
int ilen)
  4169    a.zbuffer = (stbi_uc *) ibuffer;
  4170    a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
  4171    if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
  4172       return (
int) (a.zout - a.zout_start);
  4177 STBIDEF 
char *stbi_zlib_decode_noheader_malloc(
char const *buffer, 
int len, 
int *outlen)
  4180    char *p = (
char *) stbi__malloc(16384);
  4181    if (p == NULL) 
return NULL;
  4182    a.zbuffer = (stbi_uc *) buffer;
  4183    a.zbuffer_end = (stbi_uc *) buffer+len;
  4184    if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
  4185       if (outlen) *outlen = (int) (a.zout - a.zout_start);
  4186       return a.zout_start;
  4188       STBI_FREE(a.zout_start);
  4193 STBIDEF 
int stbi_zlib_decode_noheader_buffer(
char *obuffer, 
int olen, 
const char *ibuffer, 
int ilen)
  4196    a.zbuffer = (stbi_uc *) ibuffer;
  4197    a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
  4198    if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
  4199       return (
int) (a.zout - a.zout_start);
  4218    stbi__uint32 length;
  4222 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
  4225    c.length = stbi__get32be(s);
  4226    c.type   = stbi__get32be(s);
  4230 static int stbi__check_png_header(stbi__context *s)
  4232    static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
  4234    for (i=0; i < 8; ++i)
  4235       if (stbi__get8(s) != png_sig[i]) 
return stbi__err(
"bad png sig",
"Not a PNG");
  4242    stbi_uc *idata, *expanded, *out;
  4258 static stbi_uc first_row_filter[5] =
  4267 static int stbi__paeth(
int a, 
int b, 
int c)
  4273    if (pa <= pb && pa <= pc) 
return a;
  4274    if (pb <= pc) 
return b;
  4278 static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
  4281 static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, 
int out_n, stbi__uint32 x, stbi__uint32 y, 
int depth, 
int color)
  4283    int bytes = (depth == 16? 2 : 1);
  4284    stbi__context *s = a->s;
  4285    stbi__uint32 i,j,stride = x*out_n*bytes;
  4286    stbi__uint32 img_len, img_width_bytes;
  4288    int img_n = s->img_n; 
  4290    int output_bytes = out_n*bytes;
  4291    int filter_bytes = img_n*bytes;
  4294    STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
  4295    a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); 
  4296    if (!a->out) 
return stbi__err(
"outofmem", 
"Out of memory");
  4298    img_width_bytes = (((img_n * x * depth) + 7) >> 3);
  4299    img_len = (img_width_bytes + 1) * y;
  4300    if (s->img_x == x && s->img_y == y) {
  4301       if (raw_len != img_len) 
return stbi__err(
"not enough pixels",
"Corrupt PNG");
  4303       if (raw_len < img_len) 
return stbi__err(
"not enough pixels",
"Corrupt PNG");
  4306    for (j=0; j < y; ++j) {
  4307       stbi_uc *cur = a->out + stride*j;
  4309       int filter = *raw++;
  4312          return stbi__err(
"invalid filter",
"Corrupt PNG");
  4315          STBI_ASSERT(img_width_bytes <= x);
  4316          cur += x*out_n - img_width_bytes; 
  4318          width = img_width_bytes;
  4320       prior = cur - stride; 
  4323       if (j == 0) filter = first_row_filter[filter];
  4326       for (k=0; k < filter_bytes; ++k) {
  4328             case STBI__F_none       : cur[k] = raw[k]; 
break;
  4329             case STBI__F_sub        : cur[k] = raw[k]; 
break;
  4330             case STBI__F_up         : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); 
break;
  4331             case STBI__F_avg        : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); 
break;
  4332             case STBI__F_paeth      : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); 
break;
  4333             case STBI__F_avg_first  : cur[k] = raw[k]; 
break;
  4334             case STBI__F_paeth_first: cur[k] = raw[k]; 
break;
  4344       } 
else if (depth == 16) {
  4345          if (img_n != out_n) {
  4346             cur[filter_bytes]   = 255; 
  4347             cur[filter_bytes+1] = 255; 
  4349          raw += filter_bytes;
  4350          cur += output_bytes;
  4351          prior += output_bytes;
  4359       if (depth < 8 || img_n == out_n) {
  4360          int nk = (width - 1)*filter_bytes;
  4361          #define STBI__CASE(f) \  4363                 for (k=0; k < nk; ++k)  4366             case STBI__F_none:         memcpy(cur, raw, nk); 
break;
  4367             STBI__CASE(STBI__F_sub)          { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } 
break;
  4368             STBI__CASE(STBI__F_up)           { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } 
break;
  4369             STBI__CASE(STBI__F_avg)          { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } 
break;
  4370             STBI__CASE(STBI__F_paeth)        { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } 
break;
  4371             STBI__CASE(STBI__F_avg_first)    { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } 
break;
  4372             STBI__CASE(STBI__F_paeth_first)  { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } 
break;
  4377          STBI_ASSERT(img_n+1 == out_n);
  4378          #define STBI__CASE(f) \  4380                 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \  4381                    for (k=0; k < filter_bytes; ++k)  4383             STBI__CASE(STBI__F_none)         { cur[k] = raw[k]; } 
break;
  4384             STBI__CASE(STBI__F_sub)          { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } 
break;
  4385             STBI__CASE(STBI__F_up)           { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } 
break;
  4386             STBI__CASE(STBI__F_avg)          { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } 
break;
  4387             STBI__CASE(STBI__F_paeth)        { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } 
break;
  4388             STBI__CASE(STBI__F_avg_first)    { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } 
break;
  4389             STBI__CASE(STBI__F_paeth_first)  { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } 
break;
  4396             cur = a->out + stride*j; 
  4397             for (i=0; i < x; ++i,cur+=output_bytes) {
  4398                cur[filter_bytes+1] = 255;
  4408       for (j=0; j < y; ++j) {
  4409          stbi_uc *cur = a->out + stride*j;
  4410          stbi_uc *in  = a->out + stride*j + x*out_n - img_width_bytes;
  4413          stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; 
  4422             for (k=x*img_n; k >= 2; k-=2, ++in) {
  4423                *cur++ = scale * ((*in >> 4)       );
  4424                *cur++ = scale * ((*in     ) & 0x0f);
  4426             if (k > 0) *cur++ = scale * ((*in >> 4)       );
  4427          } 
else if (depth == 2) {
  4428             for (k=x*img_n; k >= 4; k-=4, ++in) {
  4429                *cur++ = scale * ((*in >> 6)       );
  4430                *cur++ = scale * ((*in >> 4) & 0x03);
  4431                *cur++ = scale * ((*in >> 2) & 0x03);
  4432                *cur++ = scale * ((*in     ) & 0x03);
  4434             if (k > 0) *cur++ = scale * ((*in >> 6)       );
  4435             if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
  4436             if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
  4437          } 
else if (depth == 1) {
  4438             for (k=x*img_n; k >= 8; k-=8, ++in) {
  4439                *cur++ = scale * ((*in >> 7)       );
  4440                *cur++ = scale * ((*in >> 6) & 0x01);
  4441                *cur++ = scale * ((*in >> 5) & 0x01);
  4442                *cur++ = scale * ((*in >> 4) & 0x01);
  4443                *cur++ = scale * ((*in >> 3) & 0x01);
  4444                *cur++ = scale * ((*in >> 2) & 0x01);
  4445                *cur++ = scale * ((*in >> 1) & 0x01);
  4446                *cur++ = scale * ((*in     ) & 0x01);
  4448             if (k > 0) *cur++ = scale * ((*in >> 7)       );
  4449             if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
  4450             if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
  4451             if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
  4452             if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
  4453             if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
  4454             if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
  4456          if (img_n != out_n) {
  4459             cur = a->out + stride*j;
  4461                for (q=x-1; q >= 0; --q) {
  4463                   cur[q*2+0] = cur[q];
  4466                STBI_ASSERT(img_n == 3);
  4467                for (q=x-1; q >= 0; --q) {
  4469                   cur[q*4+2] = cur[q*3+2];
  4470                   cur[q*4+1] = cur[q*3+1];
  4471                   cur[q*4+0] = cur[q*3+0];
  4476    } 
else if (depth == 16) {
  4481       stbi_uc *cur = a->out;
  4482       stbi__uint16 *cur16 = (stbi__uint16*)cur;
  4484       for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
  4485          *cur16 = (cur[0] << 8) | cur[1];
  4492 static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, 
int out_n, 
int depth, 
int color, 
int interlaced)
  4494    int bytes = (depth == 16 ? 2 : 1);
  4495    int out_bytes = out_n * bytes;
  4499       return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
  4502    final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
  4503    for (p=0; p < 7; ++p) {
  4504       int xorig[] = { 0,4,0,2,0,1,0 };
  4505       int yorig[] = { 0,0,4,0,2,0,1 };
  4506       int xspc[]  = { 8,8,4,4,2,2,1 };
  4507       int yspc[]  = { 8,8,8,4,4,2,2 };
  4510       x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
  4511       y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
  4513          stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
  4514          if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
  4518          for (j=0; j < y; ++j) {
  4519             for (i=0; i < x; ++i) {
  4520                int out_y = j*yspc[p]+yorig[p];
  4521                int out_x = i*xspc[p]+xorig[p];
  4522                memcpy(
final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
  4523                       a->out + (j*x+i)*out_bytes, out_bytes);
  4527          image_data += img_len;
  4528          image_data_len -= img_len;
  4536 static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], 
int out_n)
  4538    stbi__context *s = z->s;
  4539    stbi__uint32 i, pixel_count = s->img_x * s->img_y;
  4540    stbi_uc *p = z->out;
  4544    STBI_ASSERT(out_n == 2 || out_n == 4);
  4547       for (i=0; i < pixel_count; ++i) {
  4548          p[1] = (p[0] == tc[0] ? 0 : 255);
  4552       for (i=0; i < pixel_count; ++i) {
  4553          if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
  4561 static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], 
int out_n)
  4563    stbi__context *s = z->s;
  4564    stbi__uint32 i, pixel_count = s->img_x * s->img_y;
  4565    stbi__uint16 *p = (stbi__uint16*) z->out;
  4569    STBI_ASSERT(out_n == 2 || out_n == 4);
  4572       for (i = 0; i < pixel_count; ++i) {
  4573          p[1] = (p[0] == tc[0] ? 0 : 65535);
  4577       for (i = 0; i < pixel_count; ++i) {
  4578          if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
  4586 static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, 
int len, 
int pal_img_n)
  4588    stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
  4589    stbi_uc *p, *temp_out, *orig = a->out;
  4591    p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
  4592    if (p == NULL) 
return stbi__err(
"outofmem", 
"Out of memory");
  4597    if (pal_img_n == 3) {
  4598       for (i=0; i < pixel_count; ++i) {
  4601          p[1] = palette[n+1];
  4602          p[2] = palette[n+2];
  4606       for (i=0; i < pixel_count; ++i) {
  4609          p[1] = palette[n+1];
  4610          p[2] = palette[n+2];
  4611          p[3] = palette[n+3];
  4623 static int stbi__unpremultiply_on_load = 0;
  4624 static int stbi__de_iphone_flag = 0;
  4626 STBIDEF 
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply)
  4628    stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
  4631 STBIDEF 
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert)
  4633    stbi__de_iphone_flag = flag_true_if_should_convert;
  4636 static void stbi__de_iphone(stbi__png *z)
  4638    stbi__context *s = z->s;
  4639    stbi__uint32 i, pixel_count = s->img_x * s->img_y;
  4640    stbi_uc *p = z->out;
  4642    if (s->img_out_n == 3) {  
  4643       for (i=0; i < pixel_count; ++i) {
  4650       STBI_ASSERT(s->img_out_n == 4);
  4651       if (stbi__unpremultiply_on_load) {
  4653          for (i=0; i < pixel_count; ++i) {
  4657                p[0] = p[2] * 255 / a;
  4658                p[1] = p[1] * 255 / a;
  4668          for (i=0; i < pixel_count; ++i) {
  4678 #define STBI__PNG_TYPE(a,b,c,d)  (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))  4680 static int stbi__parse_png_file(stbi__png *z, 
int scan, 
int req_comp)
  4682    stbi_uc palette[1024], pal_img_n=0;
  4683    stbi_uc has_trans=0, tc[3];
  4684    stbi__uint16 tc16[3];
  4685    stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
  4686    int first=1,k,interlace=0, color=0, is_iphone=0;
  4687    stbi__context *s = z->s;
  4693    if (!stbi__check_png_header(s)) 
return 0;
  4695    if (scan == STBI__SCAN_type) 
return 1;
  4698       stbi__pngchunk c = stbi__get_chunk_header(s);
  4700          case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
  4702             stbi__skip(s, c.length);
  4704          case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
  4706             if (!first) 
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
  4708             if (c.length != 13) 
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
  4709             s->img_x = stbi__get32be(s); 
if (s->img_x > (1 << 24)) 
return stbi__err(
"too large",
"Very large image (corrupt?)");
  4710             s->img_y = stbi__get32be(s); 
if (s->img_y > (1 << 24)) 
return stbi__err(
"too large",
"Very large image (corrupt?)");
  4711             z->depth = stbi__get8(s);  
if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)  
return stbi__err(
"1/2/4/8/16-bit only",
"PNG not supported: 1/2/4/8/16-bit only");
  4712             color = stbi__get8(s);  
if (color > 6)         
return stbi__err(
"bad ctype",
"Corrupt PNG");
  4713             if (color == 3 && z->depth == 16)                  
return stbi__err(
"bad ctype",
"Corrupt PNG");
  4714             if (color == 3) pal_img_n = 3; 
else if (color & 1) 
return stbi__err(
"bad ctype",
"Corrupt PNG");
  4715             comp  = stbi__get8(s);  
if (comp) 
return stbi__err(
"bad comp method",
"Corrupt PNG");
  4716             filter= stbi__get8(s);  
if (filter) 
return stbi__err(
"bad filter method",
"Corrupt PNG");
  4717             interlace = stbi__get8(s); 
if (interlace>1) 
return stbi__err(
"bad interlace method",
"Corrupt PNG");
  4718             if (!s->img_x || !s->img_y) 
return stbi__err(
"0-pixel image",
"Corrupt PNG");
  4720                s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
  4721                if ((1 << 30) / s->img_x / s->img_n < s->img_y) 
return stbi__err(
"too large", 
"Image too large to decode");
  4722                if (scan == STBI__SCAN_header) 
return 1;
  4727                if ((1 << 30) / s->img_x / 4 < s->img_y) 
return stbi__err(
"too large",
"Corrupt PNG");
  4733          case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'):  {
  4734             if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
  4735             if (c.length > 256*3) 
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
  4736             pal_len = c.length / 3;
  4737             if (pal_len * 3 != c.length) 
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
  4738             for (i=0; i < pal_len; ++i) {
  4739                palette[i*4+0] = stbi__get8(s);
  4740                palette[i*4+1] = stbi__get8(s);
  4741                palette[i*4+2] = stbi__get8(s);
  4742                palette[i*4+3] = 255;
  4747          case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
  4748             if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
  4749             if (z->idata) 
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
  4751                if (scan == STBI__SCAN_header) { s->img_n = 4; 
return 1; }
  4752                if (pal_len == 0) 
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
  4753                if (c.length > pal_len) 
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
  4755                for (i=0; i < c.length; ++i)
  4756                   palette[i*4+3] = stbi__get8(s);
  4758                if (!(s->img_n & 1)) 
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
  4759                if (c.length != (stbi__uint32) s->img_n*2) 
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
  4761                if (z->depth == 16) {
  4762                   for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); 
  4764                   for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; 
  4770          case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
  4771             if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
  4772             if (pal_img_n && !pal_len) 
return stbi__err(
"no PLTE",
"Corrupt PNG");
  4773             if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; 
return 1; }
  4774             if ((
int)(ioff + c.length) < (
int)ioff) 
return 0;
  4775             if (ioff + c.length > idata_limit) {
  4776                stbi__uint32 idata_limit_old = idata_limit;
  4778                if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
  4779                while (ioff + c.length > idata_limit)
  4781                STBI_NOTUSED(idata_limit_old);
  4782                p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); 
if (p == NULL) 
return stbi__err(
"outofmem", 
"Out of memory");
  4785             if (!stbi__getn(s, z->idata+ioff,c.length)) 
return stbi__err(
"outofdata",
"Corrupt PNG");
  4790          case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
  4791             stbi__uint32 raw_len, bpl;
  4792             if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
  4793             if (scan != STBI__SCAN_load) 
return 1;
  4794             if (z->idata == NULL) 
return stbi__err(
"no IDAT",
"Corrupt PNG");
  4796             bpl = (s->img_x * z->depth + 7) / 8; 
  4797             raw_len = bpl * s->img_y * s->img_n  + s->img_y ;
  4798             z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((
char *) z->idata, ioff, raw_len, (
int *) &raw_len, !is_iphone);
  4799             if (z->expanded == NULL) 
return 0; 
  4800             STBI_FREE(z->idata); z->idata = NULL;
  4801             if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
  4802                s->img_out_n = s->img_n+1;
  4804                s->img_out_n = s->img_n;
  4805             if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) 
return 0;
  4807                if (z->depth == 16) {
  4808                   if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) 
return 0;
  4810                   if (!stbi__compute_transparency(z, tc, s->img_out_n)) 
return 0;
  4813             if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
  4817                s->img_n = pal_img_n; 
  4818                s->img_out_n = pal_img_n;
  4819                if (req_comp >= 3) s->img_out_n = req_comp;
  4820                if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
  4823             STBI_FREE(z->expanded); z->expanded = NULL;
  4829             if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
  4830             if ((c.type & (1 << 29)) == 0) {
  4831                #ifndef STBI_NO_FAILURE_STRINGS  4833                static char invalid_chunk[] = 
"XXXX PNG chunk not known";
  4834                invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
  4835                invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
  4836                invalid_chunk[2] = STBI__BYTECAST(c.type >>  8);
  4837                invalid_chunk[3] = STBI__BYTECAST(c.type >>  0);
  4839                return stbi__err(invalid_chunk, 
"PNG not supported: unknown PNG chunk type");
  4841             stbi__skip(s, c.length);
  4849 static void *stbi__do_png(stbi__png *p, 
int *x, 
int *y, 
int *n, 
int req_comp, stbi__result_info *ri)
  4852    if (req_comp < 0 || req_comp > 4) 
return stbi__errpuc(
"bad req_comp", 
"Internal error");
  4853    if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
  4855          ri->bits_per_channel = 8;
  4857          ri->bits_per_channel = p->depth;
  4860       if (req_comp && req_comp != p->s->img_out_n) {
  4861          if (ri->bits_per_channel == 8)
  4862             result = stbi__convert_format((
unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
  4864             result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
  4865          p->s->img_out_n = req_comp;
  4866          if (result == NULL) 
return result;
  4870       if (n) *n = p->s->img_n;
  4872    STBI_FREE(p->out);      p->out      = NULL;
  4873    STBI_FREE(p->expanded); p->expanded = NULL;
  4874    STBI_FREE(p->idata);    p->idata    = NULL;
  4879 static void *stbi__png_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
  4883    return stbi__do_png(&p, x,y,comp,req_comp, ri);
  4886 static int stbi__png_test(stbi__context *s)
  4889    r = stbi__check_png_header(s);
  4894 static int stbi__png_info_raw(stbi__png *p, 
int *x, 
int *y, 
int *comp)
  4896    if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
  4897       stbi__rewind( p->s );
  4900    if (x) *x = p->s->img_x;
  4901    if (y) *y = p->s->img_y;
  4902    if (comp) *comp = p->s->img_n;
  4906 static int stbi__png_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  4910    return stbi__png_info_raw(&p, x, y, comp);
  4917 static int stbi__bmp_test_raw(stbi__context *s)
  4921    if (stbi__get8(s) != 
'B') 
return 0;
  4922    if (stbi__get8(s) != 
'M') 
return 0;
  4927    sz = stbi__get32le(s);
  4928    r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
  4932 static int stbi__bmp_test(stbi__context *s)
  4934    int r = stbi__bmp_test_raw(s);
  4941 static int stbi__high_bit(
unsigned int z)
  4944    if (z == 0) 
return -1;
  4945    if (z >= 0x10000) n += 16, z >>= 16;
  4946    if (z >= 0x00100) n +=  8, z >>=  8;
  4947    if (z >= 0x00010) n +=  4, z >>=  4;
  4948    if (z >= 0x00004) n +=  2, z >>=  2;
  4949    if (z >= 0x00002) n +=  1, z >>=  1;
  4953 static int stbi__bitcount(
unsigned int a)
  4955    a = (a & 0x55555555) + ((a >>  1) & 0x55555555); 
  4956    a = (a & 0x33333333) + ((a >>  2) & 0x33333333); 
  4957    a = (a + (a >> 4)) & 0x0f0f0f0f; 
  4959    a = (a + (a >> 16)); 
  4963 static int stbi__shiftsigned(
int v, 
int shift, 
int bits)
  4968    if (shift < 0) v <<= -shift;
  4982    int bpp, offset, hsz;
  4983    unsigned int mr,mg,mb,ma, all_a;
  4986 static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
  4989    if (stbi__get8(s) != 
'B' || stbi__get8(s) != 
'M') 
return stbi__errpuc(
"not BMP", 
"Corrupt BMP");
  4993    info->offset = stbi__get32le(s);
  4994    info->hsz = hsz = stbi__get32le(s);
  4995    info->mr = info->mg = info->mb = info->ma = 0;
  4997    if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) 
return stbi__errpuc(
"unknown BMP", 
"BMP type not supported: unknown");
  4999       s->img_x = stbi__get16le(s);
  5000       s->img_y = stbi__get16le(s);
  5002       s->img_x = stbi__get32le(s);
  5003       s->img_y = stbi__get32le(s);
  5005    if (stbi__get16le(s) != 1) 
return stbi__errpuc(
"bad BMP", 
"bad BMP");
  5006    info->bpp = stbi__get16le(s);
  5007    if (info->bpp == 1) 
return stbi__errpuc(
"monochrome", 
"BMP type not supported: 1-bit");
  5009       int compress = stbi__get32le(s);
  5010       if (compress == 1 || compress == 2) 
return stbi__errpuc(
"BMP RLE", 
"BMP type not supported: RLE");
  5016       if (hsz == 40 || hsz == 56) {
  5023          if (info->bpp == 16 || info->bpp == 32) {
  5024             if (compress == 0) {
  5025                if (info->bpp == 32) {
  5026                   info->mr = 0xffu << 16;
  5027                   info->mg = 0xffu <<  8;
  5028                   info->mb = 0xffu <<  0;
  5029                   info->ma = 0xffu << 24;
  5032                   info->mr = 31u << 10;
  5033                   info->mg = 31u <<  5;
  5034                   info->mb = 31u <<  0;
  5036             } 
else if (compress == 3) {
  5037                info->mr = stbi__get32le(s);
  5038                info->mg = stbi__get32le(s);
  5039                info->mb = stbi__get32le(s);
  5041                if (info->mr == info->mg && info->mg == info->mb) {
  5043                   return stbi__errpuc(
"bad BMP", 
"bad BMP");
  5046                return stbi__errpuc(
"bad BMP", 
"bad BMP");
  5050          if (hsz != 108 && hsz != 124)
  5051             return stbi__errpuc(
"bad BMP", 
"bad BMP");
  5052          info->mr = stbi__get32le(s);
  5053          info->mg = stbi__get32le(s);
  5054          info->mb = stbi__get32le(s);
  5055          info->ma = stbi__get32le(s);
  5057          for (i=0; i < 12; ++i)
  5071 static void *stbi__bmp_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
  5074    unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
  5075    stbi_uc pal[256][4];
  5076    int psize=0,i,j,width;
  5077    int flip_vertically, pad, target;
  5078    stbi__bmp_data info;
  5082    if (stbi__bmp_parse_header(s, &info) == NULL)
  5085    flip_vertically = ((int) s->img_y) > 0;
  5086    s->img_y = abs((
int) s->img_y);
  5094    if (info.hsz == 12) {
  5096          psize = (info.offset - 14 - 24) / 3;
  5099          psize = (info.offset - 14 - info.hsz) >> 2;
  5102    s->img_n = ma ? 4 : 3;
  5103    if (req_comp && req_comp >= 3) 
  5109    if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
  5110       return stbi__errpuc(
"too large", 
"Corrupt BMP");
  5112    out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
  5113    if (!out) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
  5114    if (info.bpp < 16) {
  5116       if (psize == 0 || psize > 256) { STBI_FREE(out); 
return stbi__errpuc(
"invalid", 
"Corrupt BMP"); }
  5117       for (i=0; i < psize; ++i) {
  5118          pal[i][2] = stbi__get8(s);
  5119          pal[i][1] = stbi__get8(s);
  5120          pal[i][0] = stbi__get8(s);
  5121          if (info.hsz != 12) stbi__get8(s);
  5124       stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
  5125       if (info.bpp == 4) width = (s->img_x + 1) >> 1;
  5126       else if (info.bpp == 8) width = s->img_x;
  5127       else { STBI_FREE(out); 
return stbi__errpuc(
"bad bpp", 
"Corrupt BMP"); }
  5129       for (j=0; j < (int) s->img_y; ++j) {
  5130          for (i=0; i < (int) s->img_x; i += 2) {
  5131             int v=stbi__get8(s),v2=0;
  5132             if (info.bpp == 4) {
  5136             out[z++] = pal[v][0];
  5137             out[z++] = pal[v][1];
  5138             out[z++] = pal[v][2];
  5139             if (target == 4) out[z++] = 255;
  5140             if (i+1 == (
int) s->img_x) 
break;
  5141             v = (info.bpp == 8) ? stbi__get8(s) : v2;
  5142             out[z++] = pal[v][0];
  5143             out[z++] = pal[v][1];
  5144             out[z++] = pal[v][2];
  5145             if (target == 4) out[z++] = 255;
  5150       int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
  5153       stbi__skip(s, info.offset - 14 - info.hsz);
  5154       if (info.bpp == 24) width = 3 * s->img_x;
  5155       else if (info.bpp == 16) width = 2*s->img_x;
  5158       if (info.bpp == 24) {
  5160       } 
else if (info.bpp == 32) {
  5161          if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
  5165          if (!mr || !mg || !mb) { STBI_FREE(out); 
return stbi__errpuc(
"bad masks", 
"Corrupt BMP"); }
  5167          rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
  5168          gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
  5169          bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
  5170          ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
  5172       for (j=0; j < (int) s->img_y; ++j) {
  5174             for (i=0; i < (int) s->img_x; ++i) {
  5176                out[z+2] = stbi__get8(s);
  5177                out[z+1] = stbi__get8(s);
  5178                out[z+0] = stbi__get8(s);
  5180                a = (easy == 2 ? stbi__get8(s) : 255);
  5182                if (target == 4) out[z++] = a;
  5186             for (i=0; i < (int) s->img_x; ++i) {
  5187                stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
  5189                out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
  5190                out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
  5191                out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
  5192                a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
  5194                if (target == 4) out[z++] = STBI__BYTECAST(a);
  5202    if (target == 4 && all_a == 0)
  5203       for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
  5206    if (flip_vertically) {
  5208       for (j=0; j < (int) s->img_y>>1; ++j) {
  5209          stbi_uc *p1 = out +      j     *s->img_x*target;
  5210          stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
  5211          for (i=0; i < (int) s->img_x*target; ++i) {
  5212             t = p1[i], p1[i] = p2[i], p2[i] = t;
  5217    if (req_comp && req_comp != target) {
  5218       out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
  5219       if (out == NULL) 
return out; 
  5224    if (comp) *comp = s->img_n;
  5233 static int stbi__tga_get_comp(
int bits_per_pixel, 
int is_grey, 
int* is_rgb16)
  5236    if(is_rgb16) *is_rgb16 = 0;
  5237    switch(bits_per_pixel) {
  5238       case 8:  
return STBI_grey;
  5239       case 16: 
if(is_grey) 
return STBI_grey_alpha;
  5241       case 15: 
if(is_rgb16) *is_rgb16 = 1;
  5244       case 32: 
return bits_per_pixel/8;
  5249 static int stbi__tga_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  5251     int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
  5252     int sz, tga_colormap_type;
  5254     tga_colormap_type = stbi__get8(s); 
  5255     if( tga_colormap_type > 1 ) {
  5259     tga_image_type = stbi__get8(s); 
  5260     if ( tga_colormap_type == 1 ) { 
  5261         if (tga_image_type != 1 && tga_image_type != 9) {
  5267         if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
  5272         tga_colormap_bpp = sz;
  5274         if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
  5279         tga_colormap_bpp = 0;
  5281     tga_w = stbi__get16le(s);
  5286     tga_h = stbi__get16le(s);
  5291     tga_bits_per_pixel = stbi__get8(s); 
  5293     if (tga_colormap_bpp != 0) {
  5294         if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
  5300         tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
  5302         tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
  5310     if (comp) *comp = tga_comp;
  5314 static int stbi__tga_test(stbi__context *s)
  5317    int sz, tga_color_type;
  5319    tga_color_type = stbi__get8(s);   
  5320    if ( tga_color_type > 1 ) 
goto errorEnd;   
  5322    if ( tga_color_type == 1 ) { 
  5323       if (sz != 1 && sz != 9) 
goto errorEnd; 
  5326       if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) 
goto errorEnd;
  5329       if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) 
goto errorEnd; 
  5332    if ( stbi__get16le(s) < 1 ) 
goto errorEnd;      
  5333    if ( stbi__get16le(s) < 1 ) 
goto errorEnd;      
  5335    if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) 
goto errorEnd; 
  5336    if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) 
goto errorEnd;
  5346 static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
  5348    stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
  5349    stbi__uint16 fiveBitMask = 31;
  5351    int r = (px >> 10) & fiveBitMask;
  5352    int g = (px >> 5) & fiveBitMask;
  5353    int b = px & fiveBitMask;
  5355    out[0] = (stbi_uc)((r * 255)/31);
  5356    out[1] = (stbi_uc)((g * 255)/31);
  5357    out[2] = (stbi_uc)((b * 255)/31);
  5365 static void *stbi__tga_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
  5368    int tga_offset = stbi__get8(s);
  5369    int tga_indexed = stbi__get8(s);
  5370    int tga_image_type = stbi__get8(s);
  5372    int tga_palette_start = stbi__get16le(s);
  5373    int tga_palette_len = stbi__get16le(s);
  5374    int tga_palette_bits = stbi__get8(s);
  5375    int tga_x_origin = stbi__get16le(s);
  5376    int tga_y_origin = stbi__get16le(s);
  5377    int tga_width = stbi__get16le(s);
  5378    int tga_height = stbi__get16le(s);
  5379    int tga_bits_per_pixel = stbi__get8(s);
  5380    int tga_comp, tga_rgb16=0;
  5381    int tga_inverted = stbi__get8(s);
  5384    unsigned char *tga_data;
  5385    unsigned char *tga_palette = NULL;
  5387    unsigned char raw_data[4] = {0};
  5389    int RLE_repeating = 0;
  5390    int read_next_pixel = 1;
  5394    if ( tga_image_type >= 8 )
  5396       tga_image_type -= 8;
  5399    tga_inverted = 1 - ((tga_inverted >> 5) & 1);
  5402    if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
  5403    else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
  5406       return stbi__errpuc(
"bad format", 
"Can't find out TGA pixelformat");
  5411    if (comp) *comp = tga_comp;
  5413    if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
  5414       return stbi__errpuc(
"too large", 
"Corrupt TGA");
  5416    tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
  5417    if (!tga_data) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
  5420    stbi__skip(s, tga_offset );
  5422    if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
  5423       for (i=0; i < tga_height; ++i) {
  5424          int row = tga_inverted ? tga_height -i - 1 : i;
  5425          stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
  5426          stbi__getn(s, tga_row, tga_width * tga_comp);
  5433          stbi__skip(s, tga_palette_start );
  5435          tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
  5437             STBI_FREE(tga_data);
  5438             return stbi__errpuc(
"outofmem", 
"Out of memory");
  5441             stbi_uc *pal_entry = tga_palette;
  5442             STBI_ASSERT(tga_comp == STBI_rgb);
  5443             for (i=0; i < tga_palette_len; ++i) {
  5444                stbi__tga_read_rgb16(s, pal_entry);
  5445                pal_entry += tga_comp;
  5447          } 
else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
  5448                STBI_FREE(tga_data);
  5449                STBI_FREE(tga_palette);
  5450                return stbi__errpuc(
"bad palette", 
"Corrupt TGA");
  5454       for (i=0; i < tga_width * tga_height; ++i)
  5459             if ( RLE_count == 0 )
  5462                int RLE_cmd = stbi__get8(s);
  5463                RLE_count = 1 + (RLE_cmd & 127);
  5464                RLE_repeating = RLE_cmd >> 7;
  5465                read_next_pixel = 1;
  5466             } 
else if ( !RLE_repeating )
  5468                read_next_pixel = 1;
  5472             read_next_pixel = 1;
  5475          if ( read_next_pixel )
  5481                int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
  5482                if ( pal_idx >= tga_palette_len ) {
  5486                pal_idx *= tga_comp;
  5487                for (j = 0; j < tga_comp; ++j) {
  5488                   raw_data[j] = tga_palette[pal_idx+j];
  5490             } 
else if(tga_rgb16) {
  5491                STBI_ASSERT(tga_comp == STBI_rgb);
  5492                stbi__tga_read_rgb16(s, raw_data);
  5495                for (j = 0; j < tga_comp; ++j) {
  5496                   raw_data[j] = stbi__get8(s);
  5500             read_next_pixel = 0;
  5504          for (j = 0; j < tga_comp; ++j)
  5505            tga_data[i*tga_comp+j] = raw_data[j];
  5513          for (j = 0; j*2 < tga_height; ++j)
  5515             int index1 = j * tga_width * tga_comp;
  5516             int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
  5517             for (i = tga_width * tga_comp; i > 0; --i)
  5519                unsigned char temp = tga_data[index1];
  5520                tga_data[index1] = tga_data[index2];
  5521                tga_data[index2] = temp;
  5528       if ( tga_palette != NULL )
  5530          STBI_FREE( tga_palette );
  5535    if (tga_comp >= 3 && !tga_rgb16)
  5537       unsigned char* tga_pixel = tga_data;
  5538       for (i=0; i < tga_width * tga_height; ++i)
  5540          unsigned char temp = tga_pixel[0];
  5541          tga_pixel[0] = tga_pixel[2];
  5542          tga_pixel[2] = temp;
  5543          tga_pixel += tga_comp;
  5548    if (req_comp && req_comp != tga_comp)
  5549       tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
  5553    tga_palette_start = tga_palette_len = tga_palette_bits =
  5554          tga_x_origin = tga_y_origin = 0;
  5564 static int stbi__psd_test(stbi__context *s)
  5566    int r = (stbi__get32be(s) == 0x38425053);
  5571 static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, 
int pixelCount)
  5573    int count, nleft, len;
  5576    while ((nleft = pixelCount - count) > 0) {
  5577       len = stbi__get8(s);
  5580       } 
else if (len < 128) {
  5583          if (len > nleft) 
return 0; 
  5590       } 
else if (len > 128) {
  5595          if (len > nleft) 
return 0; 
  5596          val = stbi__get8(s);
  5609 static void *stbi__psd_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri, 
int bpc)
  5612    int channelCount, compression;
  5620    if (stbi__get32be(s) != 0x38425053)   
  5621       return stbi__errpuc(
"not PSD", 
"Corrupt PSD image");
  5624    if (stbi__get16be(s) != 1)
  5625       return stbi__errpuc(
"wrong version", 
"Unsupported version of PSD image");
  5631    channelCount = stbi__get16be(s);
  5632    if (channelCount < 0 || channelCount > 16)
  5633       return stbi__errpuc(
"wrong channel count", 
"Unsupported number of channels in PSD image");
  5636    h = stbi__get32be(s);
  5637    w = stbi__get32be(s);
  5640    bitdepth = stbi__get16be(s);
  5641    if (bitdepth != 8 && bitdepth != 16)
  5642       return stbi__errpuc(
"unsupported bit depth", 
"PSD bit depth is not 8 or 16 bit");
  5654    if (stbi__get16be(s) != 3)
  5655       return stbi__errpuc(
"wrong color format", 
"PSD is not in RGB color format");
  5658    stbi__skip(s,stbi__get32be(s) );
  5661    stbi__skip(s, stbi__get32be(s) );
  5664    stbi__skip(s, stbi__get32be(s) );
  5670    compression = stbi__get16be(s);
  5671    if (compression > 1)
  5672       return stbi__errpuc(
"bad compression", 
"PSD has an unknown compression format");
  5675    if (!stbi__mad3sizes_valid(4, w, h, 0))
  5676       return stbi__errpuc(
"too large", 
"Corrupt PSD");
  5680    if (!compression && bitdepth == 16 && bpc == 16) {
  5681       out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
  5682       ri->bits_per_channel = 16;
  5684       out = (stbi_uc *) stbi__malloc(4 * w*h);
  5686    if (!out) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
  5704       stbi__skip(s, h * channelCount * 2 );
  5707       for (channel = 0; channel < 4; channel++) {
  5711          if (channel >= channelCount) {
  5713             for (i = 0; i < pixelCount; i++, p += 4)
  5714                *p = (channel == 3 ? 255 : 0);
  5717             if (!stbi__psd_decode_rle(s, p, pixelCount)) {
  5719                return stbi__errpuc(
"corrupt", 
"bad RLE data");
  5729       for (channel = 0; channel < 4; channel++) {
  5730          if (channel >= channelCount) {
  5732             if (bitdepth == 16 && bpc == 16) {
  5733                stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
  5734                stbi__uint16 val = channel == 3 ? 65535 : 0;
  5735                for (i = 0; i < pixelCount; i++, q += 4)
  5738                stbi_uc *p = out+channel;
  5739                stbi_uc val = channel == 3 ? 255 : 0;
  5740                for (i = 0; i < pixelCount; i++, p += 4)
  5744             if (ri->bits_per_channel == 16) {    
  5745                stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
  5746                for (i = 0; i < pixelCount; i++, q += 4)
  5747                   *q = (stbi__uint16) stbi__get16be(s);
  5749                stbi_uc *p = out+channel;
  5750                if (bitdepth == 16) {  
  5751                   for (i = 0; i < pixelCount; i++, p += 4)
  5752                      *p = (stbi_uc) (stbi__get16be(s) >> 8);
  5754                   for (i = 0; i < pixelCount; i++, p += 4)
  5763    if (channelCount >= 4) {
  5764       if (ri->bits_per_channel == 16) {
  5765          for (i=0; i < w*h; ++i) {
  5766             stbi__uint16 *
pixel = (stbi__uint16 *) out + 4*i;
  5768                float a = 
pixel[3] / 65535.0f;
  5769                float ra = 1.0f / a;
  5770                float inv_a = 65535.0f * (1 - ra);
  5771                pixel[0] = (stbi__uint16) (
pixel[0]*ra + inv_a);
  5772                pixel[1] = (stbi__uint16) (
pixel[1]*ra + inv_a);
  5773                pixel[2] = (stbi__uint16) (
pixel[2]*ra + inv_a);
  5777          for (i=0; i < w*h; ++i) {
  5778             unsigned char *
pixel = out + 4*i;
  5780                float a = 
pixel[3] / 255.0f;
  5781                float ra = 1.0f / a;
  5782                float inv_a = 255.0f * (1 - ra);
  5783                pixel[0] = (
unsigned char) (
pixel[0]*ra + inv_a);
  5784                pixel[1] = (
unsigned char) (
pixel[1]*ra + inv_a);
  5785                pixel[2] = (
unsigned char) (
pixel[2]*ra + inv_a);
  5792    if (req_comp && req_comp != 4) {
  5793       if (ri->bits_per_channel == 16)
  5794          out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
  5796          out = stbi__convert_format(out, 4, req_comp, w, h);
  5797       if (out == NULL) 
return out; 
  5800    if (comp) *comp = 4;
  5816 static int stbi__pic_is4(stbi__context *s,
const char *str)
  5820       if (stbi__get8(s) != (stbi_uc)str[i])
  5826 static int stbi__pic_test_core(stbi__context *s)
  5830    if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
  5836    if (!stbi__pic_is4(s,
"PICT"))
  5844    stbi_uc size,type,channel;
  5847 static stbi_uc *stbi__readval(stbi__context *s, 
int channel, stbi_uc *dest)
  5851    for (i=0; i<4; ++i, mask>>=1) {
  5852       if (channel & mask) {
  5853          if (stbi__at_eof(s)) 
return stbi__errpuc(
"bad file",
"PIC file too short");
  5854          dest[i]=stbi__get8(s);
  5861 static void stbi__copyval(
int channel,stbi_uc *dest,
const stbi_uc *src)
  5865    for (i=0;i<4; ++i, mask>>=1)
  5870 static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp, stbi_uc *result)
  5872    int act_comp=0,num_packets=0,y,chained;
  5873    stbi__pic_packet packets[10];
  5878       stbi__pic_packet *packet;
  5880       if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
  5881          return stbi__errpuc(
"bad format",
"too many packets");
  5883       packet = &packets[num_packets++];
  5885       chained = stbi__get8(s);
  5886       packet->size    = stbi__get8(s);
  5887       packet->type    = stbi__get8(s);
  5888       packet->channel = stbi__get8(s);
  5890       act_comp |= packet->channel;
  5892       if (stbi__at_eof(s))          
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
  5893       if (packet->size != 8)  
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
  5896    *comp = (act_comp & 0x10 ? 4 : 3); 
  5898    for(y=0; y<height; ++y) {
  5901       for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
  5902          stbi__pic_packet *packet = &packets[packet_idx];
  5903          stbi_uc *dest = result+y*width*4;
  5905          switch (packet->type) {
  5907                return stbi__errpuc(
"bad format",
"packet has bad compression type");
  5912                for(x=0;x<width;++x, dest+=4)
  5913                   if (!stbi__readval(s,packet->channel,dest))
  5923                      stbi_uc count,value[4];
  5925                      count=stbi__get8(s);
  5926                      if (stbi__at_eof(s))   
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
  5929                         count = (stbi_uc) left;
  5931                      if (!stbi__readval(s,packet->channel,value))  
return 0;
  5933                      for(i=0; i<count; ++i,dest+=4)
  5934                         stbi__copyval(packet->channel,dest,value);
  5943                   int count = stbi__get8(s), i;
  5944                   if (stbi__at_eof(s))  
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
  5950                         count = stbi__get16be(s);
  5954                         return stbi__errpuc(
"bad file",
"scanline overrun");
  5956                      if (!stbi__readval(s,packet->channel,value))
  5959                      for(i=0;i<count;++i, dest += 4)
  5960                         stbi__copyval(packet->channel,dest,value);
  5963                      if (count>left) 
return stbi__errpuc(
"bad file",
"scanline overrun");
  5965                      for(i=0;i<count;++i, dest+=4)
  5966                         if (!stbi__readval(s,packet->channel,dest))
  5980 static void *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp, stbi__result_info *ri)
  5983    int i, x,y, internal_comp;
  5986    if (!comp) comp = &internal_comp;
  5988    for (i=0; i<92; ++i)
  5991    x = stbi__get16be(s);
  5992    y = stbi__get16be(s);
  5993    if (stbi__at_eof(s))  
return stbi__errpuc(
"bad file",
"file too short (pic header)");
  5994    if (!stbi__mad3sizes_valid(x, y, 4, 0)) 
return stbi__errpuc(
"too large", 
"PIC image too large to decode");
  6001    result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
  6002    memset(result, 0xff, x*y*4);
  6004    if (!stbi__pic_load_core(s,x,y,comp, result)) {
  6010    if (req_comp == 0) req_comp = *comp;
  6011    result=stbi__convert_format(result,4,req_comp,x,y);
  6016 static int stbi__pic_test(stbi__context *s)
  6018    int r = stbi__pic_test_core(s);
  6038    stbi_uc *out, *old_out;             
  6039    int flags, bgindex, ratio, transparent, eflags, delay;
  6040    stbi_uc  pal[256][4];
  6041    stbi_uc lpal[256][4];
  6042    stbi__gif_lzw codes[4096];
  6043    stbi_uc *color_table;
  6046    int start_x, start_y;
  6052 static int stbi__gif_test_raw(stbi__context *s)
  6055    if (stbi__get8(s) != 
'G' || stbi__get8(s) != 
'I' || stbi__get8(s) != 
'F' || stbi__get8(s) != 
'8') 
return 0;
  6057    if (sz != 
'9' && sz != 
'7') 
return 0;
  6058    if (stbi__get8(s) != 
'a') 
return 0;
  6062 static int stbi__gif_test(stbi__context *s)
  6064    int r = stbi__gif_test_raw(s);
  6069 static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], 
int num_entries, 
int transp)
  6072    for (i=0; i < num_entries; ++i) {
  6073       pal[i][2] = stbi__get8(s);
  6074       pal[i][1] = stbi__get8(s);
  6075       pal[i][0] = stbi__get8(s);
  6076       pal[i][3] = transp == i ? 0 : 255;
  6080 static int stbi__gif_header(stbi__context *s, stbi__gif *g, 
int *comp, 
int is_info)
  6083    if (stbi__get8(s) != 
'G' || stbi__get8(s) != 
'I' || stbi__get8(s) != 
'F' || stbi__get8(s) != 
'8')
  6084       return stbi__err(
"not GIF", 
"Corrupt GIF");
  6086    version = stbi__get8(s);
  6087    if (version != 
'7' && version != 
'9')    
return stbi__err(
"not GIF", 
"Corrupt GIF");
  6088    if (stbi__get8(s) != 
'a')                
return stbi__err(
"not GIF", 
"Corrupt GIF");
  6090    stbi__g_failure_reason = 
"";
  6091    g->w = stbi__get16le(s);
  6092    g->h = stbi__get16le(s);
  6093    g->flags = stbi__get8(s);
  6094    g->bgindex = stbi__get8(s);
  6095    g->ratio = stbi__get8(s);
  6096    g->transparent = -1;
  6098    if (comp != 0) *comp = 4;  
  6100    if (is_info) 
return 1;
  6102    if (g->flags & 0x80)
  6103       stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
  6108 static int stbi__gif_info_raw(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  6110    stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
  6111    if (!stbi__gif_header(s, g, comp, 1)) {
  6122 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
  6128    if (g->codes[code].prefix >= 0)
  6129       stbi__out_gif_code(g, g->codes[code].prefix);
  6131    if (g->cur_y >= g->max_y) 
return;
  6133    p = &g->out[g->cur_x + g->cur_y];
  6134    c = &g->color_table[g->codes[code].suffix * 4];
  6144    if (g->cur_x >= g->max_x) {
  6145       g->cur_x = g->start_x;
  6146       g->cur_y += g->step;
  6148       while (g->cur_y >= g->max_y && g->parse > 0) {
  6149          g->step = (1 << g->parse) * g->line_size;
  6150          g->cur_y = g->start_y + (g->step >> 1);
  6156 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
  6159    stbi__int32 len, init_code;
  6161    stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
  6164    lzw_cs = stbi__get8(s);
  6165    if (lzw_cs > 12) 
return NULL;
  6166    clear = 1 << lzw_cs;
  6168    codesize = lzw_cs + 1;
  6169    codemask = (1 << codesize) - 1;
  6172    for (init_code = 0; init_code < clear; init_code++) {
  6173       g->codes[init_code].prefix = -1;
  6174       g->codes[init_code].first = (stbi_uc) init_code;
  6175       g->codes[init_code].suffix = (stbi_uc) init_code;
  6184       if (valid_bits < codesize) {
  6186             len = stbi__get8(s); 
  6191          bits |= (stbi__int32) stbi__get8(s) << valid_bits;
  6194          stbi__int32 code = bits & codemask;
  6196          valid_bits -= codesize;
  6198          if (code == clear) {  
  6199             codesize = lzw_cs + 1;
  6200             codemask = (1 << codesize) - 1;
  6204          } 
else if (code == clear + 1) { 
  6206             while ((len = stbi__get8(s)) > 0)
  6209          } 
else if (code <= avail) {
  6210             if (first) 
return stbi__errpuc(
"no clear code", 
"Corrupt GIF");
  6213                p = &g->codes[avail++];
  6214                if (avail > 4096)        
return stbi__errpuc(
"too many codes", 
"Corrupt GIF");
  6215                p->prefix = (stbi__int16) oldcode;
  6216                p->first = g->codes[oldcode].first;
  6217                p->suffix = (code == avail) ? p->first : g->codes[code].first;
  6218             } 
else if (code == avail)
  6219                return stbi__errpuc(
"illegal code in raster", 
"Corrupt GIF");
  6221             stbi__out_gif_code(g, (stbi__uint16) code);
  6223             if ((avail & codemask) == 0 && avail <= 0x0FFF) {
  6225                codemask = (1 << codesize) - 1;
  6230             return stbi__errpuc(
"illegal code in raster", 
"Corrupt GIF");
  6236 static void stbi__fill_gif_background(stbi__gif *g, 
int x0, 
int y0, 
int x1, 
int y1)
  6239    stbi_uc *c = g->pal[g->bgindex];
  6240    for (y = y0; y < y1; y += 4 * g->w) {
  6241       for (x = x0; x < x1; x += 4) {
  6242          stbi_uc *p  = &g->out[y + x];
  6252 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, 
int *comp, 
int req_comp)
  6255    stbi_uc *prev_out = 0;
  6257    if (g->out == 0 && !stbi__gif_header(s, g, comp,0))
  6260    if (!stbi__mad3sizes_valid(g->w, g->h, 4, 0))
  6261       return stbi__errpuc(
"too large", 
"GIF too large");
  6264    g->out = (stbi_uc *) stbi__malloc_mad3(4, g->w, g->h, 0);
  6265    if (g->out == 0) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
  6267    switch ((g->eflags & 0x1C) >> 2) {
  6269          stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);
  6272          if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
  6273          g->old_out = prev_out;
  6276          if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
  6277          stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
  6281             for (i = g->start_y; i < g->max_y; i += 4 * g->w)
  6282                memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
  6288       switch (stbi__get8(s)) {
  6291             int prev_trans = -1;
  6292             stbi__int32 x, y, w, h;
  6295             x = stbi__get16le(s);
  6296             y = stbi__get16le(s);
  6297             w = stbi__get16le(s);
  6298             h = stbi__get16le(s);
  6299             if (((x + w) > (g->w)) || ((y + h) > (g->h)))
  6300                return stbi__errpuc(
"bad Image Descriptor", 
"Corrupt GIF");
  6302             g->line_size = g->w * 4;
  6304             g->start_y = y * g->line_size;
  6305             g->max_x   = g->start_x + w * 4;
  6306             g->max_y   = g->start_y + h * g->line_size;
  6307             g->cur_x   = g->start_x;
  6308             g->cur_y   = g->start_y;
  6310             g->lflags = stbi__get8(s);
  6312             if (g->lflags & 0x40) {
  6313                g->step = 8 * g->line_size; 
  6316                g->step = g->line_size;
  6320             if (g->lflags & 0x80) {
  6321                stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
  6322                g->color_table = (stbi_uc *) g->lpal;
  6323             } 
else if (g->flags & 0x80) {
  6324                if (g->transparent >= 0 && (g->eflags & 0x01)) {
  6325                   prev_trans = g->pal[g->transparent][3];
  6326                   g->pal[g->transparent][3] = 0;
  6328                g->color_table = (stbi_uc *) g->pal;
  6330                return stbi__errpuc(
"missing color table", 
"Corrupt GIF");
  6332             o = stbi__process_gif_raster(s, g);
  6333             if (o == NULL) 
return NULL;
  6335             if (prev_trans != -1)
  6336                g->pal[g->transparent][3] = (stbi_uc) prev_trans;
  6344             if (stbi__get8(s) == 0xF9) { 
  6345                len = stbi__get8(s);
  6347                   g->eflags = stbi__get8(s);
  6348                   g->delay = stbi__get16le(s);
  6349                   g->transparent = stbi__get8(s);
  6355             while ((len = stbi__get8(s)) != 0)
  6361             return (stbi_uc *) s; 
  6364             return stbi__errpuc(
"unknown code", 
"Corrupt GIF");
  6368    STBI_NOTUSED(req_comp);
  6371 static void *stbi__gif_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
  6374    stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
  6375    memset(g, 0, 
sizeof(*g));
  6378    u = stbi__gif_load_next(s, g, comp, req_comp);
  6379    if (u == (stbi_uc *) s) u = 0;  
  6383       if (req_comp && req_comp != 4)
  6384          u = stbi__convert_format(u, 4, req_comp, g->w, g->h);
  6392 static int stbi__gif_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  6394    return stbi__gif_info_raw(s,x,y,comp);
  6402 static int stbi__hdr_test_core(stbi__context *s, 
const char *signature)
  6405    for (i=0; signature[i]; ++i)
  6406       if (stbi__get8(s) != signature[i])
  6412 static int stbi__hdr_test(stbi__context* s)
  6414    int r = stbi__hdr_test_core(s, 
"#?RADIANCE\n");
  6417        r = stbi__hdr_test_core(s, 
"#?RGBE\n");
  6423 #define STBI__HDR_BUFLEN  1024  6424 static char *stbi__hdr_gettoken(stbi__context *z, 
char *buffer)
  6429    c = (char) stbi__get8(z);
  6431    while (!stbi__at_eof(z) && c != 
'\n') {
  6433       if (len == STBI__HDR_BUFLEN-1) {
  6435          while (!stbi__at_eof(z) && stbi__get8(z) != 
'\n')
  6439       c = (char) stbi__get8(z);
  6446 static void stbi__hdr_convert(
float *output, stbi_uc *input, 
int req_comp)
  6448    if ( input[3] != 0 ) {
  6451       f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
  6453          output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
  6455          output[0] = input[0] * f1;
  6456          output[1] = input[1] * f1;
  6457          output[2] = input[2] * f1;
  6459       if (req_comp == 2) output[1] = 1;
  6460       if (req_comp == 4) output[3] = 1;
  6463          case 4: output[3] = 1; 
  6464          case 3: output[0] = output[1] = output[2] = 0;
  6466          case 2: output[1] = 1; 
  6467          case 1: output[0] = 0;
  6473 static float *stbi__hdr_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
  6475    char buffer[STBI__HDR_BUFLEN];
  6482    unsigned char count, value;
  6483    int i, j, k, c1,c2, z;
  6484    const char *headerToken;
  6488    headerToken = stbi__hdr_gettoken(s,buffer);
  6489    if (strcmp(headerToken, 
"#?RADIANCE") != 0 && strcmp(headerToken, 
"#?RGBE") != 0)
  6490       return stbi__errpf(
"not HDR", 
"Corrupt HDR image");
  6494       token = stbi__hdr_gettoken(s,buffer);
  6495       if (token[0] == 0) 
break;
  6496       if (strcmp(token, 
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
  6499    if (!valid)    
return stbi__errpf(
"unsupported format", 
"Unsupported HDR format");
  6503    token = stbi__hdr_gettoken(s,buffer);
  6504    if (strncmp(token, 
"-Y ", 3))  
return stbi__errpf(
"unsupported data layout", 
"Unsupported HDR format");
  6506    height = (int) strtol(token, &token, 10);
  6507    while (*token == 
' ') ++token;
  6508    if (strncmp(token, 
"+X ", 3))  
return stbi__errpf(
"unsupported data layout", 
"Unsupported HDR format");
  6510    width = (int) strtol(token, NULL, 10);
  6515    if (comp) *comp = 3;
  6516    if (req_comp == 0) req_comp = 3;
  6518    if (!stbi__mad4sizes_valid(width, height, req_comp, 
sizeof(
float), 0))
  6519       return stbi__errpf(
"too large", 
"HDR image is too large");
  6522    hdr_data = (
float *) stbi__malloc_mad4(width, height, req_comp, 
sizeof(
float), 0);
  6524       return stbi__errpf(
"outofmem", 
"Out of memory");
  6528    if ( width < 8 || width >= 32768) {
  6530       for (j=0; j < height; ++j) {
  6531          for (i=0; i < width; ++i) {
  6534             stbi__getn(s, rgbe, 4);
  6535             stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
  6542       for (j = 0; j < height; ++j) {
  6545          len = stbi__get8(s);
  6546          if (c1 != 2 || c2 != 2 || (len & 0x80)) {
  6550             rgbe[0] = (stbi_uc) c1;
  6551             rgbe[1] = (stbi_uc) c2;
  6552             rgbe[2] = (stbi_uc) len;
  6553             rgbe[3] = (stbi_uc) stbi__get8(s);
  6554             stbi__hdr_convert(hdr_data, rgbe, req_comp);
  6557             STBI_FREE(scanline);
  6558             goto main_decode_loop; 
  6561          len |= stbi__get8(s);
  6562          if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); 
return stbi__errpf(
"invalid decoded scanline length", 
"corrupt HDR"); }
  6563          if (scanline == NULL) {
  6564             scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
  6566                STBI_FREE(hdr_data);
  6567                return stbi__errpf(
"outofmem", 
"Out of memory");
  6571          for (k = 0; k < 4; ++k) {
  6574             while ((nleft = width - i) > 0) {
  6575                count = stbi__get8(s);
  6578                   value = stbi__get8(s);
  6580                   if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); 
return stbi__errpf(
"corrupt", 
"bad RLE data in HDR"); }
  6581                   for (z = 0; z < count; ++z)
  6582                      scanline[i++ * 4 + k] = value;
  6585                   if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); 
return stbi__errpf(
"corrupt", 
"bad RLE data in HDR"); }
  6586                   for (z = 0; z < count; ++z)
  6587                      scanline[i++ * 4 + k] = stbi__get8(s);
  6591          for (i=0; i < width; ++i)
  6592             stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
  6595          STBI_FREE(scanline);
  6601 static int stbi__hdr_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  6603    char buffer[STBI__HDR_BUFLEN];
  6610    if (!comp) comp = &dummy;
  6612    if (stbi__hdr_test(s) == 0) {
  6618       token = stbi__hdr_gettoken(s,buffer);
  6619       if (token[0] == 0) 
break;
  6620       if (strcmp(token, 
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
  6627    token = stbi__hdr_gettoken(s,buffer);
  6628    if (strncmp(token, 
"-Y ", 3)) {
  6633    *y = (int) strtol(token, &token, 10);
  6634    while (*token == 
' ') ++token;
  6635    if (strncmp(token, 
"+X ", 3)) {
  6640    *x = (int) strtol(token, NULL, 10);
  6644 #endif // STBI_NO_HDR  6647 static int stbi__bmp_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  6650    stbi__bmp_data info;
  6653    p = stbi__bmp_parse_header(s, &info);
  6657    if (x) *x = s->img_x;
  6658    if (y) *y = s->img_y;
  6659    if (comp) *comp = info.ma ? 4 : 3;
  6665 static int stbi__psd_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  6667    int channelCount, dummy;
  6670    if (!comp) comp = &dummy;
  6671    if (stbi__get32be(s) != 0x38425053) {
  6675    if (stbi__get16be(s) != 1) {
  6680    channelCount = stbi__get16be(s);
  6681    if (channelCount < 0 || channelCount > 16) {
  6685    *y = stbi__get32be(s);
  6686    *x = stbi__get32be(s);
  6687    if (stbi__get16be(s) != 8) {
  6691    if (stbi__get16be(s) != 3) {
  6701 static int stbi__pic_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  6703    int act_comp=0,num_packets=0,chained,dummy;
  6704    stbi__pic_packet packets[10];
  6708    if (!comp) comp = &dummy;
  6710    if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
  6717    *x = stbi__get16be(s);
  6718    *y = stbi__get16be(s);
  6719    if (stbi__at_eof(s)) {
  6723    if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
  6731       stbi__pic_packet *packet;
  6733       if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
  6736       packet = &packets[num_packets++];
  6737       chained = stbi__get8(s);
  6738       packet->size    = stbi__get8(s);
  6739       packet->type    = stbi__get8(s);
  6740       packet->channel = stbi__get8(s);
  6741       act_comp |= packet->channel;
  6743       if (stbi__at_eof(s)) {
  6747       if (packet->size != 8) {
  6753    *comp = (act_comp & 0x10 ? 4 : 3);
  6773 static int      stbi__pnm_test(stbi__context *s)
  6776    p = (char) stbi__get8(s);
  6777    t = (char) stbi__get8(s);
  6778    if (p != 
'P' || (t != 
'5' && t != 
'6')) {
  6785 static void *stbi__pnm_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
  6790    if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
  6795    if (comp) *comp = s->img_n;
  6797    if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
  6798       return stbi__errpuc(
"too large", 
"PNM too large");
  6800    out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
  6801    if (!out) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
  6802    stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
  6804    if (req_comp && req_comp != s->img_n) {
  6805       out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
  6806       if (out == NULL) 
return out; 
  6811 static int      stbi__pnm_isspace(
char c)
  6813    return c == 
' ' || c == 
'\t' || c == 
'\n' || c == 
'\v' || c == 
'\f' || c == 
'\r';
  6816 static void     stbi__pnm_skip_whitespace(stbi__context *s, 
char *c)
  6819       while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
  6820          *c = (char) stbi__get8(s);
  6822       if (stbi__at_eof(s) || *c != 
'#')
  6825       while (!stbi__at_eof(s) && *c != 
'\n' && *c != 
'\r' )
  6826          *c = (
char) stbi__get8(s);
  6830 static int      stbi__pnm_isdigit(
char c)
  6832    return c >= 
'0' && c <= 
'9';
  6835 static int      stbi__pnm_getinteger(stbi__context *s, 
char *c)
  6839    while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
  6840       value = value*10 + (*c - 
'0');
  6841       *c = (char) stbi__get8(s);
  6847 static int      stbi__pnm_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  6854    if (!comp) comp = &dummy;
  6859    p = (char) stbi__get8(s);
  6860    t = (char) stbi__get8(s);
  6861    if (p != 
'P' || (t != 
'5' && t != 
'6')) {
  6866    *comp = (t == 
'6') ? 3 : 1;  
  6868    c = (char) stbi__get8(s);
  6869    stbi__pnm_skip_whitespace(s, &c);
  6871    *x = stbi__pnm_getinteger(s, &c); 
  6872    stbi__pnm_skip_whitespace(s, &c);
  6874    *y = stbi__pnm_getinteger(s, &c); 
  6875    stbi__pnm_skip_whitespace(s, &c);
  6877    maxv = stbi__pnm_getinteger(s, &c);  
  6880       return stbi__err(
"max value > 255", 
"PPM image not 8-bit");
  6886 static int stbi__info_main(stbi__context *s, 
int *x, 
int *y, 
int *comp)
  6888    #ifndef STBI_NO_JPEG  6889    if (stbi__jpeg_info(s, x, y, comp)) 
return 1;
  6893    if (stbi__png_info(s, x, y, comp))  
return 1;
  6897    if (stbi__gif_info(s, x, y, comp))  
return 1;
  6901    if (stbi__bmp_info(s, x, y, comp))  
return 1;
  6905    if (stbi__psd_info(s, x, y, comp))  
return 1;
  6909    if (stbi__pic_info(s, x, y, comp))  
return 1;
  6913    if (stbi__pnm_info(s, x, y, comp))  
return 1;
  6917    if (stbi__hdr_info(s, x, y, comp))  
return 1;
  6922    if (stbi__tga_info(s, x, y, comp))
  6925    return stbi__err(
"unknown image type", 
"Image not of any known type, or corrupt");
  6928 #ifndef STBI_NO_STDIO  6929 STBIDEF 
int stbi_info(
char const *filename, 
int *x, 
int *y, 
int *comp)
  6931     FILE *f = stbi__fopen(filename, 
"rb");
  6933     if (!f) 
return stbi__err(
"can't fopen", 
"Unable to open file");
  6934     result = stbi_info_from_file(f, x, y, comp);
  6939 STBIDEF 
int stbi_info_from_file(FILE *f, 
int *x, 
int *y, 
int *comp)
  6943    long pos = ftell(f);
  6944    stbi__start_file(&s, f);
  6945    r = stbi__info_main(&s,x,y,comp);
  6946    fseek(f,pos,SEEK_SET);
  6949 #endif // !STBI_NO_STDIO  6951 STBIDEF 
int stbi_info_from_memory(stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *comp)
  6954    stbi__start_mem(&s,buffer,len);
  6955    return stbi__info_main(&s,x,y,comp);
  6958 STBIDEF 
int stbi_info_from_callbacks(
stbi_io_callbacks const *c, 
void *user, 
int *x, 
int *y, 
int *comp)
  6962    return stbi__info_main(&s,x,y,comp);
  6965 #endif // STB_IMAGE_IMPLEMENTATION