110#ifndef STBI_INCLUDE_STB_IMAGE_H 
  111#define STBI_INCLUDE_STB_IMAGE_H 
  323#define STBI_VERSION 1 
  336typedef unsigned char stbi_uc;
 
  337typedef unsigned short stbi_us;
 
  344#ifdef STB_IMAGE_STATIC 
  345#define STBIDEF static 
  347#define STBIDEF extern 
  362   int      (*read)  (
void *user,
char *data,
int size);   
 
  363   void     (*skip)  (
void *user,
int n);                 
 
  364   int      (*eof)   (
void *user);                       
 
 
  372STBIDEF stbi_uc *stbi_load_from_memory   (stbi_uc           
const *buffer, 
int len   , 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  373STBIDEF stbi_uc *stbi_load_from_callbacks(
stbi_io_callbacks const *clbk  , 
void *user, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  376STBIDEF stbi_uc *stbi_load            (
char const *filename, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  377STBIDEF stbi_uc *stbi_load_from_file  (FILE *f, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  382STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc 
const *buffer, 
int len, 
int **delays, 
int *x, 
int *y, 
int *z, 
int *comp, 
int req_comp);
 
  385#ifdef STBI_WINDOWS_UTF8 
  386STBIDEF 
int stbi_convert_wchar_to_utf8(
char *buffer, 
size_t bufferlen, 
const wchar_t* input);
 
  394STBIDEF stbi_us *stbi_load_16_from_memory   (stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  395STBIDEF stbi_us *stbi_load_16_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  398STBIDEF stbi_us *stbi_load_16          (
char const *filename, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  399STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  406#ifndef STBI_NO_LINEAR 
  407   STBIDEF 
float *stbi_loadf_from_memory     (stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  408   STBIDEF 
float *stbi_loadf_from_callbacks  (
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y,  
int *channels_in_file, 
int desired_channels);
 
  410   #ifndef STBI_NO_STDIO 
  411   STBIDEF 
float *stbi_loadf            (
char const *filename, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  412   STBIDEF 
float *stbi_loadf_from_file  (FILE *f, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels);
 
  417   STBIDEF 
void   stbi_hdr_to_ldr_gamma(
float gamma);
 
  418   STBIDEF 
void   stbi_hdr_to_ldr_scale(
float scale);
 
  421#ifndef STBI_NO_LINEAR 
  422   STBIDEF 
void   stbi_ldr_to_hdr_gamma(
float gamma);
 
  423   STBIDEF 
void   stbi_ldr_to_hdr_scale(
float scale);
 
  427STBIDEF 
int    stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user);
 
  428STBIDEF 
int    stbi_is_hdr_from_memory(stbi_uc 
const *buffer, 
int len);
 
  430STBIDEF 
int      stbi_is_hdr          (
char const *filename);
 
  431STBIDEF 
int      stbi_is_hdr_from_file(FILE *f);
 
  437STBIDEF 
const char *stbi_failure_reason  (
void);
 
  440STBIDEF 
void     stbi_image_free      (
void *retval_from_stbi_load);
 
  443STBIDEF 
int      stbi_info_from_memory(stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *comp);
 
  444STBIDEF 
int      stbi_info_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y, 
int *comp);
 
  445STBIDEF 
int      stbi_is_16_bit_from_memory(stbi_uc 
const *buffer, 
int len);
 
  446STBIDEF 
int      stbi_is_16_bit_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user);
 
  449STBIDEF 
int      stbi_info               (
char const *filename,     
int *x, 
int *y, 
int *comp);
 
  450STBIDEF 
int      stbi_info_from_file     (FILE *f,                  
int *x, 
int *y, 
int *comp);
 
  451STBIDEF 
int      stbi_is_16_bit          (
char const *filename);
 
  452STBIDEF 
int      stbi_is_16_bit_from_file(FILE *f);
 
  460STBIDEF 
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply);
 
  464STBIDEF 
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert);
 
  467STBIDEF 
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip);
 
  471STBIDEF 
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer, 
int len, 
int initial_size, 
int *outlen);
 
  472STBIDEF 
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer, 
int len, 
int initial_size, 
int *outlen, 
int parse_header);
 
  473STBIDEF 
char *stbi_zlib_decode_malloc(
const char *buffer, 
int len, 
int *outlen);
 
  474STBIDEF 
int   stbi_zlib_decode_buffer(
char *obuffer, 
int olen, 
const char *ibuffer, 
int ilen);
 
  476STBIDEF 
char *stbi_zlib_decode_noheader_malloc(
const char *buffer, 
int len, 
int *outlen);
 
  477STBIDEF 
int   stbi_zlib_decode_noheader_buffer(
char *obuffer, 
int olen, 
const char *ibuffer, 
int ilen);
 
  489#ifdef STB_IMAGE_IMPLEMENTATION 
  491#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \ 
  492  || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \ 
  493  || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \ 
  494  || defined(STBI_ONLY_ZLIB) 
  495   #ifndef STBI_ONLY_JPEG 
  498   #ifndef STBI_ONLY_PNG 
  501   #ifndef STBI_ONLY_BMP 
  504   #ifndef STBI_ONLY_PSD 
  507   #ifndef STBI_ONLY_TGA 
  510   #ifndef STBI_ONLY_GIF 
  513   #ifndef STBI_ONLY_HDR 
  516   #ifndef STBI_ONLY_PIC 
  519   #ifndef STBI_ONLY_PNM 
  524#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB) 
  535#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) 
  545#define STBI_ASSERT(x) assert(x) 
  549#define STBI_EXTERN extern "C" 
  551#define STBI_EXTERN extern 
  557   #define stbi_inline inline 
  562   #define stbi_inline __forceinline 
  567typedef unsigned short stbi__uint16;
 
  568typedef   signed short stbi__int16;
 
  569typedef unsigned int   stbi__uint32;
 
  570typedef   signed int   stbi__int32;
 
  573typedef uint16_t stbi__uint16;
 
  574typedef int16_t  stbi__int16;
 
  575typedef uint32_t stbi__uint32;
 
  576typedef int32_t  stbi__int32;
 
  580typedef unsigned char validate_uint32[
sizeof(stbi__uint32)==4 ? 1 : -1];
 
  583#define STBI_NOTUSED(v)  (void)(v) 
  585#define STBI_NOTUSED(v)  (void)sizeof(v) 
  589#define STBI_HAS_LROTL 
  593   #define stbi_lrot(x,y)  _lrotl(x,y) 
  595   #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (32 - (y)))) 
  598#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) 
  600#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) 
  603#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." 
  607#define STBI_MALLOC(sz)           malloc(sz) 
  608#define STBI_REALLOC(p,newsz)     realloc(p,newsz) 
  609#define STBI_FREE(p)              free(p) 
  612#ifndef STBI_REALLOC_SIZED 
  613#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) 
  617#if defined(__x86_64__) || defined(_M_X64) 
  618#define STBI__X64_TARGET 
  619#elif defined(__i386) || defined(_M_IX86) 
  620#define STBI__X86_TARGET 
  623#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) 
  634#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) 
  649#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) 
  651#include <emmintrin.h> 
  657static int stbi__cpuid3(
void)
 
  664static int stbi__cpuid3(
void)
 
  676#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name 
  678#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) 
  679static int stbi__sse2_available(
void)
 
  681   int info3 = stbi__cpuid3();
 
  682   return ((info3 >> 26) & 1) != 0;
 
  687#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 
  689#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) 
  690static int stbi__sse2_available(
void)
 
  703#if defined(STBI_NO_SIMD) && defined(STBI_NEON) 
  710#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) 
  713#ifndef STBI_SIMD_ALIGN 
  714#define STBI_SIMD_ALIGN(type, name) type name 
  725   stbi__uint32 img_x, img_y;
 
  726   int img_n, img_out_n;
 
  731   int read_from_callbacks;
 
  733   stbi_uc buffer_start[128];
 
  735   stbi_uc *img_buffer, *img_buffer_end;
 
  736   stbi_uc *img_buffer_original, *img_buffer_original_end;
 
  740static void stbi__refill_buffer(stbi__context *s);
 
  743static void stbi__start_mem(stbi__context *s, stbi_uc 
const *buffer, 
int len)
 
  746   s->read_from_callbacks = 0;
 
  747   s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
 
  748   s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
 
  752static void stbi__start_callbacks(stbi__context *s, 
stbi_io_callbacks *c, 
void *user)
 
  755   s->io_user_data = user;
 
  756   s->buflen = 
sizeof(s->buffer_start);
 
  757   s->read_from_callbacks = 1;
 
  758   s->img_buffer_original = s->buffer_start;
 
  759   stbi__refill_buffer(s);
 
  760   s->img_buffer_original_end = s->img_buffer_end;
 
  765static int stbi__stdio_read(
void *user, 
char *data, 
int size)
 
  767   return (
int) fread(data,1,size,(FILE*) user);
 
  770static void stbi__stdio_skip(
void *user, 
int n)
 
  772   fseek((FILE*) user, n, SEEK_CUR);
 
  775static int stbi__stdio_eof(
void *user)
 
  777   return feof((FILE*) user);
 
  787static void stbi__start_file(stbi__context *s, FILE *f)
 
  789   stbi__start_callbacks(s, &stbi__stdio_callbacks, (
void *) f);
 
  796static void stbi__rewind(stbi__context *s)
 
  801   s->img_buffer = s->img_buffer_original;
 
  802   s->img_buffer_end = s->img_buffer_original_end;
 
  813   int bits_per_channel;
 
  819static int      stbi__jpeg_test(stbi__context *s);
 
  820static void    *stbi__jpeg_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
 
  821static int      stbi__jpeg_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
 
  825static int      stbi__png_test(stbi__context *s);
 
  826static void    *stbi__png_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
 
  827static int      stbi__png_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
 
  828static int      stbi__png_is16(stbi__context *s);
 
  832static int      stbi__bmp_test(stbi__context *s);
 
  833static void    *stbi__bmp_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
 
  834static int      stbi__bmp_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
 
  838static int      stbi__tga_test(stbi__context *s);
 
  839static void    *stbi__tga_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
 
  840static int      stbi__tga_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
 
  844static int      stbi__psd_test(stbi__context *s);
 
  845static void    *stbi__psd_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri, 
int bpc);
 
  846static int      stbi__psd_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
 
  847static int      stbi__psd_is16(stbi__context *s);
 
  851static int      stbi__hdr_test(stbi__context *s);
 
  852static float   *stbi__hdr_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
 
  853static int      stbi__hdr_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
 
  857static int      stbi__pic_test(stbi__context *s);
 
  858static void    *stbi__pic_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
 
  859static int      stbi__pic_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
 
  863static int      stbi__gif_test(stbi__context *s);
 
  864static void    *stbi__gif_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
 
  865static void    *stbi__load_gif_main(stbi__context *s, 
int **delays, 
int *x, 
int *y, 
int *z, 
int *comp, 
int req_comp);
 
  866static int      stbi__gif_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
 
  870static int      stbi__pnm_test(stbi__context *s);
 
  871static void    *stbi__pnm_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri);
 
  872static int      stbi__pnm_info(stbi__context *s, 
int *x, 
int *y, 
int *comp);
 
  876static const char *stbi__g_failure_reason;
 
  878STBIDEF 
const char *stbi_failure_reason(
void)
 
  880   return stbi__g_failure_reason;
 
  883static int stbi__err(
const char *str)
 
  885   stbi__g_failure_reason = str;
 
  889static void *stbi__malloc(
size_t size)
 
  891    return STBI_MALLOC(size);
 
  906static int stbi__addsizes_valid(
int a, 
int b)
 
  913   return a <= INT_MAX - b;
 
  918static int stbi__mul2sizes_valid(
int a, 
int b)
 
  920   if (a < 0 || b < 0) 
return 0;
 
  921   if (b == 0) 
return 1; 
 
  923   return a <= INT_MAX/b;
 
  927static int stbi__mad2sizes_valid(
int a, 
int b, 
int add)
 
  929   return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
 
  933static int stbi__mad3sizes_valid(
int a, 
int b, 
int c, 
int add)
 
  935   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
 
  936      stbi__addsizes_valid(a*b*c, add);
 
  940#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) 
  941static int stbi__mad4sizes_valid(
int a, 
int b, 
int c, 
int d, 
int add)
 
  943   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
 
  944      stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
 
  949static void *stbi__malloc_mad2(
int a, 
int b, 
int add)
 
  951   if (!stbi__mad2sizes_valid(a, b, add)) 
return NULL;
 
  952   return stbi__malloc(a*b + add);
 
  955static void *stbi__malloc_mad3(
int a, 
int b, 
int c, 
int add)
 
  957   if (!stbi__mad3sizes_valid(a, b, c, add)) 
return NULL;
 
  958   return stbi__malloc(a*b*c + add);
 
  961#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) 
  962static void *stbi__malloc_mad4(
int a, 
int b, 
int c, 
int d, 
int add)
 
  964   if (!stbi__mad4sizes_valid(a, b, c, d, add)) 
return NULL;
 
  965   return stbi__malloc(a*b*c*d + add);
 
  973#ifdef STBI_NO_FAILURE_STRINGS 
  974   #define stbi__err(x,y)  0 
  975#elif defined(STBI_FAILURE_USERMSG) 
  976   #define stbi__err(x,y)  stbi__err(y) 
  978   #define stbi__err(x,y)  stbi__err(x) 
  981#define stbi__errpf(x,y)   ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) 
  982#define stbi__errpuc(x,y)  ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) 
  984STBIDEF 
void stbi_image_free(
void *retval_from_stbi_load)
 
  986   STBI_FREE(retval_from_stbi_load);
 
  989#ifndef STBI_NO_LINEAR 
  990static float   *stbi__ldr_to_hdr(stbi_uc *data, 
int x, 
int y, 
int comp);
 
  994static stbi_uc *stbi__hdr_to_ldr(
float   *data, 
int x, 
int y, 
int comp);
 
  997static int stbi__vertically_flip_on_load = 0;
 
  999STBIDEF 
void stbi_set_flip_vertically_on_load(
int flag_true_if_should_flip)
 
 1001    stbi__vertically_flip_on_load = flag_true_if_should_flip;
 
 1004static void *stbi__load_main(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri, 
int bpc)
 
 1006   memset(ri, 0, 
sizeof(*ri)); 
 
 1007   ri->bits_per_channel = 8; 
 
 1008   ri->channel_order = STBI_ORDER_RGB; 
 
 1009   ri->num_channels = 0;
 
 1011   #ifndef STBI_NO_JPEG 
 1012   if (stbi__jpeg_test(s)) 
return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
 
 1015   if (stbi__png_test(s))  
return stbi__png_load(s,x,y,comp,req_comp, ri);
 
 1018   if (stbi__bmp_test(s))  
return stbi__bmp_load(s,x,y,comp,req_comp, ri);
 
 1021   if (stbi__gif_test(s))  
return stbi__gif_load(s,x,y,comp,req_comp, ri);
 
 1024   if (stbi__psd_test(s))  
return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
 
 1027   if (stbi__pic_test(s))  
return stbi__pic_load(s,x,y,comp,req_comp, ri);
 
 1030   if (stbi__pnm_test(s))  
return stbi__pnm_load(s,x,y,comp,req_comp, ri);
 
 1034   if (stbi__hdr_test(s)) {
 
 1035      float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
 
 1036      return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
 
 1042   if (stbi__tga_test(s))
 
 1043      return stbi__tga_load(s,x,y,comp,req_comp, ri);
 
 1046   return stbi__errpuc(
"unknown image type", 
"Image not of any known type, or corrupt");
 
 1049static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, 
int w, 
int h, 
int channels)
 
 1052   int img_len = w * h * channels;
 
 1055   reduced = (stbi_uc *) stbi__malloc(img_len);
 
 1056   if (reduced == NULL) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
 
 1058   for (i = 0; i < img_len; ++i)
 
 1059      reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); 
 
 1065static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, 
int w, 
int h, 
int channels)
 
 1068   int img_len = w * h * channels;
 
 1069   stbi__uint16 *enlarged;
 
 1071   enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
 
 1072   if (enlarged == NULL) 
