Home | History | Annotate | Line # | Download | only in stbi
stb_image.c revision 1.11
      1 /* stbi-1.29 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c
      2    when you control the images you're loading
      3                                      no warranty implied; use at your own risk
      4 
      5    QUICK NOTES:
      6       Primarily of interest to game developers and other people who can
      7           avoid problematic images and only need the trivial interface
      8 
      9       JPEG baseline (no JPEG progressive)
     10       PNG 8-bit only
     11 
     12       TGA (not sure what subset, if a subset)
     13       BMP non-1bpp, non-RLE
     14       PSD (composited view only, no extra channels)
     15 
     16       GIF (*comp always reports as 4-channel)
     17       HDR (radiance rgbE format)
     18       PIC (Softimage PIC)
     19 
     20       - decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code)
     21       - supports installable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD)
     22 
     23    Latest revisions:
     24       1.29 (2010-08-16) various warning fixes from Aurelien Pocheville
     25       1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ)
     26       1.27 (2010-08-01) cast-to-uint8 to fix warnings (Laurent Gomila)
     27                         allow trailing 0s at end of image data (Laurent Gomila)
     28       1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ
     29       1.25 (2010-07-17) refix trans_data warning (Won Chun)
     30       1.24 (2010-07-12) perf improvements reading from files
     31                         minor perf improvements for jpeg
     32                         deprecated type-specific functions in hope of feedback
     33                         attempt to fix trans_data warning (Won Chun)
     34       1.23              fixed bug in iPhone support
     35       1.22 (2010-07-10) removed image *writing* support to stb_image_write.h
     36                         stbi_info support from Jetro Lauha
     37                         GIF support from Jean-Marc Lienher
     38                         iPhone PNG-extensions from James Brown
     39                         warning-fixes from Nicolas Schulz and Janez Zemva
     40       1.21              fix use of 'uint8' in header (reported by jon blow)
     41       1.20              added support for Softimage PIC, by Tom Seddon
     42 
     43    See end of file for full revision history.
     44 
     45    TODO:
     46       stbi_info support for BMP,PSD,HDR,PIC
     47       rewrite stbi_info and load_file variations to share file handling code
     48            (current system allows individual functions to be called directly,
     49            since each does all the work, but I doubt anyone uses this in practice)
     50 
     51 
     52  ============================    Contributors    =========================
     53 
     54  Image formats                                Optimizations & bugfixes
     55     Sean Barrett (jpeg, png, bmp)                Fabian "ryg" Giesen
     56     Nicolas Schulz (hdr, psd)
     57     Jonathan Dummer (tga)                     Bug fixes & warning fixes
     58     Jean-Marc Lienher (gif)                      Marc LeBlanc
     59     Tom Seddon (pic)                             Christpher Lloyd
     60     Thatcher Ulrich (psd)                        Dave Moore
     61                                                  Won Chun
     62                                                  the Horde3D community
     63  Extensions, features                            Janez Zemva
     64     Jetro Lauha (stbi_info)                      Jonathan Blow
     65     James "moose2000" Brown (iPhone PNG)         Laurent Gomila
     66                                                  Aruelien Pocheville
     67 
     68  If your name should be here but isn't, let Sean know.
     69 
     70 */
     71 
     72 #ifdef _KERNEL
     73 #include <dev/stbi/stbiconfig.h>
     74 #endif
     75 
     76 #ifndef STBI_INCLUDE_STB_IMAGE_H
     77 #define STBI_INCLUDE_STB_IMAGE_H
     78 
     79 // To get a header file for this, either cut and paste the header,
     80 // or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and
     81 // then include stb_image.c from it.
     82 
     83 ////   begin header file  ////////////////////////////////////////////////////
     84 //
     85 // Limitations:
     86 //    - no jpeg progressive support
     87 //    - non-HDR formats support 8-bit samples only (jpeg, png)
     88 //    - no delayed line count (jpeg) -- IJG doesn't support either
     89 //    - no 1-bit BMP
     90 //    - GIF always returns *comp=4
     91 //
     92 // Basic usage (see HDR discussion below):
     93 //    int x,y,n;
     94 //    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
     95 //    // ... process data if not NULL ...
     96 //    // ... x = width, y = height, n = # 8-bit components per pixel ...
     97 //    // ... replace '0' with '1'..'4' to force that many components per pixel
     98 //    stbi_image_free(data)
     99 //
    100 // Standard parameters:
    101 //    int *x       -- outputs image width in pixels
    102 //    int *y       -- outputs image height in pixels
    103 //    int *comp    -- outputs # of image components in image file
    104 //    int req_comp -- if non-zero, # of image components requested in result
    105 //
    106 // The return value from an image loader is an 'unsigned char *' which points
    107 // to the pixel data. The pixel data consists of *y scanlines of *x pixels,
    108 // with each pixel consisting of N interleaved 8-bit components; the first
    109 // pixel pointed to is top-left-most in the image. There is no padding between
    110 // image scanlines or between pixels, regardless of format. The number of
    111 // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.
    112 // If req_comp is non-zero, *comp has the number of components that _would_
    113 // have been output otherwise. E.g. if you set req_comp to 4, you will always
    114 // get RGBA output, but you can check *comp to easily see if it's opaque.
    115 //
    116 // An output image with N components has the following components interleaved
    117 // in this order in each pixel:
    118 //
    119 //     N=#comp     components
    120 //       1           grey
    121 //       2           grey, alpha
    122 //       3           red, green, blue
    123 //       4           red, green, blue, alpha
    124 //
    125 // If image loading fails for any reason, the return value will be NULL,
    126 // and *x, *y, *comp will be unchanged. The function stbi_failure_reason()
    127 // can be queried for an extremely brief, end-user unfriendly explanation
    128 // of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid
    129 // compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
    130 // more user-friendly ones.
    131 //
    132 // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
    133 //
    134 // ===========================================================================
    135 //
    136 // iPhone PNG support:
    137 //
    138 // By default we convert iphone-formatted PNGs back to RGB; nominally they
    139 // would silently load as BGR, except the existing code should have just
    140 // failed on such iPhone PNGs. But you can disable this conversion by
    141 // by calling stbi_convert_iphone_png_to_rgb(0), in which case
    142 // you will always just get the native iphone "format" through.
    143 //
    144 // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
    145 // pixel to remove any premultiplied alpha *only* if the image file explicitly
    146 // says there's premultiplied data (currently only happens in iPhone images,
    147 // and only if iPhone convert-to-rgb processing is on).
    148 //
    149 // ===========================================================================
    150 //
    151 // HDR image support   (disable by defining STBI_NO_HDR)
    152 //
    153 // stb_image now supports loading HDR images in general, and currently
    154 // the Radiance .HDR file format, although the support is provided
    155 // generically. You can still load any file through the existing interface;
    156 // if you attempt to load an HDR file, it will be automatically remapped to
    157 // LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
    158 // both of these constants can be reconfigured through this interface:
    159 //
    160 //     stbi_hdr_to_ldr_gamma(2.2f);
    161 //     stbi_hdr_to_ldr_scale(1.0f);
    162 //
    163 // (note, do not use _inverse_ constants; stbi_image will invert them
    164 // appropriately).
    165 //
    166 // Additionally, there is a new, parallel interface for loading files as
    167 // (linear) floats to preserve the full dynamic range:
    168 //
    169 //    float *data = stbi_loadf(filename, &x, &y, &n, 0);
    170 //
    171 // If you load LDR images through this interface, those images will
    172 // be promoted to floating point values, run through the inverse of
    173 // constants corresponding to the above:
    174 //
    175 //     stbi_ldr_to_hdr_scale(1.0f);
    176 //     stbi_ldr_to_hdr_gamma(2.2f);
    177 //
    178 // Finally, given a filename (or an open file or memory block--see header
    179 // file for details) containing image data, you can query for the "most
    180 // appropriate" interface to use (that is, whether the image is HDR or
    181 // not), using:
    182 //
    183 //     stbi_is_hdr(char *filename);
    184 
    185 #ifndef STBI_NO_STDIO
    186 #include <stdio.h>
    187 #endif
    188 
    189 #define STBI_VERSION 1
    190 
    191 enum
    192 {
    193    STBI_default = 0, // only used for req_comp
    194 
    195    STBI_grey       = 1,
    196    STBI_grey_alpha = 2,
    197    STBI_rgb        = 3,
    198    STBI_rgb_alpha  = 4
    199 };
    200 
    201 typedef unsigned char stbi_uc;
    202 
    203 #ifdef __cplusplus
    204 extern "C" {
    205 #endif
    206 
    207 // PRIMARY API - works on images of any type
    208 
    209 // load image by filename, open file, or memory buffer
    210 extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    211 
    212 #ifndef STBI_NO_STDIO
    213 extern stbi_uc *stbi_load            (char const *filename,     int *x, int *y, int *comp, int req_comp);
    214 extern stbi_uc *stbi_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    215 // for stbi_load_from_file, file pointer is left pointing immediately after image
    216 #endif
    217 
    218 #ifndef STBI_NO_HDR
    219    extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    220 
    221    #ifndef STBI_NO_STDIO
    222    extern float *stbi_loadf            (char const *filename,   int *x, int *y, int *comp, int req_comp);
    223    extern float *stbi_loadf_from_file  (FILE *f,                int *x, int *y, int *comp, int req_comp);
    224    #endif
    225 
    226    extern void   stbi_hdr_to_ldr_gamma(float gamma);
    227    extern void   stbi_hdr_to_ldr_scale(float scale);
    228 
    229    extern void   stbi_ldr_to_hdr_gamma(float gamma);
    230    extern void   stbi_ldr_to_hdr_scale(float scale);
    231 #endif // STBI_NO_HDR
    232 
    233 // get a VERY brief reason for failure
    234 // NOT THREADSAFE
    235 extern const char *stbi_failure_reason  (void);
    236 
    237 // free the loaded image -- this is just free()
    238 extern void     stbi_image_free      (void *retval_from_stbi_load);
    239 
    240 // get image dimensions & components without fully decoding
    241 extern int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
    242 extern int      stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
    243 
    244 #ifndef STBI_NO_STDIO
    245 extern int      stbi_info            (char const *filename,     int *x, int *y, int *comp);
    246 extern int      stbi_info_from_file  (FILE *f,                  int *x, int *y, int *comp);
    247 
    248 extern int      stbi_is_hdr          (char const *filename);
    249 extern int      stbi_is_hdr_from_file(FILE *f);
    250 #endif
    251 
    252 // for image formats that explicitly notate that they have premultiplied alpha,
    253 // we just return the colors as stored in the file. set this flag to force
    254 // unpremultiplication. results are undefined if the unpremultiply overflow.
    255 extern void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
    256 
    257 // indicate whether we should process iphone images back to canonical format,
    258 // or just pass them through "as-is"
    259 extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
    260 
    261 
    262 // ZLIB client - used by PNG, available for other purposes
    263 
    264 extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
    265 extern char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
    266 extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
    267 extern int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
    268 
    269 extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
    270 extern int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
    271 
    272 // define new loaders
    273 typedef struct
    274 {
    275    int       (*test_memory)(stbi_uc const *buffer, int len);
    276    stbi_uc * (*load_from_memory)(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    277    #ifndef STBI_NO_STDIO
    278    int       (*test_file)(FILE *f);
    279    stbi_uc * (*load_from_file)(FILE *f, int *x, int *y, int *comp, int req_comp);
    280    #endif
    281 } stbi_loader;
    282 
    283 // register a loader by filling out the above structure (you must define ALL functions)
    284 // returns 1 if added or already added, 0 if not added (too many loaders)
    285 // NOT THREADSAFE
    286 extern int stbi_register_loader(stbi_loader *loader);
    287 
    288 // define faster low-level operations (typically SIMD support)
    289 #ifdef STBI_SIMD
    290 typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize);
    291 // compute an integer IDCT on "input"
    292 //     input[x] = data[x] * dequantize[x]
    293 //     write results to 'out': 64 samples, each run of 8 spaced by 'out_stride'
    294 //                             CLAMP results to 0..255
    295 typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const  *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step);
    296 // compute a conversion from YCbCr to RGB
    297 //     'count' pixels
    298 //     write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B
    299 //     y: Y input channel
    300 //     cb: Cb input channel; scale/biased to be 0..255
    301 //     cr: Cr input channel; scale/biased to be 0..255
    302 
    303 extern void stbi_install_idct(stbi_idct_8x8 func);
    304 extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func);
    305 #endif // STBI_SIMD
    306 
    307 
    308 
    309 
    310 // TYPE-SPECIFIC ACCESS
    311 
    312 #ifdef STBI_TYPE_SPECIFIC_FUNCTIONS
    313 
    314 // is it a jpeg?
    315 extern int      stbi_jpeg_test_memory     (stbi_uc const *buffer, int len);
    316 extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    317 extern int      stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
    318 
    319 #ifndef STBI_NO_STDIO
    320 extern stbi_uc *stbi_jpeg_load            (char const *filename,     int *x, int *y, int *comp, int req_comp);
    321 extern int      stbi_jpeg_test_file       (FILE *f);
    322 extern stbi_uc *stbi_jpeg_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    323 
    324 extern int      stbi_jpeg_info            (char const *filename,     int *x, int *y, int *comp);
    325 extern int      stbi_jpeg_info_from_file  (FILE *f,                  int *x, int *y, int *comp);
    326 #endif
    327 
    328 // is it a png?
    329 extern int      stbi_png_test_memory      (stbi_uc const *buffer, int len);
    330 extern stbi_uc *stbi_png_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    331 extern int      stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
    332 
    333 #ifndef STBI_NO_STDIO
    334 extern stbi_uc *stbi_png_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    335 extern int      stbi_png_info             (char const *filename,     int *x, int *y, int *comp);
    336 extern int      stbi_png_test_file        (FILE *f);
    337 extern stbi_uc *stbi_png_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    338 extern int      stbi_png_info_from_file   (FILE *f,                  int *x, int *y, int *comp);
    339 #endif
    340 
    341 // is it a bmp?
    342 extern int      stbi_bmp_test_memory      (stbi_uc const *buffer, int len);
    343 
    344 extern stbi_uc *stbi_bmp_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    345 extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    346 #ifndef STBI_NO_STDIO
    347 extern int      stbi_bmp_test_file        (FILE *f);
    348 extern stbi_uc *stbi_bmp_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    349 #endif
    350 
    351 // is it a tga?
    352 extern int      stbi_tga_test_memory      (stbi_uc const *buffer, int len);
    353 
    354 extern stbi_uc *stbi_tga_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    355 extern stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    356 extern int stbi_tga_info_from_memory      (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
    357 #ifndef STBI_NO_STDIO
    358 extern int stbi_tga_info_from_file        (FILE *f, int *x, int *y, int *comp);
    359 extern int      stbi_tga_test_file        (FILE *f);
    360 extern stbi_uc *stbi_tga_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    361 #endif
    362 
    363 // is it a psd?
    364 extern int      stbi_psd_test_memory      (stbi_uc const *buffer, int len);
    365 
    366 extern stbi_uc *stbi_psd_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    367 extern stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    368 #ifndef STBI_NO_STDIO
    369 extern int      stbi_psd_test_file        (FILE *f);
    370 extern stbi_uc *stbi_psd_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    371 #endif
    372 
    373 // is it an hdr?
    374 extern int      stbi_hdr_test_memory      (stbi_uc const *buffer, int len);
    375 
    376 extern float *  stbi_hdr_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    377 extern float *  stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    378 #ifndef STBI_NO_STDIO
    379 extern int      stbi_hdr_test_file        (FILE *f);
    380 extern float *  stbi_hdr_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    381 #endif
    382 
    383 // is it a pic?
    384 extern int      stbi_pic_test_memory      (stbi_uc const *buffer, int len);
    385 
    386 extern stbi_uc *stbi_pic_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    387 extern stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    388 #ifndef STBI_NO_STDIO
    389 extern int      stbi_pic_test_file        (FILE *f);
    390 extern stbi_uc *stbi_pic_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    391 #endif
    392 
    393 // is it a gif?
    394 extern int      stbi_gif_test_memory      (stbi_uc const *buffer, int len);
    395 
    396 extern stbi_uc *stbi_gif_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    397 extern stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    398 extern int      stbi_gif_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
    399 
    400 #ifndef STBI_NO_STDIO
    401 extern int      stbi_gif_test_file        (FILE *f);
    402 extern stbi_uc *stbi_gif_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    403 extern int      stbi_gif_info             (char const *filename,     int *x, int *y, int *comp);
    404 extern int      stbi_gif_info_from_file   (FILE *f,                  int *x, int *y, int *comp);
    405 #endif
    406 
    407 #endif//STBI_TYPE_SPECIFIC_FUNCTIONS
    408 
    409 
    410 
    411 
    412 #ifdef __cplusplus
    413 }
    414 #endif
    415 
    416 //
    417 //
    418 ////   end header file   /////////////////////////////////////////////////////
    419 #endif // STBI_INCLUDE_STB_IMAGE_H
    420 
    421 #ifndef STBI_HEADER_FILE_ONLY
    422 
    423 #ifndef STBI_NO_HDR
    424 #include <math.h>  // ldexp
    425 #include <string.h> // strcmp
    426 #endif
    427 
    428 #ifndef STBI_NO_STDIO
    429 #include <stdio.h>
    430 #endif
    431 #ifdef _KERNEL
    432 #include <sys/cdefs.h>
    433 __KERNEL_RCSID(0, "$NetBSD: stb_image.c,v 1.11 2023/08/26 21:03:53 andvar Exp $");
    434 #include <sys/param.h>
    435 #include <sys/systm.h>
    436 #include <sys/kernel.h>
    437 #include <sys/types.h>
    438 #include <sys/malloc.h>
    439 #else
    440 #include <stdlib.h>
    441 #include <memory.h>
    442 #include <assert.h>
    443 #include <stdarg.h>
    444 #endif
    445 
    446 #ifdef _KERNEL
    447 #define	MALLOC(size)		malloc((size), M_TEMP, M_WAITOK)
    448 #define	REALLOC(ptr, size)	realloc((ptr), (size), M_TEMP, M_WAITOK)
    449 #define	FREE(ptr) \
    450     do { if (ptr) free((ptr), M_TEMP); } while (/*CONSTCOND*/0)
    451 #else
    452 #define	MALLOC(size)		malloc((size))
    453 #define	REALLOC(ptr, size)	realloc((ptr), (size))
    454 #define	FREE(ptr)		free((ptr))
    455 #endif
    456 
    457 #ifndef _MSC_VER
    458   #ifdef __cplusplus
    459   #define __forceinline inline
    460   #else
    461   #define __forceinline
    462   #endif
    463 #endif
    464 
    465 
    466 // implementation:
    467 typedef unsigned char uint8;
    468 typedef unsigned short uint16;
    469 typedef   signed short  int16;
    470 typedef unsigned int   uint32;
    471 typedef   signed int    int32;
    472 #ifndef __NetBSD__
    473 typedef unsigned int   uint;
    474 #endif
    475 
    476 // should produce compiler error if size is wrong
    477 typedef unsigned char validate_uint32[sizeof(uint32)==4 ? 1 : -1];
    478 
    479 #if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE)
    480 #define STBI_NO_WRITE
    481 #endif
    482 
    483 #define STBI_NOTUSED(v)  v=v
    484 
    485 #ifdef _MSC_VER
    486 #define STBI_HAS_LRTOL
    487 #endif
    488 
    489 #ifdef STBI_HAS_LRTOL
    490    #define stbi_lrot(x,y)  _lrotl(x,y)
    491 #else
    492    #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (32 - (y))))
    493 #endif
    494 
    495 //////////////////////////////////////////////////////////////////////////////
    496 //
    497 // Generic API that works on all image types
    498 //
    499 
    500 // deprecated functions
    501 
    502 // is it a jpeg?
    503 extern int      stbi_jpeg_test_memory     (stbi_uc const *buffer, int len);
    504 extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    505 extern int      stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
    506 
    507 #ifndef STBI_NO_STDIO
    508 extern stbi_uc *stbi_jpeg_load            (char const *filename,     int *x, int *y, int *comp, int req_comp);
    509 extern int      stbi_jpeg_test_file       (FILE *f);
    510 extern stbi_uc *stbi_jpeg_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    511 
    512 extern int      stbi_jpeg_info            (char const *filename,     int *x, int *y, int *comp);
    513 extern int      stbi_jpeg_info_from_file  (FILE *f,                  int *x, int *y, int *comp);
    514 #endif
    515 
    516 // is it a png?
    517 extern int      stbi_png_test_memory      (stbi_uc const *buffer, int len);
    518 extern stbi_uc *stbi_png_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    519 extern int      stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
    520 
    521 #ifndef STBI_NO_STDIO
    522 extern stbi_uc *stbi_png_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    523 extern int      stbi_png_info             (char const *filename,     int *x, int *y, int *comp);
    524 extern int      stbi_png_test_file        (FILE *f);
    525 extern stbi_uc *stbi_png_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    526 extern int      stbi_png_info_from_file   (FILE *f,                  int *x, int *y, int *comp);
    527 #endif
    528 
    529 // is it a bmp?
    530 extern int      stbi_bmp_test_memory      (stbi_uc const *buffer, int len);
    531 
    532 extern stbi_uc *stbi_bmp_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    533 extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    534 #ifndef STBI_NO_STDIO
    535 extern int      stbi_bmp_test_file        (FILE *f);
    536 extern stbi_uc *stbi_bmp_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    537 #endif
    538 
    539 // is it a tga?
    540 extern int      stbi_tga_test_memory      (stbi_uc const *buffer, int len);
    541 
    542 extern stbi_uc *stbi_tga_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    543 extern stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    544 #ifndef STBI_NO_STDIO
    545 extern int      stbi_tga_test_file        (FILE *f);
    546 extern stbi_uc *stbi_tga_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    547 #endif
    548 
    549 // is it a psd?
    550 extern int      stbi_psd_test_memory      (stbi_uc const *buffer, int len);
    551 
    552 extern stbi_uc *stbi_psd_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    553 extern stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    554 #ifndef STBI_NO_STDIO
    555 extern int      stbi_psd_test_file        (FILE *f);
    556 extern stbi_uc *stbi_psd_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    557 #endif
    558 
    559 // is it an hdr?
    560 extern int      stbi_hdr_test_memory      (stbi_uc const *buffer, int len);
    561 
    562 extern float *  stbi_hdr_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    563 extern float *  stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    564 #ifndef STBI_NO_STDIO
    565 extern int      stbi_hdr_test_file        (FILE *f);
    566 extern float *  stbi_hdr_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    567 #endif
    568 
    569 // is it a pic?
    570 extern int      stbi_pic_test_memory      (stbi_uc const *buffer, int len);
    571 
    572 extern stbi_uc *stbi_pic_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    573 extern stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    574 #ifndef STBI_NO_STDIO
    575 extern int      stbi_pic_test_file        (FILE *f);
    576 extern stbi_uc *stbi_pic_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    577 #endif
    578 
    579 // is it a gif?
    580 extern int      stbi_gif_test_memory      (stbi_uc const *buffer, int len);
    581 
    582 extern stbi_uc *stbi_gif_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
    583 extern stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
    584 extern int      stbi_gif_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
    585 
    586 #ifndef STBI_NO_STDIO
    587 extern int      stbi_gif_test_file        (FILE *f);
    588 extern stbi_uc *stbi_gif_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
    589 extern int      stbi_gif_info             (char const *filename,     int *x, int *y, int *comp);
    590 extern int      stbi_gif_info_from_file   (FILE *f,                  int *x, int *y, int *comp);
    591 #endif
    592 
    593 
    594 // this is not threadsafe
    595 static const char *failure_reason;
    596 
    597 const char *stbi_failure_reason(void)
    598 {
    599    return failure_reason;
    600 }
    601 
    602 #ifndef STBI_NO_FAILURE_STRINGS
    603 static int e(const char *str)
    604 {
    605    failure_reason = str;
    606    return 0;
    607 }
    608 #endif
    609 
    610 #ifdef STBI_NO_FAILURE_STRINGS
    611    #define e(x,y)  0
    612 #elif defined(STBI_FAILURE_USERMSG)
    613    #define e(x,y)  e(y)
    614 #else
    615    #define e(x,y)  e(x)
    616 #endif
    617 
    618 #define epf(x,y)   ((float *) (e(x,y)?NULL:NULL))
    619 #define epuc(x,y)  ((unsigned char *) (e(x,y)?NULL:NULL))
    620 
    621 void stbi_image_free(void *retval_from_stbi_load)
    622 {
    623    FREE(retval_from_stbi_load);
    624 }
    625 
    626 #define MAX_LOADERS  32
    627 stbi_loader *loaders[MAX_LOADERS];
    628 static int max_loaders = 0;
    629 
    630 int stbi_register_loader(stbi_loader *loader)
    631 {
    632    int i;
    633    for (i=0; i < MAX_LOADERS; ++i) {
    634       // already present?
    635       if (loaders[i] == loader)
    636          return 1;
    637       // end of the list?
    638       if (loaders[i] == NULL) {
    639          loaders[i] = loader;
    640          max_loaders = i+1;
    641          return 1;
    642       }
    643    }
    644    // no room for it
    645    return 0;
    646 }
    647 
    648 #ifndef STBI_NO_HDR
    649 static float   *ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
    650 static stbi_uc *hdr_to_ldr(float   *data, int x, int y, int comp);
    651 #endif
    652 
    653 #ifndef STBI_NO_STDIO
    654 unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
    655 {
    656    FILE *f = fopen(filename, "rb");
    657    unsigned char *result;
    658    if (!f) return epuc("can't fopen", "Unable to open file");
    659    result = stbi_load_from_file(f,x,y,comp,req_comp);
    660    fclose(f);
    661    return result;
    662 }
    663 
    664 unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
    665 {
    666    int i;
    667    if (stbi_jpeg_test_file(f)) return stbi_jpeg_load_from_file(f,x,y,comp,req_comp);
    668    if (stbi_png_test_file(f))  return stbi_png_load_from_file(f,x,y,comp,req_comp);
    669    if (stbi_bmp_test_file(f))  return stbi_bmp_load_from_file(f,x,y,comp,req_comp);
    670    if (stbi_gif_test_file(f))  return stbi_gif_load_from_file(f,x,y,comp,req_comp);
    671    if (stbi_psd_test_file(f))  return stbi_psd_load_from_file(f,x,y,comp,req_comp);
    672    if (stbi_pic_test_file(f))  return stbi_pic_load_from_file(f,x,y,comp,req_comp);
    673 
    674    #ifndef STBI_NO_HDR
    675    if (stbi_hdr_test_file(f)) {
    676       float *hdr = stbi_hdr_load_from_file(f, x,y,comp,req_comp);
    677       return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
    678    }
    679    #endif
    680 
    681    for (i=0; i < max_loaders; ++i)
    682       if (loaders[i]->test_file(f))
    683          return loaders[i]->load_from_file(f,x,y,comp,req_comp);
    684    // test tga last because it's a crappy test!
    685    if (stbi_tga_test_file(f))
    686       return stbi_tga_load_from_file(f,x,y,comp,req_comp);
    687    return epuc("unknown image type", "Image not of any known type, or corrupt");
    688 }
    689 #endif
    690 
    691 unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
    692 {
    693    int i;
    694    if (stbi_jpeg_test_memory(buffer,len)) return stbi_jpeg_load_from_memory(buffer,len,x,y,comp,req_comp);
    695    if (stbi_png_test_memory(buffer,len))  return stbi_png_load_from_memory(buffer,len,x,y,comp,req_comp);
    696    if (stbi_bmp_test_memory(buffer,len))  return stbi_bmp_load_from_memory(buffer,len,x,y,comp,req_comp);
    697    if (stbi_gif_test_memory(buffer,len))  return stbi_gif_load_from_memory(buffer,len,x,y,comp,req_comp);
    698    if (stbi_psd_test_memory(buffer,len))  return stbi_psd_load_from_memory(buffer,len,x,y,comp,req_comp);
    699    if (stbi_pic_test_memory(buffer,len))  return stbi_pic_load_from_memory(buffer,len,x,y,comp,req_comp);
    700 
    701    #ifndef STBI_NO_HDR
    702    if (stbi_hdr_test_memory(buffer, len)) {
    703       float *hdr = stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp);
    704       return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
    705    }
    706    #endif
    707 
    708    for (i=0; i < max_loaders; ++i)
    709       if (loaders[i]->test_memory(buffer,len))
    710          return loaders[i]->load_from_memory(buffer,len,x,y,comp,req_comp);
    711    // test tga last because it's a crappy test!
    712    if (stbi_tga_test_memory(buffer,len))
    713       return stbi_tga_load_from_memory(buffer,len,x,y,comp,req_comp);
    714    return epuc("unknown image type", "Image not of any known type, or corrupt");
    715 }
    716 
    717 #ifndef STBI_NO_HDR
    718 
    719 #ifndef STBI_NO_STDIO
    720 float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
    721 {
    722    FILE *f = fopen(filename, "rb");
    723    float *result;
    724    if (!f) return epf("can't fopen", "Unable to open file");
    725    result = stbi_loadf_from_file(f,x,y,comp,req_comp);
    726    fclose(f);
    727    return result;
    728 }
    729 
    730 float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
    731 {
    732    unsigned char *data;
    733    #ifndef STBI_NO_HDR
    734    if (stbi_hdr_test_file(f))
    735       return stbi_hdr_load_from_file(f,x,y,comp,req_comp);
    736    #endif
    737    data = stbi_load_from_file(f, x, y, comp, req_comp);
    738    if (data)
    739       return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
    740    return epf("unknown image type", "Image not of any known type, or corrupt");
    741 }
    742 #endif
    743 
    744 float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
    745 {
    746    stbi_uc *data;
    747    #ifndef STBI_NO_HDR
    748    if (stbi_hdr_test_memory(buffer, len))
    749       return stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp);
    750    #endif
    751    data = stbi_load_from_memory(buffer, len, x, y, comp, req_comp);
    752    if (data)
    753       return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
    754    return epf("unknown image type", "Image not of any known type, or corrupt");
    755 }
    756 #endif
    757 
    758 // these is-hdr-or-not is defined independent of whether STBI_NO_HDR is
    759 // defined, for API simplicity; if STBI_NO_HDR is defined, it always
    760 // reports false!
    761 
    762 int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
    763 {
    764    #ifndef STBI_NO_HDR
    765    return stbi_hdr_test_memory(buffer, len);
    766    #else
    767    STBI_NOTUSED(buffer);
    768    STBI_NOTUSED(len);
    769    return 0;
    770    #endif
    771 }
    772 
    773 #ifndef STBI_NO_STDIO
    774 extern int      stbi_is_hdr          (char const *filename)
    775 {
    776    FILE *f = fopen(filename, "rb");
    777    int result=0;
    778    if (f) {
    779       result = stbi_is_hdr_from_file(f);
    780       fclose(f);
    781    }
    782    return result;
    783 }
    784 
    785 extern int      stbi_is_hdr_from_file(FILE *f)
    786 {
    787    #ifndef STBI_NO_HDR
    788    return stbi_hdr_test_file(f);
    789    #else
    790    return 0;
    791    #endif
    792 }
    793 
    794 #endif
    795 
    796 #ifndef STBI_NO_HDR
    797 static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f;
    798 static float l2h_gamma=2.2f, l2h_scale=1.0f;
    799 
    800 void   stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; }
    801 void   stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; }
    802 
    803 void   stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; }
    804 void   stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; }
    805 #endif
    806 
    807 
    808 //////////////////////////////////////////////////////////////////////////////
    809 //
    810 // Common code used by all image loaders
    811 //
    812 
    813 enum
    814 {
    815    SCAN_load=0,
    816    SCAN_type,
    817    SCAN_header
    818 };
    819 
    820 typedef struct
    821 {
    822    uint32 img_x, img_y;
    823    int img_n, img_out_n;
    824 
    825    #ifndef STBI_NO_STDIO
    826    FILE  *img_file;
    827    int buflen;
    828    uint8 buffer_start[128];
    829    int from_file;
    830    #endif
    831    uint8 const *img_buffer, *img_buffer_end;
    832 } stbi;
    833 
    834 #ifndef STBI_NO_STDIO
    835 static void start_file(stbi *s, FILE *f)
    836 {
    837    s->img_file = f;
    838    s->buflen = sizeof(s->buffer_start);
    839    s->img_buffer_end = s->buffer_start + s->buflen;
    840    s->img_buffer = s->img_buffer_end;
    841    s->from_file = 1;
    842 }
    843 #endif
    844 
    845 static void start_mem(stbi *s, uint8 const *buffer, int len)
    846 {
    847 #ifndef STBI_NO_STDIO
    848    s->img_file = NULL;
    849    s->from_file = 0;
    850 #endif
    851    s->img_buffer = (uint8 const *) buffer;
    852    s->img_buffer_end = (uint8 const *) buffer+len;
    853 }
    854 
    855 #ifndef STBI_NO_STDIO
    856 static void refill_buffer(stbi *s)
    857 {
    858    int n = fread(s->buffer_start, 1, s->buflen, s->img_file);
    859    if (n == 0) {
    860       s->from_file = 0;
    861       s->img_buffer = s->img_buffer_end-1;
    862 #if 0
    863       *s->img_buffer = 0;
    864 #endif
    865    } else {
    866       s->img_buffer = s->buffer_start;
    867       s->img_buffer_end = s->buffer_start + n;
    868    }
    869 }
    870 #endif
    871 
    872 __forceinline static int get8(stbi *s)
    873 {
    874    if (s->img_buffer < s->img_buffer_end)
    875       return *s->img_buffer++;
    876 #ifndef STBI_NO_STDIO
    877    if (s->from_file) {
    878       refill_buffer(s);
    879       return *s->img_buffer++;
    880    }
    881 #endif
    882    return 0;
    883 }
    884 
    885 __forceinline static int at_eof(stbi *s)
    886 {
    887 #ifndef STBI_NO_STDIO
    888    if (s->img_file) {
    889       if (!feof(s->img_file)) return 0;
    890       // if feof() is true, check if buffer = end
    891       // special case: we've only got the special 0 character at the end
    892       if (s->from_file == 0) return 1;
    893    }
    894 #endif
    895    return s->img_buffer >= s->img_buffer_end;
    896 }
    897 
    898 __forceinline static uint8 get8u(stbi *s)
    899 {
    900    return (uint8) get8(s);
    901 }
    902 
    903 static void skip(stbi *s, int n)
    904 {
    905 #ifndef STBI_NO_STDIO
    906    if (s->img_file) {
    907       int blen = s->img_buffer_end - s->img_buffer;
    908       if (blen < n) {
    909          s->img_buffer = s->img_buffer_end;
    910          fseek(s->img_file, n - blen, SEEK_CUR);
    911          return;
    912       }
    913    }
    914 #endif
    915    s->img_buffer += n;
    916 }
    917 
    918 static int getn(stbi *s, stbi_uc *buffer, int n)
    919 {
    920 #ifndef STBI_NO_STDIO
    921    if (s->img_file) {
    922       int blen = s->img_buffer_end - s->img_buffer;
    923       if (blen < n) {
    924          int res;
    925          memcpy(buffer, s->img_buffer, blen);
    926          res = ((int) fread(buffer + blen, 1, n - blen, s->img_file) == (n-blen));
    927          s->img_buffer = s->img_buffer_end;
    928          return res;
    929       }
    930    }
    931 #endif
    932    if (s->img_buffer+n <= s->img_buffer_end) {
    933       memcpy(buffer, s->img_buffer, n);
    934       s->img_buffer += n;
    935       return 1;
    936    } else
    937       return 0;
    938 }
    939 
    940 static int get16(stbi *s)
    941 {
    942    int z = get8(s);
    943    return (z << 8) + get8(s);
    944 }
    945 
    946 static uint32 get32(stbi *s)
    947 {
    948    uint32 z = get16(s);
    949    return (z << 16) + get16(s);
    950 }
    951 
    952 static int get16le(stbi *s)
    953 {
    954    int z = get8(s);
    955    return z + (get8(s) << 8);
    956 }
    957 
    958 static uint32 get32le(stbi *s)
    959 {
    960    uint32 z = get16le(s);
    961    return z + (get16le(s) << 16);
    962 }
    963 
    964 //////////////////////////////////////////////////////////////////////////////
    965 //
    966 //  generic converter from built-in img_n to req_comp
    967 //    individual types do this automatically as much as possible (e.g. jpeg
    968 //    does all cases internally since it needs to colorspace convert anyway,
    969 //    and it never has alpha, so very few cases ). png can automatically
    970 //    interleave an alpha=255 channel, but falls back to this for other cases
    971 //
    972 //  assume data buffer is malloced, so malloc a new one and free that one
    973 //  only failure mode is malloc failing
    974 
    975 static uint8 compute_y(int r, int g, int b)
    976 {
    977    return (uint8) (((r*77) + (g*150) +  (29*b)) >> 8);
    978 }
    979 
    980 static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y)
    981 {
    982    int i,j;
    983    unsigned char *good;
    984 
    985    if (req_comp == img_n) return data;
    986    assert(req_comp >= 1 && req_comp <= 4);
    987 
    988    good = MALLOC(req_comp * x * y);
    989    if (good == NULL) {
    990       FREE(data);
    991       return epuc("outofmem", "Out of memory");
    992    }
    993 
    994    for (j=0; j < (int) y; ++j) {
    995       unsigned char *src  = data + j * x * img_n   ;
    996       unsigned char *dest = good + j * x * req_comp;
    997 
    998       #define COMBO(a,b)  ((a)*8+(b))
    999       #define CASE(a,b)   case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
   1000       // convert source image with img_n components to one with req_comp components;
   1001       // avoid switch per pixel, so use switch per scanline and massive macros
   1002       switch (COMBO(img_n, req_comp)) {
   1003          CASE(1,2) dest[0]=src[0], dest[1]=255;
   1004 		break;
   1005          CASE(1,3) dest[0]=dest[1]=dest[2]=src[0];
   1006 		break;
   1007          CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255;
   1008 		break;
   1009          CASE(2,1) dest[0]=src[0];
   1010 		break;
   1011          CASE(2,3) dest[0]=dest[1]=dest[2]=src[0];
   1012 		break;
   1013          CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1];
   1014 		break;
   1015          CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255;
   1016 		break;
   1017          CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]);
   1018 		break;
   1019          CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255;
   1020 		break;
   1021          CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]);
   1022 		break;
   1023          CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3];
   1024 		break;
   1025          CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2];
   1026 		break;
   1027          default: assert(0);
   1028       }
   1029       #undef CASE
   1030    }
   1031 
   1032    FREE(data);
   1033    return good;
   1034 }
   1035 
   1036 #ifndef STBI_NO_HDR
   1037 static float   *ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
   1038 {
   1039    int i,k,n;
   1040    float *output = MALLOC(x * y * comp * sizeof(float));
   1041    if (output == NULL) { FREE(data); return epf("outofmem", "Out of memory"); }
   1042    // compute number of non-alpha components
   1043    if (comp & 1) n = comp; else n = comp-1;
   1044    for (i=0; i < x*y; ++i) {
   1045       for (k=0; k < n; ++k) {
   1046          output[i*comp + k] = (float) pow(data[i*comp+k]/255.0f, l2h_gamma) * l2h_scale;
   1047       }
   1048       if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
   1049    }
   1050    FREE(data);
   1051    return output;
   1052 }
   1053 
   1054 #define float2int(x)   ((int) (x))
   1055 static stbi_uc *hdr_to_ldr(float   *data, int x, int y, int comp)
   1056 {
   1057    int i,k,n;
   1058    stbi_uc *output = MALLOC(x * y * comp);
   1059    if (output == NULL) { FREE(data); return epuc("outofmem", "Out of memory"); }
   1060    // compute number of non-alpha components
   1061    if (comp & 1) n = comp; else n = comp-1;
   1062    for (i=0; i < x*y; ++i) {
   1063       for (k=0; k < n; ++k) {
   1064          float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f;
   1065          if (z < 0) z = 0;
   1066          if (z > 255) z = 255;
   1067          output[i*comp + k] = (uint8) float2int(z);
   1068       }
   1069       if (k < comp) {
   1070          float z = data[i*comp+k] * 255 + 0.5f;
   1071          if (z < 0) z = 0;
   1072          if (z > 255) z = 255;
   1073          output[i*comp + k] = (uint8) float2int(z);
   1074       }
   1075    }
   1076    FREE(data);
   1077    return output;
   1078 }
   1079 #endif
   1080 
   1081 //////////////////////////////////////////////////////////////////////////////
   1082 //
   1083 //  "baseline" JPEG/JFIF decoder (not actually fully baseline implementation)
   1084 //
   1085 //    simple implementation
   1086 //      - channel subsampling of at most 2 in each dimension
   1087 //      - doesn't support delayed output of y-dimension
   1088 //      - simple interface (only one output format: 8-bit interleaved RGB)
   1089 //      - doesn't try to recover corrupt jpegs
   1090 //      - doesn't allow partial loading, loading multiple at once
   1091 //      - still fast on x86 (copying globals into locals doesn't help x86)
   1092 //      - allocates lots of intermediate memory (full size of all components)
   1093 //        - non-interleaved case requires this anyway
   1094 //        - allows good upsampling (see next)
   1095 //    high-quality
   1096 //      - upsampled channels are bilinearly interpolated, even across blocks
   1097 //      - quality integer IDCT derived from IJG's 'slow'
   1098 //    performance
   1099 //      - fast huffman; reasonable integer IDCT
   1100 //      - uses a lot of intermediate memory, could cache poorly
   1101 //      - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4
   1102 //          stb_jpeg:   1.34 seconds (MSVC6, default release build)
   1103 //          stb_jpeg:   1.06 seconds (MSVC6, processor = Pentium Pro)
   1104 //          IJL11.dll:  1.08 seconds (compiled by intel)
   1105 //          IJG 1998:   0.98 seconds (MSVC6, makefile provided by IJG)
   1106 //          IJG 1998:   0.95 seconds (MSVC6, makefile + proc=PPro)
   1107 
   1108 // huffman decoding acceleration
   1109 #define FAST_BITS   9  // larger handles more cases; smaller stomps less cache
   1110 
   1111 typedef struct
   1112 {
   1113    uint8  fast[1 << FAST_BITS];
   1114    // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
   1115    uint16 code[256];
   1116    uint8  values[256];
   1117    uint8  size[257];
   1118    unsigned int maxcode[18];
   1119    int    delta[17];   // old 'firstsymbol' - old 'firstcode'
   1120 } huffman;
   1121 
   1122 typedef struct
   1123 {
   1124    #ifdef STBI_SIMD
   1125    unsigned short dequant2[4][64];
   1126    #endif
   1127    stbi s;
   1128    huffman huff_dc[4];
   1129    huffman huff_ac[4];
   1130    uint8 dequant[4][64];
   1131 
   1132 // sizes for components, interleaved MCUs
   1133    int img_h_max, img_v_max;
   1134    int img_mcu_x, img_mcu_y;
   1135    int img_mcu_w, img_mcu_h;
   1136 
   1137 // definition of jpeg image component
   1138    struct
   1139    {
   1140       int id;
   1141       int h,v;
   1142       int tq;
   1143       int hd,ha;
   1144       int dc_pred;
   1145 
   1146       int x,y,w2,h2;
   1147       uint8 *data;
   1148       void *raw_data;
   1149       uint8 *linebuf;
   1150    } img_comp[4];
   1151 
   1152    uint32         code_buffer; // jpeg entropy-coded buffer
   1153    int            code_bits;   // number of valid bits
   1154    unsigned char  marker;      // marker seen while filling entropy buffer
   1155    int            nomore;      // flag if we saw a marker so must stop
   1156 
   1157    int scan_n, order[4];
   1158    int restart_interval, todo;
   1159 } jpeg;
   1160 
   1161 static int build_huffman(huffman *h, int *count)
   1162 {
   1163    int i,j,k=0,code;
   1164    // build size list for each symbol (from JPEG spec)
   1165    for (i=0; i < 16; ++i)
   1166       for (j=0; j < count[i]; ++j)
   1167          h->size[k++] = (uint8) (i+1);
   1168    h->size[k] = 0;
   1169 
   1170    // compute actual symbols (from jpeg spec)
   1171    code = 0;
   1172    k = 0;
   1173    for(j=1; j <= 16; ++j) {
   1174       // compute delta to add to code to compute symbol id
   1175       h->delta[j] = k - code;
   1176       if (h->size[k] == j) {
   1177          while (h->size[k] == j)
   1178             h->code[k++] = (uint16) (code++);
   1179          if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG");
   1180       }
   1181       // compute largest code + 1 for this size, preshifted as needed later
   1182       h->maxcode[j] = code << (16-j);
   1183       code <<= 1;
   1184    }
   1185    h->maxcode[j] = 0xffffffff;
   1186 
   1187    // build non-spec acceleration table; 255 is flag for not-accelerated
   1188    memset(h->fast, 255, 1 << FAST_BITS);
   1189    for (i=0; i < k; ++i) {
   1190       int s = h->size[i];
   1191       if (s <= FAST_BITS) {
   1192          int c = h->code[i] << (FAST_BITS-s);
   1193          int m = 1 << (FAST_BITS-s);
   1194          for (j=0; j < m; ++j) {
   1195             h->fast[c+j] = (uint8) i;
   1196          }
   1197       }
   1198    }
   1199    return 1;
   1200 }
   1201 
   1202 static void grow_buffer_unsafe(jpeg *j)
   1203 {
   1204    do {
   1205       int b = j->nomore ? 0 : get8(&j->s);
   1206       if (b == 0xff) {
   1207          int c = get8(&j->s);
   1208          if (c != 0) {
   1209             j->marker = (unsigned char) c;
   1210             j->nomore = 1;
   1211             return;
   1212          }
   1213       }
   1214       j->code_buffer |= b << (24 - j->code_bits);
   1215       j->code_bits += 8;
   1216    } while (j->code_bits <= 24);
   1217 }
   1218 
   1219 // (1 << n) - 1
   1220 static uint32 bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
   1221 
   1222 // decode a jpeg huffman value from the bitstream
   1223 __forceinline static int decode(jpeg *j, huffman *h)
   1224 {
   1225    unsigned int temp;
   1226    int c,k;
   1227 
   1228    if (j->code_bits < 16) grow_buffer_unsafe(j);
   1229 
   1230    // look at the top FAST_BITS and determine what symbol ID it is,
   1231    // if the code is <= FAST_BITS
   1232    c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
   1233    k = h->fast[c];
   1234    if (k < 255) {
   1235       int s = h->size[k];
   1236       if (s > j->code_bits)
   1237          return -1;
   1238       j->code_buffer <<= s;
   1239       j->code_bits -= s;
   1240       return h->values[k];
   1241    }
   1242 
   1243    // naive test is to shift the code_buffer down so k bits are
   1244    // valid, then test against maxcode. To speed this up, we've
   1245    // preshifted maxcode left so that it has (16-k) 0s at the
   1246    // end; in other words, regardless of the number of bits, it
   1247    // wants to be compared against something shifted to have 16;
   1248    // that way we don't need to shift inside the loop.
   1249    temp = j->code_buffer >> 16;
   1250    for (k=FAST_BITS+1 ; ; ++k)
   1251       if (temp < h->maxcode[k])
   1252          break;
   1253    if (k == 17) {
   1254       // error! code not found
   1255       j->code_bits -= 16;
   1256       return -1;
   1257    }
   1258 
   1259    if (k > j->code_bits)
   1260       return -1;
   1261 
   1262    // convert the huffman code to the symbol id
   1263    c = ((j->code_buffer >> (32 - k)) & bmask[k]) + h->delta[k];
   1264    assert((((j->code_buffer) >> (32 - h->size[c])) & bmask[h->size[c]]) == h->code[c]);
   1265 
   1266    // convert the id to a symbol
   1267    j->code_bits -= k;
   1268    j->code_buffer <<= k;
   1269    return h->values[c];
   1270 }
   1271 
   1272 // combined JPEG 'receive' and JPEG 'extend', since baseline
   1273 // always extends everything it receives.
   1274 __forceinline static int extend_receive(jpeg *j, int n)
   1275 {
   1276    unsigned int m = 1 << (n-1);
   1277    unsigned int k;
   1278    if (j->code_bits < n) grow_buffer_unsafe(j);
   1279 
   1280    #if 1
   1281    k = stbi_lrot(j->code_buffer, n);
   1282    j->code_buffer = k & ~bmask[n];
   1283    k &= bmask[n];
   1284    j->code_bits -= n;
   1285    #else
   1286    k = (j->code_buffer >> (32 - n)) & bmask[n];
   1287    j->code_bits -= n;
   1288    j->code_buffer <<= n;
   1289    #endif
   1290    // the following test is probably a random branch that won't
   1291    // predict well. I tried to table accelerate it but failed.
   1292    // maybe it's compiling as a conditional move?
   1293    if (k < m)
   1294       return (UINT_MAX << n) + k + 1;
   1295    else
   1296       return k;
   1297 }
   1298 
   1299 // given a value that's at position X in the zigzag stream,
   1300 // where does it appear in the 8x8 matrix coded as row-major?
   1301 static uint8 dezigzag[64+15] =
   1302 {
   1303     0,  1,  8, 16,  9,  2,  3, 10,
   1304    17, 24, 32, 25, 18, 11,  4,  5,
   1305    12, 19, 26, 33, 40, 48, 41, 34,
   1306    27, 20, 13,  6,  7, 14, 21, 28,
   1307    35, 42, 49, 56, 57, 50, 43, 36,
   1308    29, 22, 15, 23, 30, 37, 44, 51,
   1309    58, 59, 52, 45, 38, 31, 39, 46,
   1310    53, 60, 61, 54, 47, 55, 62, 63,
   1311    // let corrupt input sample past end
   1312    63, 63, 63, 63, 63, 63, 63, 63,
   1313    63, 63, 63, 63, 63, 63, 63
   1314 };
   1315 
   1316 // decode one 64-entry block--
   1317 static int decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b)
   1318 {
   1319    int diff,dc,k;
   1320    int t = decode(j, hdc);
   1321    if (t < 0) return e("bad huffman code","Corrupt JPEG");
   1322 
   1323    // 0 all the ac values now so we can do it 32-bits at a time
   1324    memset(data,0,64*sizeof(data[0]));
   1325 
   1326    diff = t ? extend_receive(j, t) : 0;
   1327    dc = j->img_comp[b].dc_pred + diff;
   1328    j->img_comp[b].dc_pred = dc;
   1329    data[0] = (short) dc;
   1330 
   1331    // decode AC components, see JPEG spec
   1332    k = 1;
   1333    do {
   1334       int r,s;
   1335       int rs = decode(j, hac);
   1336       if (rs < 0) return e("bad huffman code","Corrupt JPEG");
   1337       s = rs & 15;
   1338       r = rs >> 4;
   1339       if (s == 0) {
   1340          if (rs != 0xf0) break; // end block
   1341          k += 16;
   1342       } else {
   1343          k += r;
   1344          // decode into unzigzag'd location
   1345          data[dezigzag[k++]] = (short) extend_receive(j,s);
   1346       }
   1347    } while (k < 64);
   1348    return 1;
   1349 }
   1350 
   1351 // take a -128..127 value and clamp it and convert to 0..255
   1352 __forceinline static uint8 clamp(int x)
   1353 {
   1354    // trick to use a single test to catch both cases
   1355    if ((unsigned int) x > 255) {
   1356       if (x < 0) return 0;
   1357       if (x > 255) return 255;
   1358    }
   1359    return (uint8) x;
   1360 }
   1361 
   1362 #define f2f(x)  (int) (((x) * 4096 + 0.5))
   1363 #define fsh(x)  ((x) << 12)
   1364 
   1365 // derived from jidctint -- DCT_ISLOW
   1366 #define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7)       \
   1367    int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
   1368    p2 = s2;                                    \
   1369    p3 = s6;                                    \
   1370    p1 = (p2+p3) * f2f(0.5411961f);             \
   1371    t2 = p1 + p3*f2f(-1.847759065f);            \
   1372    t3 = p1 + p2*f2f( 0.765366865f);            \
   1373    p2 = s0;                                    \
   1374    p3 = s4;                                    \
   1375    t0 = fsh(p2+p3);                            \
   1376    t1 = fsh(p2-p3);                            \
   1377    x0 = t0+t3;                                 \
   1378    x3 = t0-t3;                                 \
   1379    x1 = t1+t2;                                 \
   1380    x2 = t1-t2;                                 \
   1381    t0 = s7;                                    \
   1382    t1 = s5;                                    \
   1383    t2 = s3;                                    \
   1384    t3 = s1;                                    \
   1385    p3 = t0+t2;                                 \
   1386    p4 = t1+t3;                                 \
   1387    p1 = t0+t3;                                 \
   1388    p2 = t1+t2;                                 \
   1389    p5 = (p3+p4)*f2f( 1.175875602f);            \
   1390    t0 = t0*f2f( 0.298631336f);                 \
   1391    t1 = t1*f2f( 2.053119869f);                 \
   1392    t2 = t2*f2f( 3.072711026f);                 \
   1393    t3 = t3*f2f( 1.501321110f);                 \
   1394    p1 = p5 + p1*f2f(-0.899976223f);            \
   1395    p2 = p5 + p2*f2f(-2.562915447f);            \
   1396    p3 = p3*f2f(-1.961570560f);                 \
   1397    p4 = p4*f2f(-0.390180644f);                 \
   1398    t3 += p1+p4;                                \
   1399    t2 += p2+p3;                                \
   1400    t1 += p2+p4;                                \
   1401    t0 += p1+p3;
   1402 
   1403 #ifdef STBI_SIMD
   1404 typedef unsigned short stbi_dequantize_t;
   1405 #else
   1406 typedef uint8 stbi_dequantize_t;
   1407 #endif
   1408 
   1409 // .344 seconds on 3*anemones.jpg
   1410 static void idct_block(uint8 *out, int out_stride, short data[64], stbi_dequantize_t *dequantize)
   1411 {
   1412    int i,val[64],*v=val;
   1413    stbi_dequantize_t *dq = dequantize;
   1414    uint8 *o;
   1415    short *d = data;
   1416 
   1417    // columns
   1418    for (i=0; i < 8; ++i,++d,++dq, ++v) {
   1419       // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
   1420       if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
   1421            && d[40]==0 && d[48]==0 && d[56]==0) {
   1422          //    no shortcut                 0     seconds
   1423          //    (1|2|3|4|5|6|7)==0          0     seconds
   1424          //    all separate               -0.047 seconds
   1425          //    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds
   1426          int dcterm = d[0] * dq[0] << 2;
   1427          v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
   1428       } else {
   1429          IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24],
   1430                  d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56])
   1431          // constants scaled things up by 1<<12; let's bring them back
   1432          // down, but keep 2 extra bits of precision
   1433          x0 += 512; x1 += 512; x2 += 512; x3 += 512;
   1434          v[ 0] = (x0+t3) >> 10;
   1435          v[56] = (x0-t3) >> 10;
   1436          v[ 8] = (x1+t2) >> 10;
   1437          v[48] = (x1-t2) >> 10;
   1438          v[16] = (x2+t1) >> 10;
   1439          v[40] = (x2-t1) >> 10;
   1440          v[24] = (x3+t0) >> 10;
   1441          v[32] = (x3-t0) >> 10;
   1442       }
   1443    }
   1444 
   1445    for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
   1446       // no fast case since the first 1D IDCT spread components out
   1447       IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
   1448       // constants scaled things up by 1<<12, plus we had 1<<2 from first
   1449       // loop, plus horizontal and vertical each scale by sqrt(8) so together
   1450       // we've got an extra 1<<3, so 1<<17 total we need to remove.
   1451       // so we want to round that, which means adding 0.5 * 1<<17,
   1452       // aka 65536. Also, we'll end up with -128 to 127 that we want
   1453       // to encode as 0..255 by adding 128, so we'll add that before the shift
   1454       x0 += 65536 + (128<<17);
   1455       x1 += 65536 + (128<<17);
   1456       x2 += 65536 + (128<<17);
   1457       x3 += 65536 + (128<<17);
   1458       // tried computing the shifts into temps, or'ing the temps to see
   1459       // if any were out of range, but that was slower
   1460       o[0] = clamp((x0+t3) >> 17);
   1461       o[7] = clamp((x0-t3) >> 17);
   1462       o[1] = clamp((x1+t2) >> 17);
   1463       o[6] = clamp((x1-t2) >> 17);
   1464       o[2] = clamp((x2+t1) >> 17);
   1465       o[5] = clamp((x2-t1) >> 17);
   1466       o[3] = clamp((x3+t0) >> 17);
   1467       o[4] = clamp((x3-t0) >> 17);
   1468    }
   1469 }
   1470 
   1471 #ifdef STBI_SIMD
   1472 static stbi_idct_8x8 stbi_idct_installed = idct_block;
   1473 
   1474 extern void stbi_install_idct(stbi_idct_8x8 func)
   1475 {
   1476    stbi_idct_installed = func;
   1477 }
   1478 #endif
   1479 
   1480 #define MARKER_none  0xff
   1481 // if there's a pending marker from the entropy stream, return that
   1482 // otherwise, fetch from the stream and get a marker. if there's no
   1483 // marker, return 0xff, which is never a valid marker value
   1484 static uint8 get_marker(jpeg *j)
   1485 {
   1486    uint8 x;
   1487    if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; }
   1488    x = get8u(&j->s);
   1489    if (x != 0xff) return MARKER_none;
   1490    while (x == 0xff)
   1491       x = get8u(&j->s);
   1492    return x;
   1493 }
   1494 
   1495 // in each scan, we'll have scan_n components, and the order
   1496 // of the components is specified by order[]
   1497 #define RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)
   1498 
   1499 // after a restart interval, reset the entropy decoder and
   1500 // the dc prediction
   1501 static void reset(jpeg *j)
   1502 {
   1503    j->code_bits = 0;
   1504    j->code_buffer = 0;
   1505    j->nomore = 0;
   1506    j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
   1507    j->marker = MARKER_none;
   1508    j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
   1509    // no more than 1<<31 MCUs if no restart_interval? that's plenty safe,
   1510    // since we don't even allow 1<<30 pixels
   1511 }
   1512 
   1513 static int parse_entropy_coded_data(jpeg *z)
   1514 {
   1515    reset(z);
   1516    if (z->scan_n == 1) {
   1517       int i,j;
   1518       #ifdef STBI_SIMD
   1519       __declspec(align(16))
   1520       #endif
   1521       short data[64];
   1522       int n = z->order[0];
   1523       // non-interleaved data, we just need to process one block at a time,
   1524       // in trivial scanline order
   1525       // number of blocks to do just depends on how many actual "pixels" this
   1526       // component has, independent of interleaved MCU blocking and such
   1527       int w = (z->img_comp[n].x+7) >> 3;
   1528       int h = (z->img_comp[n].y+7) >> 3;
   1529       for (j=0; j < h; ++j) {
   1530          for (i=0; i < w; ++i) {
   1531             if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0;
   1532             #ifdef STBI_SIMD
   1533             stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
   1534             #else
   1535             idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
   1536             #endif
   1537             // every data block is an MCU, so countdown the restart interval
   1538             if (--z->todo <= 0) {
   1539                if (z->code_bits < 24) grow_buffer_unsafe(z);
   1540                // if it's NOT a restart, then just bail, so we get corrupt data
   1541                // rather than no data
   1542                if (!RESTART(z->marker)) return 1;
   1543                reset(z);
   1544             }
   1545          }
   1546       }
   1547    } else { // interleaved!
   1548       int i,j,k,x,y;
   1549       short data[64];
   1550       for (j=0; j < z->img_mcu_y; ++j) {
   1551          for (i=0; i < z->img_mcu_x; ++i) {
   1552             // scan an interleaved mcu... process scan_n components in order
   1553             for (k=0; k < z->scan_n; ++k) {
   1554                int n = z->order[k];
   1555                // scan out an mcu's worth of this component; that's just determined
   1556                // by the basic H and V specified for the component
   1557                for (y=0; y < z->img_comp[n].v; ++y) {
   1558                   for (x=0; x < z->img_comp[n].h; ++x) {
   1559                      int x2 = (i*z->img_comp[n].h + x)*8;
   1560                      int y2 = (j*z->img_comp[n].v + y)*8;
   1561                      if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0;
   1562                      #ifdef STBI_SIMD
   1563                      stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
   1564                      #else
   1565                      idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
   1566                      #endif
   1567                   }
   1568                }
   1569             }
   1570             // after all interleaved components, that's an interleaved MCU,
   1571             // so now count down the restart interval
   1572             if (--z->todo <= 0) {
   1573                if (z->code_bits < 24) grow_buffer_unsafe(z);
   1574                // if it's NOT a restart, then just bail, so we get corrupt data
   1575                // rather than no data
   1576                if (!RESTART(z->marker)) return 1;
   1577                reset(z);
   1578             }
   1579          }
   1580       }
   1581    }
   1582    return 1;
   1583 }
   1584 
   1585 static int process_marker(jpeg *z, int marker)
   1586 {
   1587    int L;
   1588    switch (marker) {
   1589       case MARKER_none: // no marker found
   1590          return e("expected marker","Corrupt JPEG");
   1591 
   1592       case 0xC2: // SOF - progressive
   1593          return e("progressive jpeg","JPEG format not supported (progressive)");
   1594 
   1595       case 0xDD: // DRI - specify restart interval
   1596          if (get16(&z->s) != 4) return e("bad DRI len","Corrupt JPEG");
   1597          z->restart_interval = get16(&z->s);
   1598          return 1;
   1599 
   1600       case 0xDB: // DQT - define quantization table
   1601          L = get16(&z->s)-2;
   1602          while (L > 0) {
   1603             int q = get8(&z->s);
   1604             int p = q >> 4;
   1605             int t = q & 15,i;
   1606             if (p != 0) return e("bad DQT type","Corrupt JPEG");
   1607             if (t > 3) return e("bad DQT table","Corrupt JPEG");
   1608             for (i=0; i < 64; ++i)
   1609                z->dequant[t][dezigzag[i]] = get8u(&z->s);
   1610             #ifdef STBI_SIMD
   1611             for (i=0; i < 64; ++i)
   1612                z->dequant2[t][i] = z->dequant[t][i];
   1613             #endif
   1614             L -= 65;
   1615          }
   1616          return L==0;
   1617 
   1618       case 0xC4: // DHT - define huffman table
   1619          L = get16(&z->s)-2;
   1620          while (L > 0) {
   1621             uint8 *v;
   1622             int sizes[16],i,m=0;
   1623             int q = get8(&z->s);
   1624             int tc = q >> 4;
   1625             int th = q & 15;
   1626             if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG");
   1627             for (i=0; i < 16; ++i) {
   1628                sizes[i] = get8(&z->s);
   1629                m += sizes[i];
   1630             }
   1631             L -= 17;
   1632             if (tc == 0) {
   1633                if (!build_huffman(z->huff_dc+th, sizes)) return 0;
   1634                v = z->huff_dc[th].values;
   1635             } else {
   1636                if (!build_huffman(z->huff_ac+th, sizes)) return 0;
   1637                v = z->huff_ac[th].values;
   1638             }
   1639             for (i=0; i < m; ++i)
   1640                v[i] = get8u(&z->s);
   1641             L -= m;
   1642          }
   1643          return L==0;
   1644    }
   1645    // check for comment block or APP blocks
   1646    if ((marker >= 0xE0 && marker <= 0xEF) || marker == 0xFE) {
   1647       skip(&z->s, get16(&z->s)-2);
   1648       return 1;
   1649    }
   1650    return 0;
   1651 }
   1652 
   1653 // after we see SOS
   1654 static int process_scan_header(jpeg *z)
   1655 {
   1656    int i;
   1657    int Ls = get16(&z->s);
   1658    z->scan_n = get8(&z->s);
   1659    if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s.img_n) return e("bad SOS component count","Corrupt JPEG");
   1660    if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG");
   1661    for (i=0; i < z->scan_n; ++i) {
   1662       int id = get8(&z->s), which;
   1663       int q = get8(&z->s);
   1664       for (which = 0; which < z->s.img_n; ++which)
   1665          if (z->img_comp[which].id == id)
   1666             break;
   1667       if (which == z->s.img_n) return 0;
   1668       z->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG");
   1669       z->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG");
   1670       z->order[i] = which;
   1671    }
   1672    if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG");
   1673    get8(&z->s); // should be 63, but might be 0
   1674    if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG");
   1675 
   1676    return 1;
   1677 }
   1678 
   1679 static int process_frame_header(jpeg *z, int scan)
   1680 {
   1681    stbi *s = &z->s;
   1682    int Lf,p,i,q, h_max=1,v_max=1,c;
   1683    Lf = get16(s);         if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG
   1684    p  = get8(s);          if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
   1685    s->img_y = get16(s);   if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
   1686    s->img_x = get16(s);   if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires
   1687    c = get8(s);
   1688    if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG");    // JFIF requires
   1689    s->img_n = c;
   1690    for (i=0; i < c; ++i) {
   1691       z->img_comp[i].data = NULL;
   1692       z->img_comp[i].linebuf = NULL;
   1693    }
   1694 
   1695    if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG");
   1696 
   1697    for (i=0; i < s->img_n; ++i) {
   1698       z->img_comp[i].id = get8(s);
   1699       if (z->img_comp[i].id != i+1)   // JFIF requires
   1700          if (z->img_comp[i].id != i)  // some version of jpegtran outputs non-JFIF-compliant files!
   1701             return e("bad component ID","Corrupt JPEG");
   1702       q = get8(s);
   1703       z->img_comp[i].h = (q >> 4);  if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG");
   1704       z->img_comp[i].v = q & 15;    if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG");
   1705       z->img_comp[i].tq = get8(s);  if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG");
   1706    }
   1707 
   1708    if (scan != SCAN_load) return 1;
   1709 
   1710    if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode");
   1711 
   1712    for (i=0; i < s->img_n; ++i) {
   1713       if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
   1714       if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
   1715    }
   1716 
   1717    // compute interleaved mcu info
   1718    z->img_h_max = h_max;
   1719    z->img_v_max = v_max;
   1720    z->img_mcu_w = h_max * 8;
   1721    z->img_mcu_h = v_max * 8;
   1722    z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
   1723    z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
   1724 
   1725    for (i=0; i < s->img_n; ++i) {
   1726       // number of effective pixels (e.g. for non-interleaved MCU)
   1727       z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
   1728       z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
   1729       // to simplify generation, we'll allocate enough memory to decode
   1730       // the bogus oversized data from using interleaved MCUs and their
   1731       // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
   1732       // discard the extra data until colorspace conversion
   1733       z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
   1734       z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
   1735       z->img_comp[i].raw_data = MALLOC(z->img_comp[i].w2 * z->img_comp[i].h2+15);
   1736       if (z->img_comp[i].raw_data == NULL) {
   1737          for(--i; i >= 0; --i) {
   1738             FREE(z->img_comp[i].raw_data);
   1739             z->img_comp[i].data = NULL;
   1740          }
   1741          return e("outofmem", "Out of memory");
   1742       }
   1743       // align blocks for installable-idct using mmx/sse
   1744       z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
   1745       z->img_comp[i].linebuf = NULL;
   1746    }
   1747 
   1748    return 1;
   1749 }
   1750 
   1751 // use comparisons since in some cases we handle more than one case (e.g. SOF)
   1752 #define DNL(x)         ((x) == 0xdc)
   1753 #define SOI(x)         ((x) == 0xd8)
   1754 #define EOI(x)         ((x) == 0xd9)
   1755 #define SOF(x)         ((x) == 0xc0 || (x) == 0xc1)
   1756 #define SOS(x)         ((x) == 0xda)
   1757 
   1758 static int decode_jpeg_header(jpeg *z, int scan)
   1759 {
   1760    int m;
   1761    z->marker = MARKER_none; // initialize cached marker to empty
   1762    m = get_marker(z);
   1763    if (!SOI(m)) return e("no SOI","Corrupt JPEG");
   1764    if (scan == SCAN_type) return 1;
   1765    m = get_marker(z);
   1766    while (!SOF(m)) {
   1767       if (!process_marker(z,m)) return 0;
   1768       m = get_marker(z);
   1769       while (m == MARKER_none) {
   1770          // some files have extra padding after their blocks, so ok, we'll scan
   1771          if (at_eof(&z->s)) return e("no SOF", "Corrupt JPEG");
   1772          m = get_marker(z);
   1773       }
   1774    }
   1775    if (!process_frame_header(z, scan)) return 0;
   1776    return 1;
   1777 }
   1778 
   1779 static int decode_jpeg_image(jpeg *j)
   1780 {
   1781    int m;
   1782    j->restart_interval = 0;
   1783    if (!decode_jpeg_header(j, SCAN_load)) return 0;
   1784    m = get_marker(j);
   1785    while (!EOI(m)) {
   1786       if (SOS(m)) {
   1787          if (!process_scan_header(j)) return 0;
   1788          if (!parse_entropy_coded_data(j)) return 0;
   1789          if (j->marker == MARKER_none ) {
   1790             // handle 0s at the end of image data from IP Kamera 9060
   1791             while (!at_eof(&j->s)) {
   1792                int x = get8(&j->s);
   1793                if (x == 255) {
   1794                   j->marker = get8u(&j->s);
   1795                   break;
   1796                } else if (x != 0) {
   1797                   return 0;
   1798                }
   1799             }
   1800             // if we reach eof without hitting a marker, get_marker() below will fail and we'll eventually return 0
   1801          }
   1802       } else {
   1803          if (!process_marker(j, m)) return 0;
   1804       }
   1805       m = get_marker(j);
   1806    }
   1807    return 1;
   1808 }
   1809 
   1810 // static jfif-centered resampling (across block boundaries)
   1811 
   1812 typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1,
   1813                                     int w, int hs);
   1814 
   1815 #define div4(x) ((uint8) ((x) >> 2))
   1816 
   1817 static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
   1818 {
   1819    STBI_NOTUSED(out);
   1820    STBI_NOTUSED(in_far);
   1821    STBI_NOTUSED(w);
   1822    STBI_NOTUSED(hs);
   1823    return in_near;
   1824 }
   1825 
   1826 static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
   1827 {
   1828    // need to generate two samples vertically for every one in input
   1829    int i;
   1830    STBI_NOTUSED(hs);
   1831    for (i=0; i < w; ++i)
   1832       out[i] = div4(3*in_near[i] + in_far[i] + 2);
   1833    return out;
   1834 }
   1835 
   1836 static uint8*  resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
   1837 {
   1838    // need to generate two samples horizontally for every one in input
   1839    int i;
   1840    uint8 *input = in_near;
   1841 
   1842    if (w == 1) {
   1843       // if only one sample, can't do any interpolation
   1844       out[0] = out[1] = input[0];
   1845       return out;
   1846    }
   1847 
   1848    out[0] = input[0];
   1849    out[1] = div4(input[0]*3 + input[1] + 2);
   1850    for (i=1; i < w-1; ++i) {
   1851       int n = 3*input[i]+2;
   1852       out[i*2+0] = div4(n+input[i-1]);
   1853       out[i*2+1] = div4(n+input[i+1]);
   1854    }
   1855    out[i*2+0] = div4(input[w-2]*3 + input[w-1] + 2);
   1856    out[i*2+1] = input[w-1];
   1857 
   1858    STBI_NOTUSED(in_far);
   1859    STBI_NOTUSED(hs);
   1860 
   1861    return out;
   1862 }
   1863 
   1864 #define div16(x) ((uint8) ((x) >> 4))
   1865 
   1866 static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
   1867 {
   1868    // need to generate 2x2 samples for every one in input
   1869    int i,t0,t1;
   1870    if (w == 1) {
   1871       out[0] = out[1] = div4(3*in_near[0] + in_far[0] + 2);
   1872       return out;
   1873    }
   1874 
   1875    t1 = 3*in_near[0] + in_far[0];
   1876    out[0] = div4(t1+2);
   1877    for (i=1; i < w; ++i) {
   1878       t0 = t1;
   1879       t1 = 3*in_near[i]+in_far[i];
   1880       out[i*2-1] = div16(3*t0 + t1 + 8);
   1881       out[i*2  ] = div16(3*t1 + t0 + 8);
   1882    }
   1883    out[w*2-1] = div4(t1+2);
   1884 
   1885    STBI_NOTUSED(hs);
   1886 
   1887    return out;
   1888 }
   1889 
   1890 static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
   1891 {
   1892    // resample with nearest-neighbor
   1893    int i,j;
   1894    in_far = in_far;
   1895    for (i=0; i < w; ++i)
   1896       for (j=0; j < hs; ++j)
   1897          out[i*hs+j] = in_near[i];
   1898    return out;
   1899 }
   1900 
   1901 #define float2fixed(x)  ((int) ((x) * 65536 + 0.5))
   1902 
   1903 // 0.38 seconds on 3*anemones.jpg   (0.25 with processor = Pro)
   1904 // VC6 without processor=Pro is generating multiple LEAs per multiply!
   1905 static void YCbCr_to_RGB_row(uint8 *out, const uint8 *y, const uint8 *pcb, const uint8 *pcr, int count, int step)
   1906 {
   1907    int i;
   1908    for (i=0; i < count; ++i) {
   1909       int y_fixed = (y[i] << 16) + 32768; // rounding
   1910       int r,g,b;
   1911       int cr = pcr[i] - 128;
   1912       int cb = pcb[i] - 128;
   1913       r = y_fixed + cr*float2fixed(1.40200f);
   1914       g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
   1915       b = y_fixed                            + cb*float2fixed(1.77200f);
   1916       r >>= 16;
   1917       g >>= 16;
   1918       b >>= 16;
   1919       if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
   1920       if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
   1921       if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
   1922       out[0] = (uint8)r;
   1923       out[1] = (uint8)g;
   1924       out[2] = (uint8)b;
   1925       out[3] = 255;
   1926       out += step;
   1927    }
   1928 }
   1929 
   1930 #ifdef STBI_SIMD
   1931 static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row;
   1932 
   1933 void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func)
   1934 {
   1935    stbi_YCbCr_installed = func;
   1936 }
   1937 #endif
   1938 
   1939 
   1940 // clean up the temporary component buffers
   1941 static void cleanup_jpeg(jpeg *j)
   1942 {
   1943    int i;
   1944    for (i=0; i < j->s.img_n; ++i) {
   1945       if (j->img_comp[i].data) {
   1946          FREE(j->img_comp[i].raw_data);
   1947          j->img_comp[i].data = NULL;
   1948       }
   1949       if (j->img_comp[i].linebuf) {
   1950          FREE(j->img_comp[i].linebuf);
   1951          j->img_comp[i].linebuf = NULL;
   1952       }
   1953    }
   1954 }
   1955 
   1956 typedef struct
   1957 {
   1958    resample_row_func resample;
   1959    uint8 *line0,*line1;
   1960    int hs,vs;   // expansion factor in each axis
   1961    int w_lores; // horizontal pixels pre-expansion
   1962    int ystep;   // how far through vertical expansion we are
   1963    int ypos;    // which pre-expansion row we're on
   1964 } stbi_resample;
   1965 
   1966 static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
   1967 {
   1968    int n, decode_n;
   1969    // validate req_comp
   1970    if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error");
   1971    z->s.img_n = 0;
   1972 
   1973    // load a jpeg image from whichever source
   1974    if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; }
   1975 
   1976    // determine actual number of components to generate
   1977    n = req_comp ? req_comp : z->s.img_n;
   1978 
   1979    if (z->s.img_n == 3 && n < 3)
   1980       decode_n = 1;
   1981    else
   1982       decode_n = z->s.img_n;
   1983 
   1984    // resample and color-convert
   1985    {
   1986       int k;
   1987       uint i,j;
   1988       uint8 *output;
   1989       uint8 *coutput[4];
   1990 
   1991       stbi_resample res_comp[4];
   1992 
   1993       for (k=0; k < decode_n; ++k) {
   1994          stbi_resample *r = &res_comp[k];
   1995 
   1996          // allocate line buffer big enough for upsampling off the edges
   1997          // with upsample factor of 4
   1998          z->img_comp[k].linebuf = MALLOC(z->s.img_x + 3);
   1999          if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); }
   2000 
   2001          r->hs      = z->img_h_max / z->img_comp[k].h;
   2002          r->vs      = z->img_v_max / z->img_comp[k].v;
   2003          r->ystep   = r->vs >> 1;
   2004          r->w_lores = (z->s.img_x + r->hs-1) / r->hs;
   2005          r->ypos    = 0;
   2006          r->line0   = r->line1 = z->img_comp[k].data;
   2007 
   2008          if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
   2009          else if (r->hs == 1 && r->vs == 2) r->resample = resample_row_v_2;
   2010          else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2;
   2011          else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2;
   2012          else                               r->resample = resample_row_generic;
   2013       }
   2014 
   2015       // can't error after this so, this is safe
   2016       output = MALLOC(n * z->s.img_x * z->s.img_y + 1);
   2017       if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); }
   2018 
   2019       // now go ahead and resample
   2020       for (j=0; j < z->s.img_y; ++j) {
   2021          uint8 *out = output + n * z->s.img_x * j;
   2022          for (k=0; k < decode_n; ++k) {
   2023             stbi_resample *r = &res_comp[k];
   2024             int y_bot = r->ystep >= (r->vs >> 1);
   2025             coutput[k] = r->resample(z->img_comp[k].linebuf,
   2026                                      y_bot ? r->line1 : r->line0,
   2027                                      y_bot ? r->line0 : r->line1,
   2028                                      r->w_lores, r->hs);
   2029             if (++r->ystep >= r->vs) {
   2030                r->ystep = 0;
   2031                r->line0 = r->line1;
   2032                if (++r->ypos < z->img_comp[k].y)
   2033                   r->line1 += z->img_comp[k].w2;
   2034             }
   2035          }
   2036          if (n >= 3) {
   2037             uint8 *y = coutput[0];
   2038             if (z->s.img_n == 3) {
   2039                #ifdef STBI_SIMD
   2040                stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n);
   2041                #else
   2042                YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s.img_x, n);
   2043                #endif
   2044             } else
   2045                for (i=0; i < z->s.img_x; ++i) {
   2046                   out[0] = out[1] = out[2] = y[i];
   2047                   out[3] = 255; // not used if n==3
   2048                   out += n;
   2049                }
   2050          } else {
   2051             uint8 *y = coutput[0];
   2052             if (n == 1)
   2053                for (i=0; i < z->s.img_x; ++i) out[i] = y[i];
   2054             else
   2055                for (i=0; i < z->s.img_x; ++i) *out++ = y[i], *out++ = 255;
   2056          }
   2057       }
   2058       cleanup_jpeg(z);
   2059       *out_x = z->s.img_x;
   2060       *out_y = z->s.img_y;
   2061       if (comp) *comp  = z->s.img_n; // report original components, not output
   2062       return output;
   2063    }
   2064 }
   2065 
   2066 #ifndef STBI_NO_STDIO
   2067 unsigned char *stbi_jpeg_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
   2068 {
   2069    jpeg j;
   2070    start_file(&j.s, f);
   2071    return load_jpeg_image(&j, x,y,comp,req_comp);
   2072 }
   2073 
   2074 unsigned char *stbi_jpeg_load(char const *filename, int *x, int *y, int *comp, int req_comp)
   2075 {
   2076    unsigned char *data;
   2077    FILE *f = fopen(filename, "rb");
   2078    if (!f) return NULL;
   2079    data = stbi_jpeg_load_from_file(f,x,y,comp,req_comp);
   2080    fclose(f);
   2081    return data;
   2082 }
   2083 #endif
   2084 
   2085 unsigned char *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
   2086 {
   2087    #ifdef STBI_SMALL_STACK
   2088    unsigned char *result;
   2089    jpeg *j = MALLOC(sizeof(*j));
   2090    start_mem(&j->s, buffer, len);
   2091    result = load_jpeg_image(j,x,y,comp,req_comp);
   2092    FREE(j);
   2093    return result;
   2094    #else
   2095    jpeg j;
   2096    start_mem(&j.s, buffer,len);
   2097    return load_jpeg_image(&j, x,y,comp,req_comp);
   2098    #endif
   2099 }
   2100 
   2101 static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp)
   2102 {
   2103    if (!decode_jpeg_header(j, SCAN_header))
   2104       return 0;
   2105    if (x) *x = j->s.img_x;
   2106    if (y) *y = j->s.img_y;
   2107    if (comp) *comp = j->s.img_n;
   2108    return 1;
   2109 }
   2110 
   2111 #ifndef STBI_NO_STDIO
   2112 int stbi_jpeg_test_file(FILE *f)
   2113 {
   2114    int n,r;
   2115    jpeg j;
   2116    n = ftell(f);
   2117    start_file(&j.s, f);
   2118    r = decode_jpeg_header(&j, SCAN_type);
   2119    fseek(f,n,SEEK_SET);
   2120    return r;
   2121 }
   2122 
   2123 int stbi_jpeg_info_from_file(FILE *f, int *x, int *y, int *comp)
   2124 {
   2125     jpeg j;
   2126     long n = ftell(f);
   2127     int res;
   2128     start_file(&j.s, f);
   2129     res = stbi_jpeg_info_raw(&j, x, y, comp);
   2130     fseek(f, n, SEEK_SET);
   2131     return res;
   2132 }
   2133 
   2134 int stbi_jpeg_info(char const *filename, int *x, int *y, int *comp)
   2135 {
   2136     FILE *f = fopen(filename, "rb");
   2137     int result;
   2138     if (!f) return e("can't fopen", "Unable to open file");
   2139     result = stbi_jpeg_info_from_file(f, x, y, comp);
   2140     fclose(f);
   2141     return result;
   2142 }
   2143 #endif
   2144 
   2145 int stbi_jpeg_test_memory(stbi_uc const *buffer, int len)
   2146 {
   2147    jpeg j;
   2148    start_mem(&j.s, buffer,len);
   2149    return decode_jpeg_header(&j, SCAN_type);
   2150 }
   2151 
   2152 int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
   2153 {
   2154     jpeg j;
   2155     start_mem(&j.s, buffer, len);
   2156     return stbi_jpeg_info_raw(&j, x, y, comp);
   2157 }
   2158 
   2159 #ifndef STBI_NO_STDIO
   2160 extern int      stbi_jpeg_info            (char const *filename,           int *x, int *y, int *comp);
   2161 extern int      stbi_jpeg_info_from_file  (FILE *f,                  int *x, int *y, int *comp);
   2162 #endif
   2163 extern int      stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
   2164 
   2165 // public domain zlib decode    v0.2  Sean Barrett 2006-11-18
   2166 //    simple implementation
   2167 //      - all input must be provided in an upfront buffer
   2168 //      - all output is written to a single output buffer (can malloc/realloc)
   2169 //    performance
   2170 //      - fast huffman
   2171 
   2172 // fast-way is faster to check than jpeg huffman, but slow way is slower
   2173 #define ZFAST_BITS  9 // accelerate all cases in default tables
   2174 #define ZFAST_MASK  ((1 << ZFAST_BITS) - 1)
   2175 
   2176 // zlib-style huffman encoding
   2177 // (jpegs packs from left, zlib from right, so can't share code)
   2178 typedef struct
   2179 {
   2180    uint16 fast[1 << ZFAST_BITS];
   2181    uint16 firstcode[16];
   2182    int maxcode[17];
   2183    uint16 firstsymbol[16];
   2184    uint8  size[288];
   2185    uint16 value[288];
   2186 } zhuffman;
   2187 
   2188 __forceinline static int bitreverse16(int n)
   2189 {
   2190   n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);
   2191   n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);
   2192   n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);
   2193   n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);
   2194   return n;
   2195 }
   2196 
   2197 __forceinline static int bit_reverse(int v, int bits)
   2198 {
   2199    assert(bits <= 16);
   2200    // to bit reverse n bits, reverse 16 and shift
   2201    // e.g. 11 bits, bit reverse and shift away 5
   2202    return bitreverse16(v) >> (16-bits);
   2203 }
   2204 
   2205 static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num)
   2206 {
   2207    int i,k=0;
   2208    int code, next_code[16], sizes[17];
   2209 
   2210    // DEFLATE spec for generating codes
   2211    memset(sizes, 0, sizeof(sizes));
   2212    memset(z->fast, 255, sizeof(z->fast));
   2213    for (i=0; i < num; ++i)
   2214       ++sizes[sizelist[i]];
   2215    sizes[0] = 0;
   2216    for (i=1; i < 16; ++i)
   2217       assert(sizes[i] <= (1 << i));
   2218    code = 0;
   2219    for (i=1; i < 16; ++i) {
   2220       next_code[i] = code;
   2221       z->firstcode[i] = (uint16) code;
   2222       z->firstsymbol[i] = (uint16) k;
   2223       code = (code + sizes[i]);
   2224       if (sizes[i])
   2225          if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG");
   2226       z->maxcode[i] = code << (16-i); // preshift for inner loop
   2227       code <<= 1;
   2228       k += sizes[i];
   2229    }
   2230    z->maxcode[16] = 0x10000; // sentinel
   2231    for (i=0; i < num; ++i) {
   2232       int s = sizelist[i];
   2233       if (s) {
   2234          int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
   2235          z->size[c] = (uint8)s;
   2236          z->value[c] = (uint16)i;
   2237          if (s <= ZFAST_BITS) {
   2238             int m = bit_reverse(next_code[s],s);
   2239             while (m < (1 << ZFAST_BITS)) {
   2240                z->fast[m] = (uint16) c;
   2241                m += (1 << s);
   2242             }
   2243          }
   2244          ++next_code[s];
   2245       }
   2246    }
   2247    return 1;
   2248 }
   2249 
   2250 // zlib-from-memory implementation for PNG reading
   2251 //    because PNG allows splitting the zlib stream arbitrarily,
   2252 //    and it's annoying structurally to have PNG call ZLIB call PNG,
   2253 //    we require PNG read all the IDATs and combine them into a single
   2254 //    memory buffer
   2255 
   2256 typedef struct
   2257 {
   2258    uint8 const *zbuffer, *zbuffer_end;
   2259    int num_bits;
   2260    uint32 code_buffer;
   2261 
   2262    char *zout;
   2263    char *zout_start;
   2264    char *zout_end;
   2265    int   z_expandable;
   2266 
   2267    zhuffman z_length, z_distance;
   2268 } zbuf;
   2269 
   2270 __forceinline static int zget8(zbuf *z)
   2271 {
   2272    if (z->zbuffer >= z->zbuffer_end) return 0;
   2273    return *z->zbuffer++;
   2274 }
   2275 
   2276 static void fill_bits(zbuf *z)
   2277 {
   2278    do {
   2279       assert(z->code_buffer < (1U << z->num_bits));
   2280       z->code_buffer |= zget8(z) << z->num_bits;
   2281       z->num_bits += 8;
   2282    } while (z->num_bits <= 24);
   2283 }
   2284 
   2285 __forceinline static unsigned int zreceive(zbuf *z, int n)
   2286 {
   2287    unsigned int k;
   2288    if (z->num_bits < n) fill_bits(z);
   2289    k = z->code_buffer & ((1 << n) - 1);
   2290    z->code_buffer >>= n;
   2291    z->num_bits -= n;
   2292    return k;
   2293 }
   2294 
   2295 __forceinline static int zhuffman_decode(zbuf *a, zhuffman *z)
   2296 {
   2297    int b,s,k;
   2298    if (a->num_bits < 16) fill_bits(a);
   2299    b = z->fast[a->code_buffer & ZFAST_MASK];
   2300    if (b < 0xffff) {
   2301       s = z->size[b];
   2302       a->code_buffer >>= s;
   2303       a->num_bits -= s;
   2304       return z->value[b];
   2305    }
   2306 
   2307    // not resolved by fast table, so compute it the slow way
   2308    // use jpeg approach, which requires MSbits at top
   2309    k = bit_reverse(a->code_buffer, 16);
   2310    for (s=ZFAST_BITS+1; ; ++s)
   2311       if (k < z->maxcode[s])
   2312          break;
   2313    if (s == 16) return -1; // invalid code!
   2314    // code size is s, so:
   2315    b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
   2316    assert(z->size[b] == s);
   2317    a->code_buffer >>= s;
   2318    a->num_bits -= s;
   2319    return z->value[b];
   2320 }
   2321 
   2322 static int expand(zbuf *z, int n)  // need to make room for n bytes
   2323 {
   2324    char *q;
   2325    int cur, limit;
   2326    if (!z->z_expandable) return e("output buffer limit","Corrupt PNG");
   2327    cur   = (int) (z->zout     - z->zout_start);
   2328    limit = (int) (z->zout_end - z->zout_start);
   2329    while (cur + n > limit)
   2330       limit *= 2;
   2331    q = (char *) REALLOC(z->zout_start, limit);
   2332    if (q == NULL) return e("outofmem", "Out of memory");
   2333    z->zout_start = q;
   2334    z->zout       = q + cur;
   2335    z->zout_end   = q + limit;
   2336    return 1;
   2337 }
   2338 
   2339 static int length_base[31] = {
   2340    3,4,5,6,7,8,9,10,11,13,
   2341    15,17,19,23,27,31,35,43,51,59,
   2342    67,83,99,115,131,163,195,227,258,0,0 };
   2343 
   2344 static int length_extra[31]=
   2345 { 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 };
   2346 
   2347 static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
   2348 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
   2349 
   2350 static int dist_extra[32] =
   2351 { 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};
   2352 
   2353 static int parse_huffman_block(zbuf *a)
   2354 {
   2355    for(;;) {
   2356       int z = zhuffman_decode(a, &a->z_length);
   2357       if (z < 256) {
   2358          if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes
   2359          if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0;
   2360          *a->zout++ = (char) z;
   2361       } else {
   2362          uint8 *p;
   2363          int len,dist;
   2364          if (z == 256) return 1;
   2365          z -= 257;
   2366          len = length_base[z];
   2367          if (length_extra[z]) len += zreceive(a, length_extra[z]);
   2368          z = zhuffman_decode(a, &a->z_distance);
   2369          if (z < 0) return e("bad huffman code","Corrupt PNG");
   2370          dist = dist_base[z];
   2371          if (dist_extra[z]) dist += zreceive(a, dist_extra[z]);
   2372          if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG");
   2373          if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0;
   2374          p = (uint8 *) (a->zout - dist);
   2375          while (len--)
   2376             *a->zout++ = *p++;
   2377       }
   2378    }
   2379 }
   2380 
   2381 static int compute_huffman_codes(zbuf *a)
   2382 {
   2383    static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
   2384    zhuffman z_codelength;
   2385    uint8 lencodes[286+32+137];//padding for maximum single op
   2386    uint8 codelength_sizes[19];
   2387    int i,n;
   2388 
   2389    int hlit  = zreceive(a,5) + 257;
   2390    int hdist = zreceive(a,5) + 1;
   2391    int hclen = zreceive(a,4) + 4;
   2392 
   2393    memset(codelength_sizes, 0, sizeof(codelength_sizes));
   2394    for (i=0; i < hclen; ++i) {
   2395       int s = zreceive(a,3);
   2396       codelength_sizes[length_dezigzag[i]] = (uint8) s;
   2397    }
   2398    if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
   2399 
   2400    n = 0;
   2401    while (n < hlit + hdist) {
   2402       int c = zhuffman_decode(a, &z_codelength);
   2403       assert(c >= 0 && c < 19);
   2404       if (c < 16)
   2405          lencodes[n++] = (uint8) c;
   2406       else if (c == 16) {
   2407          c = zreceive(a,2)+3;
   2408          memset(lencodes+n, lencodes[n-1], c);
   2409          n += c;
   2410       } else if (c == 17) {
   2411          c = zreceive(a,3)+3;
   2412          memset(lencodes+n, 0, c);
   2413          n += c;
   2414       } else {
   2415          assert(c == 18);
   2416          c = zreceive(a,7)+11;
   2417          memset(lencodes+n, 0, c);
   2418          n += c;
   2419       }
   2420    }
   2421    if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG");
   2422    if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
   2423    if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
   2424    return 1;
   2425 }
   2426 
   2427 static int parse_uncompressed_block(zbuf *a)
   2428 {
   2429    uint8 header[4];
   2430    int len,nlen,k;
   2431    if (a->num_bits & 7)
   2432       zreceive(a, a->num_bits & 7); // discard
   2433    // drain the bit-packed data into header
   2434    k = 0;
   2435    while (a->num_bits > 0) {
   2436       header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns?
   2437       a->code_buffer >>= 8;
   2438       a->num_bits -= 8;
   2439    }
   2440    assert(a->num_bits == 0);
   2441    // now fill header the normal way
   2442    while (k < 4)
   2443       header[k++] = (uint8) zget8(a);
   2444    len  = header[1] * 256 + header[0];
   2445    nlen = header[3] * 256 + header[2];
   2446    if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG");
   2447    if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG");
   2448    if (a->zout + len > a->zout_end)
   2449       if (!expand(a, len)) return 0;
   2450    memcpy(a->zout, a->zbuffer, len);
   2451    a->zbuffer += len;
   2452    a->zout += len;
   2453    return 1;
   2454 }
   2455 
   2456 static int parse_zlib_header(zbuf *a)
   2457 {
   2458    int cmf   = zget8(a);
   2459    int cm    = cmf & 15;
   2460    /* int cinfo = cmf >> 4; */
   2461    int flg   = zget8(a);
   2462    if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec
   2463    if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
   2464    if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png
   2465    // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
   2466    return 1;
   2467 }
   2468 
   2469 // @TODO: should statically initialize these for optimal thread safety
   2470 static uint8 default_length[288], default_distance[32];
   2471 static void init_defaults(void)
   2472 {
   2473    int i;   // use <= to match clearly with spec
   2474    for (i=0; i <= 143; ++i)     default_length[i]   = 8;
   2475    for (   ; i <= 255; ++i)     default_length[i]   = 9;
   2476    for (   ; i <= 279; ++i)     default_length[i]   = 7;
   2477    for (   ; i <= 287; ++i)     default_length[i]   = 8;
   2478 
   2479    for (i=0; i <=  31; ++i)     default_distance[i] = 5;
   2480 }
   2481 
   2482 int stbi_png_partial; // a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead
   2483 static int parse_zlib(zbuf *a, int parse_header)
   2484 {
   2485    int final, type;
   2486    if (parse_header)
   2487       if (!parse_zlib_header(a)) return 0;
   2488    a->num_bits = 0;
   2489    a->code_buffer = 0;
   2490    do {
   2491       final = zreceive(a,1);
   2492       type = zreceive(a,2);
   2493       if (type == 0) {
   2494          if (!parse_uncompressed_block(a)) return 0;
   2495       } else if (type == 3) {
   2496          return 0;
   2497       } else {
   2498          if (type == 1) {
   2499             // use fixed code lengths
   2500             if (!default_distance[31]) init_defaults();
   2501             if (!zbuild_huffman(&a->z_length  , default_length  , 288)) return 0;
   2502             if (!zbuild_huffman(&a->z_distance, default_distance,  32)) return 0;
   2503          } else {
   2504             if (!compute_huffman_codes(a)) return 0;
   2505          }
   2506          if (!parse_huffman_block(a)) return 0;
   2507       }
   2508       if (stbi_png_partial && a->zout - a->zout_start > 65536)
   2509          break;
   2510    } while (!final);
   2511    return 1;
   2512 }
   2513 
   2514 static int do_zlib(zbuf *a, char *obuf, int olen, int exp, int parse_header)
   2515 {
   2516    a->zout_start = obuf;
   2517    a->zout       = obuf;
   2518    a->zout_end   = obuf + olen;
   2519    a->z_expandable = exp;
   2520 
   2521    return parse_zlib(a, parse_header);
   2522 }
   2523 
   2524 char *stbi_zlib_decode_malloc_guesssize(const char * buffer, int len, int initial_size, int *outlen)
   2525 {
   2526    zbuf a;
   2527    char *p = MALLOC(initial_size);
   2528    if (p == NULL) return NULL;
   2529    a.zbuffer = (uint8 const *) buffer;
   2530    a.zbuffer_end = (uint8 const *) buffer + len;
   2531    if (do_zlib(&a, p, initial_size, 1, 1)) {
   2532       if (outlen) *outlen = (int) (a.zout - a.zout_start);
   2533       return a.zout_start;
   2534    } else {
   2535       FREE(a.zout_start);
   2536       return NULL;
   2537    }
   2538 }
   2539 
   2540 char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
   2541 {
   2542    return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
   2543 }
   2544 
   2545 char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
   2546 {
   2547    zbuf a;
   2548    char *p = MALLOC(initial_size);
   2549    if (p == NULL) return NULL;
   2550    a.zbuffer = (uint8 const *) buffer;
   2551    a.zbuffer_end = (uint8 const *) buffer + len;
   2552    if (do_zlib(&a, p, initial_size, 1, parse_header)) {
   2553       if (outlen) *outlen = (int) (a.zout - a.zout_start);
   2554       return a.zout_start;
   2555    } else {
   2556       FREE(a.zout_start);
   2557       return NULL;
   2558    }
   2559 }
   2560 
   2561 int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
   2562 {
   2563    zbuf a;
   2564    a.zbuffer = (uint8 const *) ibuffer;
   2565    a.zbuffer_end = (uint8 const *) ibuffer + ilen;
   2566    if (do_zlib(&a, obuffer, olen, 0, 1))
   2567       return (int) (a.zout - a.zout_start);
   2568    else
   2569       return -1;
   2570 }
   2571 
   2572 char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
   2573 {
   2574    zbuf a;
   2575    char *p = MALLOC(16384);
   2576    if (p == NULL) return NULL;
   2577    a.zbuffer = (uint8 const *) buffer;
   2578    a.zbuffer_end = (uint8 const *) buffer+len;
   2579    if (do_zlib(&a, p, 16384, 1, 0)) {
   2580       if (outlen) *outlen = (int) (a.zout - a.zout_start);
   2581       return a.zout_start;
   2582    } else {
   2583       FREE(a.zout_start);
   2584       return NULL;
   2585    }
   2586 }
   2587 
   2588 int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
   2589 {
   2590    zbuf a;
   2591    a.zbuffer = (uint8 const *) ibuffer;
   2592    a.zbuffer_end = (uint8 const *) ibuffer + ilen;
   2593    if (do_zlib(&a, obuffer, olen, 0, 0))
   2594       return (int) (a.zout - a.zout_start);
   2595    else
   2596       return -1;
   2597 }
   2598 
   2599 // public domain "baseline" PNG decoder   v0.10  Sean Barrett 2006-11-18
   2600 //    simple implementation
   2601 //      - only 8-bit samples
   2602 //      - no CRC checking
   2603 //      - allocates lots of intermediate memory
   2604 //        - avoids problem of streaming data between subsystems
   2605 //        - avoids explicit window management
   2606 //    performance
   2607 //      - uses stb_zlib, a PD zlib implementation with fast huffman decoding
   2608 
   2609 
   2610 typedef struct
   2611 {
   2612    uint32 length;
   2613    uint32 type;
   2614 } chunk;
   2615 
   2616 #define PNG_TYPE(a,b,c,d)  (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
   2617 
   2618 static chunk get_chunk_header(stbi *s)
   2619 {
   2620    chunk c;
   2621    c.length = get32(s);
   2622    c.type   = get32(s);
   2623    return c;
   2624 }
   2625 
   2626 static int check_png_header(stbi *s)
   2627 {
   2628    static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 };
   2629    int i;
   2630    for (i=0; i < 8; ++i)
   2631       if (get8(s) != png_sig[i]) return e("bad png sig","Not a PNG");
   2632    return 1;
   2633 }
   2634 
   2635 typedef struct
   2636 {
   2637    stbi s;
   2638    uint8 *idata, *expanded, *out;
   2639 } png;
   2640 
   2641 
   2642 enum {
   2643    F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4,
   2644    F_avg_first, F_paeth_first
   2645 };
   2646 
   2647 static uint8 first_row_filter[5] =
   2648 {
   2649    F_none, F_sub, F_none, F_avg_first, F_paeth_first
   2650 };
   2651 
   2652 static int paeth(int a, int b, int c)
   2653 {
   2654    int p = a + b - c;
   2655    int pa = abs(p-a);
   2656    int pb = abs(p-b);
   2657    int pc = abs(p-c);
   2658    if (pa <= pb && pa <= pc) return a;
   2659    if (pb <= pc) return b;
   2660    return c;
   2661 }
   2662 
   2663 // create the png data from post-deflated data
   2664 static int create_png_image_raw(png *a, uint8 *raw, uint32 raw_len, int out_n, uint32 x, uint32 y)
   2665 {
   2666    stbi *s = &a->s;
   2667    uint32 i,j,stride = x*out_n;
   2668    int k;
   2669    int img_n = s->img_n; // copy it into a local for later
   2670    assert(out_n == s->img_n || out_n == s->img_n+1);
   2671    if (stbi_png_partial) y = 1;
   2672    a->out = MALLOC(x * y * out_n);
   2673    if (!a->out) return e("outofmem", "Out of memory");
   2674    if (!stbi_png_partial) {
   2675       if (s->img_x == x && s->img_y == y) {
   2676          if (raw_len != (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG");
   2677       } else { // interlaced:
   2678          if (raw_len < (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG");
   2679       }
   2680    }
   2681    for (j=0; j < y; ++j) {
   2682       uint8 *cur = a->out + stride*j;
   2683       uint8 *prior = cur - stride;
   2684       int filter = *raw++;
   2685       if (filter > 4) return e("invalid filter","Corrupt PNG");
   2686       // if first row, use special filter that doesn't sample previous row
   2687       if (j == 0) filter = first_row_filter[filter];
   2688       // handle first pixel explicitly
   2689       for (k=0; k < img_n; ++k) {
   2690          switch (filter) {
   2691             case F_none       : cur[k] = raw[k]; break;
   2692             case F_sub        : cur[k] = raw[k]; break;
   2693             case F_up         : cur[k] = raw[k] + prior[k]; break;
   2694             case F_avg        : cur[k] = raw[k] + (prior[k]>>1); break;
   2695             case F_paeth      : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break;
   2696             case F_avg_first  : cur[k] = raw[k]; break;
   2697             case F_paeth_first: cur[k] = raw[k]; break;
   2698          }
   2699       }
   2700       if (img_n != out_n) cur[img_n] = 255;
   2701       raw += img_n;
   2702       cur += out_n;
   2703       prior += out_n;
   2704       // this is a little gross, so that we don't switch per-pixel or per-component
   2705       if (img_n == out_n) {
   2706          #define CASE(f) \
   2707              case f:     \
   2708                 for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \
   2709                    for (k=0; k < img_n; ++k)
   2710          switch (filter) {
   2711             CASE(F_none)  cur[k] = raw[k];
   2712 		break;
   2713             CASE(F_sub)   cur[k] = raw[k] + cur[k-img_n];
   2714 		break;
   2715             CASE(F_up)    cur[k] = raw[k] + prior[k];
   2716 		break;
   2717             CASE(F_avg)   cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1);
   2718 		break;
   2719             CASE(F_paeth)  cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n]));
   2720 		break;
   2721             CASE(F_avg_first)    cur[k] = raw[k] + (cur[k-img_n] >> 1);
   2722 		break;
   2723             CASE(F_paeth_first)  cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0));
   2724 		break;
   2725          }
   2726          #undef CASE
   2727       } else {
   2728          assert(img_n+1 == out_n);
   2729          #define CASE(f) \
   2730              case f:     \
   2731                 for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
   2732                    for (k=0; k < img_n; ++k)
   2733          switch (filter) {
   2734             CASE(F_none)  cur[k] = raw[k];
   2735 		break;
   2736             CASE(F_sub)   cur[k] = raw[k] + cur[k-out_n];
   2737 		break;
   2738             CASE(F_up)    cur[k] = raw[k] + prior[k];
   2739 		break;
   2740             CASE(F_avg)   cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1);
   2741 		break;
   2742             CASE(F_paeth)  cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n]));
   2743 		break;
   2744             CASE(F_avg_first)    cur[k] = raw[k] + (cur[k-out_n] >> 1);
   2745 		break;
   2746             CASE(F_paeth_first)  cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0));
   2747 		break;
   2748          }
   2749          #undef CASE
   2750       }
   2751    }
   2752    return 1;
   2753 }
   2754 
   2755 static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n, int interlaced)
   2756 {
   2757    uint8 *final;
   2758    int p;
   2759    int save;
   2760    if (!interlaced)
   2761       return create_png_image_raw(a, raw, raw_len, out_n, a->s.img_x, a->s.img_y);
   2762    save = stbi_png_partial;
   2763    stbi_png_partial = 0;
   2764 
   2765    // de-interlacing
   2766    final = MALLOC(a->s.img_x * a->s.img_y * out_n);
   2767    for (p=0; p < 7; ++p) {
   2768       int xorig[] = { 0,4,0,2,0,1,0 };
   2769       int yorig[] = { 0,0,4,0,2,0,1 };
   2770       int xspc[]  = { 8,8,4,4,2,2,1 };
   2771       int yspc[]  = { 8,8,8,4,4,2,2 };
   2772       int i,j,x,y;
   2773       // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
   2774       x = (a->s.img_x - xorig[p] + xspc[p]-1) / xspc[p];
   2775       y = (a->s.img_y - yorig[p] + yspc[p]-1) / yspc[p];
   2776       if (x && y) {
   2777          if (!create_png_image_raw(a, raw, raw_len, out_n, x, y)) {
   2778             FREE(final);
   2779             return 0;
   2780          }
   2781          for (j=0; j < y; ++j)
   2782             for (i=0; i < x; ++i)
   2783                memcpy(final + (j*yspc[p]+yorig[p])*a->s.img_x*out_n + (i*xspc[p]+xorig[p])*out_n,
   2784                       a->out + (j*x+i)*out_n, out_n);
   2785          FREE(a->out);
   2786          raw += (x*out_n+1)*y;
   2787          raw_len -= (x*out_n+1)*y;
   2788       }
   2789    }
   2790    a->out = final;
   2791 
   2792    stbi_png_partial = save;
   2793    return 1;
   2794 }
   2795 
   2796 static int compute_transparency(png *z, uint8 tc[3], int out_n)
   2797 {
   2798    stbi *s = &z->s;
   2799    uint32 i, pixel_count = s->img_x * s->img_y;
   2800    uint8 *p = z->out;
   2801 
   2802    // compute color-based transparency, assuming we've
   2803    // already got 255 as the alpha value in the output
   2804    assert(out_n == 2 || out_n == 4);
   2805 
   2806    if (out_n == 2) {
   2807       for (i=0; i < pixel_count; ++i) {
   2808          p[1] = (p[0] == tc[0] ? 0 : 255);
   2809          p += 2;
   2810       }
   2811    } else {
   2812       for (i=0; i < pixel_count; ++i) {
   2813          if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
   2814             p[3] = 0;
   2815          p += 4;
   2816       }
   2817    }
   2818    return 1;
   2819 }
   2820 
   2821 static int expand_palette(png *a, uint8 *palette, int len, int pal_img_n)
   2822 {
   2823    uint32 i, pixel_count = a->s.img_x * a->s.img_y;
   2824    uint8 *p, *temp_out, *orig = a->out;
   2825 
   2826    p = MALLOC(pixel_count * pal_img_n);
   2827    if (p == NULL) return e("outofmem", "Out of memory");
   2828 
   2829    // between here and FREE(out) below, exiting would leak
   2830    temp_out = p;
   2831 
   2832    if (pal_img_n == 3) {
   2833       for (i=0; i < pixel_count; ++i) {
   2834          int n = orig[i]*4;
   2835          p[0] = palette[n  ];
   2836          p[1] = palette[n+1];
   2837          p[2] = palette[n+2];
   2838          p += 3;
   2839       }
   2840    } else {
   2841       for (i=0; i < pixel_count; ++i) {
   2842          int n = orig[i]*4;
   2843          p[0] = palette[n  ];
   2844          p[1] = palette[n+1];
   2845          p[2] = palette[n+2];
   2846          p[3] = palette[n+3];
   2847          p += 4;
   2848       }
   2849    }
   2850    FREE(a->out);
   2851    a->out = temp_out;
   2852 
   2853    STBI_NOTUSED(len);
   2854 
   2855    return 1;
   2856 }
   2857 
   2858 static int stbi_unpremultiply_on_load = 0;
   2859 static int stbi_de_iphone_flag = 0;
   2860 
   2861 void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
   2862 {
   2863    stbi_unpremultiply_on_load = flag_true_if_should_unpremultiply;
   2864 }
   2865 void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
   2866 {
   2867    stbi_de_iphone_flag = flag_true_if_should_convert;
   2868 }
   2869 
   2870 static void stbi_de_iphone(png *z)
   2871 {
   2872    stbi *s = &z->s;
   2873    uint32 i, pixel_count = s->img_x * s->img_y;
   2874    uint8 *p = z->out;
   2875 
   2876    if (s->img_out_n == 3) {  // convert bgr to rgb
   2877       for (i=0; i < pixel_count; ++i) {
   2878          uint8 t = p[0];
   2879          p[0] = p[2];
   2880          p[2] = t;
   2881          p += 3;
   2882       }
   2883    } else {
   2884       assert(s->img_out_n == 4);
   2885       if (stbi_unpremultiply_on_load) {
   2886          // convert bgr to rgb and unpremultiply
   2887          for (i=0; i < pixel_count; ++i) {
   2888             uint8 a = p[3];
   2889             uint8 t = p[0];
   2890             if (a) {
   2891                p[0] = p[2] * 255 / a;
   2892                p[1] = p[1] * 255 / a;
   2893                p[2] =  t   * 255 / a;
   2894             } else {
   2895                p[0] = p[2];
   2896                p[2] = t;
   2897             }
   2898             p += 4;
   2899          }
   2900       } else {
   2901          // convert bgr to rgb
   2902          for (i=0; i < pixel_count; ++i) {
   2903             uint8 t = p[0];
   2904             p[0] = p[2];
   2905             p[2] = t;
   2906             p += 4;
   2907          }
   2908       }
   2909    }
   2910 }
   2911 
   2912 static int parse_png_file(png *z, int scan, int req_comp)
   2913 {
   2914    uint8 palette[1024], pal_img_n=0;
   2915    uint8 has_trans=0, tc[3];
   2916    uint32 ioff=0, idata_limit=0, i, pal_len=0;
   2917    int first=1,k,interlace=0, iphone=0;
   2918    stbi *s = &z->s;
   2919 
   2920    if (!check_png_header(s)) return 0;
   2921 
   2922    if (scan == SCAN_type) return 1;
   2923 
   2924    for (;;) {
   2925       chunk c = get_chunk_header(s);
   2926       switch (c.type) {
   2927          case PNG_TYPE('C','g','B','I'):
   2928             iphone = stbi_de_iphone_flag;
   2929             skip(s, c.length);
   2930             break;
   2931          case PNG_TYPE('I','H','D','R'): {
   2932             int depth,color,comp,filter;
   2933             if (!first) return e("multiple IHDR","Corrupt PNG");
   2934             first = 0;
   2935             if (c.length != 13) return e("bad IHDR len","Corrupt PNG");
   2936             s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)");
   2937             s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)");
   2938             depth = get8(s);  if (depth != 8)        return e("8bit only","PNG not supported: 8-bit only");
   2939             color = get8(s);  if (color > 6)         return e("bad ctype","Corrupt PNG");
   2940             if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG");
   2941             comp  = get8(s);  if (comp) return e("bad comp method","Corrupt PNG");
   2942             filter= get8(s);  if (filter) return e("bad filter method","Corrupt PNG");
   2943             interlace = get8(s); if (interlace>1) return e("bad interlace method","Corrupt PNG");
   2944             if (!s->img_x || !s->img_y) return e("0-pixel image","Corrupt PNG");
   2945             if (!pal_img_n) {
   2946                s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
   2947                if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode");
   2948                if (scan == SCAN_header) return 1;
   2949             } else {
   2950                // if paletted, then pal_n is our final components, and
   2951                // img_n is # components to decompress/filter.
   2952                s->img_n = 1;
   2953                if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG");
   2954                // if SCAN_header, have to scan to see if we have a tRNS
   2955             }
   2956             break;
   2957          }
   2958 
   2959          case PNG_TYPE('P','L','T','E'):  {
   2960             if (first) return e("first not IHDR", "Corrupt PNG");
   2961             if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG");
   2962             pal_len = c.length / 3;
   2963             if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG");
   2964             for (i=0; i < pal_len; ++i) {
   2965                palette[i*4+0] = get8u(s);
   2966                palette[i*4+1] = get8u(s);
   2967                palette[i*4+2] = get8u(s);
   2968                palette[i*4+3] = 255;
   2969             }
   2970             break;
   2971          }
   2972 
   2973          case PNG_TYPE('t','R','N','S'): {
   2974             if (first) return e("first not IHDR", "Corrupt PNG");
   2975             if (z->idata) return e("tRNS after IDAT","Corrupt PNG");
   2976             if (pal_img_n) {
   2977                if (scan == SCAN_header) { s->img_n = 4; return 1; }
   2978                if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG");
   2979                if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG");
   2980                pal_img_n = 4;
   2981                for (i=0; i < c.length; ++i)
   2982                   palette[i*4+3] = get8u(s);
   2983             } else {
   2984                if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG");
   2985                if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG");
   2986                has_trans = 1;
   2987                for (k=0; k < s->img_n; ++k)
   2988                   tc[k] = (uint8) get16(s); // non 8-bit images will be larger
   2989             }
   2990             break;
   2991          }
   2992 
   2993          case PNG_TYPE('I','D','A','T'): {
   2994             if (first) return e("first not IHDR", "Corrupt PNG");
   2995             if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG");
   2996             if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; }
   2997             if (ioff + c.length > idata_limit) {
   2998                uint8 *p;
   2999                if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
   3000                while (ioff + c.length > idata_limit)
   3001                   idata_limit *= 2;
   3002                p = (uint8 *) REALLOC(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory");
   3003                z->idata = p;
   3004             }
   3005             if (!getn(s, z->idata+ioff,c.length)) return e("outofdata","Corrupt PNG");
   3006             ioff += c.length;
   3007             break;
   3008          }
   3009 
   3010          case PNG_TYPE('I','E','N','D'): {
   3011             uint32 raw_len;
   3012             if (first) return e("first not IHDR", "Corrupt PNG");
   3013             if (scan != SCAN_load) return 1;
   3014             if (z->idata == NULL) return e("no IDAT","Corrupt PNG");
   3015             z->expanded = (uint8 *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !iphone);
   3016             if (z->expanded == NULL) return 0; // zlib should set error
   3017             FREE(z->idata); z->idata = NULL;
   3018             if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
   3019                s->img_out_n = s->img_n+1;
   3020             else
   3021                s->img_out_n = s->img_n;
   3022             if (!create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0;
   3023             if (has_trans)
   3024                if (!compute_transparency(z, tc, s->img_out_n)) return 0;
   3025             if (iphone && s->img_out_n > 2)
   3026                stbi_de_iphone(z);
   3027             if (pal_img_n) {
   3028                // pal_img_n == 3 or 4
   3029                s->img_n = pal_img_n; // record the actual colors we had
   3030                s->img_out_n = pal_img_n;
   3031                if (req_comp >= 3) s->img_out_n = req_comp;
   3032                if (!expand_palette(z, palette, pal_len, s->img_out_n))
   3033                   return 0;
   3034             }
   3035             FREE(z->expanded); z->expanded = NULL;
   3036             return 1;
   3037          }
   3038 
   3039          default:
   3040             // if critical, fail
   3041             if (first) return e("first not IHDR", "Corrupt PNG");
   3042             if ((c.type & (1 << 29)) == 0) {
   3043                #ifndef STBI_NO_FAILURE_STRINGS
   3044                // not threadsafe
   3045                static char invalid_chunk[] = "XXXX chunk not known";
   3046                invalid_chunk[0] = (uint8) (c.type >> 24);
   3047                invalid_chunk[1] = (uint8) (c.type >> 16);
   3048                invalid_chunk[2] = (uint8) (c.type >>  8);
   3049                invalid_chunk[3] = (uint8) (c.type >>  0);
   3050                #endif
   3051                return e(invalid_chunk, "PNG not supported: unknown chunk type");
   3052             }
   3053             skip(s, c.length);
   3054             break;
   3055       }
   3056       // end of chunk, read and skip CRC
   3057       get32(s);
   3058    }
   3059 }
   3060 
   3061 static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp)
   3062 {
   3063    unsigned char *result=NULL;
   3064    p->expanded = NULL;
   3065    p->idata = NULL;
   3066    p->out = NULL;
   3067    if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error");
   3068    if (parse_png_file(p, SCAN_load, req_comp)) {
   3069       result = p->out;
   3070       p->out = NULL;
   3071       if (req_comp && req_comp != p->s.img_out_n) {
   3072          result = convert_format(result, p->s.img_out_n, req_comp, p->s.img_x, p->s.img_y);
   3073          p->s.img_out_n = req_comp;
   3074          if (result == NULL) return result;
   3075       }
   3076       *x = p->s.img_x;
   3077       *y = p->s.img_y;
   3078       if (n) *n = p->s.img_n;
   3079    }
   3080    FREE(p->expanded); p->expanded = NULL;
   3081    FREE(p->idata);    p->idata    = NULL;
   3082 
   3083    return result;
   3084 }
   3085 
   3086 #ifndef STBI_NO_STDIO
   3087 unsigned char *stbi_png_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
   3088 {
   3089    png p;
   3090    start_file(&p.s, f);
   3091    return do_png(&p, x,y,comp,req_comp);
   3092 }
   3093 
   3094 unsigned char *stbi_png_load(char const *filename, int *x, int *y, int *comp, int req_comp)
   3095 {
   3096    unsigned char *data;
   3097    FILE *f = fopen(filename, "rb");
   3098    if (!f) return NULL;
   3099    data = stbi_png_load_from_file(f,x,y,comp,req_comp);
   3100    fclose(f);
   3101    return data;
   3102 }
   3103 #endif
   3104 
   3105 unsigned char *stbi_png_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
   3106 {
   3107    png p;
   3108    start_mem(&p.s, buffer,len);
   3109    return do_png(&p, x,y,comp,req_comp);
   3110 }
   3111 
   3112 #ifndef STBI_NO_STDIO
   3113 int stbi_png_test_file(FILE *f)
   3114 {
   3115    png p;
   3116    int n,r;
   3117    n = ftell(f);
   3118    start_file(&p.s, f);
   3119    r = parse_png_file(&p, SCAN_type,STBI_default);
   3120    fseek(f,n,SEEK_SET);
   3121    return r;
   3122 }
   3123 #endif
   3124 
   3125 int stbi_png_test_memory(stbi_uc const *buffer, int len)
   3126 {
   3127    png p;
   3128    start_mem(&p.s, buffer, len);
   3129    return parse_png_file(&p, SCAN_type,STBI_default);
   3130 }
   3131 
   3132 static int stbi_png_info_raw(png *p, int *x, int *y, int *comp)
   3133 {
   3134    if (!parse_png_file(p, SCAN_header, 0))
   3135       return 0;
   3136    if (x) *x = p->s.img_x;
   3137    if (y) *y = p->s.img_y;
   3138    if (comp) *comp = p->s.img_n;
   3139    return 1;
   3140 }
   3141 
   3142 #ifndef STBI_NO_STDIO
   3143 int      stbi_png_info             (char const *filename,           int *x, int *y, int *comp)
   3144 {
   3145    int res;
   3146    FILE *f = fopen(filename, "rb");
   3147    if (!f) return 0;
   3148    res = stbi_png_info_from_file(f, x, y, comp);
   3149    fclose(f);
   3150    return res;
   3151 }
   3152 
   3153 int stbi_png_info_from_file(FILE *f, int *x, int *y, int *comp)
   3154 {
   3155    png p;
   3156    int res;
   3157    long n = ftell(f);
   3158    start_file(&p.s, f);
   3159    res = stbi_png_info_raw(&p, x, y, comp);
   3160    fseek(f, n, SEEK_SET);
   3161    return res;
   3162 }
   3163 #endif // !STBI_NO_STDIO
   3164 
   3165 int stbi_png_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
   3166 {
   3167    png p;
   3168    start_mem(&p.s, buffer, len);
   3169    return stbi_png_info_raw(&p, x, y, comp);
   3170 }
   3171 
   3172 // Microsoft/Windows BMP image
   3173 
   3174 static int bmp_test(stbi *s)
   3175 {
   3176    int sz;
   3177    if (get8(s) != 'B') return 0;
   3178    if (get8(s) != 'M') return 0;
   3179    get32le(s); // discard filesize
   3180    get16le(s); // discard reserved
   3181    get16le(s); // discard reserved
   3182    get32le(s); // discard data offset
   3183    sz = get32le(s);
   3184    if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1;
   3185    return 0;
   3186 }
   3187 
   3188 #ifndef STBI_NO_STDIO
   3189 int      stbi_bmp_test_file        (FILE *f)
   3190 {
   3191    stbi s;
   3192    int r,n = ftell(f);
   3193    start_file(&s,f);
   3194    r = bmp_test(&s);
   3195    fseek(f,n,SEEK_SET);
   3196    return r;
   3197 }
   3198 #endif
   3199 
   3200 int      stbi_bmp_test_memory      (stbi_uc const *buffer, int len)
   3201 {
   3202    stbi s;
   3203    start_mem(&s, buffer, len);
   3204    return bmp_test(&s);
   3205 }
   3206 
   3207 // returns 0..31 for the highest set bit
   3208 static int high_bit(unsigned int z)
   3209 {
   3210    int n=0;
   3211    if (z == 0) return -1;
   3212    if (z >= 0x10000) n += 16, z >>= 16;
   3213    if (z >= 0x00100) n +=  8, z >>=  8;
   3214    if (z >= 0x00010) n +=  4, z >>=  4;
   3215    if (z >= 0x00004) n +=  2, z >>=  2;
   3216    if (z >= 0x00002) n +=  1, z >>=  1;
   3217    return n;
   3218 }
   3219 
   3220 static int bitcount(unsigned int a)
   3221 {
   3222    a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2
   3223    a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4
   3224    a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
   3225    a = (a + (a >> 8)); // max 16 per 8 bits
   3226    a = (a + (a >> 16)); // max 32 per 8 bits
   3227    return a & 0xff;
   3228 }
   3229 
   3230 static int shiftsigned(int v, int shift, int bits)
   3231 {
   3232    int result;
   3233    int z=0;
   3234 
   3235    if (shift < 0) v <<= -shift;
   3236    else v >>= shift;
   3237    result = v;
   3238 
   3239    z = bits;
   3240    while (z < 8) {
   3241       result += v >> z;
   3242       z += bits;
   3243    }
   3244    return result;
   3245 }
   3246 
   3247 static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp)
   3248 {
   3249    uint8 *out;
   3250    unsigned int mr=0,mg=0,mb=0,ma=0;
   3251    stbi_uc pal[256][4];
   3252    int psize=0,i,j,compress=0,width;
   3253    int bpp, flip_vertically, pad, target, offset, hsz;
   3254    if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP");
   3255    get32le(s); // discard filesize
   3256    get16le(s); // discard reserved
   3257    get16le(s); // discard reserved
   3258    offset = get32le(s);
   3259    hsz = get32le(s);
   3260    if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown");
   3261    if (hsz == 12) {
   3262       s->img_x = get16le(s);
   3263       s->img_y = get16le(s);
   3264    } else {
   3265       s->img_x = get32le(s);
   3266       s->img_y = get32le(s);
   3267    }
   3268    if (get16le(s) != 1) return epuc("bad BMP", "bad BMP");
   3269    bpp = get16le(s);
   3270    if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit");
   3271    flip_vertically = ((int) s->img_y) > 0;
   3272    s->img_y = abs((int) s->img_y);
   3273    if (hsz == 12) {
   3274       if (bpp < 24)
   3275          psize = (offset - 14 - 24) / 3;
   3276    } else {
   3277       compress = get32le(s);
   3278       if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE");
   3279       get32le(s); // discard sizeof
   3280       get32le(s); // discard hres
   3281       get32le(s); // discard vres
   3282       get32le(s); // discard colorsused
   3283       get32le(s); // discard max important
   3284       if (hsz == 40 || hsz == 56) {
   3285          if (hsz == 56) {
   3286             get32le(s);
   3287             get32le(s);
   3288             get32le(s);
   3289             get32le(s);
   3290          }
   3291          if (bpp == 16 || bpp == 32) {
   3292             mr = mg = mb = 0;
   3293             if (compress == 0) {
   3294                if (bpp == 32) {
   3295                   mr = 0xffu << 16;
   3296                   mg = 0xffu <<  8;
   3297                   mb = 0xffu <<  0;
   3298                   ma = 0xffu << 24;
   3299                } else {
   3300                   mr = 31u << 10;
   3301                   mg = 31u <<  5;
   3302                   mb = 31u <<  0;
   3303                }
   3304             } else if (compress == 3) {
   3305                mr = get32le(s);
   3306                mg = get32le(s);
   3307                mb = get32le(s);
   3308                // not documented, but generated by photoshop and handled by mspaint
   3309                if (mr == mg && mg == mb) {
   3310                   // ?!?!?
   3311                   return epuc("bad BMP", "bad BMP");
   3312                }
   3313             } else
   3314                return epuc("bad BMP", "bad BMP");
   3315          }
   3316       } else {
   3317          assert(hsz == 108);
   3318          mr = get32le(s);
   3319          mg = get32le(s);
   3320          mb = get32le(s);
   3321          ma = get32le(s);
   3322          get32le(s); // discard color space
   3323          for (i=0; i < 12; ++i)
   3324             get32le(s); // discard color space parameters
   3325       }
   3326       if (bpp < 16)
   3327          psize = (offset - 14 - hsz) >> 2;
   3328    }
   3329    s->img_n = ma ? 4 : 3;
   3330    if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
   3331       target = req_comp;
   3332    else
   3333       target = s->img_n; // if they want monochrome, we'll post-convert
   3334    out = MALLOC(target * s->img_x * s->img_y);
   3335    if (!out) return epuc("outofmem", "Out of memory");
   3336    if (bpp < 16) {
   3337       int z=0;
   3338       if (psize == 0 || psize > 256) { FREE(out); return epuc("invalid", "Corrupt BMP"); }
   3339       for (i=0; i < psize; ++i) {
   3340          pal[i][2] = get8u(s);
   3341          pal[i][1] = get8u(s);
   3342          pal[i][0] = get8u(s);
   3343          if (hsz != 12) get8(s);
   3344          pal[i][3] = 255;
   3345       }
   3346       skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
   3347       if (bpp == 4) width = (s->img_x + 1) >> 1;
   3348       else if (bpp == 8) width = s->img_x;
   3349       else { FREE(out); return epuc("bad bpp", "Corrupt BMP"); }
   3350       pad = (-width)&3;
   3351       for (j=0; j < (int) s->img_y; ++j) {
   3352          for (i=0; i < (int) s->img_x; i += 2) {
   3353             int v=get8(s),v2=0;
   3354             if (bpp == 4) {
   3355                v2 = v & 15;
   3356                v >>= 4;
   3357             }
   3358             out[z++] = pal[v][0];
   3359             out[z++] = pal[v][1];
   3360             out[z++] = pal[v][2];
   3361             if (target == 4) out[z++] = 255;
   3362             if (i+1 == (int) s->img_x) break;
   3363             v = (bpp == 8) ? get8(s) : v2;
   3364             out[z++] = pal[v][0];
   3365             out[z++] = pal[v][1];
   3366             out[z++] = pal[v][2];
   3367             if (target == 4) out[z++] = 255;
   3368          }
   3369          skip(s, pad);
   3370       }
   3371    } else {
   3372       int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
   3373       int z = 0;
   3374       int easy=0;
   3375       skip(s, offset - 14 - hsz);
   3376       if (bpp == 24) width = 3 * s->img_x;
   3377       else if (bpp == 16) width = 2*s->img_x;
   3378       else /* bpp = 32 and pad = 0 */ width=0;
   3379       pad = (-width) & 3;
   3380       if (bpp == 24) {
   3381          easy = 1;
   3382       } else if (bpp == 32) {
   3383          if (mb == 0xff && mg == 0xff00 && mr == 0xff000000 && ma == 0xff000000)
   3384             easy = 2;
   3385       }
   3386       if (!easy) {
   3387          if (!mr || !mg || !mb) {
   3388 	    FREE(out);
   3389 	    return epuc("bad masks", "Corrupt BMP");
   3390 	 }
   3391          // right shift amt to put high bit in position #7
   3392          rshift = high_bit(mr)-7; rcount = bitcount(mr);
   3393          gshift = high_bit(mg)-7; gcount = bitcount(mr);
   3394          bshift = high_bit(mb)-7; bcount = bitcount(mr);
   3395          ashift = high_bit(ma)-7; acount = bitcount(mr);
   3396       }
   3397       for (j=0; j < (int) s->img_y; ++j) {
   3398          if (easy) {
   3399             for (i=0; i < (int) s->img_x; ++i) {
   3400                int a;
   3401                out[z+2] = get8u(s);
   3402                out[z+1] = get8u(s);
   3403                out[z+0] = get8u(s);
   3404                z += 3;
   3405                a = (easy == 2 ? get8(s) : 255);
   3406                if (target == 4) out[z++] = (uint8) a;
   3407             }
   3408          } else {
   3409             for (i=0; i < (int) s->img_x; ++i) {
   3410                uint32 v = (bpp == 16 ? get16le(s) : get32le(s));
   3411                int a;
   3412                out[z++] = (uint8) shiftsigned(v & mr, rshift, rcount);
   3413                out[z++] = (uint8) shiftsigned(v & mg, gshift, gcount);
   3414                out[z++] = (uint8) shiftsigned(v & mb, bshift, bcount);
   3415                a = (ma ? shiftsigned(v & ma, ashift, acount) : 255);
   3416                if (target == 4) out[z++] = (uint8) a;
   3417             }
   3418          }
   3419          skip(s, pad);
   3420       }
   3421    }
   3422    if (flip_vertically) {
   3423       stbi_uc t;
   3424       for (j=0; j < (int) s->img_y>>1; ++j) {
   3425          stbi_uc *p1 = out +      j     *s->img_x*target;
   3426          stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
   3427          for (i=0; i < (int) s->img_x*target; ++i) {
   3428             t = p1[i], p1[i] = p2[i], p2[i] = t;
   3429          }
   3430       }
   3431    }
   3432 
   3433    if (req_comp && req_comp != target) {
   3434       out = convert_format(out, target, req_comp, s->img_x, s->img_y);
   3435       if (out == NULL) return out; // convert_format frees input on failure
   3436    }
   3437 
   3438    *x = s->img_x;
   3439    *y = s->img_y;
   3440    if (comp) *comp = target;
   3441    return out;
   3442 }
   3443 
   3444 #ifndef STBI_NO_STDIO
   3445 stbi_uc *stbi_bmp_load             (char const *filename,           int *x, int *y, int *comp, int req_comp)
   3446 {
   3447    stbi_uc *data;
   3448    FILE *f = fopen(filename, "rb");
   3449    if (!f) return NULL;
   3450    data = stbi_bmp_load_from_file(f, x,y,comp,req_comp);
   3451    fclose(f);
   3452    return data;
   3453 }
   3454 
   3455 stbi_uc *stbi_bmp_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp)
   3456 {
   3457    stbi s;
   3458    start_file(&s, f);
   3459    return bmp_load(&s, x,y,comp,req_comp);
   3460 }
   3461 #endif
   3462 
   3463 stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
   3464 {
   3465    stbi s;
   3466    start_mem(&s, buffer, len);
   3467    return bmp_load(&s, x,y,comp,req_comp);
   3468 }
   3469 
   3470 // Targa Truevision - TGA
   3471 // by Jonathan Dummer
   3472 
   3473 static int tga_info(stbi *s, int *x, int *y, int *comp)
   3474 {
   3475     int tga_w, tga_h, tga_comp;
   3476     int sz;
   3477     get8u(s);                   // discard Offset
   3478     sz = get8u(s);              // color type
   3479     if( sz > 1 ) return 0;      // only RGB or indexed allowed
   3480     sz = get8u(s);              // image type
   3481     // only RGB or grey allowed, +/- RLE
   3482     if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;
   3483     get16le(s);                 // discard palette start
   3484     get16le(s);                 // discard palette length
   3485     get8(s);                    // discard bits per palette color entry
   3486     get16le(s);                 // discard x origin
   3487     get16le(s);                 // discard y origin
   3488     tga_w = get16le(s);
   3489     if( tga_w < 1 ) return 0;   // test width
   3490     tga_h = get16le(s);
   3491     if( tga_h < 1 ) return 0;   // test height
   3492     sz = get8(s);               // bits per pixel
   3493     // only RGB or RGBA or grey allowed
   3494     if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) return 0;
   3495     tga_comp = sz;
   3496     if (x) *x = tga_w;
   3497     if (y) *y = tga_h;
   3498     if (comp) *comp = tga_comp / 8;
   3499     return 1;                   // seems to have passed everything
   3500 }
   3501 
   3502 #ifndef STBI_NO_STDIO
   3503 int stbi_tga_info_from_file(FILE *f, int *x, int *y, int *comp)
   3504 {
   3505     stbi s;
   3506     int r;
   3507     long n = ftell(f);
   3508     start_file(&s, f);
   3509     r = tga_info(&s, x, y, comp);
   3510     fseek(f, n, SEEK_SET);
   3511     return r;
   3512 }
   3513 #endif
   3514 
   3515 int stbi_tga_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
   3516 {
   3517     stbi s;
   3518     start_mem(&s, buffer, len);
   3519     return tga_info(&s, x, y, comp);
   3520 }
   3521 
   3522 static int tga_test(stbi *s)
   3523 {
   3524    int sz;
   3525    get8u(s);      //   discard Offset
   3526    sz = get8u(s);   //   color type
   3527    if ( sz > 1 ) return 0;   //   only RGB or indexed allowed
   3528    sz = get8u(s);   //   image type
   3529    if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0;   //   only RGB or grey allowed, +/- RLE
   3530    get16(s);      //   discard palette start
   3531    get16(s);      //   discard palette length
   3532    get8(s);         //   discard bits per palette color entry
   3533    get16(s);      //   discard x origin
   3534    get16(s);      //   discard y origin
   3535    if ( get16(s) < 1 ) return 0;      //   test width
   3536    if ( get16(s) < 1 ) return 0;      //   test height
   3537    sz = get8(s);   //   bits per pixel
   3538    if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0;   //   only RGB or RGBA or grey allowed
   3539    return 1;      //   seems to have passed everything
   3540 }
   3541 
   3542 #ifndef STBI_NO_STDIO
   3543 int      stbi_tga_test_file        (FILE *f)
   3544 {
   3545    stbi s;
   3546    int r,n = ftell(f);
   3547    start_file(&s, f);
   3548    r = tga_test(&s);
   3549    fseek(f,n,SEEK_SET);
   3550    return r;
   3551 }
   3552 #endif
   3553 
   3554 int      stbi_tga_test_memory      (stbi_uc const *buffer, int len)
   3555 {
   3556    stbi s;
   3557    start_mem(&s, buffer, len);
   3558    return tga_test(&s);
   3559 }
   3560 
   3561 static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp)
   3562 {
   3563    //   read in the TGA header stuff
   3564    int tga_offset = get8u(s);
   3565    int tga_indexed = get8u(s);
   3566    int tga_image_type = get8u(s);
   3567    int tga_is_RLE = 0;
   3568    int tga_palette_start = get16le(s);
   3569    int tga_palette_len = get16le(s);
   3570    int tga_palette_bits = get8u(s);
   3571    int tga_x_origin = get16le(s);
   3572    int tga_y_origin = get16le(s);
   3573    int tga_width = get16le(s);
   3574    int tga_height = get16le(s);
   3575    int tga_bits_per_pixel = get8u(s);
   3576    int tga_inverted = get8u(s);
   3577    //   image data
   3578    unsigned char *tga_data;
   3579    unsigned char *tga_palette = NULL;
   3580    int i, j;
   3581    unsigned char raw_data[4];
   3582    unsigned char trans_data[4];
   3583    int RLE_count = 0;
   3584    int RLE_repeating = 0;
   3585    int read_next_pixel = 1;
   3586 
   3587    //   do a tiny bit of precessing
   3588    if ( tga_image_type >= 8 )
   3589    {
   3590       tga_image_type -= 8;
   3591       tga_is_RLE = 1;
   3592    }
   3593    /* int tga_alpha_bits = tga_inverted & 15; */
   3594    tga_inverted = 1 - ((tga_inverted >> 5) & 1);
   3595 
   3596    //   error check
   3597    if ( //(tga_indexed) ||
   3598       (tga_width < 1) || (tga_height < 1) ||
   3599       (tga_image_type < 1) || (tga_image_type > 3) ||
   3600       ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
   3601       (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
   3602       )
   3603    {
   3604       return NULL;
   3605    }
   3606 
   3607    //   If I'm paletted, then I'll use the number of bits from the palette
   3608    if ( tga_indexed )
   3609    {
   3610       tga_bits_per_pixel = tga_palette_bits;
   3611    }
   3612 
   3613    //   tga info
   3614    *x = tga_width;
   3615    *y = tga_height;
   3616    if ( (req_comp < 1) || (req_comp > 4) )
   3617    {
   3618       //   just use whatever the file was
   3619       req_comp = tga_bits_per_pixel / 8;
   3620       *comp = req_comp;
   3621    } else
   3622    {
   3623       //   force a new number of components
   3624       *comp = tga_bits_per_pixel/8;
   3625    }
   3626    tga_data = MALLOC( tga_width * tga_height * req_comp );
   3627 
   3628    //   skip to the data's starting position (offset usually = 0)
   3629    skip(s, tga_offset );
   3630    //   do I need to load a palette?
   3631    if ( tga_indexed )
   3632    {
   3633       //   any data to skip? (offset usually = 0)
   3634       skip(s, tga_palette_start );
   3635       //   load the palette
   3636       tga_palette = MALLOC( tga_palette_len * tga_palette_bits / 8 );
   3637       if (!getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 ))
   3638          return NULL;
   3639    }
   3640    //   load the data
   3641    trans_data[0] = trans_data[1] = trans_data[2] = trans_data[3] = 0;
   3642    for (i=0; i < tga_width * tga_height; ++i)
   3643    {
   3644       //   if I'm in RLE mode, do I need to get a RLE chunk?
   3645       if ( tga_is_RLE )
   3646       {
   3647          if ( RLE_count == 0 )
   3648          {
   3649             //   yep, get the next byte as a RLE command
   3650             int RLE_cmd = get8u(s);
   3651             RLE_count = 1 + (RLE_cmd & 127);
   3652             RLE_repeating = RLE_cmd >> 7;
   3653             read_next_pixel = 1;
   3654          } else if ( !RLE_repeating )
   3655          {
   3656             read_next_pixel = 1;
   3657          }
   3658       } else
   3659       {
   3660          read_next_pixel = 1;
   3661       }
   3662       //   OK, if I need to read a pixel, do it now
   3663       if ( read_next_pixel )
   3664       {
   3665          //   load however much data we did have
   3666          if ( tga_indexed )
   3667          {
   3668             //   read in 1 byte, then perform the lookup
   3669             int pal_idx = get8u(s);
   3670             if ( pal_idx >= tga_palette_len )
   3671             {
   3672                //   invalid index
   3673                pal_idx = 0;
   3674             }
   3675             pal_idx *= tga_bits_per_pixel / 8;
   3676             for (j = 0; j*8 < tga_bits_per_pixel; ++j)
   3677             {
   3678                raw_data[j] = tga_palette[pal_idx+j];
   3679             }
   3680          } else
   3681          {
   3682             //   read in the data raw
   3683             for (j = 0; j*8 < tga_bits_per_pixel; ++j)
   3684             {
   3685                raw_data[j] = get8u(s);
   3686             }
   3687          }
   3688          //   convert raw to the intermediate format
   3689          switch (tga_bits_per_pixel)
   3690          {
   3691          case 8:
   3692             //   Luminous => RGBA
   3693             trans_data[0] = raw_data[0];
   3694             trans_data[1] = raw_data[0];
   3695             trans_data[2] = raw_data[0];
   3696             trans_data[3] = 255;
   3697             break;
   3698          case 16:
   3699             //   Luminous,Alpha => RGBA
   3700             trans_data[0] = raw_data[0];
   3701             trans_data[1] = raw_data[0];
   3702             trans_data[2] = raw_data[0];
   3703             trans_data[3] = raw_data[1];
   3704             break;
   3705          case 24:
   3706             //   BGR => RGBA
   3707             trans_data[0] = raw_data[2];
   3708             trans_data[1] = raw_data[1];
   3709             trans_data[2] = raw_data[0];
   3710             trans_data[3] = 255;
   3711             break;
   3712          case 32:
   3713             //   BGRA => RGBA
   3714             trans_data[0] = raw_data[2];
   3715             trans_data[1] = raw_data[1];
   3716             trans_data[2] = raw_data[0];
   3717             trans_data[3] = raw_data[3];
   3718             break;
   3719          }
   3720          //   clear the reading flag for the next pixel
   3721          read_next_pixel = 0;
   3722       } // end of reading a pixel
   3723       //   convert to final format
   3724       switch (req_comp)
   3725       {
   3726       case 1:
   3727          //   RGBA => Luminance
   3728          tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]);
   3729          break;
   3730       case 2:
   3731          //   RGBA => Luminance,Alpha
   3732          tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]);
   3733          tga_data[i*req_comp+1] = trans_data[3];
   3734          break;
   3735       case 3:
   3736          //   RGBA => RGB
   3737          tga_data[i*req_comp+0] = trans_data[0];
   3738          tga_data[i*req_comp+1] = trans_data[1];
   3739          tga_data[i*req_comp+2] = trans_data[2];
   3740          break;
   3741       case 4:
   3742          //   RGBA => RGBA
   3743          tga_data[i*req_comp+0] = trans_data[0];
   3744          tga_data[i*req_comp+1] = trans_data[1];
   3745          tga_data[i*req_comp+2] = trans_data[2];
   3746          tga_data[i*req_comp+3] = trans_data[3];
   3747          break;
   3748       }
   3749       //   in case we're in RLE mode, keep counting down
   3750       --RLE_count;
   3751    }
   3752    //   do I need to invert the image?
   3753    if ( tga_inverted )
   3754    {
   3755       for (j = 0; j*2 < tga_height; ++j)
   3756       {
   3757          int index1 = j * tga_width * req_comp;
   3758          int index2 = (tga_height - 1 - j) * tga_width * req_comp;
   3759          for (i = tga_width * req_comp; i > 0; --i)
   3760          {
   3761             unsigned char temp = tga_data[index1];
   3762             tga_data[index1] = tga_data[index2];
   3763             tga_data[index2] = temp;
   3764             ++index1;
   3765             ++index2;
   3766          }
   3767       }
   3768    }
   3769    //   clear my palette, if I had one
   3770    if ( tga_palette != NULL )
   3771    {
   3772       FREE( tga_palette );
   3773    }
   3774    //   the things I do to get rid of an error message, and yet keep
   3775    //   Microsoft's C compilers happy... [8^(
   3776    tga_palette_start = tga_palette_len = tga_palette_bits =
   3777          tga_x_origin = tga_y_origin = 0;
   3778    //   OK, done
   3779    return tga_data;
   3780 }
   3781 
   3782 #ifndef STBI_NO_STDIO
   3783 stbi_uc *stbi_tga_load             (char const *filename,           int *x, int *y, int *comp, int req_comp)
   3784 {
   3785    stbi_uc *data;
   3786    FILE *f = fopen(filename, "rb");
   3787    if (!f) return NULL;
   3788    data = stbi_tga_load_from_file(f, x,y,comp,req_comp);
   3789    fclose(f);
   3790    return data;
   3791 }
   3792 
   3793 stbi_uc *stbi_tga_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp)
   3794 {
   3795    stbi s;
   3796    start_file(&s, f);
   3797    return tga_load(&s, x,y,comp,req_comp);
   3798 }
   3799 #endif
   3800 
   3801 stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
   3802 {
   3803    stbi s;
   3804    start_mem(&s, buffer, len);
   3805    return tga_load(&s, x,y,comp,req_comp);
   3806 }
   3807 
   3808 
   3809 // *************************************************************************************************
   3810 // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
   3811 
   3812 static int psd_test(stbi *s)
   3813 {
   3814    if (get32(s) != 0x38425053) return 0;   // "8BPS"
   3815    else return 1;
   3816 }
   3817 
   3818 #ifndef STBI_NO_STDIO
   3819 int stbi_psd_test_file(FILE *f)
   3820 {
   3821    stbi s;
   3822    int r,n = ftell(f);
   3823    start_file(&s, f);
   3824    r = psd_test(&s);
   3825    fseek(f,n,SEEK_SET);
   3826    return r;
   3827 }
   3828 #endif
   3829 
   3830 int stbi_psd_test_memory(stbi_uc const *buffer, int len)
   3831 {
   3832    stbi s;
   3833    start_mem(&s, buffer, len);
   3834    return psd_test(&s);
   3835 }
   3836 
   3837 static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp)
   3838 {
   3839    int   pixelCount;
   3840    int channelCount, compression;
   3841    int channel, i, count, len;
   3842    int w,h;
   3843    uint8 *out;
   3844 
   3845    // Check identifier
   3846    if (get32(s) != 0x38425053)   // "8BPS"
   3847       return epuc("not PSD", "Corrupt PSD image");
   3848 
   3849    // Check file type version.
   3850    if (get16(s) != 1)
   3851       return epuc("wrong version", "Unsupported version of PSD image");
   3852 
   3853    // Skip 6 reserved bytes.
   3854    skip(s, 6 );
   3855 
   3856    // Read the number of channels (R, G, B, A, etc).
   3857    channelCount = get16(s);
   3858    if (channelCount < 0 || channelCount > 16)
   3859       return epuc("wrong channel count", "Unsupported number of channels in PSD image");
   3860 
   3861    // Read the rows and columns of the image.
   3862    h = get32(s);
   3863    w = get32(s);
   3864 
   3865    // Make sure the depth is 8 bits.
   3866    if (get16(s) != 8)
   3867       return epuc("unsupported bit depth", "PSD bit depth is not 8 bit");
   3868 
   3869    // Make sure the color mode is RGB.
   3870    // Valid options are:
   3871    //   0: Bitmap
   3872    //   1: Grayscale
   3873    //   2: Indexed color
   3874    //   3: RGB color
   3875    //   4: CMYK color
   3876    //   7: Multichannel
   3877    //   8: Duotone
   3878    //   9: Lab color
   3879    if (get16(s) != 3)
   3880       return epuc("wrong color format", "PSD is not in RGB color format");
   3881 
   3882    // Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)
   3883    skip(s,get32(s) );
   3884 
   3885    // Skip the image resources.  (resolution, pen tool paths, etc)
   3886    skip(s, get32(s) );
   3887 
   3888    // Skip the reserved data.
   3889    skip(s, get32(s) );
   3890 
   3891    // Find out if the data is compressed.
   3892    // Known values:
   3893    //   0: no compression
   3894    //   1: RLE compressed
   3895    compression = get16(s);
   3896    if (compression > 1)
   3897       return epuc("bad compression", "PSD has an unknown compression format");
   3898 
   3899    // Create the destination image.
   3900    out = MALLOC(4 * w*h);
   3901    if (!out) return epuc("outofmem", "Out of memory");
   3902    pixelCount = w*h;
   3903 
   3904    // Initialize the data to zero.
   3905    //memset( out, 0, pixelCount * 4 );
   3906 
   3907    // Finally, the image data.
   3908    if (compression) {
   3909       // RLE as used by .PSD and .TIFF
   3910       // Loop until you get the number of unpacked bytes you are expecting:
   3911       //     Read the next source byte into n.
   3912       //     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
   3913       //     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
   3914       //     Else if n is 128, noop.
   3915       // Endloop
   3916 
   3917       // The RLE-compressed data is preceded by a 2-byte data count for each row in the data,
   3918       // which we're going to just skip.
   3919       skip(s, h * channelCount * 2 );
   3920 
   3921       // Read the RLE data by channel.
   3922       for (channel = 0; channel < 4; channel++) {
   3923          uint8 *p;
   3924 
   3925          p = out+channel;
   3926          if (channel >= channelCount) {
   3927             // Fill this channel with default data.
   3928             for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;
   3929          } else {
   3930             // Read the RLE data.
   3931             count = 0;
   3932             while (count < pixelCount) {
   3933                len = get8(s);
   3934                if (len == 128) {
   3935                   // No-op.
   3936                } else if (len < 128) {
   3937                   // Copy next len+1 bytes literally.
   3938                   len++;
   3939                   count += len;
   3940                   while (len) {
   3941                      *p = get8u(s);
   3942                      p += 4;
   3943                      len--;
   3944                   }
   3945                } else if (len > 128) {
   3946                   uint8   val;
   3947                   // Next -len+1 bytes in the dest are replicated from next source byte.
   3948                   // (Interpret len as a negative 8-bit int.)
   3949                   len ^= 0x0FF;
   3950                   len += 2;
   3951                   val = get8u(s);
   3952                   count += len;
   3953                   while (len) {
   3954                      *p = val;
   3955                      p += 4;
   3956                      len--;
   3957                   }
   3958                }
   3959             }
   3960          }
   3961       }
   3962 
   3963    } else {
   3964       // We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)
   3965       // where each channel consists of an 8-bit value for each pixel in the image.
   3966 
   3967       // Read the data by channel.
   3968       for (channel = 0; channel < 4; channel++) {
   3969          uint8 *p;
   3970 
   3971          p = out + channel;
   3972          if (channel > channelCount) {
   3973             // Fill this channel with default data.
   3974             for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;
   3975          } else {
   3976             // Read the data.
   3977             for (i = 0; i < pixelCount; i++)
   3978                *p = get8u(s), p += 4;
   3979          }
   3980       }
   3981    }
   3982 
   3983    if (req_comp && req_comp != 4) {
   3984       out = convert_format(out, 4, req_comp, w, h);
   3985       if (out == NULL) return out; // convert_format frees input on failure
   3986    }
   3987 
   3988    if (comp) *comp = channelCount;
   3989    *y = h;
   3990    *x = w;
   3991 
   3992    return out;
   3993 }
   3994 
   3995 #ifndef STBI_NO_STDIO
   3996 stbi_uc *stbi_psd_load(char const *filename, int *x, int *y, int *comp, int req_comp)
   3997 {
   3998    stbi_uc *data;
   3999    FILE *f = fopen(filename, "rb");
   4000    if (!f) return NULL;
   4001    data = stbi_psd_load_from_file(f, x,y,comp,req_comp);
   4002    fclose(f);
   4003    return data;
   4004 }
   4005 
   4006 stbi_uc *stbi_psd_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
   4007 {
   4008    stbi s;
   4009    start_file(&s, f);
   4010    return psd_load(&s, x,y,comp,req_comp);
   4011 }
   4012 #endif
   4013 
   4014 stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
   4015 {
   4016    stbi s;
   4017    start_mem(&s, buffer, len);
   4018    return psd_load(&s, x,y,comp,req_comp);
   4019 }
   4020 
   4021 // *************************************************************************************************
   4022 // Softimage PIC loader
   4023 // by Tom Seddon
   4024 //
   4025 // See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
   4026 // See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
   4027 
   4028 static int pic_is4(stbi *s,const char *str)
   4029 {
   4030    int i;
   4031    for (i=0; i<4; ++i)
   4032       if (get8(s) != (stbi_uc)str[i])
   4033          return 0;
   4034 
   4035    return 1;
   4036 }
   4037 
   4038 static int pic_test(stbi *s)
   4039 {
   4040    int i;
   4041 
   4042    if (!pic_is4(s,"\x53\x80\xF6\x34"))
   4043       return 0;
   4044 
   4045    for(i=0;i<84;++i)
   4046       get8(s);
   4047 
   4048    if (!pic_is4(s,"PICT"))
   4049       return 0;
   4050 
   4051    return 1;
   4052 }
   4053 
   4054 typedef struct
   4055 {
   4056    stbi_uc size,type,channel;
   4057 } pic_packet_t;
   4058 
   4059 static stbi_uc *pic_readval(stbi *s, int channel, stbi_uc *dest)
   4060 {
   4061    int mask=0x80, i;
   4062 
   4063    for (i=0; i<4; ++i, mask>>=1) {
   4064       if (channel & mask) {
   4065          if (at_eof(s)) return epuc("bad file","PIC file too short");
   4066          dest[i]=get8u(s);
   4067       }
   4068    }
   4069 
   4070    return dest;
   4071 }
   4072 
   4073 static void pic_copyval(int channel,stbi_uc *dest,const stbi_uc *src)
   4074 {
   4075    int mask=0x80,i;
   4076 
   4077    for (i=0;i<4; ++i, mask>>=1)
   4078       if (channel&mask)
   4079          dest[i]=src[i];
   4080 }
   4081 
   4082 static stbi_uc *pic_load2(stbi *s,int width,int height,int *comp, stbi_uc *result)
   4083 {
   4084    int act_comp=0,num_packets=0,y,chained;
   4085    pic_packet_t packets[10];
   4086 
   4087    // this will (should...) cater for even some bizarre stuff like having data
   4088     // for the same channel in multiple packets.
   4089    do {
   4090       pic_packet_t *packet;
   4091 
   4092       if (num_packets==sizeof(packets)/sizeof(packets[0]))
   4093          return epuc("bad format","too many packets");
   4094 
   4095       packet = &packets[num_packets++];
   4096 
   4097       chained = get8(s);
   4098       packet->size    = get8u(s);
   4099       packet->type    = get8u(s);
   4100       packet->channel = get8u(s);
   4101 
   4102       act_comp |= packet->channel;
   4103 
   4104       if (at_eof(s))          return epuc("bad file","file too short (reading packets)");
   4105       if (packet->size != 8)  return epuc("bad format","packet isn't 8bpp");
   4106    } while (chained);
   4107 
   4108    *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
   4109 
   4110    for(y=0; y<height; ++y) {
   4111       int packet_idx;
   4112 
   4113       for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
   4114          pic_packet_t *packet = &packets[packet_idx];
   4115          stbi_uc *dest = result+y*width*4;
   4116 
   4117          switch (packet->type) {
   4118             default:
   4119                return epuc("bad format","packet has bad compression type");
   4120 
   4121             case 0: {//uncompressed
   4122                int x;
   4123 
   4124                for(x=0;x<width;++x, dest+=4)
   4125                   if (!pic_readval(s,packet->channel,dest))
   4126                      return 0;
   4127                break;
   4128             }
   4129 
   4130             case 1://Pure RLE
   4131                {
   4132                   int left=width, i;
   4133 
   4134                   while (left>0) {
   4135                      stbi_uc count,value[4];
   4136 
   4137                      count=get8u(s);
   4138                      if (at_eof(s))   return epuc("bad file","file too short (pure read count)");
   4139 
   4140                      if (count > left)
   4141                         count = (uint8) left;
   4142 
   4143                      if (!pic_readval(s,packet->channel,value))  return 0;
   4144 
   4145                      for(i=0; i<count; ++i,dest+=4)
   4146                         pic_copyval(packet->channel,dest,value);
   4147                      left -= count;
   4148                   }
   4149                }
   4150                break;
   4151 
   4152             case 2: {//Mixed RLE
   4153                int left=width;
   4154                while (left>0) {
   4155                   int count = get8(s), i;
   4156                   if (at_eof(s))  return epuc("bad file","file too short (mixed read count)");
   4157 
   4158                   if (count >= 128) { // Repeated
   4159                      stbi_uc value[4];
   4160 
   4161                      if (count==128)
   4162                         count = get16(s);
   4163                      else
   4164                         count -= 127;
   4165                      if (count > left)
   4166                         return epuc("bad file","scanline overrun");
   4167 
   4168                      if (!pic_readval(s,packet->channel,value))
   4169                         return 0;
   4170 
   4171                      for(i=0;i<count;++i, dest += 4)
   4172                         pic_copyval(packet->channel,dest,value);
   4173                   } else { // Raw
   4174                      ++count;
   4175                      if (count>left) return epuc("bad file","scanline overrun");
   4176 
   4177                      for(i=0;i<count;++i, dest+=4)
   4178                         if (!pic_readval(s,packet->channel,dest))
   4179                            return 0;
   4180                   }
   4181                   left-=count;
   4182                }
   4183                break;
   4184             }
   4185          }
   4186       }
   4187    }
   4188 
   4189    return result;
   4190 }
   4191 
   4192 static stbi_uc *pic_load(stbi *s,int *px,int *py,int *comp,int req_comp)
   4193 {
   4194    stbi_uc *result;
   4195    int i, x,y;
   4196 
   4197    for (i=0; i<92; ++i)
   4198       get8(s);
   4199 
   4200    x = get16(s);
   4201    y = get16(s);
   4202    if (at_eof(s))  return epuc("bad file","file too short (pic header)");
   4203    if ((1 << 28) / x < y) return epuc("too large", "Image too large to decode");
   4204 
   4205    get32(s); //skip `ratio'
   4206    get16(s); //skip `fields'
   4207    get16(s); //skip `pad'
   4208 
   4209    // intermediate buffer is RGBA
   4210    result = MALLOC(x*y*4);
   4211    memset(result, 0xff, x*y*4);
   4212 
   4213    if (!pic_load2(s,x,y,comp, result)) {
   4214       FREE(result);
   4215       result=0;
   4216    }
   4217    *px = x;
   4218    *py = y;
   4219    if (req_comp == 0) req_comp = *comp;
   4220    result=convert_format(result,4,req_comp,x,y);
   4221 
   4222    return result;
   4223 }
   4224 
   4225 int stbi_pic_test_memory(stbi_uc const *buffer, int len)
   4226 {
   4227    stbi s;
   4228    start_mem(&s,buffer,len);
   4229    return pic_test(&s);
   4230 }
   4231 
   4232 stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
   4233 {
   4234    stbi s;
   4235    start_mem(&s,buffer,len);
   4236    return pic_load(&s,x,y,comp,req_comp);
   4237 }
   4238 
   4239 #ifndef STBI_NO_STDIO
   4240 int stbi_pic_test_file(FILE *f)
   4241 {
   4242    int result;
   4243    long l = ftell(f);
   4244    stbi s;
   4245    start_file(&s,f);
   4246    result = pic_test(&s);
   4247    fseek(f,l,SEEK_SET);
   4248    return result;
   4249 }
   4250 
   4251 stbi_uc *stbi_pic_load(char const *filename,int *x, int *y, int *comp, int req_comp)
   4252 {
   4253    stbi_uc *result;
   4254    FILE *f=fopen(filename,"rb");
   4255    if (!f) return 0;
   4256    result = stbi_pic_load_from_file(f,x,y,comp,req_comp);
   4257    fclose(f);
   4258    return result;
   4259 }
   4260 
   4261 stbi_uc *stbi_pic_load_from_file(FILE *f,int *x, int *y, int *comp, int req_comp)
   4262 {
   4263    stbi s;
   4264    start_file(&s,f);
   4265    return pic_load(&s,x,y,comp,req_comp);
   4266 }
   4267 #endif
   4268 
   4269 // *************************************************************************************************
   4270 // GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
   4271 typedef struct stbi_gif_lzw_struct {
   4272    int16 prefix;
   4273    uint8 first;
   4274    uint8 suffix;
   4275 } stbi_gif_lzw;
   4276 
   4277 typedef struct stbi_gif_struct
   4278 {
   4279    int w,h;
   4280    stbi_uc *out;                 // output buffer (always 4 components)
   4281    int flags, bgindex, ratio, transparent, eflags;
   4282    uint8  pal[256][4];
   4283    uint8 lpal[256][4];
   4284    stbi_gif_lzw codes[4096];
   4285    uint8 *color_table;
   4286    int parse, step;
   4287    int lflags;
   4288    int start_x, start_y;
   4289    int max_x, max_y;
   4290    int cur_x, cur_y;
   4291    int line_size;
   4292 } stbi_gif;
   4293 
   4294 static int gif_test(stbi *s)
   4295 {
   4296    int sz;
   4297    if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') return 0;
   4298    sz = get8(s);
   4299    if (sz != '9' && sz != '7') return 0;
   4300    if (get8(s) != 'a') return 0;
   4301    return 1;
   4302 }
   4303 
   4304 #ifndef STBI_NO_STDIO
   4305 int      stbi_gif_test_file        (FILE *f)
   4306 {
   4307    stbi s;
   4308    int r,n = ftell(f);
   4309    start_file(&s,f);
   4310    r = gif_test(&s);
   4311    fseek(f,n,SEEK_SET);
   4312    return r;
   4313 }
   4314 #endif
   4315 
   4316 int      stbi_gif_test_memory      (stbi_uc const *buffer, int len)
   4317 {
   4318    stbi s;
   4319    start_mem(&s, buffer, len);
   4320    return gif_test(&s);
   4321 }
   4322 
   4323 static void stbi_gif_parse_colortable(stbi *s, uint8 pal[256][4], int num_entries, int transp)
   4324 {
   4325    int i;
   4326    for (i=0; i < num_entries; ++i) {
   4327       pal[i][2] = get8u(s);
   4328       pal[i][1] = get8u(s);
   4329       pal[i][0] = get8u(s);
   4330       pal[i][3] = transp ? 0 : 255;
   4331    }
   4332 }
   4333 
   4334 static int stbi_gif_header(stbi *s, stbi_gif *g, int *comp, int is_info)
   4335 {
   4336    uint8 ver;
   4337    if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8')
   4338       return e("not GIF", "Corrupt GIF");
   4339 
   4340    ver = get8u(s);
   4341    if (ver != '7' && ver != '9')    return e("not GIF", "Corrupt GIF");
   4342    if (get8(s) != 'a')                      return e("not GIF", "Corrupt GIF");
   4343 
   4344    failure_reason = "";
   4345    g->w = get16le(s);
   4346    g->h = get16le(s);
   4347    g->flags = get8(s);
   4348    g->bgindex = get8(s);
   4349    g->ratio = get8(s);
   4350    g->transparent = -1;
   4351 
   4352    if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments
   4353 
   4354    if (is_info) return 1;
   4355 
   4356    if (g->flags & 0x80)
   4357       stbi_gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
   4358 
   4359    return 1;
   4360 }
   4361 
   4362 static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp)
   4363 {
   4364    stbi_gif g;
   4365    if (!stbi_gif_header(s, &g, comp, 1)) return 0;
   4366    if (x) *x = g.w;
   4367    if (y) *y = g.h;
   4368    return 1;
   4369 }
   4370 
   4371 static void stbi_out_gif_code(stbi_gif *g, uint16 code)
   4372 {
   4373    uint8 *p, *c;
   4374 
   4375    // recurse to decode the prefixes, since the linked-list is backwards,
   4376    // and working backwards through an interleaved image would be nasty
   4377    if (g->codes[code].prefix >= 0)
   4378       stbi_out_gif_code(g, g->codes[code].prefix);
   4379 
   4380    if (g->cur_y >= g->max_y) return;
   4381 
   4382    p = &g->out[g->cur_x + g->cur_y];
   4383    c = &g->color_table[g->codes[code].suffix * 4];
   4384 
   4385    if (c[3] >= 128) {
   4386       p[0] = c[2];
   4387       p[1] = c[1];
   4388       p[2] = c[0];
   4389       p[3] = c[3];
   4390    }
   4391    g->cur_x += 4;
   4392 
   4393    if (g->cur_x >= g->max_x) {
   4394       g->cur_x = g->start_x;
   4395       g->cur_y += g->step;
   4396 
   4397       while (g->cur_y >= g->max_y && g->parse > 0) {
   4398          g->step = (1 << g->parse) * g->line_size;
   4399          g->cur_y = g->start_y + (g->step >> 1);
   4400          --g->parse;
   4401       }
   4402    }
   4403 }
   4404 
   4405 static uint8 *stbi_process_gif_raster(stbi *s, stbi_gif *g)
   4406 {
   4407    uint8 lzw_cs;
   4408    int32 len, code;
   4409    uint32 first;
   4410    int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
   4411    stbi_gif_lzw *p;
   4412 
   4413    lzw_cs = get8u(s);
   4414    clear = 1 << lzw_cs;
   4415    first = 1;
   4416    codesize = lzw_cs + 1;
   4417    codemask = (1 << codesize) - 1;
   4418    bits = 0;
   4419    valid_bits = 0;
   4420    for (code = 0; code < clear; code++) {
   4421       g->codes[code].prefix = -1;
   4422       g->codes[code].first = (uint8) code;
   4423       g->codes[code].suffix = (uint8) code;
   4424    }
   4425 
   4426    // support no starting clear code
   4427    avail = clear+2;
   4428    oldcode = -1;
   4429 
   4430    len = 0;
   4431    for(;;) {
   4432       if (valid_bits < codesize) {
   4433          if (len == 0) {
   4434             len = get8(s); // start new block
   4435             if (len == 0)
   4436                return g->out;
   4437          }
   4438          --len;
   4439          bits |= (int32) get8(s) << valid_bits;
   4440          valid_bits += 8;
   4441       } else {
   4442          code = bits & codemask;
   4443          bits >>= codesize;
   4444          valid_bits -= codesize;
   4445          // @OPTIMIZE: is there some way we can accelerate the non-clear path?
   4446          if (code == clear) {  // clear code
   4447             codesize = lzw_cs + 1;
   4448             codemask = (1 << codesize) - 1;
   4449             avail = clear + 2;
   4450             oldcode = -1;
   4451             first = 0;
   4452          } else if (code == clear + 1) { // end of stream code
   4453             skip(s, len);
   4454             while ((len = get8(s)) > 0)
   4455                skip(s,len);
   4456             return g->out;
   4457          } else if (code <= avail) {
   4458             if (first) return epuc("no clear code", "Corrupt GIF");
   4459 
   4460             if (oldcode >= 0) {
   4461                p = &g->codes[avail++];
   4462                if (avail > 4096)        return epuc("too many codes", "Corrupt GIF");
   4463                p->prefix = (int16) oldcode;
   4464                p->first = g->codes[oldcode].first;
   4465                p->suffix = (code == avail) ? p->first : g->codes[code].first;
   4466             } else if (code == avail)
   4467                return epuc("illegal code in raster", "Corrupt GIF");
   4468 
   4469             stbi_out_gif_code(g, (uint16) code);
   4470 
   4471             if ((avail & codemask) == 0 && avail <= 0x0FFF) {
   4472                codesize++;
   4473                codemask = (1 << codesize) - 1;
   4474             }
   4475 
   4476             oldcode = code;
   4477          } else {
   4478             return epuc("illegal code in raster", "Corrupt GIF");
   4479          }
   4480       }
   4481    }
   4482 }
   4483 
   4484 static void stbi_fill_gif_background(stbi_gif *g)
   4485 {
   4486    int i;
   4487    uint8 *c = g->pal[g->bgindex];
   4488    // @OPTIMIZE: write a dword at a time
   4489    for (i = 0; i < g->w * g->h * 4; i += 4) {
   4490       uint8 *p  = &g->out[i];
   4491       p[0] = c[2];
   4492       p[1] = c[1];
   4493       p[2] = c[0];
   4494       p[3] = c[3];
   4495    }
   4496 }
   4497 
   4498 // this function is designed to support animated gifs, although stb_image doesn't support it
   4499 static uint8 *stbi_gif_load_next(stbi *s, stbi_gif *g, int *comp, int req_comp)
   4500 {
   4501    int i;
   4502    uint8 *old_out = 0;
   4503 
   4504    if (g->out == 0) {
   4505       if (!stbi_gif_header(s, g, comp,0))     return 0; // failure_reason set by stbi_gif_header
   4506       g->out = MALLOC(4 * g->w * g->h);
   4507       if (g->out == 0)                      return epuc("outofmem", "Out of memory");
   4508       stbi_fill_gif_background(g);
   4509    } else {
   4510       // animated-gif-only path
   4511       if (((g->eflags & 0x1C) >> 2) == 3) {
   4512          old_out = g->out;
   4513          g->out = MALLOC(4 * g->w * g->h);
   4514          if (g->out == 0)                   return epuc("outofmem", "Out of memory");
   4515          memcpy(g->out, old_out, g->w*g->h*4);
   4516       }
   4517    }
   4518 
   4519    for (;;) {
   4520       switch (get8(s)) {
   4521          case 0x2C: /* Image Descriptor */
   4522          {
   4523             int32 x, y, w, h;
   4524             uint8 *o;
   4525 
   4526             x = get16le(s);
   4527             y = get16le(s);
   4528             w = get16le(s);
   4529             h = get16le(s);
   4530             if (((x + w) > (g->w)) || ((y + h) > (g->h)))
   4531                return epuc("bad Image Descriptor", "Corrupt GIF");
   4532 
   4533             g->line_size = g->w * 4;
   4534             g->start_x = x * 4;
   4535             g->start_y = y * g->line_size;
   4536             g->max_x   = g->start_x + w * 4;
   4537             g->max_y   = g->start_y + h * g->line_size;
   4538             g->cur_x   = g->start_x;
   4539             g->cur_y   = g->start_y;
   4540 
   4541             g->lflags = get8(s);
   4542 
   4543             if (g->lflags & 0x40) {
   4544                g->step = 8 * g->line_size; // first interlaced spacing
   4545                g->parse = 3;
   4546             } else {
   4547                g->step = g->line_size;
   4548                g->parse = 0;
   4549             }
   4550 
   4551             if (g->lflags & 0x80) {
   4552                stbi_gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
   4553                g->color_table = (uint8 *) g->lpal;
   4554             } else if (g->flags & 0x80) {
   4555                for (i=0; i < 256; ++i)  // @OPTIMIZE: reset only the previous transparent
   4556                   g->pal[i][3] = 255;
   4557                if (g->transparent >= 0 && (g->eflags & 0x01))
   4558                   g->pal[g->transparent][3] = 0;
   4559                g->color_table = (uint8 *) g->pal;
   4560             } else
   4561                return epuc("missing color table", "Corrupt GIF");
   4562 
   4563             o = stbi_process_gif_raster(s, g);
   4564             if (o == NULL) return NULL;
   4565 
   4566             if (req_comp && req_comp != 4)
   4567                o = convert_format(o, 4, req_comp, g->w, g->h);
   4568             return o;
   4569          }
   4570 
   4571          case 0x21: // Comment Extension.
   4572          {
   4573             int len;
   4574             if (get8(s) == 0xF9) { // Graphic Control Extension.
   4575                len = get8(s);
   4576                if (len == 4) {
   4577                   g->eflags = get8(s);
   4578                   get16le(s); // delay
   4579                   g->transparent = get8(s);
   4580                } else {
   4581                   skip(s, len);
   4582                   break;
   4583                }
   4584             }
   4585             while ((len = get8(s)) != 0)
   4586                skip(s, len);
   4587             break;
   4588          }
   4589 
   4590          case 0x3B: // gif stream termination code
   4591             return (uint8 *) 1;
   4592 
   4593          default:
   4594             return epuc("unknown code", "Corrupt GIF");
   4595       }
   4596    }
   4597 }
   4598 
   4599 #ifndef STBI_NO_STDIO
   4600 stbi_uc *stbi_gif_load             (char const *filename,           int *x, int *y, int *comp, int req_comp)
   4601 {
   4602    uint8 *data;
   4603    FILE *f = fopen(filename, "rb");
   4604    if (!f) return NULL;
   4605    data = stbi_gif_load_from_file(f, x,y,comp,req_comp);
   4606    fclose(f);
   4607    return data;
   4608 }
   4609 
   4610 stbi_uc *stbi_gif_load_from_file   (FILE *f, int *x, int *y, int *comp, int req_comp)
   4611 {
   4612    uint8 *u = 0;
   4613    stbi s;
   4614    stbi_gif g={0};
   4615    start_file(&s, f);
   4616 
   4617    u = stbi_gif_load_next(&s, &g, comp, req_comp);
   4618    if (u == (void *) 1) u = 0;  // end of animated gif marker
   4619    if (u) {
   4620       *x = g.w;
   4621       *y = g.h;
   4622    }
   4623 
   4624    return u;
   4625 }
   4626 #endif
   4627 
   4628 stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
   4629 {
   4630    uint8 *u = 0;
   4631    stbi s;
   4632    stbi_gif *pg;
   4633 
   4634    #ifdef STBI_SMALL_STACK
   4635    pg = MALLOC(sizeof(*pg));
   4636    if (pg == NULL)
   4637       return NULL;
   4638    #else
   4639    stbi_gif g;
   4640    pg = &g;
   4641    #endif
   4642 
   4643    memset(pg, 0, sizeof(*pg));
   4644    start_mem(&s, buffer, len);
   4645    u = stbi_gif_load_next(&s, pg, comp, req_comp);
   4646    if (u == (void *) 1) u = 0;  // end of animated gif marker
   4647    if (u) {
   4648       *x = pg->w;
   4649       *y = pg->h;
   4650    }
   4651 
   4652    #ifdef STBI_SMALL_STACK
   4653    FREE(pg);
   4654    #endif
   4655 
   4656    return u;
   4657 }
   4658 
   4659 #ifndef STBI_NO_STDIO
   4660 int      stbi_gif_info             (char const *filename,           int *x, int *y, int *comp)
   4661 {
   4662    int res;
   4663    FILE *f = fopen(filename, "rb");
   4664    if (!f) return 0;
   4665    res = stbi_gif_info_from_file(f, x, y, comp);
   4666    fclose(f);
   4667    return res;
   4668 }
   4669 
   4670 int stbi_gif_info_from_file(FILE *f, int *x, int *y, int *comp)
   4671 {
   4672    stbi s;
   4673    int res;
   4674    long n = ftell(f);
   4675    start_file(&s, f);
   4676    res = stbi_gif_info_raw(&s, x, y, comp);
   4677    fseek(f, n, SEEK_SET);
   4678    return res;
   4679 }
   4680 #endif // !STBI_NO_STDIO
   4681 
   4682 int stbi_gif_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
   4683 {
   4684    stbi s;
   4685    start_mem(&s, buffer, len);
   4686    return stbi_gif_info_raw(&s, x, y, comp);
   4687 }
   4688 
   4689 
   4690 
   4691 
   4692 // *************************************************************************************************
   4693 // Radiance RGBE HDR loader
   4694 // originally by Nicolas Schulz
   4695 #ifndef STBI_NO_HDR
   4696 static int hdr_test(stbi *s)
   4697 {
   4698    const char *signature = "#?RADIANCE\n";
   4699    int i;
   4700    for (i=0; signature[i]; ++i)
   4701       if (get8(s) != signature[i])
   4702          return 0;
   4703    return 1;
   4704 }
   4705 
   4706 int stbi_hdr_test_memory(stbi_uc const *buffer, int len)
   4707 {
   4708    stbi s;
   4709    start_mem(&s, buffer, len);
   4710    return hdr_test(&s);
   4711 }
   4712 
   4713 #ifndef STBI_NO_STDIO
   4714 int stbi_hdr_test_file(FILE *f)
   4715 {
   4716    stbi s;
   4717    int r,n = ftell(f);
   4718    start_file(&s, f);
   4719    r = hdr_test(&s);
   4720    fseek(f,n,SEEK_SET);
   4721    return r;
   4722 }
   4723 #endif
   4724 
   4725 #define HDR_BUFLEN  1024
   4726 static char *hdr_gettoken(stbi *z, char *buffer)
   4727 {
   4728    int len=0;
   4729    char c = '\0';
   4730 
   4731    c = (char) get8(z);
   4732 
   4733    while (!at_eof(z) && c != '\n') {
   4734       buffer[len++] = c;
   4735       if (len == HDR_BUFLEN-1) {
   4736          // flush to end of line
   4737          while (!at_eof(z) && get8(z) != '\n')
   4738             ;
   4739          break;
   4740       }
   4741       c = (char) get8(z);
   4742    }
   4743 
   4744    buffer[len] = 0;
   4745    return buffer;
   4746 }
   4747 
   4748 static void hdr_convert(float *output, stbi_uc *input, int req_comp)
   4749 {
   4750    if ( input[3] != 0 ) {
   4751       float f1;
   4752       // Exponent
   4753       f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
   4754       if (req_comp <= 2)
   4755          output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
   4756       else {
   4757          output[0] = input[0] * f1;
   4758          output[1] = input[1] * f1;
   4759          output[2] = input[2] * f1;
   4760       }
   4761       if (req_comp == 2) output[1] = 1;
   4762       if (req_comp == 4) output[3] = 1;
   4763    } else {
   4764       switch (req_comp) {
   4765          case 4: output[3] = 1; /* fallthrough */
   4766          case 3: output[0] = output[1] = output[2] = 0;
   4767                  break;
   4768          case 2: output[1] = 1; /* fallthrough */
   4769          case 1: output[0] = 0;
   4770                  break;
   4771       }
   4772    }
   4773 }
   4774 
   4775 
   4776 static float *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp)
   4777 {
   4778    char buffer[HDR_BUFLEN];
   4779    char *token;
   4780    int valid = 0;
   4781    int width, height;
   4782    stbi_uc *scanline;
   4783    float *hdr_data;
   4784    int len;
   4785    unsigned char count, value;
   4786    int i, j, k, c1,c2, z;
   4787 
   4788 
   4789    // Check identifier
   4790    if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0)
   4791       return epf("not HDR", "Corrupt HDR image");
   4792 
   4793    // Parse header
   4794    for(;;) {
   4795       token = hdr_gettoken(s,buffer);
   4796       if (token[0] == 0) break;
   4797       if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
   4798    }
   4799 
   4800    if (!valid)    return epf("unsupported format", "Unsupported HDR format");
   4801 
   4802    // Parse width and height
   4803    // can't use sscanf() if we're not using stdio!
   4804    token = hdr_gettoken(s,buffer);
   4805    if (strncmp(token, "-Y ", 3))  return epf("unsupported data layout", "Unsupported HDR format");
   4806    token += 3;
   4807    height = strtol(token, &token, 10);
   4808    while (*token == ' ') ++token;
   4809    if (strncmp(token, "+X ", 3))  return epf("unsupported data layout", "Unsupported HDR format");
   4810    token += 3;
   4811    width = strtol(token, NULL, 10);
   4812 
   4813    *x = width;
   4814    *y = height;
   4815 
   4816    *comp = 3;
   4817    if (req_comp == 0) req_comp = 3;
   4818 
   4819    // Read data
   4820    hdr_data = MALLOC(height * width * req_comp * sizeof(float));
   4821 
   4822    // Load image data
   4823    // image data is stored as some number of sca
   4824    if ( width < 8 || width >= 32768) {
   4825       // Read flat data
   4826       for (j=0; j < height; ++j) {
   4827          for (i=0; i < width; ++i) {
   4828             stbi_uc rgbe[4];
   4829            main_decode_loop:
   4830             getn(s, rgbe, 4);
   4831             hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
   4832          }
   4833       }
   4834    } else {
   4835       // Read RLE-encoded data
   4836       scanline = NULL;
   4837 
   4838       for (j = 0; j < height; ++j) {
   4839          c1 = get8(s);
   4840          c2 = get8(s);
   4841          len = get8(s);
   4842          if (c1 != 2 || c2 != 2 || (len & 0x80)) {
   4843             // not run-length encoded, so we have to actually use THIS data as a decoded
   4844             // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
   4845             uint8 rgbe[4];
   4846             rgbe[0] = (uint8) c1;
   4847             rgbe[1] = (uint8) c2;
   4848             rgbe[2] = (uint8) len;
   4849             rgbe[3] = (uint8) get8u(s);
   4850             hdr_convert(hdr_data, rgbe, req_comp);
   4851             i = 1;
   4852             j = 0;
   4853             FREE(scanline);
   4854             goto main_decode_loop; // yes, this makes no sense
   4855          }
   4856          len <<= 8;
   4857          len |= get8(s);
   4858          if (len != width) { FREE(hdr_data); FREE(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); }
   4859          if (scanline == NULL) scanline = MALLOC(width * 4);
   4860 
   4861          for (k = 0; k < 4; ++k) {
   4862             i = 0;
   4863             while (i < width) {
   4864                count = get8u(s);
   4865                if (count > 128) {
   4866                   // Run
   4867                   value = get8u(s);
   4868                   count -= 128;
   4869                   for (z = 0; z < count; ++z)
   4870                      scanline[i++ * 4 + k] = value;
   4871                } else {
   4872                   // Dump
   4873                   for (z = 0; z < count; ++z)
   4874                      scanline[i++ * 4 + k] = get8u(s);
   4875                }
   4876             }
   4877          }
   4878          for (i=0; i < width; ++i)
   4879             hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
   4880       }
   4881       FREE(scanline);
   4882    }
   4883 
   4884    return hdr_data;
   4885 }
   4886 
   4887 #ifndef STBI_NO_STDIO
   4888 float *stbi_hdr_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
   4889 {
   4890    stbi s;
   4891    start_file(&s,f);
   4892    return hdr_load(&s,x,y,comp,req_comp);
   4893 }
   4894 #endif
   4895 
   4896 float *stbi_hdr_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
   4897 {
   4898    stbi s;
   4899    start_mem(&s,buffer, len);
   4900    return hdr_load(&s,x,y,comp,req_comp);
   4901 }
   4902 
   4903 #endif // STBI_NO_HDR
   4904 
   4905 
   4906 #ifndef STBI_NO_STDIO
   4907 int stbi_info(char const *filename, int *x, int *y, int *comp)
   4908 {
   4909     FILE *f = fopen(filename, "rb");
   4910     int result;
   4911     if (!f) return e("can't fopen", "Unable to open file");
   4912     result = stbi_info_from_file(f, x, y, comp);
   4913     fclose(f);
   4914     return result;
   4915 }
   4916 
   4917 int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
   4918 {
   4919    if (stbi_jpeg_info_from_file(f, x, y, comp))
   4920        return 1;
   4921    if (stbi_png_info_from_file(f, x, y, comp))
   4922        return 1;
   4923    if (stbi_gif_info_from_file(f, x, y, comp))
   4924        return 1;
   4925    // @TODO: stbi_bmp_info_from_file
   4926    // @TODO: stbi_psd_info_from_file
   4927    #ifndef STBI_NO_HDR
   4928    // @TODO: stbi_hdr_info_from_file
   4929    #endif
   4930    // test tga last because it's a crappy test!
   4931    if (stbi_tga_info_from_file(f, x, y, comp))
   4932        return 1;
   4933    return e("unknown image type", "Image not of any known type, or corrupt");
   4934 }
   4935 #endif // !STBI_NO_STDIO
   4936 
   4937 int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
   4938 {
   4939    if (stbi_jpeg_info_from_memory(buffer, len, x, y, comp))
   4940        return 1;
   4941    if (stbi_png_info_from_memory(buffer, len, x, y, comp))
   4942        return 1;
   4943    if (stbi_gif_info_from_memory(buffer, len, x, y, comp))
   4944        return 1;
   4945    // @TODO: stbi_bmp_info_from_memory
   4946    // @TODO: stbi_psd_info_from_memory
   4947    #ifndef STBI_NO_HDR
   4948    // @TODO: stbi_hdr_info_from_memory
   4949    #endif
   4950    // test tga last because it's a crappy test!
   4951    if (stbi_tga_info_from_memory(buffer, len, x, y, comp))
   4952        return 1;
   4953    return e("unknown image type", "Image not of any known type, or corrupt");
   4954 }
   4955 
   4956 #endif // STBI_HEADER_FILE_ONLY
   4957 
   4958 /*
   4959    revision history:
   4960       1.29 (2010-08-16) various warning fixes from Aurelien Pocheville
   4961       1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ)
   4962       1.27 (2010-08-01)
   4963              cast-to-uint8 to fix warnings
   4964       1.26 (2010-07-24)
   4965              fix bug in file buffering for PNG reported by SpartanJ
   4966       1.25 (2010-07-17)
   4967              refix trans_data warning (Won Chun)
   4968       1.24 (2010-07-12)
   4969              perf improvements reading from files on platforms with lock-heavy fgetc()
   4970              minor perf improvements for jpeg
   4971              deprecated type-specific functions so we'll get feedback if they're needed
   4972              attempt to fix trans_data warning (Won Chun)
   4973       1.23   fixed bug in iPhone support
   4974       1.22 (2010-07-10)
   4975              removed image *writing* support
   4976              removed image *writing* support
   4977              stbi_info support from Jetro Lauha
   4978              GIF support from Jean-Marc Lienher
   4979              iPhone PNG-extensions from James Brown
   4980              warning-fixes from Nicolas Schulz and Janez Zemva (i.e. Janez (U+017D)emva)
   4981       1.21   fix use of 'uint8' in header (reported by jon blow)
   4982       1.20   added support for Softimage PIC, by Tom Seddon
   4983       1.19   bug in interlaced PNG corruption check (found by ryg)
   4984       1.18 2008-08-02
   4985              fix a threading bug (local mutable static)
   4986       1.17   support interlaced PNG
   4987       1.16   major bugfix - convert_format converted one too many pixels
   4988       1.15   initialize some fields for thread safety
   4989       1.14   fix threadsafe conversion bug
   4990              header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
   4991       1.13   threadsafe
   4992       1.12   const qualifiers in the API
   4993       1.11   Support installable IDCT, colorspace conversion routines
   4994       1.10   Fixes for 64-bit (don't use "unsigned long")
   4995              optimized upsampling by Fabian "ryg" Giesen
   4996       1.09   Fix format-conversion for PSD code (bad global variables!)
   4997       1.08   Thatcher Ulrich's PSD code integrated by Nicolas Schulz
   4998       1.07   attempt to fix C++ warning/errors again
   4999       1.06   attempt to fix C++ warning/errors again
   5000       1.05   fix TGA loading to return correct *comp and use good luminance calc
   5001       1.04   default float alpha is 1, not 255; use 'void *' for stbi_image_free
   5002       1.03   bugfixes to STBI_NO_STDIO, STBI_NO_HDR
   5003       1.02   support for (subset of) HDR files, float interface for preferred access to them
   5004       1.01   fix bug: possible bug in handling right-side up bmps... not sure
   5005              fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all
   5006       1.00   interface to zlib that skips zlib header
   5007       0.99   correct handling of alpha in palette
   5008       0.98   TGA loader by lonesock; dynamically add loaders (untested)
   5009       0.97   jpeg errors on too large a file; also catch another malloc failure
   5010       0.96   fix detection of invalid v value - particleman@mollyrocket forum
   5011       0.95   during header scan, seek to markers in case of padding
   5012       0.94   STBI_NO_STDIO to disable stdio usage; rename all #defines the same
   5013       0.93   handle jpegtran output; verbose errors
   5014       0.92   read 4,8,16,24,32-bit BMP files of several formats
   5015       0.91   output 24-bit Windows 3.0 BMP files
   5016       0.90   fix a few more warnings; bump version number to approach 1.0
   5017       0.61   bugfixes due to Marc LeBlanc, Christopher Lloyd
   5018       0.60   fix compiling as c++
   5019       0.59   fix warnings: merge Dave Moore's -Wall fixes
   5020       0.58   fix bug: zlib uncompressed mode len/nlen was wrong endian
   5021       0.57   fix bug: jpg last huffman symbol before marker was >9 bits but less
   5022                       than 16 available
   5023       0.56   fix bug: zlib uncompressed mode len vs. nlen
   5024       0.55   fix bug: restart_interval not initialized to 0
   5025       0.54   allow NULL for 'int *comp'
   5026       0.53   fix bug in png 3->4; speedup png decoding
   5027       0.52   png handles req_comp=3,4 directly; minor cleanup; jpeg comments
   5028       0.51   obey req_comp requests, 1-component jpegs return as 1-component,
   5029              on 'test' only check type, not whether we support this variant
   5030 */
   5031