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