return (stbi__uint16 *) stbi__errpuc(
"outofmem", 
"Out of memory");
 
 1074   for (i = 0; i < img_len; ++i)
 
 1075      enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); 
 
 1081static void stbi__vertical_flip(
void *image, 
int w, 
int h, 
int bytes_per_pixel)
 
 1084   size_t bytes_per_row = (size_t)w * bytes_per_pixel;
 
 1086   stbi_uc *bytes = (stbi_uc *)image;
 
 1088   for (row = 0; row < (h>>1); row++) {
 
 1089      stbi_uc *row0 = bytes + row*bytes_per_row;
 
 1090      stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
 
 1092      size_t bytes_left = bytes_per_row;
 
 1093      while (bytes_left) {
 
 1094         size_t bytes_copy = (bytes_left < 
sizeof(temp)) ? bytes_left : sizeof(temp);
 
 1095         memcpy(temp, row0, bytes_copy);
 
 1096         memcpy(row0, row1, bytes_copy);
 
 1097         memcpy(row1, temp, bytes_copy);
 
 1100         bytes_left -= bytes_copy;
 
 1106static void stbi__vertical_flip_slices(
void *image, 
int w, 
int h, 
int z, 
int bytes_per_pixel)
 
 1109   int slice_size = w * h * bytes_per_pixel;
 
 1111   stbi_uc *bytes = (stbi_uc *)image;
 
 1112   for (slice = 0; slice < z; ++slice) {
 
 1113      stbi__vertical_flip(bytes, w, h, bytes_per_pixel); 
 
 1114      bytes += slice_size; 
 
 1119static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1121   stbi__result_info ri;
 
 1122   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
 
 1127   if (ri.bits_per_channel != 8) {
 
 1128      STBI_ASSERT(ri.bits_per_channel == 16);
 
 1129      result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
 
 1130      ri.bits_per_channel = 8;
 
 1135   if (stbi__vertically_flip_on_load) {
 
 1136      int channels = req_comp ? req_comp : *comp;
 
 1137      stbi__vertical_flip(result, *x, *y, channels * 
sizeof(stbi_uc));
 
 1140   return (
unsigned char *) result;
 
 1143static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1145   stbi__result_info ri;
 
 1146   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
 
 1151   if (ri.bits_per_channel != 16) {
 
 1152      STBI_ASSERT(ri.bits_per_channel == 8);
 
 1153      result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
 
 1154      ri.bits_per_channel = 16;
 
 1160   if (stbi__vertically_flip_on_load) {
 
 1161      int channels = req_comp ? req_comp : *comp;
 
 1162      stbi__vertical_flip(result, *x, *y, channels * 
sizeof(stbi__uint16));
 
 1165   return (stbi__uint16 *) result;
 
 1168#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) 
 1169static void stbi__float_postprocess(
float *result, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1171   if (stbi__vertically_flip_on_load && result != NULL) {
 
 1172      int channels = req_comp ? req_comp : *comp;
 
 1173      stbi__vertical_flip(result, *x, *y, channels * 
sizeof(
float));
 
 1178#ifndef STBI_NO_STDIO 
 1180#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) 
 1181STBI_EXTERN __declspec(dllimport) 
int __stdcall MultiByteToWideChar(
unsigned int cp, 
unsigned long flags, 
const char *str, 
int cbmb, 
wchar_t *widestr, 
int cchwide);
 
 1182STBI_EXTERN __declspec(dllimport) 
int __stdcall WideCharToMultiByte(
unsigned int cp, 
unsigned long flags, 
const wchar_t *widestr, 
int cchwide, 
char *str, 
int cbmb, 
const char *defchar, 
int *used_default);
 
 1185#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) 
 1186STBIDEF 
int stbi_convert_wchar_to_utf8(
char *buffer, 
size_t bufferlen, 
const wchar_t* input)
 
 1188        return WideCharToMultiByte(65001 , 0, input, -1, buffer, (
int) bufferlen, NULL, NULL);
 
 1192static FILE *stbi__fopen(
char const *filename, 
char const *mode)
 
 1195#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8) 
 1197   wchar_t wFilename[1024];
 
 1198        if (0 == MultiByteToWideChar(65001 , 0, filename, -1, wFilename, 
sizeof(wFilename)))
 
 1201        if (0 == MultiByteToWideChar(65001 , 0, mode, -1, wMode, 
sizeof(wMode)))
 
 1205        if (0 != _wfopen_s(&f, wFilename, wMode))
 
 1208   f = _wfopen(wFilename, wMode);
 
 1211#elif defined(_MSC_VER) && _MSC_VER >= 1400 
 1212   if (0 != fopen_s(&f, filename, mode))
 
 1215   f = fopen(filename, mode);
 
 1221STBIDEF stbi_uc *stbi_load(
char const *filename, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1223   FILE *f = stbi__fopen(filename, 
"rb");
 
 1224   unsigned char *result;
 
 1225   if (!f) 
return stbi__errpuc(
"can't fopen", 
"Unable to open file");
 
 1226   result = stbi_load_from_file(f,x,y,comp,req_comp);
 
 1231STBIDEF stbi_uc *stbi_load_from_file(FILE *f, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1233   unsigned char *result;
 
 1235   stbi__start_file(&s,f);
 
 1236   result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
 
 1239      fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
 
 1244STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1246   stbi__uint16 *result;
 
 1248   stbi__start_file(&s,f);
 
 1249   result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
 
 1252      fseek(f, - (
int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
 
 1257STBIDEF stbi_us *stbi_load_16(
char const *filename, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1259   FILE *f = stbi__fopen(filename, 
"rb");
 
 1260   stbi__uint16 *result;
 
 1261   if (!f) 
return (stbi_us *) stbi__errpuc(
"can't fopen", 
"Unable to open file");
 
 1262   result = stbi_load_from_file_16(f,x,y,comp,req_comp);
 
 1270STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels)
 
 1273   stbi__start_mem(&s,buffer,len);
 
 1274   return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
 
 1277STBIDEF stbi_us *stbi_load_16_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y, 
int *channels_in_file, 
int desired_channels)
 
 1281   return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
 
 1284STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1287   stbi__start_mem(&s,buffer,len);
 
 1288   return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
 
 1291STBIDEF stbi_uc *stbi_load_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1295   return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
 
 1299STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc 
const *buffer, 
int len, 
int **delays, 
int *x, 
int *y, 
int *z, 
int *comp, 
int req_comp)
 
 1301   unsigned char *result;
 
 1303   stbi__start_mem(&s,buffer,len); 
 
 1305   result = (
unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
 
 1306   if (stbi__vertically_flip_on_load) {
 
 1307      stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); 
 
 1314#ifndef STBI_NO_LINEAR 
 1315static float *stbi__loadf_main(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1317   unsigned char *data;
 
 1319   if (stbi__hdr_test(s)) {
 
 1320      stbi__result_info ri;
 
 1321      float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
 
 1323         stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
 
 1327   data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
 
 1329      return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
 
 1330   return stbi__errpf(
"unknown image type", 
"Image not of any known type, or corrupt");
 
 1333STBIDEF 
float *stbi_loadf_from_memory(stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1336   stbi__start_mem(&s,buffer,len);
 
 1337   return stbi__loadf_main(&s,x,y,comp,req_comp);
 
 1340STBIDEF 
float *stbi_loadf_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1344   return stbi__loadf_main(&s,x,y,comp,req_comp);
 
 1347#ifndef STBI_NO_STDIO 
 1348STBIDEF 
float *stbi_loadf(
char const *filename, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1351   FILE *f = stbi__fopen(filename, 
"rb");
 
 1352   if (!f) 
return stbi__errpf(
"can't fopen", 
"Unable to open file");
 
 1353   result = stbi_loadf_from_file(f,x,y,comp,req_comp);
 
 1358STBIDEF 
float *stbi_loadf_from_file(FILE *f, 
int *x, 
int *y, 
int *comp, 
int req_comp)
 
 1361   stbi__start_file(&s,f);
 
 1362   return stbi__loadf_main(&s,x,y,comp,req_comp);
 
 1372STBIDEF 
int stbi_is_hdr_from_memory(stbi_uc 
const *buffer, 
int len)
 
 1376   stbi__start_mem(&s,buffer,len);
 
 1377   return stbi__hdr_test(&s);
 
 1379   STBI_NOTUSED(buffer);
 
 1385#ifndef STBI_NO_STDIO 
 1386STBIDEF 
int      stbi_is_hdr          (
char const *filename)
 
 1388   FILE *f = stbi__fopen(filename, 
"rb");
 
 1391      result = stbi_is_hdr_from_file(f);
 
 1397STBIDEF 
int stbi_is_hdr_from_file(FILE *f)
 
 1400   long pos = ftell(f);
 
 1403   stbi__start_file(&s,f);
 
 1404   res = stbi__hdr_test(&s);
 
 1405   fseek(f, pos, SEEK_SET);
 
 1414STBIDEF 
int      stbi_is_hdr_from_callbacks(
stbi_io_callbacks const *clbk, 
void *user)
 
 1419   return stbi__hdr_test(&s);
 
 1427#ifndef STBI_NO_LINEAR 
 1428static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
 
 1430STBIDEF 
void   stbi_ldr_to_hdr_gamma(
float gamma) { stbi__l2h_gamma = gamma; }
 
 1431STBIDEF 
void   stbi_ldr_to_hdr_scale(
float scale) { stbi__l2h_scale = scale; }
 
 1434static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
 
 1436STBIDEF 
void   stbi_hdr_to_ldr_gamma(
float gamma) { stbi__h2l_gamma_i = 1/gamma; }
 
 1437STBIDEF 
void   stbi_hdr_to_ldr_scale(
float scale) { stbi__h2l_scale_i = 1/scale; }
 
 1452static void stbi__refill_buffer(stbi__context *s)
 
 1454   int n = (s->io.read)(s->io_user_data,(
char*)s->buffer_start,s->buflen);
 
 1458      s->read_from_callbacks = 0;
 
 1459      s->img_buffer = s->buffer_start;
 
 1460      s->img_buffer_end = s->buffer_start+1;
 
 1463      s->img_buffer = s->buffer_start;
 
 1464      s->img_buffer_end = s->buffer_start + n;
 
 1468stbi_inline 
static stbi_uc stbi__get8(stbi__context *s)
 
 1470   if (s->img_buffer < s->img_buffer_end)
 
 1471      return *s->img_buffer++;
 
 1472   if (s->read_from_callbacks) {
 
 1473      stbi__refill_buffer(s);
 
 1474      return *s->img_buffer++;
 
 1479stbi_inline 
static int stbi__at_eof(stbi__context *s)
 
 1482      if (!(s->io.eof)(s->io_user_data)) 
return 0;
 
 1485      if (s->read_from_callbacks == 0) 
return 1;
 
 1488   return s->img_buffer >= s->img_buffer_end;
 
 1491static void stbi__skip(stbi__context *s, 
int n)
 
 1494      s->img_buffer = s->img_buffer_end;
 
 1498      int blen = (int) (s->img_buffer_end - s->img_buffer);
 
 1500         s->img_buffer = s->img_buffer_end;
 
 1501         (s->io.skip)(s->io_user_data, n - blen);
 
 1508static int stbi__getn(stbi__context *s, stbi_uc *buffer, 
int n)
 
 1511      int blen = (int) (s->img_buffer_end - s->img_buffer);
 
 1515         memcpy(buffer, s->img_buffer, blen);
 
 1517         count = (s->io.read)(s->io_user_data, (
char*) buffer + blen, n - blen);
 
 1518         res = (count == (n-blen));
 
 1519         s->img_buffer = s->img_buffer_end;
 
 1524   if (s->img_buffer+n <= s->img_buffer_end) {
 
 1525      memcpy(buffer, s->img_buffer, n);
 
 1532static int stbi__get16be(stbi__context *s)
 
 1534   int z = stbi__get8(s);
 
 1535   return (z << 8) + stbi__get8(s);
 
 1538static stbi__uint32 stbi__get32be(stbi__context *s)
 
 1540   stbi__uint32 z = stbi__get16be(s);
 
 1541   return (z << 16) + stbi__get16be(s);
 
 1544#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) 
 1547static int stbi__get16le(stbi__context *s)
 
 1549   int z = stbi__get8(s);
 
 1550   return z + (stbi__get8(s) << 8);
 
 1555static stbi__uint32 stbi__get32le(stbi__context *s)
 
 1557   stbi__uint32 z = stbi__get16le(s);
 
 1558   return z + (stbi__get16le(s) << 16);
 
 1562#define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))   
 1576static stbi_uc stbi__compute_y(
int r, 
int g, 
int b)
 
 1578   return (stbi_uc) (((r*77) + (g*150) +  (29*b)) >> 8);
 
 1581static unsigned char *stbi__convert_format(
unsigned char *data, 
int img_n, 
int req_comp, 
unsigned int x, 
unsigned int y)
 
 1584   unsigned char *good;
 
 1586   if (req_comp == img_n) 
return data;
 
 1587   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
 
 1589   good = (
unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
 
 1592      return stbi__errpuc(
"outofmem", 
"Out of memory");
 
 1595   for (j=0; j < (int) y; ++j) {
 
 1596      unsigned char *src  = data + j * x * img_n   ;
 
 1597      unsigned char *dest = good + j * x * req_comp;
 
 1599      #define STBI__COMBO(a,b)  ((a)*8+(b)) 
 1600      #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 
 1603      switch (STBI__COMBO(img_n, req_comp)) {
 
 1604         STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255;                                     } 
break;
 
 1605         STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } 
break;
 
 1606         STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255;                     } 
break;
 
 1607         STBI__CASE(2,1) { dest[0]=src[0];                                                  } 
break;
 
 1608         STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } 
break;
 
 1609         STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                  } 
break;
 
 1610         STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255;        } 
break;
 
 1611         STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } 
break;
 
 1612         STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255;    } 
break;
 
 1613         STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } 
break;
 
 1614         STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } 
break;
 
 1615         STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                    } 
break;
 
 1616         default: STBI_ASSERT(0);
 
 1625static stbi__uint16 stbi__compute_y_16(
int r, 
int g, 
int b)
 
 1627   return (stbi__uint16) (((r*77) + (g*150) +  (29*b)) >> 8);
 
 1630static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, 
int img_n, 
int req_comp, 
unsigned int x, 
unsigned int y)
 
 1635   if (req_comp == img_n) 
return data;
 
 1636   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
 
 1638   good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
 
 1641      return (stbi__uint16 *) stbi__errpuc(
"outofmem", 
"Out of memory");
 
 1644   for (j=0; j < (int) y; ++j) {
 
 1645      stbi__uint16 *src  = data + j * x * img_n   ;
 
 1646      stbi__uint16 *dest = good + j * x * req_comp;
 
 1648      #define STBI__COMBO(a,b)  ((a)*8+(b)) 
 1649      #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 
 1652      switch (STBI__COMBO(img_n, req_comp)) {
 
 1653         STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff;                                     } 
break;
 
 1654         STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } 
break;
 
 1655         STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff;                     } 
break;
 
 1656         STBI__CASE(2,1) { dest[0]=src[0];                                                     } 
break;
 
 1657         STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } 
break;
 
 1658         STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                     } 
break;
 
 1659         STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff;        } 
break;
 
 1660         STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } 
break;
 
 1661         STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } 
break;
 
 1662         STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } 
break;
 
 1663         STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } 
break;
 
 1664         STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                       } 
break;
 
 1665         default: STBI_ASSERT(0);
 
 1674#ifndef STBI_NO_LINEAR 
 1675static float   *stbi__ldr_to_hdr(stbi_uc *data, 
int x, 
int y, 
int comp)
 
 1679   if (!data) 
return NULL;
 
 1680   output = (
float *) stbi__malloc_mad4(x, y, comp, 
sizeof(
float), 0);
 
 1681   if (output == NULL) { STBI_FREE(data); 
return stbi__errpf(
"outofmem", 
"Out of memory"); }
 
 1683   if (comp & 1) n = comp; 
else n = comp-1;
 
 1684   for (i=0; i < x*y; ++i) {
 
 1685      for (k=0; k < n; ++k) {
 
 1686         output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
 
 1690      for (i=0; i < x*y; ++i) {
 
 1691         output[i*comp + n] = data[i*comp + n]/255.0f;
 
 1700#define stbi__float2int(x)   ((int) (x)) 
 1701static stbi_uc *stbi__hdr_to_ldr(
float   *data, 
int x, 
int y, 
int comp)
 
 1705   if (!data) 
return NULL;
 
 1706   output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
 
 1707   if (output == NULL) { STBI_FREE(data); 
return stbi__errpuc(
"outofmem", 
"Out of memory"); }
 
 1709   if (comp & 1) n = comp; 
else n = comp-1;
 
 1710   for (i=0; i < x*y; ++i) {
 
 1711      for (k=0; k < n; ++k) {
 
 1712         float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
 
 1714         if (z > 255) z = 255;
 
 1715         output[i*comp + k] = (stbi_uc) stbi__float2int(z);
 
 1718         float z = data[i*comp+k] * 255 + 0.5f;
 
 1720         if (z > 255) z = 255;
 
 1721         output[i*comp + k] = (stbi_uc) stbi__float2int(z);
 
 1757   stbi_uc  fast[1 << FAST_BITS];
 
 1759   stbi__uint16 code[256];
 
 1760   stbi_uc  values[256];
 
 1762   unsigned int maxcode[18];
 
 1769   stbi__huffman huff_dc[4];
 
 1770   stbi__huffman huff_ac[4];
 
 1771   stbi__uint16 dequant[4][64];
 
 1772   stbi__int16 fast_ac[4][1 << FAST_BITS];
 
 1775   int img_h_max, img_v_max;
 
 1776   int img_mcu_x, img_mcu_y;
 
 1777   int img_mcu_w, img_mcu_h;
 
 1790      void *raw_data, *raw_coeff;
 
 1793      int      coeff_w, coeff_h; 
 
 1796   stbi__uint32   code_buffer; 
 
 1798   unsigned char  marker;      
 
 1808   int            app14_color_transform; 
 
 1811   int scan_n, order[4];
 
 1812   int restart_interval, todo;
 
 1815   void (*idct_block_kernel)(stbi_uc *out, 
int out_stride, 
short data[64]);
 
 1816   void (*YCbCr_to_RGB_kernel)(stbi_uc *out, 
const stbi_uc *y, 
const stbi_uc *pcb, 
const stbi_uc *pcr, 
int count, 
int step);
 
 1817   stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs);
 
 1820static int stbi__build_huffman(stbi__huffman *h, 
int *count)
 
 1825   for (i=0; i < 16; ++i)
 
 1826      for (j=0; j < count[i]; ++j)
 
 1827         h->size[k++] = (stbi_uc) (i+1);
 
 1833   for(j=1; j <= 16; ++j) {
 
 1835      h->delta[j] = k - code;
 
 1836      if (h->size[k] == j) {
 
 1837         while (h->size[k] == j)
 
 1838            h->code[k++] = (stbi__uint16) (code++);
 
 1839         if (code-1 >= (1u << j)) 
return stbi__err(
"bad code lengths",
"Corrupt JPEG");
 
 1842      h->maxcode[j] = code << (16-j);
 
 1845   h->maxcode[j] = 0xffffffff;
 
 1848   memset(h->fast, 255, 1 << FAST_BITS);
 
 1849   for (i=0; i < k; ++i) {
 
 1851      if (s <= FAST_BITS) {
 
 1852         int c = h->code[i] << (FAST_BITS-s);
 
 1853         int m = 1 << (FAST_BITS-s);
 
 1854         for (j=0; j < m; ++j) {
 
 1855            h->fast[c+j] = (stbi_uc) i;
 
 1864static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
 
 1867   for (i=0; i < (1 << FAST_BITS); ++i) {
 
 1868      stbi_uc fast = h->fast[i];
 
 1871         int rs = h->values[fast];
 
 1872         int run = (rs >> 4) & 15;
 
 1873         int magbits = rs & 15;
 
 1874         int len = h->size[fast];
 
 1876         if (magbits && len + magbits <= FAST_BITS) {
 
 1878            int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
 
 1879            int m = 1 << (magbits - 1);
 
 1880            if (k < m) k += (~0U << magbits) + 1;
 
 1882            if (k >= -128 && k <= 127)
 
 1883               fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
 
 1889static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
 
 1892      unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
 
 1894         int c = stbi__get8(j->s);
 
 1895         while (c == 0xff) c = stbi__get8(j->s); 
 
 1897            j->marker = (
unsigned char) c;
 
 1902      j->code_buffer |= b << (24 - j->code_bits);
 
 1904   } 
while (j->code_bits <= 24);
 
 1908static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
 
 1911stbi_inline 
static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
 
 1916   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
 
 1920   c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
 
 1924      if (s > j->code_bits)
 
 1926      j->code_buffer <<= s;
 
 1928      return h->values[k];
 
 1937   temp = j->code_buffer >> 16;
 
 1938   for (k=FAST_BITS+1 ; ; ++k)
 
 1939      if (temp < h->maxcode[k])
 
 1947   if (k > j->code_bits)
 
 1951   c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
 
 1952   STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
 
 1956   j->code_buffer <<= k;
 
 1957   return h->values[c];
 
 1961static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
 
 1965stbi_inline 
static int stbi__extend_receive(stbi__jpeg *j, 
int n)
 
 1969   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
 
 1971   sgn = (stbi__int32)j->code_buffer >> 31; 
 
 1972   k = stbi_lrot(j->code_buffer, n);
 
 1973   STBI_ASSERT(n >= 0 && n < (
int) (
sizeof(stbi__bmask)/
sizeof(*stbi__bmask)));
 
 1974   j->code_buffer = k & ~stbi__bmask[n];
 
 1975   k &= stbi__bmask[n];
 
 1977   return k + (stbi__jbias[n] & ~sgn);
 
 1981stbi_inline 
static int stbi__jpeg_get_bits(stbi__jpeg *j, 
int n)
 
 1984   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
 
 1985   k = stbi_lrot(j->code_buffer, n);
 
 1986   j->code_buffer = k & ~stbi__bmask[n];
 
 1987   k &= stbi__bmask[n];
 
 1992stbi_inline 
static int stbi__jpeg_get_bit(stbi__jpeg *j)
 
 1995   if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
 
 1997   j->code_buffer <<= 1;
 
 1999   return k & 0x80000000;
 
 2004static const stbi_uc stbi__jpeg_dezigzag[64+15] =
 
 2006    0,  1,  8, 16,  9,  2,  3, 10,
 
 2007   17, 24, 32, 25, 18, 11,  4,  5,
 
 2008   12, 19, 26, 33, 40, 48, 41, 34,
 
 2009   27, 20, 13,  6,  7, 14, 21, 28,
 
 2010   35, 42, 49, 56, 57, 50, 43, 36,
 
 2011   29, 22, 15, 23, 30, 37, 44, 51,
 
 2012   58, 59, 52, 45, 38, 31, 39, 46,
 
 2013   53, 60, 61, 54, 47, 55, 62, 63,
 
 2015   63, 63, 63, 63, 63, 63, 63, 63,
 
 2016   63, 63, 63, 63, 63, 63, 63
 
 2020static 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)
 
 2025   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
 
 2026   t = stbi__jpeg_huff_decode(j, hdc);
 
 2027   if (t < 0) 
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
 
 2030   memset(data,0,64*
sizeof(data[0]));
 
 2032   diff = t ? stbi__extend_receive(j, t) : 0;
 
 2033   dc = j->img_comp[b].dc_pred + diff;
 
 2034   j->img_comp[b].dc_pred = dc;
 
 2035   data[0] = (short) (dc * dequant[0]);
 
 2042      if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
 
 2043      c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
 
 2048         j->code_buffer <<= s;
 
 2051         zig = stbi__jpeg_dezigzag[k++];
 
 2052         data[zig] = (short) ((r >> 8) * dequant[zig]);
 
 2054         int rs = stbi__jpeg_huff_decode(j, hac);
 
 2055         if (rs < 0) 
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
 
 2059            if (rs != 0xf0) 
break; 
 
 2064            zig = stbi__jpeg_dezigzag[k++];
 
 2065            data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
 
 2072static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, 
short data[64], stbi__huffman *hdc, 
int b)
 
 2076   if (j->spec_end != 0) 
return stbi__err(
"can't merge dc and ac", 
"Corrupt JPEG");
 
 2078   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
 
 2080   if (j->succ_high == 0) {
 
 2082      memset(data,0,64*
sizeof(data[0])); 
 
 2083      t = stbi__jpeg_huff_decode(j, hdc);
 
 2084      diff = t ? stbi__extend_receive(j, t) : 0;
 
 2086      dc = j->img_comp[b].dc_pred + diff;
 
 2087      j->img_comp[b].dc_pred = dc;
 
 2088      data[0] = (short) (dc << j->succ_low);
 
 2091      if (stbi__jpeg_get_bit(j))
 
 2092         data[0] += (short) (1 << j->succ_low);
 
 2099static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, 
short data[64], stbi__huffman *hac, stbi__int16 *fac)
 
 2102   if (j->spec_start == 0) 
return stbi__err(
"can't merge dc and ac", 
"Corrupt JPEG");
 
 2104   if (j->succ_high == 0) {
 
 2105      int shift = j->succ_low;
 
 2116         if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
 
 2117         c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
 
 2122            j->code_buffer <<= s;
 
 2124            zig = stbi__jpeg_dezigzag[k++];
 
 2125            data[zig] = (short) ((r >> 8) << shift);
 
 2127            int rs = stbi__jpeg_huff_decode(j, hac);
 
 2128            if (rs < 0) 
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
 
 2133                  j->eob_run = (1 << r);
 
 2135                     j->eob_run += stbi__jpeg_get_bits(j, r);
 
 2142               zig = stbi__jpeg_dezigzag[k++];
 
 2143               data[zig] = (short) (stbi__extend_receive(j,s) << shift);
 
 2146      } 
while (k <= j->spec_end);
 
 2150      short bit = (short) (1 << j->succ_low);
 
 2154         for (k = j->spec_start; k <= j->spec_end; ++k) {
 
 2155            short *p = &data[stbi__jpeg_dezigzag[k]];
 
 2157               if (stbi__jpeg_get_bit(j))
 
 2158                  if ((*p & bit)==0) {
 
 2169            int rs = stbi__jpeg_huff_decode(j, hac); 
 
 2170            if (rs < 0) 
return stbi__err(
"bad huffman code",
"Corrupt JPEG");
 
 2175                  j->eob_run = (1 << r) - 1;
 
 2177                     j->eob_run += stbi__jpeg_get_bits(j, r);
 
 2185               if (s != 1) 
return stbi__err(
"bad huffman code", 
"Corrupt JPEG");
 
 2187               if (stbi__jpeg_get_bit(j))
 
 2194            while (k <= j->spec_end) {
 
 2195               short *p = &data[stbi__jpeg_dezigzag[k++]];
 
 2197                  if (stbi__jpeg_get_bit(j))
 
 2198                     if ((*p & bit)==0) {
 
 2212         } 
while (k <= j->spec_end);
 
 2219stbi_inline 
static stbi_uc stbi__clamp(
int x)
 
 2222   if ((
unsigned int) x > 255) {
 
 2223      if (x < 0) 
return 0;
 
 2224      if (x > 255) 
return 255;
 
 2229#define stbi__f2f(x)  ((int) (((x) * 4096 + 0.5))) 
 2230#define stbi__fsh(x)  ((x) * 4096) 
 2233#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ 
 2234   int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ 
 2237   p1 = (p2+p3) * stbi__f2f(0.5411961f);       \ 
 2238   t2 = p1 + p3*stbi__f2f(-1.847759065f);      \ 
 2239   t3 = p1 + p2*stbi__f2f( 0.765366865f);      \ 
 2242   t0 = stbi__fsh(p2+p3);                      \ 
 2243   t1 = stbi__fsh(p2-p3);                      \ 
 2256   p5 = (p3+p4)*stbi__f2f( 1.175875602f);      \ 
 2257   t0 = t0*stbi__f2f( 0.298631336f);           \ 
 2258   t1 = t1*stbi__f2f( 2.053119869f);           \ 
 2259   t2 = t2*stbi__f2f( 3.072711026f);           \ 
 2260   t3 = t3*stbi__f2f( 1.501321110f);           \ 
 2261   p1 = p5 + p1*stbi__f2f(-0.899976223f);      \ 
 2262   p2 = p5 + p2*stbi__f2f(-2.562915447f);      \ 
 2263   p3 = p3*stbi__f2f(-1.961570560f);           \ 
 2264   p4 = p4*stbi__f2f(-0.390180644f);           \ 
 2270static void stbi__idct_block(stbi_uc *out, 
int out_stride, 
short data[64])
 
 2272   int i,val[64],*v=val;
 
 2277   for (i=0; i < 8; ++i,++d, ++v) {
 
 2279      if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
 
 2280           && d[40]==0 && d[48]==0 && d[56]==0) {
 
 2285         int dcterm = d[0]*4;
 
 2286         v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
 
 2288         STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
 
 2291         x0 += 512; x1 += 512; x2 += 512; x3 += 512;
 
 2292         v[ 0] = (x0+t3) >> 10;
 
 2293         v[56] = (x0-t3) >> 10;
 
 2294         v[ 8] = (x1+t2) >> 10;
 
 2295         v[48] = (x1-t2) >> 10;
 
 2296         v[16] = (x2+t1) >> 10;
 
 2297         v[40] = (x2-t1) >> 10;
 
 2298         v[24] = (x3+t0) >> 10;
 
 2299         v[32] = (x3-t0) >> 10;
 
 2303   for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
 
 2305      STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
 
 2312      x0 += 65536 + (128<<17);
 
 2313      x1 += 65536 + (128<<17);
 
 2314      x2 += 65536 + (128<<17);
 
 2315      x3 += 65536 + (128<<17);
 
 2318      o[0] = stbi__clamp((x0+t3) >> 17);
 
 2319      o[7] = stbi__clamp((x0-t3) >> 17);
 
 2320      o[1] = stbi__clamp((x1+t2) >> 17);
 
 2321      o[6] = stbi__clamp((x1-t2) >> 17);
 
 2322      o[2] = stbi__clamp((x2+t1) >> 17);
 
 2323      o[5] = stbi__clamp((x2-t1) >> 17);
 
 2324      o[3] = stbi__clamp((x3+t0) >> 17);
 
 2325      o[4] = stbi__clamp((x3-t0) >> 17);
 
 2333static void stbi__idct_simd(stbi_uc *out, 
int out_stride, 
short data[64])
 
 2336   __m128i row0, row1, row2, row3, row4, row5, row6, row7;
 
 2340   #define dct_const(x,y)  _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) 
 2344   #define dct_rot(out0,out1, x,y,c0,c1) \ 
 2345      __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ 
 2346      __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ 
 2347      __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ 
 2348      __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ 
 2349      __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ 
 2350      __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) 
 2353   #define dct_widen(out, in) \ 
 2354      __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ 
 2355      __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) 
 2358   #define dct_wadd(out, a, b) \ 
 2359      __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ 
 2360      __m128i out##_h = _mm_add_epi32(a##_h, b##_h) 
 2363   #define dct_wsub(out, a, b) \ 
 2364      __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ 
 2365      __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) 
 2368   #define dct_bfly32o(out0, out1, a,b,bias,s) \ 
 2370         __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ 
 2371         __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ 
 2372         dct_wadd(sum, abiased, b); \ 
 2373         dct_wsub(dif, abiased, b); \ 
 2374         out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ 
 2375         out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ 
 2379   #define dct_interleave8(a, b) \ 
 2381      a = _mm_unpacklo_epi8(a, b); \ 
 2382      b = _mm_unpackhi_epi8(tmp, b) 
 2385   #define dct_interleave16(a, b) \ 
 2387      a = _mm_unpacklo_epi16(a, b); \ 
 2388      b = _mm_unpackhi_epi16(tmp, b) 
 2390   #define dct_pass(bias,shift) \ 
 2393         dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ 
 2394         __m128i sum04 = _mm_add_epi16(row0, row4); \ 
 2395         __m128i dif04 = _mm_sub_epi16(row0, row4); \ 
 2396         dct_widen(t0e, sum04); \ 
 2397         dct_widen(t1e, dif04); \ 
 2398         dct_wadd(x0, t0e, t3e); \ 
 2399         dct_wsub(x3, t0e, t3e); \ 
 2400         dct_wadd(x1, t1e, t2e); \ 
 2401         dct_wsub(x2, t1e, t2e); \ 
 2403         dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ 
 2404         dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ 
 2405         __m128i sum17 = _mm_add_epi16(row1, row7); \ 
 2406         __m128i sum35 = _mm_add_epi16(row3, row5); \ 
 2407         dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ 
 2408         dct_wadd(x4, y0o, y4o); \ 
 2409         dct_wadd(x5, y1o, y5o); \ 
 2410         dct_wadd(x6, y2o, y5o); \ 
 2411         dct_wadd(x7, y3o, y4o); \ 
 2412         dct_bfly32o(row0,row7, x0,x7,bias,shift); \ 
 2413         dct_bfly32o(row1,row6, x1,x6,bias,shift); \ 
 2414         dct_bfly32o(row2,row5, x2,x5,bias,shift); \ 
 2415         dct_bfly32o(row3,row4, x3,x4,bias,shift); \ 
 2418   __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
 
 2419   __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
 
 2420   __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
 
 2421   __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
 
 2422   __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
 
 2423   __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
 
 2424   __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
 
 2425   __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
 
 2428   __m128i bias_0 = _mm_set1_epi32(512);
 
 2429   __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
 
 2432   row0 = _mm_load_si128((
const __m128i *) (data + 0*8));
 
 2433   row1 = _mm_load_si128((
const __m128i *) (data + 1*8));
 
 2434   row2 = _mm_load_si128((
const __m128i *) (data + 2*8));
 
 2435   row3 = _mm_load_si128((
const __m128i *) (data + 3*8));
 
 2436   row4 = _mm_load_si128((
const __m128i *) (data + 4*8));
 
 2437   row5 = _mm_load_si128((
const __m128i *) (data + 5*8));
 
 2438   row6 = _mm_load_si128((
const __m128i *) (data + 6*8));
 
 2439   row7 = _mm_load_si128((
const __m128i *) (data + 7*8));
 
 2442   dct_pass(bias_0, 10);
 
 2446      dct_interleave16(row0, row4);
 
 2447      dct_interleave16(row1, row5);
 
 2448      dct_interleave16(row2, row6);
 
 2449      dct_interleave16(row3, row7);
 
 2452      dct_interleave16(row0, row2);
 
 2453      dct_interleave16(row1, row3);
 
 2454      dct_interleave16(row4, row6);
 
 2455      dct_interleave16(row5, row7);
 
 2458      dct_interleave16(row0, row1);
 
 2459      dct_interleave16(row2, row3);
 
 2460      dct_interleave16(row4, row5);
 
 2461      dct_interleave16(row6, row7);
 
 2465   dct_pass(bias_1, 17);
 
 2469      __m128i p0 = _mm_packus_epi16(row0, row1); 
 
 2470      __m128i p1 = _mm_packus_epi16(row2, row3);
 
 2471      __m128i p2 = _mm_packus_epi16(row4, row5);
 
 2472      __m128i p3 = _mm_packus_epi16(row6, row7);
 
 2475      dct_interleave8(p0, p2); 
 
 2476      dct_interleave8(p1, p3); 
 
 2479      dct_interleave8(p0, p1); 
 
 2480      dct_interleave8(p2, p3); 
 
 2483      dct_interleave8(p0, p2); 
 
 2484      dct_interleave8(p1, p3); 
 
 2487      _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
 
 2488      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
 
 2489      _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
 
 2490      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
 
 2491      _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
 
 2492      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
 
 2493      _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
 
 2494      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
 
 2503#undef dct_interleave8 
 2504#undef dct_interleave16 
 2514static void stbi__idct_simd(stbi_uc *out, 
int out_stride, 
short data[64])
 
 2516   int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
 
 2518   int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
 
 2519   int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
 
 2520   int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
 
 2521   int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
 
 2522   int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
 
 2523   int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
 
 2524   int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
 
 2525   int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
 
 2526   int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
 
 2527   int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
 
 2528   int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
 
 2529   int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
 
 2531#define dct_long_mul(out, inq, coeff) \ 
 2532   int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ 
 2533   int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) 
 2535#define dct_long_mac(out, acc, inq, coeff) \ 
 2536   int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ 
 2537   int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) 
 2539#define dct_widen(out, inq) \ 
 2540   int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ 
 2541   int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) 
 2544#define dct_wadd(out, a, b) \ 
 2545   int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ 
 2546   int32x4_t out##_h = vaddq_s32(a##_h, b##_h) 
 2549#define dct_wsub(out, a, b) \ 
 2550   int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ 
 2551   int32x4_t out##_h = vsubq_s32(a##_h, b##_h) 
 2554#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ 
 2556      dct_wadd(sum, a, b); \ 
 2557      dct_wsub(dif, a, b); \ 
 2558      out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ 
 2559      out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ 
 2562#define dct_pass(shiftop, shift) \ 
 2565      int16x8_t sum26 = vaddq_s16(row2, row6); \ 
 2566      dct_long_mul(p1e, sum26, rot0_0); \ 
 2567      dct_long_mac(t2e, p1e, row6, rot0_1); \ 
 2568      dct_long_mac(t3e, p1e, row2, rot0_2); \ 
 2569      int16x8_t sum04 = vaddq_s16(row0, row4); \ 
 2570      int16x8_t dif04 = vsubq_s16(row0, row4); \ 
 2571      dct_widen(t0e, sum04); \ 
 2572      dct_widen(t1e, dif04); \ 
 2573      dct_wadd(x0, t0e, t3e); \ 
 2574      dct_wsub(x3, t0e, t3e); \ 
 2575      dct_wadd(x1, t1e, t2e); \ 
 2576      dct_wsub(x2, t1e, t2e); \ 
 2578      int16x8_t sum15 = vaddq_s16(row1, row5); \ 
 2579      int16x8_t sum17 = vaddq_s16(row1, row7); \ 
 2580      int16x8_t sum35 = vaddq_s16(row3, row5); \ 
 2581      int16x8_t sum37 = vaddq_s16(row3, row7); \ 
 2582      int16x8_t sumodd = vaddq_s16(sum17, sum35); \ 
 2583      dct_long_mul(p5o, sumodd, rot1_0); \ 
 2584      dct_long_mac(p1o, p5o, sum17, rot1_1); \ 
 2585      dct_long_mac(p2o, p5o, sum35, rot1_2); \ 
 2586      dct_long_mul(p3o, sum37, rot2_0); \ 
 2587      dct_long_mul(p4o, sum15, rot2_1); \ 
 2588      dct_wadd(sump13o, p1o, p3o); \ 
 2589      dct_wadd(sump24o, p2o, p4o); \ 
 2590      dct_wadd(sump23o, p2o, p3o); \ 
 2591      dct_wadd(sump14o, p1o, p4o); \ 
 2592      dct_long_mac(x4, sump13o, row7, rot3_0); \ 
 2593      dct_long_mac(x5, sump24o, row5, rot3_1); \ 
 2594      dct_long_mac(x6, sump23o, row3, rot3_2); \ 
 2595      dct_long_mac(x7, sump14o, row1, rot3_3); \ 
 2596      dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ 
 2597      dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ 
 2598      dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ 
 2599      dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ 
 2603   row0 = vld1q_s16(data + 0*8);
 
 2604   row1 = vld1q_s16(data + 1*8);
 
 2605   row2 = vld1q_s16(data + 2*8);
 
 2606   row3 = vld1q_s16(data + 3*8);
 
 2607   row4 = vld1q_s16(data + 4*8);
 
 2608   row5 = vld1q_s16(data + 5*8);
 
 2609   row6 = vld1q_s16(data + 6*8);
 
 2610   row7 = vld1q_s16(data + 7*8);
 
 2613   row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
 
 2616   dct_pass(vrshrn_n_s32, 10);
 
 2622#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } 
 2623#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]); } 
 2624#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)); } 
 2627      dct_trn16(row0, row1); 
 
 2628      dct_trn16(row2, row3);
 
 2629      dct_trn16(row4, row5);
 
 2630      dct_trn16(row6, row7);
 
 2633      dct_trn32(row0, row2); 
 
 2634      dct_trn32(row1, row3);
 
 2635      dct_trn32(row4, row6);
 
 2636      dct_trn32(row5, row7);
 
 2639      dct_trn64(row0, row4); 
 
 2640      dct_trn64(row1, row5);
 
 2641      dct_trn64(row2, row6);
 
 2642      dct_trn64(row3, row7);
 
 2653   dct_pass(vshrn_n_s32, 16);
 
 2657      uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
 
 2658      uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
 
 2659      uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
 
 2660      uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
 
 2661      uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
 
 2662      uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
 
 2663      uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
 
 2664      uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
 
 2667#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } 
 2668#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]); } 
 2669#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]); } 
 2681      dct_trn8_16(p0, p2);
 
 2682      dct_trn8_16(p1, p3);
 
 2683      dct_trn8_16(p4, p6);
 
 2684      dct_trn8_16(p5, p7);
 
 2687      dct_trn8_32(p0, p4);
 
 2688      dct_trn8_32(p1, p5);
 
 2689      dct_trn8_32(p2, p6);
 
 2690      dct_trn8_32(p3, p7);
 
 2693      vst1_u8(out, p0); out += out_stride;
 
 2694      vst1_u8(out, p1); out += out_stride;
 
 2695      vst1_u8(out, p2); out += out_stride;
 
 2696      vst1_u8(out, p3); out += out_stride;
 
 2697      vst1_u8(out, p4); out += out_stride;
 
 2698      vst1_u8(out, p5); out += out_stride;
 
 2699      vst1_u8(out, p6); out += out_stride;
 
 2718#define STBI__MARKER_none  0xff 
 2722static stbi_uc stbi__get_marker(stbi__jpeg *j)
 
 2725   if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; 
return x; }
 
 2726   x = stbi__get8(j->s);
 
 2727   if (x != 0xff) 
return STBI__MARKER_none;
 
 2729      x = stbi__get8(j->s); 
 
 2735#define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7) 
 2739static void stbi__jpeg_reset(stbi__jpeg *j)
 
 2744   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;
 
 2745   j->marker = STBI__MARKER_none;
 
 2746   j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
 
 2752static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
 
 2754   stbi__jpeg_reset(z);
 
 2755   if (!z->progressive) {
 
 2756      if (z->scan_n == 1) {
 
 2758         STBI_SIMD_ALIGN(
short, data[64]);
 
 2759         int n = z->order[0];
 
 2764         int w = (z->img_comp[n].x+7) >> 3;
 
 2765         int h = (z->img_comp[n].y+7) >> 3;
 
 2766         for (j=0; j < h; ++j) {
 
 2767            for (i=0; i < w; ++i) {
 
 2768               int ha = z->img_comp[n].ha;
 
 2769               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;
 
 2770               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
 
 2772               if (--z->todo <= 0) {
 
 2773                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
 
 2776                  if (!STBI__RESTART(z->marker)) 
return 1;
 
 2777                  stbi__jpeg_reset(z);
 
 2784         STBI_SIMD_ALIGN(
short, data[64]);
 
 2785         for (j=0; j < z->img_mcu_y; ++j) {
 
 2786            for (i=0; i < z->img_mcu_x; ++i) {
 
 2788               for (k=0; k < z->scan_n; ++k) {
 
 2789                  int n = z->order[k];
 
 2792                  for (y=0; y < z->img_comp[n].v; ++y) {
 
 2793                     for (x=0; x < z->img_comp[n].h; ++x) {
 
 2794                        int x2 = (i*z->img_comp[n].h + x)*8;
 
 2795                        int y2 = (j*z->img_comp[n].v + y)*8;
 
 2796                        int ha = z->img_comp[n].ha;
 
 2797                        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;
 
 2798                        z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
 
 2804               if (--z->todo <= 0) {
 
 2805                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
 
 2806                  if (!STBI__RESTART(z->marker)) 
return 1;
 
 2807                  stbi__jpeg_reset(z);
 
 2814      if (z->scan_n == 1) {
 
 2816         int n = z->order[0];
 
 2821         int w = (z->img_comp[n].x+7) >> 3;
 
 2822         int h = (z->img_comp[n].y+7) >> 3;
 
 2823         for (j=0; j < h; ++j) {
 
 2824            for (i=0; i < w; ++i) {
 
 2825               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
 
 2826               if (z->spec_start == 0) {
 
 2827                  if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
 
 2830                  int ha = z->img_comp[n].ha;
 
 2831                  if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
 
 2835               if (--z->todo <= 0) {
 
 2836                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
 
 2837                  if (!STBI__RESTART(z->marker)) 
return 1;
 
 2838                  stbi__jpeg_reset(z);
 
 2845         for (j=0; j < z->img_mcu_y; ++j) {
 
 2846            for (i=0; i < z->img_mcu_x; ++i) {
 
 2848               for (k=0; k < z->scan_n; ++k) {
 
 2849                  int n = z->order[k];
 
 2852                  for (y=0; y < z->img_comp[n].v; ++y) {
 
 2853                     for (x=0; x < z->img_comp[n].h; ++x) {
 
 2854                        int x2 = (i*z->img_comp[n].h + x);
 
 2855                        int y2 = (j*z->img_comp[n].v + y);
 
 2856                        short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
 
 2857                        if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
 
 2864               if (--z->todo <= 0) {
 
 2865                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
 
 2866                  if (!STBI__RESTART(z->marker)) 
return 1;
 
 2867                  stbi__jpeg_reset(z);
 
 2876static void stbi__jpeg_dequantize(
short *data, stbi__uint16 *dequant)
 
 2879   for (i=0; i < 64; ++i)
 
 2880      data[i] *= dequant[i];
 
 2883static void stbi__jpeg_finish(stbi__jpeg *z)
 
 2885   if (z->progressive) {
 
 2888      for (n=0; n < z->s->img_n; ++n) {
 
 2889         int w = (z->img_comp[n].x+7) >> 3;
 
 2890         int h = (z->img_comp[n].y+7) >> 3;
 
 2891         for (j=0; j < h; ++j) {
 
 2892            for (i=0; i < w; ++i) {
 
 2893               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
 
 2894               stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
 
 2895               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
 
 2902static int stbi__process_marker(stbi__jpeg *z, 
int m)
 
 2906      case STBI__MARKER_none: 
 
 2907         return stbi__err(
"expected marker",
"Corrupt JPEG");
 
 2910         if (stbi__get16be(z->s) != 4) 
return stbi__err(
"bad DRI len",
"Corrupt JPEG");
 
 2911         z->restart_interval = stbi__get16be(z->s);
 
 2915         L = stbi__get16be(z->s)-2;
 
 2917            int q = stbi__get8(z->s);
 
 2918            int p = q >> 4, sixteen = (p != 0);
 
 2920            if (p != 0 && p != 1) 
return stbi__err(
"bad DQT type",
"Corrupt JPEG");
 
 2921            if (t > 3) 
return stbi__err(
"bad DQT table",
"Corrupt JPEG");
 
 2923            for (i=0; i < 64; ++i)
 
 2924               z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
 
 2925            L -= (sixteen ? 129 : 65);
 
 2930         L = stbi__get16be(z->s)-2;
 
 2933            int sizes[16],i,n=0;
 
 2934            int q = stbi__get8(z->s);
 
 2937            if (tc > 1 || th > 3) 
return stbi__err(
"bad DHT header",
"Corrupt JPEG");
 
 2938            for (i=0; i < 16; ++i) {
 
 2939               sizes[i] = stbi__get8(z->s);
 
 2944               if (!stbi__build_huffman(z->huff_dc+th, sizes)) 
return 0;
 
 2945               v = z->huff_dc[th].values;
 
 2947               if (!stbi__build_huffman(z->huff_ac+th, sizes)) 
return 0;
 
 2948               v = z->huff_ac[th].values;
 
 2950            for (i=0; i < n; ++i)
 
 2951               v[i] = stbi__get8(z->s);
 
 2953               stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
 
 2960   if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
 
 2961      L = stbi__get16be(z->s);
 
 2964            return stbi__err(
"bad COM len",
"Corrupt JPEG");
 
 2966            return stbi__err(
"bad APP len",
"Corrupt JPEG");
 
 2970      if (m == 0xE0 && L >= 5) { 
 
 2971         static const unsigned char tag[5] = {
'J',
'F',
'I',
'F',
'\0'};
 
 2974         for (i=0; i < 5; ++i)
 
 2975            if (stbi__get8(z->s) != tag[i])
 
 2980      } 
else if (m == 0xEE && L >= 12) { 
 
 2981         static const unsigned char tag[6] = {
'A',
'd',
'o',
'b',
'e',
'\0'};
 
 2984         for (i=0; i < 6; ++i)
 
 2985            if (stbi__get8(z->s) != tag[i])
 
 2990            stbi__get16be(z->s); 
 
 2991            stbi__get16be(z->s); 
 
 2992            z->app14_color_transform = stbi__get8(z->s); 
 
 2997      stbi__skip(z->s, L);
 
 3001   return stbi__err(
"unknown marker",
"Corrupt JPEG");
 
 3005static int stbi__process_scan_header(stbi__jpeg *z)
 
 3008   int Ls = stbi__get16be(z->s);
 
 3009   z->scan_n = stbi__get8(z->s);
 
 3010   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");
 
 3011   if (Ls != 6+2*z->scan_n) 
return stbi__err(
"bad SOS len",
"Corrupt JPEG");
 
 3012   for (i=0; i < z->scan_n; ++i) {
 
 3013      int id = stbi__get8(z->s), which;
 
 3014      int q = stbi__get8(z->s);
 
 3015      for (which = 0; which < z->s->img_n; ++which)
 
 3016         if (z->img_comp[which].id == 
id)
 
 3018      if (which == z->s->img_n) 
return 0; 
 
 3019      z->img_comp[which].hd = q >> 4;   
if (z->img_comp[which].hd > 3) 
return stbi__err(
"bad DC huff",
"Corrupt JPEG");
 
 3020      z->img_comp[which].ha = q & 15;   
if (z->img_comp[which].ha > 3) 
return stbi__err(
"bad AC huff",
"Corrupt JPEG");
 
 3021      z->order[i] = which;
 
 3026      z->spec_start = stbi__get8(z->s);
 
 3027      z->spec_end   = stbi__get8(z->s); 
 
 3028      aa = stbi__get8(z->s);
 
 3029      z->succ_high = (aa >> 4);
 
 3030      z->succ_low  = (aa & 15);
 
 3031      if (z->progressive) {
 
 3032         if (z->spec_start > 63 || z->spec_end > 63  || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
 
 3033            return stbi__err(
"bad SOS", 
"Corrupt JPEG");
 
 3035         if (z->spec_start != 0) 
return stbi__err(
"bad SOS",
"Corrupt JPEG");
 
 3036         if (z->succ_high != 0 || z->succ_low != 0) 
return stbi__err(
"bad SOS",
"Corrupt JPEG");
 
 3044static int stbi__free_jpeg_components(stbi__jpeg *z, 
int ncomp, 
int why)
 
 3047   for (i=0; i < ncomp; ++i) {
 
 3048      if (z->img_comp[i].raw_data) {
 
 3049         STBI_FREE(z->img_comp[i].raw_data);
 
 3050         z->img_comp[i].raw_data = NULL;
 
 3051         z->img_comp[i].data = NULL;
 
 3053      if (z->img_comp[i].raw_coeff) {
 
 3054         STBI_FREE(z->img_comp[i].raw_coeff);
 
 3055         z->img_comp[i].raw_coeff = 0;
 
 3056         z->img_comp[i].coeff = 0;
 
 3058      if (z->img_comp[i].linebuf) {
 
 3059         STBI_FREE(z->img_comp[i].linebuf);
 
 3060         z->img_comp[i].linebuf = NULL;
 
 3066static int stbi__process_frame_header(stbi__jpeg *z, 
int scan)
 
 3068   stbi__context *s = z->s;
 
 3069   int Lf,p,i,q, h_max=1,v_max=1,c;
 
 3070   Lf = stbi__get16be(s);         
if (Lf < 11) 
return stbi__err(
"bad SOF len",
"Corrupt JPEG"); 
 
 3071   p  = stbi__get8(s);            
if (p != 8) 
return stbi__err(
"only 8-bit",
"JPEG format not supported: 8-bit only"); 
 
 3072   s->img_y = stbi__get16be(s);   
if (s->img_y == 0) 
return stbi__err(
"no header height", 
"JPEG format not supported: delayed height"); 
 
 3073   s->img_x = stbi__get16be(s);   
if (s->img_x == 0) 
return stbi__err(
"0 width",
"Corrupt JPEG"); 
 
 3075   if (c != 3 && c != 1 && c != 4) 
return stbi__err(
"bad component count",
"Corrupt JPEG");
 
 3077   for (i=0; i < c; ++i) {
 
 3078      z->img_comp[i].data = NULL;
 
 3079      z->img_comp[i].linebuf = NULL;
 
 3082   if (Lf != 8+3*s->img_n) 
return stbi__err(
"bad SOF len",
"Corrupt JPEG");
 
 3085   for (i=0; i < s->img_n; ++i) {
 
 3086      static const unsigned char rgb[3] = { 
'R', 
'G', 
'B' };
 
 3087      z->img_comp[i].id = stbi__get8(s);
 
 3088      if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
 
 3091      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");
 
 3092      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");
 
 3093      z->img_comp[i].tq = stbi__get8(s);  
if (z->img_comp[i].tq > 3) 
return stbi__err(
"bad TQ",
"Corrupt JPEG");
 
 3096   if (scan != STBI__SCAN_load) 
return 1;
 
 3098   if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) 
return stbi__err(
"too large", 
"Image too large to decode");
 
 3100   for (i=0; i < s->img_n; ++i) {
 
 3101      if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
 
 3102      if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
 
 3106   z->img_h_max = h_max;
 
 3107   z->img_v_max = v_max;
 
 3108   z->img_mcu_w = h_max * 8;
 
 3109   z->img_mcu_h = v_max * 8;
 
 3111   z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
 
 3112   z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
 
 3114   for (i=0; i < s->img_n; ++i) {
 
 3116      z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
 
 3117      z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
 
 3125      z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
 
 3126      z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
 
 3127      z->img_comp[i].coeff = 0;
 
 3128      z->img_comp[i].raw_coeff = 0;
 
 3129      z->img_comp[i].linebuf = NULL;
 
 3130      z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
 
 3131      if (z->img_comp[i].raw_data == NULL)
 
 3132         return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem", 
"Out of memory"));
 
 3134      z->img_comp[i].data = (stbi_uc*) (((
size_t) z->img_comp[i].raw_data + 15) & ~15);
 
 3135      if (z->progressive) {
 
 3137         z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
 
 3138         z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
 
 3139         z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, 
sizeof(
short), 15);
 
 3140         if (z->img_comp[i].raw_coeff == NULL)
 
 3141            return stbi__free_jpeg_components(z, i+1, stbi__err(
"outofmem", 
"Out of memory"));
 
 3142         z->img_comp[i].coeff = (
short*) (((
size_t) z->img_comp[i].raw_coeff + 15) & ~15);
 
 3150#define stbi__DNL(x)         ((x) == 0xdc) 
 3151#define stbi__SOI(x)         ((x) == 0xd8) 
 3152#define stbi__EOI(x)         ((x) == 0xd9) 
 3153#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) 
 3154#define stbi__SOS(x)         ((x) == 0xda) 
 3156#define stbi__SOF_progressive(x)   ((x) == 0xc2) 
 3158static int stbi__decode_jpeg_header(stbi__jpeg *z, 
int scan)
 
 3162   z->app14_color_transform = -1; 
 
 3163   z->marker = STBI__MARKER_none; 
 
 3164   m = stbi__get_marker(z);
 
 3165   if (!stbi__SOI(m)) 
return stbi__err(
"no SOI",
"Corrupt JPEG");
 
 3166   if (scan == STBI__SCAN_type) 
return 1;
 
 3167   m = stbi__get_marker(z);
 
 3168   while (!stbi__SOF(m)) {
 
 3169      if (!stbi__process_marker(z,m)) 
return 0;
 
 3170      m = stbi__get_marker(z);
 
 3171      while (m == STBI__MARKER_none) {
 
 3173         if (stbi__at_eof(z->s)) 
return stbi__err(
"no SOF", 
"Corrupt JPEG");
 
 3174         m = stbi__get_marker(z);
 
 3177   z->progressive = stbi__SOF_progressive(m);
 
 3178   if (!stbi__process_frame_header(z, scan)) 
return 0;
 
 3183static int stbi__decode_jpeg_image(stbi__jpeg *j)
 
 3186   for (m = 0; m < 4; m++) {
 
 3187      j->img_comp[m].raw_data = NULL;
 
 3188      j->img_comp[m].raw_coeff = NULL;
 
 3190   j->restart_interval = 0;
 
 3191   if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) 
return 0;
 
 3192   m = stbi__get_marker(j);
 
 3193   while (!stbi__EOI(m)) {
 
 3195         if (!stbi__process_scan_header(j)) 
return 0;
 
 3196         if (!stbi__parse_entropy_coded_data(j)) 
return 0;
 
 3197         if (j->marker == STBI__MARKER_none ) {
 
 3199            while (!stbi__at_eof(j->s)) {
 
 3200               int x = stbi__get8(j->s);
 
 3202                  j->marker = stbi__get8(j->s);
 
 3208      } 
else if (stbi__DNL(m)) {
 
 3209         int Ld = stbi__get16be(j->s);
 
 3210         stbi__uint32 NL = stbi__get16be(j->s);
 
 3211         if (Ld != 4) 
return stbi__err(
"bad DNL len", 
"Corrupt JPEG");
 
 3212         if (NL != j->s->img_y) 
return stbi__err(
"bad DNL height", 
"Corrupt JPEG");
 
 3214         if (!stbi__process_marker(j, m)) 
return 0;
 
 3216      m = stbi__get_marker(j);
 
 3219      stbi__jpeg_finish(j);
 
 3225typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
 
 3228#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) 
 3230static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
 
 3233   STBI_NOTUSED(in_far);
 
 3239static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
 
 3244   for (i=0; i < w; ++i)
 
 3245      out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
 
 3249static stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
 
 3253   stbi_uc *input = in_near;
 
 3257      out[0] = out[1] = input[0];
 
 3262   out[1] = stbi__div4(input[0]*3 + input[1] + 2);
 
 3263   for (i=1; i < w-1; ++i) {
 
 3264      int n = 3*input[i]+2;
 
 3265      out[i*2+0] = stbi__div4(n+input[i-1]);
 
 3266      out[i*2+1] = stbi__div4(n+input[i+1]);
 
 3268   out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
 
 3269   out[i*2+1] = input[w-1];
 
 3271   STBI_NOTUSED(in_far);
 
 3277#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) 
 3279static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
 
 3284      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
 
 3288   t1 = 3*in_near[0] + in_far[0];
 
 3289   out[0] = stbi__div4(t1+2);
 
 3290   for (i=1; i < w; ++i) {
 
 3292      t1 = 3*in_near[i]+in_far[i];
 
 3293      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
 
 3294      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
 
 3296   out[w*2-1] = stbi__div4(t1+2);
 
 3303#if defined(STBI_SSE2) || defined(STBI_NEON) 
 3304static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
 
 3310      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
 
 3314   t1 = 3*in_near[0] + in_far[0];
 
 3318   for (; i < ((w-1) & ~7); i += 8) {
 
 3319#if defined(STBI_SSE2) 
 3322      __m128i zero  = _mm_setzero_si128();
 
 3323      __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));
 
 3324      __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
 
 3325      __m128i farw  = _mm_unpacklo_epi8(farb, zero);
 
 3326      __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
 
 3327      __m128i diff  = _mm_sub_epi16(farw, nearw);
 
 3328      __m128i nears = _mm_slli_epi16(nearw, 2);
 
 3329      __m128i curr  = _mm_add_epi16(nears, diff); 
 
 3336      __m128i prv0 = _mm_slli_si128(curr, 2);
 
 3337      __m128i nxt0 = _mm_srli_si128(curr, 2);
 
 3338      __m128i prev = _mm_insert_epi16(prv0, t1, 0);
 
 3339      __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
 
 3345      __m128i bias  = _mm_set1_epi16(8);
 
 3346      __m128i curs = _mm_slli_epi16(curr, 2);
 
 3347      __m128i prvd = _mm_sub_epi16(prev, curr);
 
 3348      __m128i nxtd = _mm_sub_epi16(next, curr);
 
 3349      __m128i curb = _mm_add_epi16(curs, bias);
 
 3350      __m128i even = _mm_add_epi16(prvd, curb);
 
 3351      __m128i odd  = _mm_add_epi16(nxtd, curb);
 
 3354      __m128i int0 = _mm_unpacklo_epi16(even, odd);
 
 3355      __m128i int1 = _mm_unpackhi_epi16(even, odd);
 
 3356      __m128i de0  = _mm_srli_epi16(int0, 4);
 
 3357      __m128i de1  = _mm_srli_epi16(int1, 4);
 
 3360      __m128i outv = _mm_packus_epi16(de0, de1);
 
 3361      _mm_storeu_si128((__m128i *) (out + i*2), outv);
 
 3362#elif defined(STBI_NEON) 
 3365      uint8x8_t farb  = vld1_u8(in_far + i);
 
 3366      uint8x8_t nearb = vld1_u8(in_near + i);
 
 3367      int16x8_t diff  = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
 
 3368      int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
 
 3369      int16x8_t curr  = vaddq_s16(nears, diff); 
 
 3376      int16x8_t prv0 = vextq_s16(curr, curr, 7);
 
 3377      int16x8_t nxt0 = vextq_s16(curr, curr, 1);
 
 3378      int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
 
 3379      int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
 
 3385      int16x8_t curs = vshlq_n_s16(curr, 2);
 
 3386      int16x8_t prvd = vsubq_s16(prev, curr);
 
 3387      int16x8_t nxtd = vsubq_s16(next, curr);
 
 3388      int16x8_t even = vaddq_s16(curs, prvd);
 
 3389      int16x8_t odd  = vaddq_s16(curs, nxtd);
 
 3393      o.val[0] = vqrshrun_n_s16(even, 4);
 
 3394      o.val[1] = vqrshrun_n_s16(odd,  4);
 
 3395      vst2_u8(out + i*2, o);
 
 3399      t1 = 3*in_near[i+7] + in_far[i+7];
 
 3403   t1 = 3*in_near[i] + in_far[i];
 
 3404   out[i*2] = stbi__div16(3*t1 + t0 + 8);
 
 3406   for (++i; i < w; ++i) {
 
 3408      t1 = 3*in_near[i]+in_far[i];
 
 3409      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
 
 3410      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
 
 3412   out[w*2-1] = stbi__div4(t1+2);
 
 3420static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, 
int w, 
int hs)
 
 3424   STBI_NOTUSED(in_far);
 
 3425   for (i=0; i < w; ++i)
 
 3426      for (j=0; j < hs; ++j)
 
 3427         out[i*hs+j] = in_near[i];
 
 3433#define stbi__float2fixed(x)  (((int) ((x) * 4096.0f + 0.5f)) << 8) 
 3434static 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)
 
 3437   for (i=0; i < count; ++i) {
 
 3438      int y_fixed = (y[i] << 20) + (1<<19); 
 
 3440      int cr = pcr[i] - 128;
 
 3441      int cb = pcb[i] - 128;
 
 3442      r = y_fixed +  cr* stbi__float2fixed(1.40200f);
 
 3443      g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
 
 3444      b = y_fixed                                     +   cb* stbi__float2fixed(1.77200f);
 
 3448      if ((
unsigned) r > 255) { 
if (r < 0) r = 0; 
else r = 255; }
 
 3449      if ((
unsigned) g > 255) { 
if (g < 0) g = 0; 
else g = 255; }
 
 3450      if ((
unsigned) b > 255) { 
if (b < 0) b = 0; 
else b = 255; }
 
 3451      out[0] = (stbi_uc)r;
 
 3452      out[1] = (stbi_uc)g;
 
 3453      out[2] = (stbi_uc)b;
 
 3459#if defined(STBI_SSE2) || defined(STBI_NEON) 
 3460static 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)
 
 3470      __m128i signflip  = _mm_set1_epi8(-0x80);
 
 3471      __m128i cr_const0 = _mm_set1_epi16(   (
short) ( 1.40200f*4096.0f+0.5f));
 
 3472      __m128i cr_const1 = _mm_set1_epi16( - (
short) ( 0.71414f*4096.0f+0.5f));
 
 3473      __m128i cb_const0 = _mm_set1_epi16( - (
short) ( 0.34414f*4096.0f+0.5f));
 
 3474      __m128i cb_const1 = _mm_set1_epi16(   (
short) ( 1.77200f*4096.0f+0.5f));
 
 3475      __m128i y_bias = _mm_set1_epi8((
char) (
unsigned char) 128);
 
 3476      __m128i xw = _mm_set1_epi16(255); 
 
 3478      for (; i+7 < count; i += 8) {
 
 3480         __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
 
 3481         __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
 
 3482         __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
 
 3483         __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); 
 
 3484         __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); 
 
 3487         __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);
 
 3488         __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
 
 3489         __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
 
 3492         __m128i yws = _mm_srli_epi16(yw, 4);
 
 3493         __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
 
 3494         __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
 
 3495         __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
 
 3496         __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
 
 3497         __m128i rws = _mm_add_epi16(cr0, yws);
 
 3498         __m128i gwt = _mm_add_epi16(cb0, yws);
 
 3499         __m128i bws = _mm_add_epi16(yws, cb1);
 
 3500         __m128i gws = _mm_add_epi16(gwt, cr1);
 
 3503         __m128i rw = _mm_srai_epi16(rws, 4);
 
 3504         __m128i bw = _mm_srai_epi16(bws, 4);
 
 3505         __m128i gw = _mm_srai_epi16(gws, 4);
 
 3508         __m128i brb = _mm_packus_epi16(rw, bw);
 
 3509         __m128i gxb = _mm_packus_epi16(gw, xw);
 
 3512         __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
 
 3513         __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
 
 3514         __m128i o0 = _mm_unpacklo_epi16(t0, t1);
 
 3515         __m128i o1 = _mm_unpackhi_epi16(t0, t1);
 
 3518         _mm_storeu_si128((__m128i *) (out + 0), o0);
 
 3519         _mm_storeu_si128((__m128i *) (out + 16), o1);
 
 3529      uint8x8_t signflip = vdup_n_u8(0x80);
 
 3530      int16x8_t cr_const0 = vdupq_n_s16(   (
short) ( 1.40200f*4096.0f+0.5f));
 
 3531      int16x8_t cr_const1 = vdupq_n_s16( - (
short) ( 0.71414f*4096.0f+0.5f));
 
 3532      int16x8_t cb_const0 = vdupq_n_s16( - (
short) ( 0.34414f*4096.0f+0.5f));
 
 3533      int16x8_t cb_const1 = vdupq_n_s16(   (
short) ( 1.77200f*4096.0f+0.5f));
 
 3535      for (; i+7 < count; i += 8) {
 
 3537         uint8x8_t y_bytes  = vld1_u8(y + i);
 
 3538         uint8x8_t cr_bytes = vld1_u8(pcr + i);
 
 3539         uint8x8_t cb_bytes = vld1_u8(pcb + i);
 
 3540         int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
 
 3541         int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
 
 3544         int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
 
 3545         int16x8_t crw = vshll_n_s8(cr_biased, 7);
 
 3546         int16x8_t cbw = vshll_n_s8(cb_biased, 7);
 
 3549         int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
 
 3550         int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
 
 3551         int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
 
 3552         int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
 
 3553         int16x8_t rws = vaddq_s16(yws, cr0);
 
 3554         int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
 
 3555         int16x8_t bws = vaddq_s16(yws, cb1);
 
 3559         o.val[0] = vqrshrun_n_s16(rws, 4);
 
 3560         o.val[1] = vqrshrun_n_s16(gws, 4);
 
 3561         o.val[2] = vqrshrun_n_s16(bws, 4);
 
 3562         o.val[3] = vdup_n_u8(255);
 
 3571   for (; i < count; ++i) {
 
 3572      int y_fixed = (y[i] << 20) + (1<<19); 
 
 3574      int cr = pcr[i] - 128;
 
 3575      int cb = pcb[i] - 128;
 
 3576      r = y_fixed + cr* stbi__float2fixed(1.40200f);
 
 3577      g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
 
 3578      b = y_fixed                                   +   cb* stbi__float2fixed(1.77200f);
 
 3582      if ((
unsigned) r > 255) { 
if (r < 0) r = 0; 
else r = 255; }
 
 3583      if ((
unsigned) g > 255) { 
if (g < 0) g = 0; 
else g = 255; }
 
 3584      if ((
unsigned) b > 255) { 
if (b < 0) b = 0; 
else b = 255; }
 
 3585      out[0] = (stbi_uc)r;
 
 3586      out[1] = (stbi_uc)g;
 
 3587      out[2] = (stbi_uc)b;
 
 3595static void stbi__setup_jpeg(stbi__jpeg *j)
 
 3597   j->idct_block_kernel = stbi__idct_block;
 
 3598   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
 
 3599   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
 
 3602   if (stbi__sse2_available()) {
 
 3603      j->idct_block_kernel = stbi__idct_simd;
 
 3604      j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
 
 3605      j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
 
 3610   j->idct_block_kernel = stbi__idct_simd;
 
 3611   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
 
 3612   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
 
 3617static void stbi__cleanup_jpeg(stbi__jpeg *j)
 
 3619   stbi__free_jpeg_components(j, j->s->img_n, 0);
 
 3624   resample_row_func resample;
 
 3625   stbi_uc *line0,*line1;
 
 3633static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
 
 3635   unsigned int t = x*y + 128;
 
 3636   return (stbi_uc) ((t + (t >>8)) >> 8);
 
 3639static stbi_uc *load_jpeg_image(stbi__jpeg *z, 
int *out_x, 
int *out_y, 
int *comp, 
int req_comp)
 
 3641   int n, decode_n, is_rgb;
 
 3645   if (req_comp < 0 || req_comp > 4) 
return stbi__errpuc(
"bad req_comp", 
"Internal error");
 
 3648   if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); 
return NULL; }
 
 3651   n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
 
 3653   is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
 
 3655   if (z->s->img_n == 3 && n < 3 && !is_rgb)
 
 3658      decode_n = z->s->img_n;
 
 3665      stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
 
 3667      stbi__resample res_comp[4];
 
 3669      for (k=0; k < decode_n; ++k) {
 
 3670         stbi__resample *r = &res_comp[k];
 
 3674         z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
 
 3675         if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); 
return stbi__errpuc(
"outofmem", 
"Out of memory"); }
 
 3677         r->hs      = z->img_h_max / z->img_comp[k].h;
 
 3678         r->vs      = z->img_v_max / z->img_comp[k].v;
 
 3679         r->ystep   = r->vs >> 1;
 
 3680         r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
 
 3682         r->line0   = r->line1 = z->img_comp[k].data;
 
 3684         if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
 
 3685         else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
 
 3686         else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
 
 3687         else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
 
 3688         else                               r->resample = stbi__resample_row_generic;
 
 3692      output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
 
 3693      if (!output) { stbi__cleanup_jpeg(z); 
return stbi__errpuc(
"outofmem", 
"Out of memory"); }
 
 3696      for (j=0; j < z->s->img_y; ++j) {
 
 3697         stbi_uc *out = output + n * z->s->img_x * j;
 
 3698         for (k=0; k < decode_n; ++k) {
 
 3699            stbi__resample *r = &res_comp[k];
 
 3700            int y_bot = r->ystep >= (r->vs >> 1);
 
 3701            coutput[k] = r->resample(z->img_comp[k].linebuf,
 
 3702                                     y_bot ? r->line1 : r->line0,
 
 3703                                     y_bot ? r->line0 : r->line1,
 
 3705            if (++r->ystep >= r->vs) {
 
 3707               r->line0 = r->line1;
 
 3708               if (++r->ypos < z->img_comp[k].y)
 
 3709                  r->line1 += z->img_comp[k].w2;
 
 3713            stbi_uc *y = coutput[0];
 
 3714            if (z->s->img_n == 3) {
 
 3716                  for (i=0; i < z->s->img_x; ++i) {
 
 3718                     out[1] = coutput[1][i];
 
 3719                     out[2] = coutput[2][i];
 
 3724                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
 
 3726            } 
else if (z->s->img_n == 4) {
 
 3727               if (z->app14_color_transform == 0) { 
 
 3728                  for (i=0; i < z->s->img_x; ++i) {
 
 3729                     stbi_uc m = coutput[3][i];
 
 3730                     out[0] = stbi__blinn_8x8(coutput[0][i], m);
 
 3731                     out[1] = stbi__blinn_8x8(coutput[1][i], m);
 
 3732                     out[2] = stbi__blinn_8x8(coutput[2][i], m);
 
 3736               } 
else if (z->app14_color_transform == 2) { 
 
 3737                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
 
 3738                  for (i=0; i < z->s->img_x; ++i) {
 
 3739                     stbi_uc m = coutput[3][i];
 
 3740                     out[0] = stbi__blinn_8x8(255 - out[0], m);
 
 3741                     out[1] = stbi__blinn_8x8(255 - out[1], m);
 
 3742                     out[2] = stbi__blinn_8x8(255 - out[2], m);
 
 3746                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
 
 3749               for (i=0; i < z->s->img_x; ++i) {
 
 3750                  out[0] = out[1] = out[2] = y[i];
 
 3757                  for (i=0; i < z->s->img_x; ++i)
 
 3758                     *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
 
 3760                  for (i=0; i < z->s->img_x; ++i, out += 2) {
 
 3761                     out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
 
 3765            } 
else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
 
 3766               for (i=0; i < z->s->img_x; ++i) {
 
 3767                  stbi_uc m = coutput[3][i];
 
 3768                  stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
 
 3769                  stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
 
 3770                  stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
 
 3771                  out[0] = stbi__compute_y(r, g, b);
 
 3775            } 
else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
 
 3776               for (i=0; i < z->s->img_x; ++i) {
 
 3777                  out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
 
 3782               stbi_uc *y = coutput[0];
 
 3784                  for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
 
 3786                  for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
 
 3790      stbi__cleanup_jpeg(z);
 
 3791      *out_x = z->s->img_x;
 
 3792      *out_y = z->s->img_y;
 
 3793      if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; 
 
 3798static void *stbi__jpeg_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
 
 3800   unsigned char* result;
 
 3801   stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(
sizeof(stbi__jpeg));
 
 3804   stbi__setup_jpeg(j);
 
 3805   result = load_jpeg_image(j, x,y,comp,req_comp);
 
 3810static int stbi__jpeg_test(stbi__context *s)
 
 3813   stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(
sizeof(stbi__jpeg));
 
 3815   stbi__setup_jpeg(j);
 
 3816   r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
 
 3822static int stbi__jpeg_info_raw(stbi__jpeg *j, 
int *x, 
int *y, 
int *comp)
 
 3824   if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
 
 3825      stbi__rewind( j->s );
 
 3828   if (x) *x = j->s->img_x;
 
 3829   if (y) *y = j->s->img_y;
 
 3830   if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
 
 3834static int stbi__jpeg_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 3837   stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(
sizeof(stbi__jpeg)));
 
 3839   result = stbi__jpeg_info_raw(j, x, y, comp);
 
 3855#define STBI__ZFAST_BITS  9  
 3856#define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1) 
 3862   stbi__uint16 fast[1 << STBI__ZFAST_BITS];
 
 3863   stbi__uint16 firstcode[16];
 
 3865   stbi__uint16 firstsymbol[16];
 
 3867   stbi__uint16 value[288];
 
 3870stbi_inline 
static int stbi__bitreverse16(
int n)
 
 3872  n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);
 
 3873  n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);
 
 3874  n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);
 
 3875  n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);
 
 3879stbi_inline 
static int stbi__bit_reverse(
int v, 
int bits)
 
 3881   STBI_ASSERT(bits <= 16);
 
 3884   return stbi__bitreverse16(v) >> (16-bits);
 
 3887static int stbi__zbuild_huffman(stbi__zhuffman *z, 
const stbi_uc *sizelist, 
int num)
 
 3890   int code, next_code[16], sizes[17];
 
 3893   memset(sizes, 0, 
sizeof(sizes));
 
 3894   memset(z->fast, 0, 
sizeof(z->fast));
 
 3895   for (i=0; i < num; ++i)
 
 3896      ++sizes[sizelist[i]];
 
 3898   for (i=1; i < 16; ++i)
 
 3899      if (sizes[i] > (1 << i))
 
 3900         return stbi__err(
"bad sizes", 
"Corrupt PNG");
 
 3902   for (i=1; i < 16; ++i) {
 
 3903      next_code[i] = code;
 
 3904      z->firstcode[i] = (stbi__uint16) code;
 
 3905      z->firstsymbol[i] = (stbi__uint16) k;
 
 3906      code = (code + sizes[i]);
 
 3908         if (code-1 >= (1 << i)) 
return stbi__err(
"bad codelengths",
"Corrupt PNG");
 
 3909      z->maxcode[i] = code << (16-i); 
 
 3913   z->maxcode[16] = 0x10000; 
 
 3914   for (i=0; i < num; ++i) {
 
 3915      int s = sizelist[i];
 
 3917         int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
 
 3918         stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
 
 3919         z->size [c] = (stbi_uc     ) s;
 
 3920         z->value[c] = (stbi__uint16) i;
 
 3921         if (s <= STBI__ZFAST_BITS) {
 
 3922            int j = stbi__bit_reverse(next_code[s],s);
 
 3923            while (j < (1 << STBI__ZFAST_BITS)) {
 
 3942   stbi_uc *zbuffer, *zbuffer_end;
 
 3944   stbi__uint32 code_buffer;
 
 3951   stbi__zhuffman z_length, z_distance;
 
 3954stbi_inline 
static stbi_uc stbi__zget8(stbi__zbuf *z)
 
 3956   if (z->zbuffer >= z->zbuffer_end) 
return 0;
 
 3957   return *z->zbuffer++;
 
 3960static void stbi__fill_bits(stbi__zbuf *z)
 
 3963      STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
 
 3964      z->code_buffer |= (
unsigned int) stbi__zget8(z) << z->num_bits;
 
 3966   } 
while (z->num_bits <= 24);
 
 3969stbi_inline 
static unsigned int stbi__zreceive(stbi__zbuf *z, 
int n)
 
 3972   if (z->num_bits < n) stbi__fill_bits(z);
 
 3973   k = z->code_buffer & ((1 << n) - 1);
 
 3974   z->code_buffer >>= n;
 
 3979static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
 
 3984   k = stbi__bit_reverse(a->code_buffer, 16);
 
 3985   for (s=STBI__ZFAST_BITS+1; ; ++s)
 
 3986      if (k < z->maxcode[s])
 
 3988   if (s == 16) 
return -1; 
 
 3990   b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
 
 3991   STBI_ASSERT(z->size[b] == s);
 
 3992   a->code_buffer >>= s;
 
 3997stbi_inline 
static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
 
 4000   if (a->num_bits < 16) stbi__fill_bits(a);
 
 4001   b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
 
 4004      a->code_buffer >>= s;
 
 4008   return stbi__zhuffman_decode_slowpath(a, z);
 
 4011static int stbi__zexpand(stbi__zbuf *z, 
char *zout, 
int n)  
 
 4014   int cur, limit, old_limit;
 
 4016   if (!z->z_expandable) 
return stbi__err(
"output buffer limit",
"Corrupt PNG");
 
 4017   cur   = (int) (z->zout     - z->zout_start);
 
 4018   limit = old_limit = (int) (z->zout_end - z->zout_start);
 
 4019   while (cur + n > limit)
 
 4021   q = (
char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
 
 4022   STBI_NOTUSED(old_limit);
 
 4023   if (q == NULL) 
return stbi__err(
"outofmem", 
"Out of memory");
 
 4026   z->zout_end   = q + limit;
 
 4030static const int stbi__zlength_base[31] = {
 
 4031   3,4,5,6,7,8,9,10,11,13,
 
 4032   15,17,19,23,27,31,35,43,51,59,
 
 4033   67,83,99,115,131,163,195,227,258,0,0 };
 
 4035static const int stbi__zlength_extra[31]=
 
 4036{ 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 };
 
 4038static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
 
 4039257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
 
 4041static const int stbi__zdist_extra[32] =
 
 4042{ 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};
 
 4044static int stbi__parse_huffman_block(stbi__zbuf *a)
 
 4046   char *zout = a->zout;
 
 4048      int z = stbi__zhuffman_decode(a, &a->z_length);
 
 4050         if (z < 0) 
return stbi__err(
"bad huffman code",
"Corrupt PNG"); 
 
 4051         if (zout >= a->zout_end) {
 
 4052            if (!stbi__zexpand(a, zout, 1)) 
return 0;
 
 4064         len = stbi__zlength_base[z];
 
 4065         if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
 
 4066         z = stbi__zhuffman_decode(a, &a->z_distance);
 
 4067         if (z < 0) 
return stbi__err(
"bad huffman code",
"Corrupt PNG");
 
 4068         dist = stbi__zdist_base[z];
 
 4069         if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
 
 4070         if (zout - a->zout_start < dist) 
return stbi__err(
"bad dist",
"Corrupt PNG");
 
 4071         if (zout + len > a->zout_end) {
 
 4072            if (!stbi__zexpand(a, zout, len)) 
return 0;
 
 4075         p = (stbi_uc *) (zout - dist);
 
 4078            if (len) { 
do *zout++ = v; 
while (--len); }
 
 4080            if (len) { 
do *zout++ = *p++; 
while (--len); }
 
 4086static int stbi__compute_huffman_codes(stbi__zbuf *a)
 
 4088   static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
 
 4089   stbi__zhuffman z_codelength;
 
 4090   stbi_uc lencodes[286+32+137];
 
 4091   stbi_uc codelength_sizes[19];
 
 4094   int hlit  = stbi__zreceive(a,5) + 257;
 
 4095   int hdist = stbi__zreceive(a,5) + 1;
 
 4096   int hclen = stbi__zreceive(a,4) + 4;
 
 4097   int ntot  = hlit + hdist;
 
 4099   memset(codelength_sizes, 0, 
sizeof(codelength_sizes));
 
 4100   for (i=0; i < hclen; ++i) {
 
 4101      int s = stbi__zreceive(a,3);
 
 4102      codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
 
 4104   if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) 
return 0;
 
 4108      int c = stbi__zhuffman_decode(a, &z_codelength);
 
 4109      if (c < 0 || c >= 19) 
return stbi__err(
"bad codelengths", 
"Corrupt PNG");
 
 4111         lencodes[n++] = (stbi_uc) c;
 
 4115            c = stbi__zreceive(a,2)+3;
 
 4116            if (n == 0) 
return stbi__err(
"bad codelengths", 
"Corrupt PNG");
 
 4117            fill = lencodes[n-1];
 
 4119            c = stbi__zreceive(a,3)+3;
 
 4121            STBI_ASSERT(c == 18);
 
 4122            c = stbi__zreceive(a,7)+11;
 
 4124         if (ntot - n < c) 
return stbi__err(
"bad codelengths", 
"Corrupt PNG");
 
 4125         memset(lencodes+n, fill, c);
 
 4129   if (n != ntot) 
return stbi__err(
"bad codelengths",
"Corrupt PNG");
 
 4130   if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) 
return 0;
 
 4131   if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) 
return 0;
 
 4135static int stbi__parse_uncompressed_block(stbi__zbuf *a)
 
 4139   if (a->num_bits & 7)
 
 4140      stbi__zreceive(a, a->num_bits & 7); 
 
 4143   while (a->num_bits > 0) {
 
 4144      header[k++] = (stbi_uc) (a->code_buffer & 255); 
 
 4145      a->code_buffer >>= 8;
 
 4148   STBI_ASSERT(a->num_bits == 0);
 
 4151      header[k++] = stbi__zget8(a);
 
 4152   len  = header[1] * 256 + header[0];
 
 4153   nlen = header[3] * 256 + header[2];
 
 4154   if (nlen != (len ^ 0xffff)) 
return stbi__err(
"zlib corrupt",
"Corrupt PNG");
 
 4155   if (a->zbuffer + len > a->zbuffer_end) 
return stbi__err(
"read past buffer",
"Corrupt PNG");
 
 4156   if (a->zout + len > a->zout_end)
 
 4157      if (!stbi__zexpand(a, a->zout, len)) 
return 0;
 
 4158   memcpy(a->zout, a->zbuffer, len);
 
 4164static int stbi__parse_zlib_header(stbi__zbuf *a)
 
 4166   int cmf   = stbi__zget8(a);
 
 4169   int flg   = stbi__zget8(a);
 
 4170   if ((cmf*256+flg) % 31 != 0) 
return stbi__err(
"bad zlib header",
"Corrupt PNG"); 
 
 4171   if (flg & 32) 
return stbi__err(
"no preset dict",
"Corrupt PNG"); 
 
 4172   if (cm != 8) 
return stbi__err(
"bad compression",
"Corrupt PNG"); 
 
 4177static const stbi_uc stbi__zdefault_length[288] =
 
 4179   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,
 
 4180   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,
 
 4181   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,
 
 4182   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,
 
 4183   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,
 
 4184   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,
 
 4185   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,
 
 4186   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,
 
 4187   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
 
 4189static const stbi_uc stbi__zdefault_distance[32] =
 
 4191   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
 
 4206static int stbi__parse_zlib(stbi__zbuf *a, 
int parse_header)
 
 4210      if (!stbi__parse_zlib_header(a)) 
return 0;
 
 4214      final = stbi__zreceive(a,1);
 
 4215      type = stbi__zreceive(a,2);
 
 4217         if (!stbi__parse_uncompressed_block(a)) 
return 0;
 
 4218      } 
else if (type == 3) {
 
 4223            if (!stbi__zbuild_huffman(&a->z_length  , stbi__zdefault_length  , 288)) 
return 0;
 
 4224            if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance,  32)) 
return 0;
 
 4226            if (!stbi__compute_huffman_codes(a)) 
return 0;
 
 4228         if (!stbi__parse_huffman_block(a)) 
return 0;
 
 4234static int stbi__do_zlib(stbi__zbuf *a, 
char *obuf, 
int olen, 
int exp, 
int parse_header)
 
 4236   a->zout_start = obuf;
 
 4238   a->zout_end   = obuf + olen;
 
 4239   a->z_expandable = exp;
 
 4241   return stbi__parse_zlib(a, parse_header);
 
 4244STBIDEF 
char *stbi_zlib_decode_malloc_guesssize(
const char *buffer, 
int len, 
int initial_size, 
int *outlen)
 
 4247   char *p = (
char *) stbi__malloc(initial_size);
 
 4248   if (p == NULL) 
return NULL;
 
 4249   a.zbuffer = (stbi_uc *) buffer;
 
 4250   a.zbuffer_end = (stbi_uc *) buffer + len;
 
 4251   if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
 
 4252      if (outlen) *outlen = (int) (a.zout - a.zout_start);
 
 4253      return a.zout_start;
 
 4255      STBI_FREE(a.zout_start);
 
 4260STBIDEF 
char *stbi_zlib_decode_malloc(
char const *buffer, 
int len, 
int *outlen)
 
 4262   return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
 
 4265STBIDEF 
char *stbi_zlib_decode_malloc_guesssize_headerflag(
const char *buffer, 
int len, 
int initial_size, 
int *outlen, 
int parse_header)
 
 4268   char *p = (
char *) stbi__malloc(initial_size);
 
 4269   if (p == NULL) 
return NULL;
 
 4270   a.zbuffer = (stbi_uc *) buffer;
 
 4271   a.zbuffer_end = (stbi_uc *) buffer + len;
 
 4272   if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
 
 4273      if (outlen) *outlen = (int) (a.zout - a.zout_start);
 
 4274      return a.zout_start;
 
 4276      STBI_FREE(a.zout_start);
 
 4281STBIDEF 
int stbi_zlib_decode_buffer(
char *obuffer, 
int olen, 
char const *ibuffer, 
int ilen)
 
 4284   a.zbuffer = (stbi_uc *) ibuffer;
 
 4285   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
 
 4286   if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
 
 4287      return (
int) (a.zout - a.zout_start);
 
 4292STBIDEF 
char *stbi_zlib_decode_noheader_malloc(
char const *buffer, 
int len, 
int *outlen)
 
 4295   char *p = (
char *) stbi__malloc(16384);
 
 4296   if (p == NULL) 
return NULL;
 
 4297   a.zbuffer = (stbi_uc *) buffer;
 
 4298   a.zbuffer_end = (stbi_uc *) buffer+len;
 
 4299   if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
 
 4300      if (outlen) *outlen = (int) (a.zout - a.zout_start);
 
 4301      return a.zout_start;
 
 4303      STBI_FREE(a.zout_start);
 
 4308STBIDEF 
int stbi_zlib_decode_noheader_buffer(
char *obuffer, 
int olen, 
const char *ibuffer, 
int ilen)
 
 4311   a.zbuffer = (stbi_uc *) ibuffer;
 
 4312   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
 
 4313   if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
 
 4314      return (
int) (a.zout - a.zout_start);
 
 4333   stbi__uint32 length;
 
 4337static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
 
 4340   c.length = stbi__get32be(s);
 
 4341   c.type   = stbi__get32be(s);
 
 4345static int stbi__check_png_header(stbi__context *s)
 
 4347   static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
 
 4349   for (i=0; i < 8; ++i)
 
 4350      if (stbi__get8(s) != png_sig[i]) 
return stbi__err(
"bad png sig",
"Not a PNG");
 
 4357   stbi_uc *idata, *expanded, *out;
 
 4373static stbi_uc first_row_filter[5] =
 
 4382static int stbi__paeth(
int a, 
int b, 
int c)
 
 4388   if (pa <= pb && pa <= pc) 
return a;
 
 4389   if (pb <= pc) 
return b;
 
 4393static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
 
 4396static 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)
 
 4398   int bytes = (depth == 16? 2 : 1);
 
 4399   stbi__context *s = a->s;
 
 4400   stbi__uint32 i,j,stride = x*out_n*bytes;
 
 4401   stbi__uint32 img_len, img_width_bytes;
 
 4403   int img_n = s->img_n; 
 
 4405   int output_bytes = out_n*bytes;
 
 4406   int filter_bytes = img_n*bytes;
 
 4409   STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
 
 4410   a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); 
 
 4411   if (!a->out) 
return stbi__err(
"outofmem", 
"Out of memory");
 
 4413   if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) 
return stbi__err(
"too large", 
"Corrupt PNG");
 
 4414   img_width_bytes = (((img_n * x * depth) + 7) >> 3);
 
 4415   img_len = (img_width_bytes + 1) * y;
 
 4420   if (raw_len < img_len) 
return stbi__err(
"not enough pixels",
"Corrupt PNG");
 
 4422   for (j=0; j < y; ++j) {
 
 4423      stbi_uc *cur = a->out + stride*j;
 
 4425      int filter = *raw++;
 
 4428         return stbi__err(
"invalid filter",
"Corrupt PNG");
 
 4431         STBI_ASSERT(img_width_bytes <= x);
 
 4432         cur += x*out_n - img_width_bytes; 
 
 4434         width = img_width_bytes;
 
 4436      prior = cur - stride; 
 
 4439      if (j == 0) filter = first_row_filter[filter];
 
 4442      for (k=0; k < filter_bytes; ++k) {
 
 4444            case STBI__F_none       : cur[k] = raw[k]; 
break;
 
 4445            case STBI__F_sub        : cur[k] = raw[k]; 
break;
 
 4446            case STBI__F_up         : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); 
break;
 
 4447            case STBI__F_avg        : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); 
break;
 
 4448            case STBI__F_paeth      : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); 
break;
 
 4449            case STBI__F_avg_first  : cur[k] = raw[k]; 
break;
 
 4450            case STBI__F_paeth_first: cur[k] = raw[k]; 
break;
 
 4460      } 
else if (depth == 16) {
 
 4461         if (img_n != out_n) {
 
 4462            cur[filter_bytes]   = 255; 
 
 4463            cur[filter_bytes+1] = 255; 
 
 4465         raw += filter_bytes;
 
 4466         cur += output_bytes;
 
 4467         prior += output_bytes;
 
 4475      if (depth < 8 || img_n == out_n) {
 
 4476         int nk = (width - 1)*filter_bytes;
 
 4477         #define STBI__CASE(f) \ 
 4479                for (k=0; k < nk; ++k) 
 4482            case STBI__F_none:         memcpy(cur, raw, nk); 
break;
 
 4483            STBI__CASE(STBI__F_sub)          { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } 
break;
 
 4484            STBI__CASE(STBI__F_up)           { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } 
break;
 
 4485            STBI__CASE(STBI__F_avg)          { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } 
break;
 
 4486            STBI__CASE(STBI__F_paeth)        { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } 
break;
 
 4487            STBI__CASE(STBI__F_avg_first)    { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } 
break;
 
 4488            STBI__CASE(STBI__F_paeth_first)  { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } 
break;
 
 4493         STBI_ASSERT(img_n+1 == out_n);
 
 4494         #define STBI__CASE(f) \ 
 4496                for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ 
 4497                   for (k=0; k < filter_bytes; ++k) 
 4499            STBI__CASE(STBI__F_none)         { cur[k] = raw[k]; } 
break;
 
 4500            STBI__CASE(STBI__F_sub)          { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } 
break;
 
 4501            STBI__CASE(STBI__F_up)           { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } 
break;
 
 4502            STBI__CASE(STBI__F_avg)          { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } 
break;
 
 4503            STBI__CASE(STBI__F_paeth)        { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } 
break;
 
 4504            STBI__CASE(STBI__F_avg_first)    { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } 
break;
 
 4505            STBI__CASE(STBI__F_paeth_first)  { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } 
break;
 
 4512            cur = a->out + stride*j; 
 
 4513            for (i=0; i < x; ++i,cur+=output_bytes) {
 
 4514               cur[filter_bytes+1] = 255;
 
 4524      for (j=0; j < y; ++j) {
 
 4525         stbi_uc *cur = a->out + stride*j;
 
 4526         stbi_uc *in  = a->out + stride*j + x*out_n - img_width_bytes;
 
 4529         stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; 
 
 4538            for (k=x*img_n; k >= 2; k-=2, ++in) {
 
 4539               *cur++ = scale * ((*in >> 4)       );
 
 4540               *cur++ = scale * ((*in     ) & 0x0f);
 
 4542            if (k > 0) *cur++ = scale * ((*in >> 4)       );
 
 4543         } 
else if (depth == 2) {
 
 4544            for (k=x*img_n; k >= 4; k-=4, ++in) {
 
 4545               *cur++ = scale * ((*in >> 6)       );
 
 4546               *cur++ = scale * ((*in >> 4) & 0x03);
 
 4547               *cur++ = scale * ((*in >> 2) & 0x03);
 
 4548               *cur++ = scale * ((*in     ) & 0x03);
 
 4550            if (k > 0) *cur++ = scale * ((*in >> 6)       );
 
 4551            if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
 
 4552            if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
 
 4553         } 
else if (depth == 1) {
 
 4554            for (k=x*img_n; k >= 8; k-=8, ++in) {
 
 4555               *cur++ = scale * ((*in >> 7)       );
 
 4556               *cur++ = scale * ((*in >> 6) & 0x01);
 
 4557               *cur++ = scale * ((*in >> 5) & 0x01);
 
 4558               *cur++ = scale * ((*in >> 4) & 0x01);
 
 4559               *cur++ = scale * ((*in >> 3) & 0x01);
 
 4560               *cur++ = scale * ((*in >> 2) & 0x01);
 
 4561               *cur++ = scale * ((*in >> 1) & 0x01);
 
 4562               *cur++ = scale * ((*in     ) & 0x01);
 
 4564            if (k > 0) *cur++ = scale * ((*in >> 7)       );
 
 4565            if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
 
 4566            if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
 
 4567            if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
 
 4568            if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
 
 4569            if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
 
 4570            if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
 
 4572         if (img_n != out_n) {
 
 4575            cur = a->out + stride*j;
 
 4577               for (q=x-1; q >= 0; --q) {
 
 4579                  cur[q*2+0] = cur[q];
 
 4582               STBI_ASSERT(img_n == 3);
 
 4583               for (q=x-1; q >= 0; --q) {
 
 4585                  cur[q*4+2] = cur[q*3+2];
 
 4586                  cur[q*4+1] = cur[q*3+1];
 
 4587                  cur[q*4+0] = cur[q*3+0];
 
 4592   } 
else if (depth == 16) {
 
 4597      stbi_uc *cur = a->out;
 
 4598      stbi__uint16 *cur16 = (stbi__uint16*)cur;
 
 4600      for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
 
 4601         *cur16 = (cur[0] << 8) | cur[1];
 
 4608static 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)
 
 4610   int bytes = (depth == 16 ? 2 : 1);
 
 4611   int out_bytes = out_n * bytes;
 
 4615      return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
 
 4618   final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
 
 4619   for (p=0; p < 7; ++p) {
 
 4620      int xorig[] = { 0,4,0,2,0,1,0 };
 
 4621      int yorig[] = { 0,0,4,0,2,0,1 };
 
 4622      int xspc[]  = { 8,8,4,4,2,2,1 };
 
 4623      int yspc[]  = { 8,8,8,4,4,2,2 };
 
 4626      x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
 
 4627      y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
 
 4629         stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
 
 4630         if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
 
 4634         for (j=0; j < y; ++j) {
 
 4635            for (i=0; i < x; ++i) {
 
 4636               int out_y = j*yspc[p]+yorig[p];
 
 4637               int out_x = i*xspc[p]+xorig[p];
 
 4638               memcpy(
final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
 
 4639                      a->out + (j*x+i)*out_bytes, out_bytes);
 
 4643         image_data += img_len;
 
 4644         image_data_len -= img_len;
 
 4652static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], 
int out_n)
 
 4654   stbi__context *s = z->s;
 
 4655   stbi__uint32 i, pixel_count = s->img_x * s->img_y;
 
 4656   stbi_uc *p = z->out;
 
 4660   STBI_ASSERT(out_n == 2 || out_n == 4);
 
 4663      for (i=0; i < pixel_count; ++i) {
 
 4664         p[1] = (p[0] == tc[0] ? 0 : 255);
 
 4668      for (i=0; i < pixel_count; ++i) {
 
 4669         if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
 
 4677static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], 
int out_n)
 
 4679   stbi__context *s = z->s;
 
 4680   stbi__uint32 i, pixel_count = s->img_x * s->img_y;
 
 4681   stbi__uint16 *p = (stbi__uint16*) z->out;
 
 4685   STBI_ASSERT(out_n == 2 || out_n == 4);
 
 4688      for (i = 0; i < pixel_count; ++i) {
 
 4689         p[1] = (p[0] == tc[0] ? 0 : 65535);
 
 4693      for (i = 0; i < pixel_count; ++i) {
 
 4694         if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
 
 4702static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, 
int len, 
int pal_img_n)
 
 4704   stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
 
 4705   stbi_uc *p, *temp_out, *orig = a->out;
 
 4707   p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
 
 4708   if (p == NULL) 
return stbi__err(
"outofmem", 
"Out of memory");
 
 4713   if (pal_img_n == 3) {
 
 4714      for (i=0; i < pixel_count; ++i) {
 
 4717         p[1] = palette[n+1];
 
 4718         p[2] = palette[n+2];
 
 4722      for (i=0; i < pixel_count; ++i) {
 
 4725         p[1] = palette[n+1];
 
 4726         p[2] = palette[n+2];
 
 4727         p[3] = palette[n+3];
 
 4739static int stbi__unpremultiply_on_load = 0;
 
 4740static int stbi__de_iphone_flag = 0;
 
 4742STBIDEF 
void stbi_set_unpremultiply_on_load(
int flag_true_if_should_unpremultiply)
 
 4744   stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
 
 4747STBIDEF 
void stbi_convert_iphone_png_to_rgb(
int flag_true_if_should_convert)
 
 4749   stbi__de_iphone_flag = flag_true_if_should_convert;
 
 4752static void stbi__de_iphone(stbi__png *z)
 
 4754   stbi__context *s = z->s;
 
 4755   stbi__uint32 i, pixel_count = s->img_x * s->img_y;
 
 4756   stbi_uc *p = z->out;
 
 4758   if (s->img_out_n == 3) {  
 
 4759      for (i=0; i < pixel_count; ++i) {
 
 4766      STBI_ASSERT(s->img_out_n == 4);
 
 4767      if (stbi__unpremultiply_on_load) {
 
 4769         for (i=0; i < pixel_count; ++i) {
 
 4773               stbi_uc half = a / 2;
 
 4774               p[0] = (p[2] * 255 + half) / a;
 
 4775               p[1] = (p[1] * 255 + half) / a;
 
 4776               p[2] = ( t   * 255 + half) / a;
 
 4785         for (i=0; i < pixel_count; ++i) {
 
 4795#define STBI__PNG_TYPE(a,b,c,d)  (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) 
 4797static int stbi__parse_png_file(stbi__png *z, 
int scan, 
int req_comp)
 
 4799   stbi_uc palette[1024], pal_img_n=0;
 
 4800   stbi_uc has_trans=0, tc[3]={0};
 
 4801   stbi__uint16 tc16[3];
 
 4802   stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
 
 4803   int first=1,k,interlace=0, color=0, is_iphone=0;
 
 4804   stbi__context *s = z->s;
 
 4810   if (!stbi__check_png_header(s)) 
return 0;
 
 4812   if (scan == STBI__SCAN_type) 
return 1;
 
 4815      stbi__pngchunk c = stbi__get_chunk_header(s);
 
 4817         case STBI__PNG_TYPE(
'C',
'g',
'B',
'I'):
 
 4819            stbi__skip(s, c.length);
 
 4821         case STBI__PNG_TYPE(
'I',
'H',
'D',
'R'): {
 
 4823            if (!first) 
return stbi__err(
"multiple IHDR",
"Corrupt PNG");
 
 4825            if (c.length != 13) 
return stbi__err(
"bad IHDR len",
"Corrupt PNG");
 
 4826            s->img_x = stbi__get32be(s); 
if (s->img_x > (1 << 24)) 
return stbi__err(
"too large",
"Very large image (corrupt?)");
 
 4827            s->img_y = stbi__get32be(s); 
if (s->img_y > (1 << 24)) 
return stbi__err(
"too large",
"Very large image (corrupt?)");
 
 4828            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");
 
 4829            color = stbi__get8(s);  
if (color > 6)         
return stbi__err(
"bad ctype",
"Corrupt PNG");
 
 4830            if (color == 3 && z->depth == 16)                  
return stbi__err(
"bad ctype",
"Corrupt PNG");
 
 4831            if (color == 3) pal_img_n = 3; 
else if (color & 1) 
return stbi__err(
"bad ctype",
"Corrupt PNG");
 
 4832            comp  = stbi__get8(s);  
if (comp) 
return stbi__err(
"bad comp method",
"Corrupt PNG");
 
 4833            filter= stbi__get8(s);  
if (filter) 
return stbi__err(
"bad filter method",
"Corrupt PNG");
 
 4834            interlace = stbi__get8(s); 
if (interlace>1) 
return stbi__err(
"bad interlace method",
"Corrupt PNG");
 
 4835            if (!s->img_x || !s->img_y) 
return stbi__err(
"0-pixel image",
"Corrupt PNG");
 
 4837               s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
 
 4838               if ((1 << 30) / s->img_x / s->img_n < s->img_y) 
return stbi__err(
"too large", 
"Image too large to decode");
 
 4839               if (scan == STBI__SCAN_header) 
return 1;
 
 4844               if ((1 << 30) / s->img_x / 4 < s->img_y) 
return stbi__err(
"too large",
"Corrupt PNG");
 
 4850         case STBI__PNG_TYPE(
'P',
'L',
'T',
'E'):  {
 
 4851            if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
 
 4852            if (c.length > 256*3) 
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
 
 4853            pal_len = c.length / 3;
 
 4854            if (pal_len * 3 != c.length) 
return stbi__err(
"invalid PLTE",
"Corrupt PNG");
 
 4855            for (i=0; i < pal_len; ++i) {
 
 4856               palette[i*4+0] = stbi__get8(s);
 
 4857               palette[i*4+1] = stbi__get8(s);
 
 4858               palette[i*4+2] = stbi__get8(s);
 
 4859               palette[i*4+3] = 255;
 
 4864         case STBI__PNG_TYPE(
't',
'R',
'N',
'S'): {
 
 4865            if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
 
 4866            if (z->idata) 
return stbi__err(
"tRNS after IDAT",
"Corrupt PNG");
 
 4868               if (scan == STBI__SCAN_header) { s->img_n = 4; 
return 1; }
 
 4869               if (pal_len == 0) 
return stbi__err(
"tRNS before PLTE",
"Corrupt PNG");
 
 4870               if (c.length > pal_len) 
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
 
 4872               for (i=0; i < c.length; ++i)
 
 4873                  palette[i*4+3] = stbi__get8(s);
 
 4875               if (!(s->img_n & 1)) 
return stbi__err(
"tRNS with alpha",
"Corrupt PNG");
 
 4876               if (c.length != (stbi__uint32) s->img_n*2) 
return stbi__err(
"bad tRNS len",
"Corrupt PNG");
 
 4878               if (z->depth == 16) {
 
 4879                  for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); 
 
 4881                  for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; 
 
 4887         case STBI__PNG_TYPE(
'I',
'D',
'A',
'T'): {
 
 4888            if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
 
 4889            if (pal_img_n && !pal_len) 
return stbi__err(
"no PLTE",
"Corrupt PNG");
 
 4890            if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; 
return 1; }
 
 4891            if ((
int)(ioff + c.length) < (
int)ioff) 
return 0;
 
 4892            if (ioff + c.length > idata_limit) {
 
 4893               stbi__uint32 idata_limit_old = idata_limit;
 
 4895               if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
 
 4896               while (ioff + c.length > idata_limit)
 
 4898               STBI_NOTUSED(idata_limit_old);
 
 4899               p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); 
if (p == NULL) 
return stbi__err(
"outofmem", 
"Out of memory");
 
 4902            if (!stbi__getn(s, z->idata+ioff,c.length)) 
return stbi__err(
"outofdata",
"Corrupt PNG");
 
 4907         case STBI__PNG_TYPE(
'I',
'E',
'N',
'D'): {
 
 4908            stbi__uint32 raw_len, bpl;
 
 4909            if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
 
 4910            if (scan != STBI__SCAN_load) 
return 1;
 
 4911            if (z->idata == NULL) 
return stbi__err(
"no IDAT",
"Corrupt PNG");
 
 4913            bpl = (s->img_x * z->depth + 7) / 8; 
 
 4914            raw_len = bpl * s->img_y * s->img_n  + s->img_y ;
 
 4915            z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((
char *) z->idata, ioff, raw_len, (
int *) &raw_len, !is_iphone);
 
 4916            if (z->expanded == NULL) 
return 0; 
 
 4917            STBI_FREE(z->idata); z->idata = NULL;
 
 4918            if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
 
 4919               s->img_out_n = s->img_n+1;
 
 4921               s->img_out_n = s->img_n;
 
 4922            if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) 
return 0;
 
 4924               if (z->depth == 16) {
 
 4925                  if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) 
return 0;
 
 4927                  if (!stbi__compute_transparency(z, tc, s->img_out_n)) 
return 0;
 
 4930            if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
 
 4934               s->img_n = pal_img_n; 
 
 4935               s->img_out_n = pal_img_n;
 
 4936               if (req_comp >= 3) s->img_out_n = req_comp;
 
 4937               if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
 
 4939            } 
else if (has_trans) {
 
 4943            STBI_FREE(z->expanded); z->expanded = NULL;
 
 4949            if (first) 
return stbi__err(
"first not IHDR", 
"Corrupt PNG");
 
 4950            if ((c.type & (1 << 29)) == 0) {
 
 4951               #ifndef STBI_NO_FAILURE_STRINGS 
 4953               static char invalid_chunk[] = 
"XXXX PNG chunk not known";
 
 4954               invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
 
 4955               invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
 
 4956               invalid_chunk[2] = STBI__BYTECAST(c.type >>  8);
 
 4957               invalid_chunk[3] = STBI__BYTECAST(c.type >>  0);
 
 4959               return stbi__err(invalid_chunk, 
"PNG not supported: unknown PNG chunk type");
 
 4961            stbi__skip(s, c.length);
 
 4969static void *stbi__do_png(stbi__png *p, 
int *x, 
int *y, 
int *n, 
int req_comp, stbi__result_info *ri)
 
 4972   if (req_comp < 0 || req_comp > 4) 
return stbi__errpuc(
"bad req_comp", 
"Internal error");
 
 4973   if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
 
 4975         ri->bits_per_channel = 8;
 
 4977         ri->bits_per_channel = p->depth;
 
 4980      if (req_comp && req_comp != p->s->img_out_n) {
 
 4981         if (ri->bits_per_channel == 8)
 
 4982            result = stbi__convert_format((
unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
 
 4984            result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
 
 4985         p->s->img_out_n = req_comp;
 
 4986         if (result == NULL) 
return result;
 
 4990      if (n) *n = p->s->img_n;
 
 4992   STBI_FREE(p->out);      p->out      = NULL;
 
 4993   STBI_FREE(p->expanded); p->expanded = NULL;
 
 4994   STBI_FREE(p->idata);    p->idata    = NULL;
 
 4999static void *stbi__png_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
 
 5003   return stbi__do_png(&p, x,y,comp,req_comp, ri);
 
 5006static int stbi__png_test(stbi__context *s)
 
 5009   r = stbi__check_png_header(s);
 
 5014static int stbi__png_info_raw(stbi__png *p, 
int *x, 
int *y, 
int *comp)
 
 5016   if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
 
 5017      stbi__rewind( p->s );
 
 5020   if (x) *x = p->s->img_x;
 
 5021   if (y) *y = p->s->img_y;
 
 5022   if (comp) *comp = p->s->img_n;
 
 5026static int stbi__png_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 5030   return stbi__png_info_raw(&p, x, y, comp);
 
 5033static int stbi__png_is16(stbi__context *s)
 
 5037   if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
 
 5039   if (p.depth != 16) {
 
 5050static int stbi__bmp_test_raw(stbi__context *s)
 
 5054   if (stbi__get8(s) != 
'B') 
return 0;
 
 5055   if (stbi__get8(s) != 
'M') 
return 0;
 
 5060   sz = stbi__get32le(s);
 
 5061   r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
 
 5065static int stbi__bmp_test(stbi__context *s)
 
 5067   int r = stbi__bmp_test_raw(s);
 
 5074static int stbi__high_bit(
unsigned int z)
 
 5077   if (z == 0) 
return -1;
 
 5078   if (z >= 0x10000) { n += 16; z >>= 16; }
 
 5079   if (z >= 0x00100) { n +=  8; z >>=  8; }
 
 5080   if (z >= 0x00010) { n +=  4; z >>=  4; }
 
 5081   if (z >= 0x00004) { n +=  2; z >>=  2; }
 
 5082   if (z >= 0x00002) { n +=  1; z >>=  1; }
 
 5086static int stbi__bitcount(
unsigned int a)
 
 5088   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); 
 
 5089   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); 
 
 5090   a = (a + (a >> 4)) & 0x0f0f0f0f; 
 
 5092   a = (a + (a >> 16)); 
 
 5099static int stbi__shiftsigned(
unsigned int v, 
int shift, 
int bits)
 
 5101   static unsigned int mul_table[9] = {
 
 5103      0xff, 0x55, 0x49, 0x11,
 
 5104      0x21, 0x41, 0x81, 0x01,
 
 5106   static unsigned int shift_table[9] = {
 
 5113   STBI_ASSERT(v >= 0 && v < 256);
 
 5115   STBI_ASSERT(bits >= 0 && bits <= 8);
 
 5116   return (
int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
 
 5121   int bpp, offset, hsz;
 
 5122   unsigned int mr,mg,mb,ma, all_a;
 
 5125static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
 
 5128   if (stbi__get8(s) != 
'B' || stbi__get8(s) != 
'M') 
return stbi__errpuc(
"not BMP", 
"Corrupt BMP");
 
 5132   info->offset = stbi__get32le(s);
 
 5133   info->hsz = hsz = stbi__get32le(s);
 
 5134   info->mr = info->mg = info->mb = info->ma = 0;
 
 5136   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) 
return stbi__errpuc(
"unknown BMP", 
"BMP type not supported: unknown");
 
 5138      s->img_x = stbi__get16le(s);
 
 5139      s->img_y = stbi__get16le(s);
 
 5141      s->img_x = stbi__get32le(s);
 
 5142      s->img_y = stbi__get32le(s);
 
 5144   if (stbi__get16le(s) != 1) 
return stbi__errpuc(
"bad BMP", 
"bad BMP");
 
 5145   info->bpp = stbi__get16le(s);
 
 5147      int compress = stbi__get32le(s);
 
 5148      if (compress == 1 || compress == 2) 
return stbi__errpuc(
"BMP RLE", 
"BMP type not supported: RLE");
 
 5154      if (hsz == 40 || hsz == 56) {
 
 5161         if (info->bpp == 16 || info->bpp == 32) {
 
 5162            if (compress == 0) {
 
 5163               if (info->bpp == 32) {
 
 5164                  info->mr = 0xffu << 16;
 
 5165                  info->mg = 0xffu <<  8;
 
 5166                  info->mb = 0xffu <<  0;
 
 5167                  info->ma = 0xffu << 24;
 
 5170                  info->mr = 31u << 10;
 
 5171                  info->mg = 31u <<  5;
 
 5172                  info->mb = 31u <<  0;
 
 5174            } 
else if (compress == 3) {
 
 5175               info->mr = stbi__get32le(s);
 
 5176               info->mg = stbi__get32le(s);
 
 5177               info->mb = stbi__get32le(s);
 
 5179               if (info->mr == info->mg && info->mg == info->mb) {
 
 5181                  return stbi__errpuc(
"bad BMP", 
"bad BMP");
 
 5184               return stbi__errpuc(
"bad BMP", 
"bad BMP");
 
 5188         if (hsz != 108 && hsz != 124)
 
 5189            return stbi__errpuc(
"bad BMP", 
"bad BMP");
 
 5190         info->mr = stbi__get32le(s);
 
 5191         info->mg = stbi__get32le(s);
 
 5192         info->mb = stbi__get32le(s);
 
 5193         info->ma = stbi__get32le(s);
 
 5195         for (i=0; i < 12; ++i)
 
 5209static void *stbi__bmp_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
 
 5212   unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
 
 5213   stbi_uc pal[256][4];
 
 5214   int psize=0,i,j,width;
 
 5215   int flip_vertically, pad, target;
 
 5216   stbi__bmp_data info;
 
 5220   if (stbi__bmp_parse_header(s, &info) == NULL)
 
 5223   flip_vertically = ((int) s->img_y) > 0;
 
 5224   s->img_y = abs((
int) s->img_y);
 
 5232   if (info.hsz == 12) {
 
 5234         psize = (info.offset - 14 - 24) / 3;
 
 5237         psize = (info.offset - 14 - info.hsz) >> 2;
 
 5240   s->img_n = ma ? 4 : 3;
 
 5241   if (req_comp && req_comp >= 3) 
 
 5247   if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
 
 5248      return stbi__errpuc(
"too large", 
"Corrupt BMP");
 
 5250   out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
 
 5251   if (!out) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
 
 5252   if (info.bpp < 16) {
 
 5254      if (psize == 0 || psize > 256) { STBI_FREE(out); 
return stbi__errpuc(
"invalid", 
"Corrupt BMP"); }
 
 5255      for (i=0; i < psize; ++i) {
 
 5256         pal[i][2] = stbi__get8(s);
 
 5257         pal[i][1] = stbi__get8(s);
 
 5258         pal[i][0] = stbi__get8(s);
 
 5259         if (info.hsz != 12) stbi__get8(s);
 
 5262      stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
 
 5263      if (info.bpp == 1) width = (s->img_x + 7) >> 3;
 
 5264      else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
 
 5265      else if (info.bpp == 8) width = s->img_x;
 
 5266      else { STBI_FREE(out); 
return stbi__errpuc(
"bad bpp", 
"Corrupt BMP"); }
 
 5268      if (info.bpp == 1) {
 
 5269         for (j=0; j < (int) s->img_y; ++j) {
 
 5270            int bit_offset = 7, v = stbi__get8(s);
 
 5271            for (i=0; i < (int) s->img_x; ++i) {
 
 5272               int color = (v>>bit_offset)&0x1;
 
 5273               out[z++] = pal[color][0];
 
 5274               out[z++] = pal[color][1];
 
 5275               out[z++] = pal[color][2];
 
 5276               if (target == 4) out[z++] = 255;
 
 5277               if (i+1 == (
int) s->img_x) 
break;
 
 5278               if((--bit_offset) < 0) {
 
 5286         for (j=0; j < (int) s->img_y; ++j) {
 
 5287            for (i=0; i < (int) s->img_x; i += 2) {
 
 5288               int v=stbi__get8(s),v2=0;
 
 5289               if (info.bpp == 4) {
 
 5293               out[z++] = pal[v][0];
 
 5294               out[z++] = pal[v][1];
 
 5295               out[z++] = pal[v][2];
 
 5296               if (target == 4) out[z++] = 255;
 
 5297               if (i+1 == (
int) s->img_x) 
break;
 
 5298               v = (info.bpp == 8) ? stbi__get8(s) : v2;
 
 5299               out[z++] = pal[v][0];
 
 5300               out[z++] = pal[v][1];
 
 5301               out[z++] = pal[v][2];
 
 5302               if (target == 4) out[z++] = 255;
 
 5308      int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
 
 5311      stbi__skip(s, info.offset - 14 - info.hsz);
 
 5312      if (info.bpp == 24) width = 3 * s->img_x;
 
 5313      else if (info.bpp == 16) width = 2*s->img_x;
 
 5316      if (info.bpp == 24) {
 
 5318      } 
else if (info.bpp == 32) {
 
 5319         if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
 
 5323         if (!mr || !mg || !mb) { STBI_FREE(out); 
return stbi__errpuc(
"bad masks", 
"Corrupt BMP"); }
 
 5325         rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
 
 5326         gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
 
 5327         bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
 
 5328         ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
 
 5330      for (j=0; j < (int) s->img_y; ++j) {
 
 5332            for (i=0; i < (int) s->img_x; ++i) {
 
 5334               out[z+2] = stbi__get8(s);
 
 5335               out[z+1] = stbi__get8(s);
 
 5336               out[z+0] = stbi__get8(s);
 
 5338               a = (easy == 2 ? stbi__get8(s) : 255);
 
 5340               if (target == 4) out[z++] = a;
 
 5344            for (i=0; i < (int) s->img_x; ++i) {
 
 5345               stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
 
 5347               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
 
 5348               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
 
 5349               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
 
 5350               a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
 
 5352               if (target == 4) out[z++] = STBI__BYTECAST(a);
 
 5360   if (target == 4 && all_a == 0)
 
 5361      for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
 
 5364   if (flip_vertically) {
 
 5366      for (j=0; j < (int) s->img_y>>1; ++j) {
 
 5367         stbi_uc *p1 = out +      j     *s->img_x*target;
 
 5368         stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
 
 5369         for (i=0; i < (int) s->img_x*target; ++i) {
 
 5370            t = p1[i]; p1[i] = p2[i]; p2[i] = t;
 
 5375   if (req_comp && req_comp != target) {
 
 5376      out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
 
 5377      if (out == NULL) 
return out; 
 
 5382   if (comp) *comp = s->img_n;
 
 5391static int stbi__tga_get_comp(
int bits_per_pixel, 
int is_grey, 
int* is_rgb16)
 
 5394   if (is_rgb16) *is_rgb16 = 0;
 
 5395   switch(bits_per_pixel) {
 
 5396      case 8:  
return STBI_grey;
 
 5397      case 16: 
if(is_grey) 
return STBI_grey_alpha;
 
 5399      case 15: 
if(is_rgb16) *is_rgb16 = 1;
 
 5402      case 32: 
return bits_per_pixel/8;
 
 5407static int stbi__tga_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 5409    int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
 
 5410    int sz, tga_colormap_type;
 
 5412    tga_colormap_type = stbi__get8(s); 
 
 5413    if( tga_colormap_type > 1 ) {
 
 5417    tga_image_type = stbi__get8(s); 
 
 5418    if ( tga_colormap_type == 1 ) { 
 
 5419        if (tga_image_type != 1 && tga_image_type != 9) {
 
 5425        if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
 
 5430        tga_colormap_bpp = sz;
 
 5432        if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
 
 5437        tga_colormap_bpp = 0;
 
 5439    tga_w = stbi__get16le(s);
 
 5444    tga_h = stbi__get16le(s);
 
 5449    tga_bits_per_pixel = stbi__get8(s); 
 
 5451    if (tga_colormap_bpp != 0) {
 
 5452        if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
 
 5458        tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
 
 5460        tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
 
 5468    if (comp) *comp = tga_comp;
 
 5472static int stbi__tga_test(stbi__context *s)
 
 5475   int sz, tga_color_type;
 
 5477   tga_color_type = stbi__get8(s);   
 
 5478   if ( tga_color_type > 1 ) 
goto errorEnd;   
 
 5480   if ( tga_color_type == 1 ) { 
 
 5481      if (sz != 1 && sz != 9) 
goto errorEnd; 
 
 5484      if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) 
goto errorEnd;
 
 5487      if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) 
goto errorEnd; 
 
 5490   if ( stbi__get16le(s) < 1 ) 
goto errorEnd;      
 
 5491   if ( stbi__get16le(s) < 1 ) 
goto errorEnd;      
 
 5493   if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) 
goto errorEnd; 
 
 5494   if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) 
goto errorEnd;
 
 5504static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
 
 5506   stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
 
 5507   stbi__uint16 fiveBitMask = 31;
 
 5509   int r = (px >> 10) & fiveBitMask;
 
 5510   int g = (px >> 5) & fiveBitMask;
 
 5511   int b = px & fiveBitMask;
 
 5513   out[0] = (stbi_uc)((r * 255)/31);
 
 5514   out[1] = (stbi_uc)((g * 255)/31);
 
 5515   out[2] = (stbi_uc)((b * 255)/31);
 
 5523static void *stbi__tga_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
 
 5526   int tga_offset = stbi__get8(s);
 
 5527   int tga_indexed = stbi__get8(s);
 
 5528   int tga_image_type = stbi__get8(s);
 
 5530   int tga_palette_start = stbi__get16le(s);
 
 5531   int tga_palette_len = stbi__get16le(s);
 
 5532   int tga_palette_bits = stbi__get8(s);
 
 5533   int tga_x_origin = stbi__get16le(s);
 
 5534   int tga_y_origin = stbi__get16le(s);
 
 5535   int tga_width = stbi__get16le(s);
 
 5536   int tga_height = stbi__get16le(s);
 
 5537   int tga_bits_per_pixel = stbi__get8(s);
 
 5538   int tga_comp, tga_rgb16=0;
 
 5539   int tga_inverted = stbi__get8(s);
 
 5542   unsigned char *tga_data;
 
 5543   unsigned char *tga_palette = NULL;
 
 5545   unsigned char raw_data[4] = {0};
 
 5547   int RLE_repeating = 0;
 
 5548   int read_next_pixel = 1;
 
 5552   if ( tga_image_type >= 8 )
 
 5554      tga_image_type -= 8;
 
 5557   tga_inverted = 1 - ((tga_inverted >> 5) & 1);
 
 5560   if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
 
 5561   else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
 
 5564      return stbi__errpuc(
"bad format", 
"Can't find out TGA pixelformat");
 
 5569   if (comp) *comp = tga_comp;
 
 5571   if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
 
 5572      return stbi__errpuc(
"too large", 
"Corrupt TGA");
 
 5574   tga_data = (
unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
 
 5575   if (!tga_data) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
 
 5578   stbi__skip(s, tga_offset );
 
 5580   if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
 
 5581      for (i=0; i < tga_height; ++i) {
 
 5582         int row = tga_inverted ? tga_height -i - 1 : i;
 
 5583         stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
 
 5584         stbi__getn(s, tga_row, tga_width * tga_comp);
 
 5591         stbi__skip(s, tga_palette_start );
 
 5593         tga_palette = (
unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
 
 5595            STBI_FREE(tga_data);
 
 5596            return stbi__errpuc(
"outofmem", 
"Out of memory");
 
 5599            stbi_uc *pal_entry = tga_palette;
 
 5600            STBI_ASSERT(tga_comp == STBI_rgb);
 
 5601            for (i=0; i < tga_palette_len; ++i) {
 
 5602               stbi__tga_read_rgb16(s, pal_entry);
 
 5603               pal_entry += tga_comp;
 
 5605         } 
else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
 
 5606               STBI_FREE(tga_data);
 
 5607               STBI_FREE(tga_palette);
 
 5608               return stbi__errpuc(
"bad palette", 
"Corrupt TGA");
 
 5612      for (i=0; i < tga_width * tga_height; ++i)
 
 5617            if ( RLE_count == 0 )
 
 5620               int RLE_cmd = stbi__get8(s);
 
 5621               RLE_count = 1 + (RLE_cmd & 127);
 
 5622               RLE_repeating = RLE_cmd >> 7;
 
 5623               read_next_pixel = 1;
 
 5624            } 
else if ( !RLE_repeating )
 
 5626               read_next_pixel = 1;
 
 5630            read_next_pixel = 1;
 
 5633         if ( read_next_pixel )
 
 5639               int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
 
 5640               if ( pal_idx >= tga_palette_len ) {
 
 5644               pal_idx *= tga_comp;
 
 5645               for (j = 0; j < tga_comp; ++j) {
 
 5646                  raw_data[j] = tga_palette[pal_idx+j];
 
 5648            } 
else if(tga_rgb16) {
 
 5649               STBI_ASSERT(tga_comp == STBI_rgb);
 
 5650               stbi__tga_read_rgb16(s, raw_data);
 
 5653               for (j = 0; j < tga_comp; ++j) {
 
 5654                  raw_data[j] = stbi__get8(s);
 
 5658            read_next_pixel = 0;
 
 5662         for (j = 0; j < tga_comp; ++j)
 
 5663           tga_data[i*tga_comp+j] = raw_data[j];
 
 5671         for (j = 0; j*2 < tga_height; ++j)
 
 5673            int index1 = j * tga_width * tga_comp;
 
 5674            int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
 
 5675            for (i = tga_width * tga_comp; i > 0; --i)
 
 5677               unsigned char temp = tga_data[index1];
 
 5678               tga_data[index1] = tga_data[index2];
 
 5679               tga_data[index2] = temp;
 
 5686      if ( tga_palette != NULL )
 
 5688         STBI_FREE( tga_palette );
 
 5693   if (tga_comp >= 3 && !tga_rgb16)
 
 5695      unsigned char* tga_pixel = tga_data;
 
 5696      for (i=0; i < tga_width * tga_height; ++i)
 
 5698         unsigned char temp = tga_pixel[0];
 
 5699         tga_pixel[0] = tga_pixel[2];
 
 5700         tga_pixel[2] = temp;
 
 5701         tga_pixel += tga_comp;
 
 5706   if (req_comp && req_comp != tga_comp)
 
 5707      tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
 
 5711   tga_palette_start = tga_palette_len = tga_palette_bits =
 
 5712         tga_x_origin = tga_y_origin = 0;
 
 5722static int stbi__psd_test(stbi__context *s)
 
 5724   int r = (stbi__get32be(s) == 0x38425053);
 
 5729static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, 
int pixelCount)
 
 5731   int count, nleft, len;
 
 5734   while ((nleft = pixelCount - count) > 0) {
 
 5735      len = stbi__get8(s);
 
 5738      } 
else if (len < 128) {
 
 5741         if (len > nleft) 
return 0; 
 
 5748      } 
else if (len > 128) {
 
 5753         if (len > nleft) 
return 0; 
 
 5754         val = stbi__get8(s);
 
 5767static void *stbi__psd_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri, 
int bpc)
 
 5770   int channelCount, compression;
 
 5778   if (stbi__get32be(s) != 0x38425053)   
 
 5779      return stbi__errpuc(
"not PSD", 
"Corrupt PSD image");
 
 5782   if (stbi__get16be(s) != 1)
 
 5783      return stbi__errpuc(
"wrong version", 
"Unsupported version of PSD image");
 
 5789   channelCount = stbi__get16be(s);
 
 5790   if (channelCount < 0 || channelCount > 16)
 
 5791      return stbi__errpuc(
"wrong channel count", 
"Unsupported number of channels in PSD image");
 
 5794   h = stbi__get32be(s);
 
 5795   w = stbi__get32be(s);
 
 5798   bitdepth = stbi__get16be(s);
 
 5799   if (bitdepth != 8 && bitdepth != 16)
 
 5800      return stbi__errpuc(
"unsupported bit depth", 
"PSD bit depth is not 8 or 16 bit");
 
 5812   if (stbi__get16be(s) != 3)
 
 5813      return stbi__errpuc(
"wrong color format", 
"PSD is not in RGB color format");
 
 5816   stbi__skip(s,stbi__get32be(s) );
 
 5819   stbi__skip(s, stbi__get32be(s) );
 
 5822   stbi__skip(s, stbi__get32be(s) );
 
 5828   compression = stbi__get16be(s);
 
 5829   if (compression > 1)
 
 5830      return stbi__errpuc(
"bad compression", 
"PSD has an unknown compression format");
 
 5833   if (!stbi__mad3sizes_valid(4, w, h, 0))
 
 5834      return stbi__errpuc(
"too large", 
"Corrupt PSD");
 
 5838   if (!compression && bitdepth == 16 && bpc == 16) {
 
 5839      out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
 
 5840      ri->bits_per_channel = 16;
 
 5842      out = (stbi_uc *) stbi__malloc(4 * w*h);
 
 5844   if (!out) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
 
 5862      stbi__skip(s, h * channelCount * 2 );
 
 5865      for (channel = 0; channel < 4; channel++) {
 
 5869         if (channel >= channelCount) {
 
 5871            for (i = 0; i < pixelCount; i++, p += 4)
 
 5872               *p = (channel == 3 ? 255 : 0);
 
 5875            if (!stbi__psd_decode_rle(s, p, pixelCount)) {
 
 5877               return stbi__errpuc(
"corrupt", 
"bad RLE data");
 
 5887      for (channel = 0; channel < 4; channel++) {
 
 5888         if (channel >= channelCount) {
 
 5890            if (bitdepth == 16 && bpc == 16) {
 
 5891               stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
 
 5892               stbi__uint16 val = channel == 3 ? 65535 : 0;
 
 5893               for (i = 0; i < pixelCount; i++, q += 4)
 
 5896               stbi_uc *p = out+channel;
 
 5897               stbi_uc val = channel == 3 ? 255 : 0;
 
 5898               for (i = 0; i < pixelCount; i++, p += 4)
 
 5902            if (ri->bits_per_channel == 16) {    
 
 5903               stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
 
 5904               for (i = 0; i < pixelCount; i++, q += 4)
 
 5905                  *q = (stbi__uint16) stbi__get16be(s);
 
 5907               stbi_uc *p = out+channel;
 
 5908               if (bitdepth == 16) {  
 
 5909                  for (i = 0; i < pixelCount; i++, p += 4)
 
 5910                     *p = (stbi_uc) (stbi__get16be(s) >> 8);
 
 5912                  for (i = 0; i < pixelCount; i++, p += 4)
 
 5921   if (channelCount >= 4) {
 
 5922      if (ri->bits_per_channel == 16) {
 
 5923         for (i=0; i < w*h; ++i) {
 
 5924            stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
 
 5925            if (pixel[3] != 0 && pixel[3] != 65535) {
 
 5926               float a = pixel[3] / 65535.0f;
 
 5927               float ra = 1.0f / a;
 
 5928               float inv_a = 65535.0f * (1 - ra);
 
 5929               pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
 
 5930               pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
 
 5931               pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
 
 5935         for (i=0; i < w*h; ++i) {
 
 5936            unsigned char *pixel = out + 4*i;
 
 5937            if (pixel[3] != 0 && pixel[3] != 255) {
 
 5938               float a = pixel[3] / 255.0f;
 
 5939               float ra = 1.0f / a;
 
 5940               float inv_a = 255.0f * (1 - ra);
 
 5941               pixel[0] = (
unsigned char) (pixel[0]*ra + inv_a);
 
 5942               pixel[1] = (
unsigned char) (pixel[1]*ra + inv_a);
 
 5943               pixel[2] = (
unsigned char) (pixel[2]*ra + inv_a);
 
 5950   if (req_comp && req_comp != 4) {
 
 5951      if (ri->bits_per_channel == 16)
 
 5952         out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
 
 5954         out = stbi__convert_format(out, 4, req_comp, w, h);
 
 5955      if (out == NULL) 
return out; 
 
 5958   if (comp) *comp = 4;
 
 5974static int stbi__pic_is4(stbi__context *s,
const char *str)
 
 5978      if (stbi__get8(s) != (stbi_uc)str[i])
 
 5984static int stbi__pic_test_core(stbi__context *s)
 
 5988   if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34"))
 
 5994   if (!stbi__pic_is4(s,
"PICT"))
 
 6002   stbi_uc size,type,channel;
 
 6005static stbi_uc *stbi__readval(stbi__context *s, 
int channel, stbi_uc *dest)
 
 6009   for (i=0; i<4; ++i, mask>>=1) {
 
 6010      if (channel & mask) {
 
 6011         if (stbi__at_eof(s)) 
return stbi__errpuc(
"bad file",
"PIC file too short");
 
 6012         dest[i]=stbi__get8(s);
 
 6019static void stbi__copyval(
int channel,stbi_uc *dest,
const stbi_uc *src)
 
 6023   for (i=0;i<4; ++i, mask>>=1)
 
 6028static stbi_uc *stbi__pic_load_core(stbi__context *s,
int width,
int height,
int *comp, stbi_uc *result)
 
 6030   int act_comp=0,num_packets=0,y,chained;
 
 6031   stbi__pic_packet packets[10];
 
 6036      stbi__pic_packet *packet;
 
 6038      if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
 
 6039         return stbi__errpuc(
"bad format",
"too many packets");
 
 6041      packet = &packets[num_packets++];
 
 6043      chained = stbi__get8(s);
 
 6044      packet->size    = stbi__get8(s);
 
 6045      packet->type    = stbi__get8(s);
 
 6046      packet->channel = stbi__get8(s);
 
 6048      act_comp |= packet->channel;
 
 6050      if (stbi__at_eof(s))          
return stbi__errpuc(
"bad file",
"file too short (reading packets)");
 
 6051      if (packet->size != 8)  
return stbi__errpuc(
"bad format",
"packet isn't 8bpp");
 
 6054   *comp = (act_comp & 0x10 ? 4 : 3); 
 
 6056   for(y=0; y<height; ++y) {
 
 6059      for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
 
 6060         stbi__pic_packet *packet = &packets[packet_idx];
 
 6061         stbi_uc *dest = result+y*width*4;
 
 6063         switch (packet->type) {
 
 6065               return stbi__errpuc(
"bad format",
"packet has bad compression type");
 
 6070               for(x=0;x<width;++x, dest+=4)
 
 6071                  if (!stbi__readval(s,packet->channel,dest))
 
 6081                     stbi_uc count,value[4];
 
 6083                     count=stbi__get8(s);
 
 6084                     if (stbi__at_eof(s))   
return stbi__errpuc(
"bad file",
"file too short (pure read count)");
 
 6087                        count = (stbi_uc) left;
 
 6089                     if (!stbi__readval(s,packet->channel,value))  
return 0;
 
 6091                     for(i=0; i<count; ++i,dest+=4)
 
 6092                        stbi__copyval(packet->channel,dest,value);
 
 6101                  int count = stbi__get8(s), i;
 
 6102                  if (stbi__at_eof(s))  
return stbi__errpuc(
"bad file",
"file too short (mixed read count)");
 
 6108                        count = stbi__get16be(s);
 
 6112                        return stbi__errpuc(
"bad file",
"scanline overrun");
 
 6114                     if (!stbi__readval(s,packet->channel,value))
 
 6117                     for(i=0;i<count;++i, dest += 4)
 
 6118                        stbi__copyval(packet->channel,dest,value);
 
 6121                     if (count>left) 
return stbi__errpuc(
"bad file",
"scanline overrun");
 
 6123                     for(i=0;i<count;++i, dest+=4)
 
 6124                        if (!stbi__readval(s,packet->channel,dest))
 
 6138static void *stbi__pic_load(stbi__context *s,
int *px,
int *py,
int *comp,
int req_comp, stbi__result_info *ri)
 
 6141   int i, x,y, internal_comp;
 
 6144   if (!comp) comp = &internal_comp;
 
 6146   for (i=0; i<92; ++i)
 
 6149   x = stbi__get16be(s);
 
 6150   y = stbi__get16be(s);
 
 6151   if (stbi__at_eof(s))  
return stbi__errpuc(
"bad file",
"file too short (pic header)");
 
 6152   if (!stbi__mad3sizes_valid(x, y, 4, 0)) 
return stbi__errpuc(
"too large", 
"PIC image too large to decode");
 
 6159   result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
 
 6160   memset(result, 0xff, x*y*4);
 
 6162   if (!stbi__pic_load_core(s,x,y,comp, result)) {
 
 6168   if (req_comp == 0) req_comp = *comp;
 
 6169   result=stbi__convert_format(result,4,req_comp,x,y);
 
 6174static int stbi__pic_test(stbi__context *s)
 
 6176   int r = stbi__pic_test_core(s);
 
 6197   stbi_uc *background;          
 
 6199   int flags, bgindex, ratio, transparent, eflags;
 
 6200   stbi_uc  pal[256][4];
 
 6201   stbi_uc lpal[256][4];
 
 6202   stbi__gif_lzw codes[8192];
 
 6203   stbi_uc *color_table;
 
 6206   int start_x, start_y;
 
 6213static int stbi__gif_test_raw(stbi__context *s)
 
 6216   if (stbi__get8(s) != 
'G' || stbi__get8(s) != 
'I' || stbi__get8(s) != 
'F' || stbi__get8(s) != 
'8') 
return 0;
 
 6218   if (sz != 
'9' && sz != 
'7') 
return 0;
 
 6219   if (stbi__get8(s) != 
'a') 
return 0;
 
 6223static int stbi__gif_test(stbi__context *s)
 
 6225   int r = stbi__gif_test_raw(s);
 
 6230static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], 
int num_entries, 
int transp)
 
 6233   for (i=0; i < num_entries; ++i) {
 
 6234      pal[i][2] = stbi__get8(s);
 
 6235      pal[i][1] = stbi__get8(s);
 
 6236      pal[i][0] = stbi__get8(s);
 
 6237      pal[i][3] = transp == i ? 0 : 255;
 
 6241static int stbi__gif_header(stbi__context *s, stbi__gif *g, 
int *comp, 
int is_info)
 
 6244   if (stbi__get8(s) != 
'G' || stbi__get8(s) != 
'I' || stbi__get8(s) != 
'F' || stbi__get8(s) != 
'8')
 
 6245      return stbi__err(
"not GIF", 
"Corrupt GIF");
 
 6247   version = stbi__get8(s);
 
 6248   if (version != 
'7' && version != 
'9')    
return stbi__err(
"not GIF", 
"Corrupt GIF");
 
 6249   if (stbi__get8(s) != 
'a')                
return stbi__err(
"not GIF", 
"Corrupt GIF");
 
 6251   stbi__g_failure_reason = 
"";
 
 6252   g->w = stbi__get16le(s);
 
 6253   g->h = stbi__get16le(s);
 
 6254   g->flags = stbi__get8(s);
 
 6255   g->bgindex = stbi__get8(s);
 
 6256   g->ratio = stbi__get8(s);
 
 6257   g->transparent = -1;
 
 6259   if (comp != 0) *comp = 4;  
 
 6261   if (is_info) 
return 1;
 
 6263   if (g->flags & 0x80)
 
 6264      stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
 
 6269static int stbi__gif_info_raw(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 6271   stbi__gif* g = (stbi__gif*) stbi__malloc(
sizeof(stbi__gif));
 
 6272   if (!stbi__gif_header(s, g, comp, 1)) {
 
 6283static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
 
 6290   if (g->codes[code].prefix >= 0)
 
 6291      stbi__out_gif_code(g, g->codes[code].prefix);
 
 6293   if (g->cur_y >= g->max_y) 
return;
 
 6295   idx = g->cur_x + g->cur_y; 
 
 6297   g->history[idx / 4] = 1;  
 
 6299   c = &g->color_table[g->codes[code].suffix * 4];
 
 6308   if (g->cur_x >= g->max_x) {
 
 6309      g->cur_x = g->start_x;
 
 6310      g->cur_y += g->step;
 
 6312      while (g->cur_y >= g->max_y && g->parse > 0) {
 
 6313         g->step = (1 << g->parse) * g->line_size;
 
 6314         g->cur_y = g->start_y + (g->step >> 1);
 
 6320static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
 
 6323   stbi__int32 len, init_code;
 
 6325   stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
 
 6328   lzw_cs = stbi__get8(s);
 
 6329   if (lzw_cs > 12) 
return NULL;
 
 6330   clear = 1 << lzw_cs;
 
 6332   codesize = lzw_cs + 1;
 
 6333   codemask = (1 << codesize) - 1;
 
 6336   for (init_code = 0; init_code < clear; init_code++) {
 
 6337      g->codes[init_code].prefix = -1;
 
 6338      g->codes[init_code].first = (stbi_uc) init_code;
 
 6339      g->codes[init_code].suffix = (stbi_uc) init_code;
 
 6348      if (valid_bits < codesize) {
 
 6350            len = stbi__get8(s); 
 
 6355         bits |= (stbi__int32) stbi__get8(s) << valid_bits;
 
 6358         stbi__int32 code = bits & codemask;
 
 6360         valid_bits -= codesize;
 
 6362         if (code == clear) {  
 
 6363            codesize = lzw_cs + 1;
 
 6364            codemask = (1 << codesize) - 1;
 
 6368         } 
else if (code == clear + 1) { 
 
 6370            while ((len = stbi__get8(s)) > 0)
 
 6373         } 
else if (code <= avail) {
 
 6375               return stbi__errpuc(
"no clear code", 
"Corrupt GIF");
 
 6379               p = &g->codes[avail++];
 
 6381                  return stbi__errpuc(
"too many codes", 
"Corrupt GIF");
 
 6384               p->prefix = (stbi__int16) oldcode;
 
 6385               p->first = g->codes[oldcode].first;
 
 6386               p->suffix = (code == avail) ? p->first : g->codes[code].first;
 
 6387            } 
else if (code == avail)
 
 6388               return stbi__errpuc(
"illegal code in raster", 
"Corrupt GIF");
 
 6390            stbi__out_gif_code(g, (stbi__uint16) code);
 
 6392            if ((avail & codemask) == 0 && avail <= 0x0FFF) {
 
 6394               codemask = (1 << codesize) - 1;
 
 6399            return stbi__errpuc(
"illegal code in raster", 
"Corrupt GIF");
 
 6407static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, 
int *comp, 
int req_comp, stbi_uc *two_back)
 
 6413   STBI_NOTUSED(req_comp);
 
 6418      if (!stbi__gif_header(s, g, comp,0)) 
return 0; 
 
 6419      if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
 
 6420         return stbi__errpuc(
"too large", 
"GIF image is too large");
 
 6421      pcount = g->w * g->h;
 
 6422      g->out = (stbi_uc *) stbi__malloc(4 * pcount);
 
 6423      g->background = (stbi_uc *) stbi__malloc(4 * pcount);
 
 6424      g->history = (stbi_uc *) stbi__malloc(pcount);
 
 6425      if (!g->out || !g->background || !g->history)
 
 6426         return stbi__errpuc(
"outofmem", 
"Out of memory");
 
 6431      memset(g->out, 0x00, 4 * pcount);
 
 6432      memset(g->background, 0x00, 4 * pcount); 
 
 6433      memset(g->history, 0x00, pcount);        
 
 6437      dispose = (g->eflags & 0x1C) >> 2; 
 
 6438      pcount = g->w * g->h; 
 
 6440      if ((dispose == 3) && (two_back == 0)) {
 
 6445         for (pi = 0; pi < pcount; ++pi) {
 
 6446            if (g->history[pi]) {
 
 6447               memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); 
 
 6450      } 
else if (dispose == 2) { 
 
 6452         for (pi = 0; pi < pcount; ++pi) {
 
 6453            if (g->history[pi]) {
 
 6454               memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); 
 
 6465      memcpy( g->background, g->out, 4 * g->w * g->h ); 
 
 6469   memset( g->history, 0x00, g->w * g->h );        
 
 6472      int tag = stbi__get8(s); 
 
 6476            stbi__int32 x, y, w, h;
 
 6479            x = stbi__get16le(s);
 
 6480            y = stbi__get16le(s);
 
 6481            w = stbi__get16le(s);
 
 6482            h = stbi__get16le(s);
 
 6483            if (((x + w) > (g->w)) || ((y + h) > (g->h)))
 
 6484               return stbi__errpuc(
"bad Image Descriptor", 
"Corrupt GIF");
 
 6486            g->line_size = g->w * 4;
 
 6488            g->start_y = y * g->line_size;
 
 6489            g->max_x   = g->start_x + w * 4;
 
 6490            g->max_y   = g->start_y + h * g->line_size;
 
 6491            g->cur_x   = g->start_x;
 
 6492            g->cur_y   = g->start_y;
 
 6499               g->cur_y = g->max_y;
 
 6501            g->lflags = stbi__get8(s);
 
 6503            if (g->lflags & 0x40) {
 
 6504               g->step = 8 * g->line_size; 
 
 6507               g->step = g->line_size;
 
 6511            if (g->lflags & 0x80) {
 
 6512               stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
 
 6513               g->color_table = (stbi_uc *) g->lpal;
 
 6514            } 
else if (g->flags & 0x80) {
 
 6515               g->color_table = (stbi_uc *) g->pal;
 
 6517               return stbi__errpuc(
"missing color table", 
"Corrupt GIF");            
 
 6519            o = stbi__process_gif_raster(s, g);
 
 6520            if (!o) 
return NULL;
 
 6523            pcount = g->w * g->h; 
 
 6524            if (first_frame && (g->bgindex > 0)) {
 
 6526               for (pi = 0; pi < pcount; ++pi) {
 
 6527                  if (g->history[pi] == 0) {
 
 6528                     g->pal[g->bgindex][3] = 255; 
 
 6529                     memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); 
 
 6540            int ext = stbi__get8(s); 
 
 6542               len = stbi__get8(s);
 
 6544                  g->eflags = stbi__get8(s);
 
 6545                  g->delay = 10 * stbi__get16le(s); 
 
 6548                  if (g->transparent >= 0) {
 
 6549                     g->pal[g->transparent][3] = 255; 
 
 6551                  if (g->eflags & 0x01) {
 
 6552                     g->transparent = stbi__get8(s);
 
 6553                     if (g->transparent >= 0) {
 
 6554                        g->pal[g->transparent][3] = 0; 
 
 6559                     g->transparent = -1; 
 
 6566            while ((len = stbi__get8(s)) != 0) {
 
 6573            return (stbi_uc *) s; 
 
 6576            return stbi__errpuc(
"unknown code", 
"Corrupt GIF");
 
 6581static void *stbi__load_gif_main(stbi__context *s, 
int **delays, 
int *x, 
int *y, 
int *z, 
int *comp, 
int req_comp)
 
 6583   if (stbi__gif_test(s)) {
 
 6587      stbi_uc *two_back = 0; 
 
 6590      memset(&g, 0, 
sizeof(g));
 
 6596         u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
 
 6597         if (u == (stbi_uc *) s) u = 0;  
 
 6603            stride = g.w * g.h * 4; 
 
 6606               out = (stbi_uc*) STBI_REALLOC( out, layers * stride ); 
 
 6608                  *delays = (
int*) STBI_REALLOC( *delays, 
sizeof(
int) * layers ); 
 
 6611               out = (stbi_uc*)stbi__malloc( layers * stride ); 
 
 6613                  *delays = (
int*) stbi__malloc( layers * 
sizeof(
int) ); 
 
 6616            memcpy( out + ((layers - 1) * stride), u, stride ); 
 
 6618               two_back = out - 2 * stride; 
 
 6622               (*delays)[layers - 1U] = g.delay; 
 
 6629      STBI_FREE(g.history); 
 
 6630      STBI_FREE(g.background); 
 
 6633      if (req_comp && req_comp != 4)
 
 6634         out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
 
 6639      return stbi__errpuc(
"not GIF", 
"Image was not as a gif type."); 
 
 6643static void *stbi__gif_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
 
 6647   memset(&g, 0, 
sizeof(g));
 
 6650   u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
 
 6651   if (u == (stbi_uc *) s) u = 0;  
 
 6658      if (req_comp && req_comp != 4)
 
 6659         u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
 
 6666   STBI_FREE(g.history);
 
 6667   STBI_FREE(g.background); 
 
 6672static int stbi__gif_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 6674   return stbi__gif_info_raw(s,x,y,comp);
 
 6682static int stbi__hdr_test_core(stbi__context *s, 
const char *signature)
 
 6685   for (i=0; signature[i]; ++i)
 
 6686      if (stbi__get8(s) != signature[i])
 
 6692static int stbi__hdr_test(stbi__context* s)
 
 6694   int r = stbi__hdr_test_core(s, 
"#?RADIANCE\n");
 
 6697       r = stbi__hdr_test_core(s, 
"#?RGBE\n");
 
 6703#define STBI__HDR_BUFLEN  1024 
 6704static char *stbi__hdr_gettoken(stbi__context *z, 
char *buffer)
 
 6709   c = (char) stbi__get8(z);
 
 6711   while (!stbi__at_eof(z) && c != 
'\n') {
 
 6713      if (len == STBI__HDR_BUFLEN-1) {
 
 6715         while (!stbi__at_eof(z) && stbi__get8(z) != 
'\n')
 
 6719      c = (char) stbi__get8(z);
 
 6726static void stbi__hdr_convert(
float *output, stbi_uc *input, 
int req_comp)
 
 6728   if ( input[3] != 0 ) {
 
 6731      f1 = (float) ldexp(1.0f, input[3] - (
int)(128 + 8));
 
 6733         output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
 
 6735         output[0] = input[0] * f1;
 
 6736         output[1] = input[1] * f1;
 
 6737         output[2] = input[2] * f1;
 
 6739      if (req_comp == 2) output[1] = 1;
 
 6740      if (req_comp == 4) output[3] = 1;
 
 6743         case 4: output[3] = 1; 
 
 6744         case 3: output[0] = output[1] = output[2] = 0;
 
 6746         case 2: output[1] = 1; 
 
 6747         case 1: output[0] = 0;
 
 6753static float *stbi__hdr_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
 
 6755   char buffer[STBI__HDR_BUFLEN];
 
 6762   unsigned char count, value;
 
 6763   int i, j, k, c1,c2, z;
 
 6764   const char *headerToken;
 
 6768   headerToken = stbi__hdr_gettoken(s,buffer);
 
 6769   if (strcmp(headerToken, 
"#?RADIANCE") != 0 && strcmp(headerToken, 
"#?RGBE") != 0)
 
 6770      return stbi__errpf(
"not HDR", 
"Corrupt HDR image");
 
 6774      token = stbi__hdr_gettoken(s,buffer);
 
 6775      if (token[0] == 0) 
break;
 
 6776      if (strcmp(token, 
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
 
 6779   if (!valid)    
return stbi__errpf(
"unsupported format", 
"Unsupported HDR format");
 
 6783   token = stbi__hdr_gettoken(s,buffer);
 
 6784   if (strncmp(token, 
"-Y ", 3))  
return stbi__errpf(
"unsupported data layout", 
"Unsupported HDR format");
 
 6786   height = (int) strtol(token, &token, 10);
 
 6787   while (*token == 
' ') ++token;
 
 6788   if (strncmp(token, 
"+X ", 3))  
return stbi__errpf(
"unsupported data layout", 
"Unsupported HDR format");
 
 6790   width = (int) strtol(token, NULL, 10);
 
 6795   if (comp) *comp = 3;
 
 6796   if (req_comp == 0) req_comp = 3;
 
 6798   if (!stbi__mad4sizes_valid(width, height, req_comp, 
sizeof(
float), 0))
 
 6799      return stbi__errpf(
"too large", 
"HDR image is too large");
 
 6802   hdr_data = (
float *) stbi__malloc_mad4(width, height, req_comp, 
sizeof(
float), 0);
 
 6804      return stbi__errpf(
"outofmem", 
"Out of memory");
 
 6808   if ( width < 8 || width >= 32768) {
 
 6810      for (j=0; j < height; ++j) {
 
 6811         for (i=0; i < width; ++i) {
 
 6814            stbi__getn(s, rgbe, 4);
 
 6815            stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
 
 6822      for (j = 0; j < height; ++j) {
 
 6825         len = stbi__get8(s);
 
 6826         if (c1 != 2 || c2 != 2 || (len & 0x80)) {
 
 6830            rgbe[0] = (stbi_uc) c1;
 
 6831            rgbe[1] = (stbi_uc) c2;
 
 6832            rgbe[2] = (stbi_uc) len;
 
 6833            rgbe[3] = (stbi_uc) stbi__get8(s);
 
 6834            stbi__hdr_convert(hdr_data, rgbe, req_comp);
 
 6837            STBI_FREE(scanline);
 
 6838            goto main_decode_loop; 
 
 6841         len |= stbi__get8(s);
 
 6842         if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); 
return stbi__errpf(
"invalid decoded scanline length", 
"corrupt HDR"); }
 
 6843         if (scanline == NULL) {
 
 6844            scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
 
 6846               STBI_FREE(hdr_data);
 
 6847               return stbi__errpf(
"outofmem", 
"Out of memory");
 
 6851         for (k = 0; k < 4; ++k) {
 
 6854            while ((nleft = width - i) > 0) {
 
 6855               count = stbi__get8(s);
 
 6858                  value = stbi__get8(s);
 
 6860                  if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); 
return stbi__errpf(
"corrupt", 
"bad RLE data in HDR"); }
 
 6861                  for (z = 0; z < count; ++z)
 
 6862                     scanline[i++ * 4 + k] = value;
 
 6865                  if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); 
return stbi__errpf(
"corrupt", 
"bad RLE data in HDR"); }
 
 6866                  for (z = 0; z < count; ++z)
 
 6867                     scanline[i++ * 4 + k] = stbi__get8(s);
 
 6871         for (i=0; i < width; ++i)
 
 6872            stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
 
 6875         STBI_FREE(scanline);
 
 6881static int stbi__hdr_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 6883   char buffer[STBI__HDR_BUFLEN];
 
 6890   if (!comp) comp = &dummy;
 
 6892   if (stbi__hdr_test(s) == 0) {
 
 6898      token = stbi__hdr_gettoken(s,buffer);
 
 6899      if (token[0] == 0) 
break;
 
 6900      if (strcmp(token, 
"FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
 
 6907   token = stbi__hdr_gettoken(s,buffer);
 
 6908   if (strncmp(token, 
"-Y ", 3)) {
 
 6913   *y = (int) strtol(token, &token, 10);
 
 6914   while (*token == 
' ') ++token;
 
 6915   if (strncmp(token, 
"+X ", 3)) {
 
 6920   *x = (int) strtol(token, NULL, 10);
 
 6927static int stbi__bmp_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 6930   stbi__bmp_data info;
 
 6933   p = stbi__bmp_parse_header(s, &info);
 
 6937   if (x) *x = s->img_x;
 
 6938   if (y) *y = s->img_y;
 
 6939   if (comp) *comp = info.ma ? 4 : 3;
 
 6945static int stbi__psd_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 6947   int channelCount, dummy, depth;
 
 6950   if (!comp) comp = &dummy;
 
 6951   if (stbi__get32be(s) != 0x38425053) {
 
 6955   if (stbi__get16be(s) != 1) {
 
 6960   channelCount = stbi__get16be(s);
 
 6961   if (channelCount < 0 || channelCount > 16) {
 
 6965   *y = stbi__get32be(s);
 
 6966   *x = stbi__get32be(s);
 
 6967   depth = stbi__get16be(s);
 
 6968   if (depth != 8 && depth != 16) {
 
 6972   if (stbi__get16be(s) != 3) {
 
 6980static int stbi__psd_is16(stbi__context *s)
 
 6982   int channelCount, depth;
 
 6983   if (stbi__get32be(s) != 0x38425053) {
 
 6987   if (stbi__get16be(s) != 1) {
 
 6992   channelCount = stbi__get16be(s);
 
 6993   if (channelCount < 0 || channelCount > 16) {
 
 6997   (void) stbi__get32be(s);
 
 6998   (void) stbi__get32be(s);
 
 6999   depth = stbi__get16be(s);
 
 7009static int stbi__pic_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 7011   int act_comp=0,num_packets=0,chained,dummy;
 
 7012   stbi__pic_packet packets[10];
 
 7016   if (!comp) comp = &dummy;
 
 7018   if (!stbi__pic_is4(s,
"\x53\x80\xF6\x34")) {
 
 7025   *x = stbi__get16be(s);
 
 7026   *y = stbi__get16be(s);
 
 7027   if (stbi__at_eof(s)) {
 
 7031   if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
 
 7039      stbi__pic_packet *packet;
 
 7041      if (num_packets==
sizeof(packets)/
sizeof(packets[0]))
 
 7044      packet = &packets[num_packets++];
 
 7045      chained = stbi__get8(s);
 
 7046      packet->size    = stbi__get8(s);
 
 7047      packet->type    = stbi__get8(s);
 
 7048      packet->channel = stbi__get8(s);
 
 7049      act_comp |= packet->channel;
 
 7051      if (stbi__at_eof(s)) {
 
 7055      if (packet->size != 8) {
 
 7061   *comp = (act_comp & 0x10 ? 4 : 3);
 
 7081static int      stbi__pnm_test(stbi__context *s)
 
 7084   p = (char) stbi__get8(s);
 
 7085   t = (char) stbi__get8(s);
 
 7086   if (p != 
'P' || (t != 
'5' && t != 
'6')) {
 
 7093static void *stbi__pnm_load(stbi__context *s, 
int *x, 
int *y, 
int *comp, 
int req_comp, stbi__result_info *ri)
 
 7098   if (!stbi__pnm_info(s, (
int *)&s->img_x, (
int *)&s->img_y, (
int *)&s->img_n))
 
 7103   if (comp) *comp = s->img_n;
 
 7105   if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))
 
 7106      return stbi__errpuc(
"too large", 
"PNM too large");
 
 7108   out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);
 
 7109   if (!out) 
return stbi__errpuc(
"outofmem", 
"Out of memory");
 
 7110   stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
 
 7112   if (req_comp && req_comp != s->img_n) {
 
 7113      out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
 
 7114      if (out == NULL) 
return out; 
 
 7119static int      stbi__pnm_isspace(
char c)
 
 7121   return c == 
' ' || c == 
'\t' || c == 
'\n' || c == 
'\v' || c == 
'\f' || c == 
'\r';
 
 7124static void     stbi__pnm_skip_whitespace(stbi__context *s, 
char *c)
 
 7127      while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
 
 7128         *c = (char) stbi__get8(s);
 
 7130      if (stbi__at_eof(s) || *c != 
'#')
 
 7133      while (!stbi__at_eof(s) && *c != 
'\n' && *c != 
'\r' )
 
 7134         *c = (char) stbi__get8(s);
 
 7138static int      stbi__pnm_isdigit(
char c)
 
 7140   return c >= 
'0' && c <= 
'9';
 
 7143static int      stbi__pnm_getinteger(stbi__context *s, 
char *c)
 
 7147   while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
 
 7148      value = value*10 + (*c - 
'0');
 
 7149      *c = (char) stbi__get8(s);
 
 7155static int      stbi__pnm_info(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 7162   if (!comp) comp = &dummy;
 
 7167   p = (char) stbi__get8(s);
 
 7168   t = (char) stbi__get8(s);
 
 7169   if (p != 
'P' || (t != 
'5' && t != 
'6')) {
 
 7174   *comp = (t == 
'6') ? 3 : 1;  
 
 7176   c = (char) stbi__get8(s);
 
 7177   stbi__pnm_skip_whitespace(s, &c);
 
 7179   *x = stbi__pnm_getinteger(s, &c); 
 
 7180   stbi__pnm_skip_whitespace(s, &c);
 
 7182   *y = stbi__pnm_getinteger(s, &c); 
 
 7183   stbi__pnm_skip_whitespace(s, &c);
 
 7185   maxv = stbi__pnm_getinteger(s, &c);  
 
 7188      return stbi__err(
"max value > 255", 
"PPM image not 8-bit");
 
 7194static int stbi__info_main(stbi__context *s, 
int *x, 
int *y, 
int *comp)
 
 7196   #ifndef STBI_NO_JPEG 
 7197   if (stbi__jpeg_info(s, x, y, comp)) 
return 1;
 
 7201   if (stbi__png_info(s, x, y, comp))  
return 1;
 
 7205   if (stbi__gif_info(s, x, y, comp))  
return 1;
 
 7209   if (stbi__bmp_info(s, x, y, comp))  
return 1;
 
 7213   if (stbi__psd_info(s, x, y, comp))  
return 1;
 
 7217   if (stbi__pic_info(s, x, y, comp))  
return 1;
 
 7221   if (stbi__pnm_info(s, x, y, comp))  
return 1;
 
 7225   if (stbi__hdr_info(s, x, y, comp))  
return 1;
 
 7230   if (stbi__tga_info(s, x, y, comp))
 
 7233   return stbi__err(
"unknown image type", 
"Image not of any known type, or corrupt");
 
 7236static int stbi__is_16_main(stbi__context *s)
 
 7239   if (stbi__png_is16(s))  
return 1;
 
 7243   if (stbi__psd_is16(s))  
return 1;
 
 7249#ifndef STBI_NO_STDIO 
 7250STBIDEF 
int stbi_info(
char const *filename, 
int *x, 
int *y, 
int *comp)
 
 7252    FILE *f = stbi__fopen(filename, 
"rb");
 
 7254    if (!f) 
return stbi__err(
"can't fopen", 
"Unable to open file");
 
 7255    result = stbi_info_from_file(f, x, y, comp);
 
 7260STBIDEF 
int stbi_info_from_file(FILE *f, 
int *x, 
int *y, 
int *comp)
 
 7264   long pos = ftell(f);
 
 7265   stbi__start_file(&s, f);
 
 7266   r = stbi__info_main(&s,x,y,comp);
 
 7267   fseek(f,pos,SEEK_SET);
 
 7271STBIDEF 
int stbi_is_16_bit(
char const *filename)
 
 7273    FILE *f = stbi__fopen(filename, 
"rb");
 
 7275    if (!f) 
return stbi__err(
"can't fopen", 
"Unable to open file");
 
 7276    result = stbi_is_16_bit_from_file(f);
 
 7281STBIDEF 
int stbi_is_16_bit_from_file(FILE *f)
 
 7285   long pos = ftell(f);
 
 7286   stbi__start_file(&s, f);
 
 7287   r = stbi__is_16_main(&s);
 
 7288   fseek(f,pos,SEEK_SET);
 
 7293STBIDEF 
int stbi_info_from_memory(stbi_uc 
const *buffer, 
int len, 
int *x, 
int *y, 
int *comp)
 
 7296   stbi__start_mem(&s,buffer,len);
 
 7297   return stbi__info_main(&s,x,y,comp);
 
 7300STBIDEF 
int stbi_info_from_callbacks(
stbi_io_callbacks const *c, 
void *user, 
int *x, 
int *y, 
int *comp)
 
 7304   return stbi__info_main(&s,x,y,comp);
 
 7307STBIDEF 
int stbi_is_16_bit_from_memory(stbi_uc 
const *buffer, 
int len)
 
 7310   stbi__start_mem(&s,buffer,len);
 
 7311   return stbi__is_16_main(&s);
 
 7314STBIDEF 
int stbi_is_16_bit_from_callbacks(
stbi_io_callbacks const *c, 
void *user)
 
 7318   return stbi__is_16_main(&s);