• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /* stb_image - v2.28 - public domain image loader - http://nothings.org/stb
2                                   no warranty implied; use at your own risk
3 
4    Do this:
5       #define STB_IMAGE_IMPLEMENTATION
6    before you include this file in *one* C or C++ file to create the implementation.
7 
8    // i.e. it should look like this:
9    #include ...
10    #include ...
11    #include ...
12    #define STB_IMAGE_IMPLEMENTATION
13    #include "stb_image.h"
14 
15    You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.
16    And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free
17 
18 
19    QUICK NOTES:
20       Primarily of interest to game developers and other people who can
21           avoid problematic images and only need the trivial interface
22 
23       JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)
24       PNG 1/2/4/8/16-bit-per-channel
25 
26       TGA (not sure what subset, if a subset)
27       BMP non-1bpp, non-RLE
28       PSD (composited view only, no extra channels, 8/16 bit-per-channel)
29 
30       GIF (*comp always reports as 4-channel)
31       HDR (radiance rgbE format)
32       PIC (Softimage PIC)
33       PNM (PPM and PGM binary only)
34 
35       Animated GIF still needs a proper API, but here's one way to do it:
36           http://gist.github.com/urraka/685d9a6340b26b830d49
37 
38       - decode from memory or through FILE (define STBI_NO_STDIO to remove code)
39       - decode from arbitrary I/O callbacks
40       - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)
41 
42    Full documentation under "DOCUMENTATION" below.
43 
44 
45 LICENSE
46 
47   See end of file for license information.
48 
49 RECENT REVISION HISTORY:
50 
51       2.28  (2023-01-29) many error fixes, security errors, just tons of stuff
52       2.27  (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes
53       2.26  (2020-07-13) many minor fixes
54       2.25  (2020-02-02) fix warnings
55       2.24  (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically
56       2.23  (2019-08-11) fix clang static analysis warning
57       2.22  (2019-03-04) gif fixes, fix warnings
58       2.21  (2019-02-25) fix typo in comment
59       2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
60       2.19  (2018-02-11) fix warning
61       2.18  (2018-01-30) fix warnings
62       2.17  (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
63       2.16  (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes
64       2.15  (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC
65       2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
66       2.13  (2016-12-04) experimental 16-bit API, only for PNG so far; fixes
67       2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
68       2.11  (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64
69                          RGB-format JPEG; remove white matting in PSD;
70                          allocate large structures on the stack;
71                          correct channel count for PNG & BMP
72       2.10  (2016-01-22) avoid warning introduced in 2.09
73       2.09  (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED
74 
75    See end of file for full revision history.
76 
77 
78  ============================    Contributors    =========================
79 
80  Image formats                          Extensions, features
81     Sean Barrett (jpeg, png, bmp)          Jetro Lauha (stbi_info)
82     Nicolas Schulz (hdr, psd)              Martin "SpartanJ" Golini (stbi_info)
83     Jonathan Dummer (tga)                  James "moose2000" Brown (iPhone PNG)
84     Jean-Marc Lienher (gif)                Ben "Disch" Wenger (io callbacks)
85     Tom Seddon (pic)                       Omar Cornut (1/2/4-bit PNG)
86     Thatcher Ulrich (psd)                  Nicolas Guillemot (vertical flip)
87     Ken Miller (pgm, ppm)                  Richard Mitton (16-bit PSD)
88     github:urraka (animated gif)           Junggon Kim (PNM comments)
89     Christopher Forseth (animated gif)     Daniel Gibson (16-bit TGA)
90                                            socks-the-fox (16-bit PNG)
91                                            Jeremy Sawicki (handle all ImageNet JPGs)
92  Optimizations & bugfixes                  Mikhail Morozov (1-bit BMP)
93     Fabian "ryg" Giesen                    Anael Seghezzi (is-16-bit query)
94     Arseny Kapoulkine                      Simon Breuss (16-bit PNM)
95     John-Mark Allen
96     Carmelo J Fdez-Aguera
97 
98  Bug & warning fixes
99     Marc LeBlanc            David Woo          Guillaume George     Martins Mozeiko
100     Christpher Lloyd        Jerry Jansson      Joseph Thomson       Blazej Dariusz Roszkowski
101     Phil Jordan                                Dave Moore           Roy Eltham
102     Hayaki Saito            Nathan Reed        Won Chun
103     Luke Graham             Johan Duparc       Nick Verigakis       the Horde3D community
104     Thomas Ruf              Ronny Chevalier                         github:rlyeh
105     Janez Zemva             John Bartholomew   Michal Cichon        github:romigrou
106     Jonathan Blow           Ken Hamada         Tero Hanninen        github:svdijk
107     Eugene Golushkov        Laurent Gomila     Cort Stratton        github:snagar
108     Aruelien Pocheville     Sergio Gonzalez    Thibault Reuille     github:Zelex
109     Cass Everitt            Ryamond Barbiero                        github:grim210
110     Paul Du Bois            Engin Manap        Aldo Culquicondor    github:sammyhw
111     Philipp Wiesemann       Dale Weiler        Oriol Ferrer Mesia   github:phprus
112     Josh Tobin              Neil Bickford      Matthew Gregan       github:poppolopoppo
113     Julian Raschke          Gregory Mullen     Christian Floisand   github:darealshinji
114     Baldur Karlsson         Kevin Schmidt      JR Smith             github:Michaelangel007
115                             Brad Weinberger    Matvey Cherevko      github:mosra
116     Luca Sas                Alexander Veselov  Zack Middleton       [reserved]
117     Ryan C. Gordon          [reserved]                              [reserved]
118                      DO NOT ADD YOUR NAME HERE
119 
120                      Jacko Dirks
121 
122   To add your name to the credits, pick a random blank space in the middle and fill it.
123   80% of merge conflicts on stb PRs are due to people adding their name at the end
124   of the credits.
125 */
126 
127 #ifndef STBI_INCLUDE_STB_IMAGE_H
128 #define STBI_INCLUDE_STB_IMAGE_H
129 
130 // DOCUMENTATION
131 //
132 // Limitations:
133 //    - no 12-bit-per-channel JPEG
134 //    - no JPEGs with arithmetic coding
135 //    - GIF always returns *comp=4
136 //
137 // Basic usage (see HDR discussion below for HDR usage):
138 //    int x,y,n;
139 //    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
140 //    // ... process data if not NULL ...
141 //    // ... x = width, y = height, n = # 8-bit components per pixel ...
142 //    // ... replace '0' with '1'..'4' to force that many components per pixel
143 //    // ... but 'n' will always be the number that it would have been if you said 0
144 //    stbi_image_free(data);
145 //
146 // Standard parameters:
147 //    int *x                 -- outputs image width in pixels
148 //    int *y                 -- outputs image height in pixels
149 //    int *channels_in_file  -- outputs # of image components in image file
150 //    int desired_channels   -- if non-zero, # of image components requested in result
151 //
152 // The return value from an image loader is an 'unsigned char *' which points
153 // to the pixel data, or NULL on an allocation failure or if the image is
154 // corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,
155 // with each pixel consisting of N interleaved 8-bit components; the first
156 // pixel pointed to is top-left-most in the image. There is no padding between
157 // image scanlines or between pixels, regardless of format. The number of
158 // components N is 'desired_channels' if desired_channels is non-zero, or
159 // *channels_in_file otherwise. If desired_channels is non-zero,
160 // *channels_in_file has the number of components that _would_ have been
161 // output otherwise. E.g. if you set desired_channels to 4, you will always
162 // get RGBA output, but you can check *channels_in_file to see if it's trivially
163 // opaque because e.g. there were only 3 channels in the source image.
164 //
165 // An output image with N components has the following components interleaved
166 // in this order in each pixel:
167 //
168 //     N=#comp     components
169 //       1           grey
170 //       2           grey, alpha
171 //       3           red, green, blue
172 //       4           red, green, blue, alpha
173 //
174 // If image loading fails for any reason, the return value will be NULL,
175 // and *x, *y, *channels_in_file will be unchanged. The function
176 // stbi_failure_reason() can be queried for an extremely brief, end-user
177 // unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS
178 // to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
179 // more user-friendly ones.
180 //
181 // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
182 //
183 // To query the width, height and component count of an image without having to
184 // decode the full file, you can use the stbi_info family of functions:
185 //
186 //   int x,y,n,ok;
187 //   ok = stbi_info(filename, &x, &y, &n);
188 //   // returns ok=1 and sets x, y, n if image is a supported format,
189 //   // 0 otherwise.
190 //
191 // Note that stb_image pervasively uses ints in its public API for sizes,
192 // including sizes of memory buffers. This is now part of the API and thus
193 // hard to change without causing breakage. As a result, the various image
194 // loaders all have certain limits on image size; these differ somewhat
195 // by format but generally boil down to either just under 2GB or just under
196 // 1GB. When the decoded image would be larger than this, stb_image decoding
197 // will fail.
198 //
199 // Additionally, stb_image will reject image files that have any of their
200 // dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS,
201 // which defaults to 2**24 = 16777216 pixels. Due to the above memory limit,
202 // the only way to have an image with such dimensions load correctly
203 // is for it to have a rather extreme aspect ratio. Either way, the
204 // assumption here is that such larger images are likely to be malformed
205 // or malicious. If you do need to load an image with individual dimensions
206 // larger than that, and it still fits in the overall size limit, you can
207 // #define STBI_MAX_DIMENSIONS on your own to be something larger.
208 //
209 // ===========================================================================
210 //
211 // UNICODE:
212 //
213 //   If compiling for Windows and you wish to use Unicode filenames, compile
214 //   with
215 //       #define STBI_WINDOWS_UTF8
216 //   and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert
217 //   Windows wchar_t filenames to utf8.
218 //
219 // ===========================================================================
220 //
221 // Philosophy
222 //
223 // stb libraries are designed with the following priorities:
224 //
225 //    1. easy to use
226 //    2. easy to maintain
227 //    3. good performance
228 //
229 // Sometimes I let "good performance" creep up in priority over "easy to maintain",
230 // and for best performance I may provide less-easy-to-use APIs that give higher
231 // performance, in addition to the easy-to-use ones. Nevertheless, it's important
232 // to keep in mind that from the standpoint of you, a client of this library,
233 // all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
234 //
235 // Some secondary priorities arise directly from the first two, some of which
236 // provide more explicit reasons why performance can't be emphasized.
237 //
238 //    - Portable ("ease of use")
239 //    - Small source code footprint ("easy to maintain")
240 //    - No dependencies ("ease of use")
241 //
242 // ===========================================================================
243 //
244 // I/O callbacks
245 //
246 // I/O callbacks allow you to read from arbitrary sources, like packaged
247 // files or some other source. Data read from callbacks are processed
248 // through a small internal buffer (currently 128 bytes) to try to reduce
249 // overhead.
250 //
251 // The three functions you must define are "read" (reads some bytes of data),
252 // "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
253 //
254 // ===========================================================================
255 //
256 // SIMD support
257 //
258 // The JPEG decoder will try to automatically use SIMD kernels on x86 when
259 // supported by the compiler. For ARM Neon support, you must explicitly
260 // request it.
261 //
262 // (The old do-it-yourself SIMD API is no longer supported in the current
263 // code.)
264 //
265 // On x86, SSE2 will automatically be used when available based on a run-time
266 // test; if not, the generic C versions are used as a fall-back. On ARM targets,
267 // the typical path is to have separate builds for NEON and non-NEON devices
268 // (at least this is true for iOS and Android). Therefore, the NEON support is
269 // toggled by a build flag: define STBI_NEON to get NEON loops.
270 //
271 // If for some reason you do not want to use any of SIMD code, or if
272 // you have issues compiling it, you can disable it entirely by
273 // defining STBI_NO_SIMD.
274 //
275 // ===========================================================================
276 //
277 // HDR image support   (disable by defining STBI_NO_HDR)
278 //
279 // stb_image supports loading HDR images in general, and currently the Radiance
280 // .HDR file format specifically. You can still load any file through the existing
281 // interface; if you attempt to load an HDR file, it will be automatically remapped
282 // to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
283 // both of these constants can be reconfigured through this interface:
284 //
285 //     stbi_hdr_to_ldr_gamma(2.2f);
286 //     stbi_hdr_to_ldr_scale(1.0f);
287 //
288 // (note, do not use _inverse_ constants; stbi_image will invert them
289 // appropriately).
290 //
291 // Additionally, there is a new, parallel interface for loading files as
292 // (linear) floats to preserve the full dynamic range:
293 //
294 //    float *data = stbi_loadf(filename, &x, &y, &n, 0);
295 //
296 // If you load LDR images through this interface, those images will
297 // be promoted to floating point values, run through the inverse of
298 // constants corresponding to the above:
299 //
300 //     stbi_ldr_to_hdr_scale(1.0f);
301 //     stbi_ldr_to_hdr_gamma(2.2f);
302 //
303 // Finally, given a filename (or an open file or memory block--see header
304 // file for details) containing image data, you can query for the "most
305 // appropriate" interface to use (that is, whether the image is HDR or
306 // not), using:
307 //
308 //     stbi_is_hdr(char *filename);
309 //
310 // ===========================================================================
311 //
312 // iPhone PNG support:
313 //
314 // We optionally support converting iPhone-formatted PNGs (which store
315 // premultiplied BGRA) back to RGB, even though they're internally encoded
316 // differently. To enable this conversion, call
317 // stbi_convert_iphone_png_to_rgb(1).
318 //
319 // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
320 // pixel to remove any premultiplied alpha *only* if the image file explicitly
321 // says there's premultiplied data (currently only happens in iPhone images,
322 // and only if iPhone convert-to-rgb processing is on).
323 //
324 // ===========================================================================
325 //
326 // ADDITIONAL CONFIGURATION
327 //
328 //  - You can suppress implementation of any of the decoders to reduce
329 //    your code footprint by #defining one or more of the following
330 //    symbols before creating the implementation.
331 //
332 //        STBI_NO_JPEG
333 //        STBI_NO_PNG
334 //        STBI_NO_BMP
335 //        STBI_NO_PSD
336 //        STBI_NO_TGA
337 //        STBI_NO_GIF
338 //        STBI_NO_HDR
339 //        STBI_NO_PIC
340 //        STBI_NO_PNM   (.ppm and .pgm)
341 //
342 //  - You can request *only* certain decoders and suppress all other ones
343 //    (this will be more forward-compatible, as addition of new decoders
344 //    doesn't require you to disable them explicitly):
345 //
346 //        STBI_ONLY_JPEG
347 //        STBI_ONLY_PNG
348 //        STBI_ONLY_BMP
349 //        STBI_ONLY_PSD
350 //        STBI_ONLY_TGA
351 //        STBI_ONLY_GIF
352 //        STBI_ONLY_HDR
353 //        STBI_ONLY_PIC
354 //        STBI_ONLY_PNM   (.ppm and .pgm)
355 //
356 //   - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
357 //     want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
358 //
359 //  - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater
360 //    than that size (in either width or height) without further processing.
361 //    This is to let programs in the wild set an upper bound to prevent
362 //    denial-of-service attacks on untrusted data, as one could generate a
363 //    valid image of gigantic dimensions and force stb_image to allocate a
364 //    huge block of memory and spend disproportionate time decoding it. By
365 //    default this is set to (1 << 24), which is 16777216, but that's still
366 //    very big.
367 
368 #ifndef STBI_NO_STDIO
369 #include <stdio.h>
370 #endif // STBI_NO_STDIO
371 
372 #define STBI_VERSION 1
373 
374 enum
375 {
376    STBI_default = 0, // only used for desired_channels
377 
378    STBI_grey       = 1,
379    STBI_grey_alpha = 2,
380    STBI_rgb        = 3,
381    STBI_rgb_alpha  = 4
382 };
383 
384 #include <stdlib.h>
385 typedef unsigned char stbi_uc;
386 typedef unsigned short stbi_us;
387 
388 #ifdef __cplusplus
389 extern "C" {
390 #endif
391 
392 #ifndef STBIDEF
393 #ifdef STB_IMAGE_STATIC
394 #define STBIDEF static
395 #else
396 #define STBIDEF extern
397 #endif
398 #endif
399 
400 //////////////////////////////////////////////////////////////////////////////
401 //
402 // PRIMARY API - works on images of any type
403 //
404 
405 //
406 // load image by filename, open file, or memory buffer
407 //
408 
409 typedef struct
410 {
411    int      (*read)  (void *user,char *data,int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read
412    void     (*skip)  (void *user,int n);                 // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
413    int      (*eof)   (void *user);                       // returns nonzero if we are at end of file/data
414 } stbi_io_callbacks;
415 
416 ////////////////////////////////////
417 //
418 // 8-bits-per-channel interface
419 //
420 
421 STBIDEF stbi_uc *stbi_load_from_memory   (stbi_uc           const *buffer, int len   , int *x, int *y, int *channels_in_file, int desired_channels);
422 STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk  , void *user, int *x, int *y, int *channels_in_file, int desired_channels);
423 
424 #ifndef STBI_NO_STDIO
425 STBIDEF stbi_uc *stbi_load            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
426 STBIDEF stbi_uc *stbi_load_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
427 // for stbi_load_from_file, file pointer is left pointing immediately after image
428 #endif
429 
430 #ifndef STBI_NO_GIF
431 STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
432 #endif
433 
434 #ifdef STBI_WINDOWS_UTF8
435 STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
436 #endif
437 
438 ////////////////////////////////////
439 //
440 // 16-bits-per-channel interface
441 //
442 
443 STBIDEF stbi_us *stbi_load_16_from_memory   (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
444 STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
445 
446 #ifndef STBI_NO_STDIO
447 STBIDEF stbi_us *stbi_load_16          (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
448 STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
449 #endif
450 
451 ////////////////////////////////////
452 //
453 // float-per-channel interface
454 //
455 #ifndef STBI_NO_LINEAR
456    STBIDEF float *stbi_loadf_from_memory     (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
457    STBIDEF float *stbi_loadf_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y,  int *channels_in_file, int desired_channels);
458 
459    #ifndef STBI_NO_STDIO
460    STBIDEF float *stbi_loadf            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
461    STBIDEF float *stbi_loadf_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
462    #endif
463 #endif
464 
465 #ifndef STBI_NO_HDR
466    STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma);
467    STBIDEF void   stbi_hdr_to_ldr_scale(float scale);
468 #endif // STBI_NO_HDR
469 
470 #ifndef STBI_NO_LINEAR
471    STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma);
472    STBIDEF void   stbi_ldr_to_hdr_scale(float scale);
473 #endif // STBI_NO_LINEAR
474 
475 // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
476 STBIDEF int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
477 STBIDEF int    stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
478 #ifndef STBI_NO_STDIO
479 STBIDEF int      stbi_is_hdr          (char const *filename);
480 STBIDEF int      stbi_is_hdr_from_file(FILE *f);
481 #endif // STBI_NO_STDIO
482 
483 
484 // get a VERY brief reason for failure
485 // on most compilers (and ALL modern mainstream compilers) this is threadsafe
486 STBIDEF const char *stbi_failure_reason  (void);
487 
488 // free the loaded image -- this is just free()
489 STBIDEF void     stbi_image_free      (void *retval_from_stbi_load);
490 
491 // get image dimensions & components without fully decoding
492 STBIDEF int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
493 STBIDEF int      stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
494 STBIDEF int      stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len);
495 STBIDEF int      stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user);
496 
497 #ifndef STBI_NO_STDIO
498 STBIDEF int      stbi_info               (char const *filename,     int *x, int *y, int *comp);
499 STBIDEF int      stbi_info_from_file     (FILE *f,                  int *x, int *y, int *comp);
500 STBIDEF int      stbi_is_16_bit          (char const *filename);
501 STBIDEF int      stbi_is_16_bit_from_file(FILE *f);
502 #endif
503 
504 
505 
506 // for image formats that explicitly notate that they have premultiplied alpha,
507 // we just return the colors as stored in the file. set this flag to force
508 // unpremultiplication. results are undefined if the unpremultiply overflow.
509 STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
510 
511 // indicate whether we should process iphone images back to canonical format,
512 // or just pass them through "as-is"
513 STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
514 
515 // flip the image vertically, so the first pixel in the output array is the bottom left
516 STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);
517 
518 // as above, but only applies to images loaded on the thread that calls the function
519 // this function is only available if your compiler supports thread-local variables;
520 // calling it will fail to link if your compiler doesn't
521 STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply);
522 STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert);
523 STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip);
524 
525 // ZLIB client - used by PNG, available for other purposes
526 
527 STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
528 STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
529 STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
530 STBIDEF int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
531 
532 STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
533 STBIDEF int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
534 
535 
536 #ifdef __cplusplus
537 }
538 #endif
539 
540 //
541 //
542 ////   end header file   /////////////////////////////////////////////////////
543 #endif // STBI_INCLUDE_STB_IMAGE_H
544 
545 #ifdef STB_IMAGE_IMPLEMENTATION
546 
547 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
548   || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
549   || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
550   || defined(STBI_ONLY_ZLIB)
551    #ifndef STBI_ONLY_JPEG
552    #define STBI_NO_JPEG
553    #endif
554    #ifndef STBI_ONLY_PNG
555    #define STBI_NO_PNG
556    #endif
557    #ifndef STBI_ONLY_BMP
558    #define STBI_NO_BMP
559    #endif
560    #ifndef STBI_ONLY_PSD
561    #define STBI_NO_PSD
562    #endif
563    #ifndef STBI_ONLY_TGA
564    #define STBI_NO_TGA
565    #endif
566    #ifndef STBI_ONLY_GIF
567    #define STBI_NO_GIF
568    #endif
569    #ifndef STBI_ONLY_HDR
570    #define STBI_NO_HDR
571    #endif
572    #ifndef STBI_ONLY_PIC
573    #define STBI_NO_PIC
574    #endif
575    #ifndef STBI_ONLY_PNM
576    #define STBI_NO_PNM
577    #endif
578 #endif
579 
580 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
581 #define STBI_NO_ZLIB
582 #endif
583 
584 
585 #include <stdarg.h>
586 #include <stddef.h> // ptrdiff_t on osx
587 #include <stdlib.h>
588 #include <string.h>
589 #include <limits.h>
590 
591 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
592 #include <math.h>  // ldexp, pow
593 #endif
594 
595 #ifndef STBI_NO_STDIO
596 #include <stdio.h>
597 #endif
598 
599 #ifndef STBI_ASSERT
600 #include <assert.h>
601 #define STBI_ASSERT(x) assert(x)
602 #endif
603 
604 #ifdef __cplusplus
605 #define STBI_EXTERN extern "C"
606 #else
607 #define STBI_EXTERN extern
608 #endif
609 
610 
611 #ifndef _MSC_VER
612    #ifdef __cplusplus
613    #define stbi_inline inline
614    #else
615    #define stbi_inline
616    #endif
617 #else
618    #define stbi_inline __forceinline
619 #endif
620 
621 #ifndef STBI_NO_THREAD_LOCALS
622    #if defined(__cplusplus) &&  __cplusplus >= 201103L
623       #define STBI_THREAD_LOCAL       thread_local
624    #elif defined(__GNUC__) && __GNUC__ < 5
625       #define STBI_THREAD_LOCAL       __thread
626    #elif defined(_MSC_VER)
627       #define STBI_THREAD_LOCAL       __declspec(thread)
628    #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
629       #define STBI_THREAD_LOCAL       _Thread_local
630    #endif
631 
632    #ifndef STBI_THREAD_LOCAL
633       #if defined(__GNUC__)
634         #define STBI_THREAD_LOCAL       __thread
635       #endif
636    #endif
637 #endif
638 
639 #if defined(_MSC_VER) || defined(__SYMBIAN32__)
640 typedef unsigned short stbi__uint16;
641 typedef   signed short stbi__int16;
642 typedef unsigned int   stbi__uint32;
643 typedef   signed int   stbi__int32;
644 #else
645 #include <stdint.h>
646 typedef uint16_t stbi__uint16;
647 typedef int16_t  stbi__int16;
648 typedef uint32_t stbi__uint32;
649 typedef int32_t  stbi__int32;
650 #endif
651 
652 // should produce compiler error if size is wrong
653 typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
654 
655 #ifdef _MSC_VER
656 #define STBI_NOTUSED(v)  (void)(v)
657 #else
658 #define STBI_NOTUSED(v)  (void)sizeof(v)
659 #endif
660 
661 #ifdef _MSC_VER
662 #define STBI_HAS_LROTL
663 #endif
664 
665 #ifdef STBI_HAS_LROTL
666    #define stbi_lrot(x,y)  _lrotl(x,y)
667 #else
668    #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (-(y) & 31)))
669 #endif
670 
671 #if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
672 // ok
673 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
674 // ok
675 #else
676 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
677 #endif
678 
679 #ifndef STBI_MALLOC
680 #define STBI_MALLOC(sz)           malloc(sz)
681 #define STBI_REALLOC(p,newsz)     realloc(p,newsz)
682 #define STBI_FREE(p)              free(p)
683 #endif
684 
685 #ifndef STBI_REALLOC_SIZED
686 #define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
687 #endif
688 
689 // x86/x64 detection
690 #if defined(__x86_64__) || defined(_M_X64)
691 #define STBI__X64_TARGET
692 #elif defined(__i386) || defined(_M_IX86)
693 #define STBI__X86_TARGET
694 #endif
695 
696 #if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
697 // gcc doesn't support sse2 intrinsics unless you compile with -msse2,
698 // which in turn means it gets to use SSE2 everywhere. This is unfortunate,
699 // but previous attempts to provide the SSE2 functions with runtime
700 // detection caused numerous issues. The way architecture extensions are
701 // exposed in GCC/Clang is, sadly, not really suited for one-file libs.
702 // New behavior: if compiled with -msse2, we use SSE2 without any
703 // detection; if not, we don't use it at all.
704 #define STBI_NO_SIMD
705 #endif
706 
707 #if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
708 // Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET
709 //
710 // 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the
711 // Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.
712 // As a result, enabling SSE2 on 32-bit MinGW is dangerous when not
713 // simultaneously enabling "-mstackrealign".
714 //
715 // See https://github.com/nothings/stb/issues/81 for more information.
716 //
717 // So default to no SSE2 on 32-bit MinGW. If you've read this far and added
718 // -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.
719 #define STBI_NO_SIMD
720 #endif
721 
722 #if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
723 #define STBI_SSE2
724 #include <emmintrin.h>
725 
726 #ifdef _MSC_VER
727 
728 #if _MSC_VER >= 1400  // not VC6
729 #include <intrin.h> // __cpuid
stbi__cpuid3(void)730 static int stbi__cpuid3(void)
731 {
732    int info[4];
733    __cpuid(info,1);
734    return info[3];
735 }
736 #else
stbi__cpuid3(void)737 static int stbi__cpuid3(void)
738 {
739    int res;
740    __asm {
741       mov  eax,1
742       cpuid
743       mov  res,edx
744    }
745    return res;
746 }
747 #endif
748 
749 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
750 
751 #if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
stbi__sse2_available(void)752 static int stbi__sse2_available(void)
753 {
754    int info3 = stbi__cpuid3();
755    return ((info3 >> 26) & 1) != 0;
756 }
757 #endif
758 
759 #else // assume GCC-style if not VC++
760 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
761 
762 #if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
stbi__sse2_available(void)763 static int stbi__sse2_available(void)
764 {
765    // If we're even attempting to compile this on GCC/Clang, that means
766    // -msse2 is on, which means the compiler is allowed to use SSE2
767    // instructions at will, and so are we.
768    return 1;
769 }
770 #endif
771 
772 #endif
773 #endif
774 
775 // ARM NEON
776 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)
777 #undef STBI_NEON
778 #endif
779 
780 #ifdef STBI_NEON
781 #include <arm_neon.h>
782 #ifdef _MSC_VER
783 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
784 #else
785 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
786 #endif
787 #endif
788 
789 #ifndef STBI_SIMD_ALIGN
790 #define STBI_SIMD_ALIGN(type, name) type name
791 #endif
792 
793 #ifndef STBI_MAX_DIMENSIONS
794 #define STBI_MAX_DIMENSIONS (1 << 24)
795 #endif
796 
797 ///////////////////////////////////////////////
798 //
799 //  stbi__context struct and start_xxx functions
800 
801 // stbi__context structure is our basic context used by all images, so it
802 // contains all the IO context, plus some basic image information
803 typedef struct
804 {
805    stbi__uint32 img_x, img_y;
806    int img_n, img_out_n;
807 
808    stbi_io_callbacks io;
809    void *io_user_data;
810 
811    int read_from_callbacks;
812    int buflen;
813    stbi_uc buffer_start[128];
814    int callback_already_read;
815 
816    stbi_uc *img_buffer, *img_buffer_end;
817    stbi_uc *img_buffer_original, *img_buffer_original_end;
818 } stbi__context;
819 
820 
821 static void stbi__refill_buffer(stbi__context *s);
822 
823 // initialize a memory-decode context
stbi__start_mem(stbi__context * s,stbi_uc const * buffer,int len)824 static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)
825 {
826    s->io.read = NULL;
827    s->read_from_callbacks = 0;
828    s->callback_already_read = 0;
829    s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
830    s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
831 }
832 
833 // initialize a callback-based context
stbi__start_callbacks(stbi__context * s,stbi_io_callbacks * c,void * user)834 static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)
835 {
836    s->io = *c;
837    s->io_user_data = user;
838    s->buflen = sizeof(s->buffer_start);
839    s->read_from_callbacks = 1;
840    s->callback_already_read = 0;
841    s->img_buffer = s->img_buffer_original = s->buffer_start;
842    stbi__refill_buffer(s);
843    s->img_buffer_original_end = s->img_buffer_end;
844 }
845 
846 #ifndef STBI_NO_STDIO
847 
stbi__stdio_read(void * user,char * data,int size)848 static int stbi__stdio_read(void *user, char *data, int size)
849 {
850    return (int) fread(data,1,size,(FILE*) user);
851 }
852 
stbi__stdio_skip(void * user,int n)853 static void stbi__stdio_skip(void *user, int n)
854 {
855    int ch;
856    fseek((FILE*) user, n, SEEK_CUR);
857    ch = fgetc((FILE*) user);  /* have to read a byte to reset feof()'s flag */
858    if (ch != EOF) {
859       ungetc(ch, (FILE *) user);  /* push byte back onto stream if valid. */
860    }
861 }
862 
stbi__stdio_eof(void * user)863 static int stbi__stdio_eof(void *user)
864 {
865    return feof((FILE*) user) || ferror((FILE *) user);
866 }
867 
868 static stbi_io_callbacks stbi__stdio_callbacks =
869 {
870    stbi__stdio_read,
871    stbi__stdio_skip,
872    stbi__stdio_eof,
873 };
874 
stbi__start_file(stbi__context * s,FILE * f)875 static void stbi__start_file(stbi__context *s, FILE *f)
876 {
877    stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);
878 }
879 
880 //static void stop_file(stbi__context *s) { }
881 
882 #endif // !STBI_NO_STDIO
883 
stbi__rewind(stbi__context * s)884 static void stbi__rewind(stbi__context *s)
885 {
886    // conceptually rewind SHOULD rewind to the beginning of the stream,
887    // but we just rewind to the beginning of the initial buffer, because
888    // we only use it after doing 'test', which only ever looks at at most 92 bytes
889    s->img_buffer = s->img_buffer_original;
890    s->img_buffer_end = s->img_buffer_original_end;
891 }
892 
893 enum
894 {
895    STBI_ORDER_RGB,
896    STBI_ORDER_BGR
897 };
898 
899 typedef struct
900 {
901    int bits_per_channel;
902    int num_channels;
903    int channel_order;
904 } stbi__result_info;
905 
906 #ifndef STBI_NO_JPEG
907 static int      stbi__jpeg_test(stbi__context *s);
908 static void    *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
909 static int      stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
910 #endif
911 
912 #ifndef STBI_NO_PNG
913 static int      stbi__png_test(stbi__context *s);
914 static void    *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
915 static int      stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
916 static int      stbi__png_is16(stbi__context *s);
917 #endif
918 
919 #ifndef STBI_NO_BMP
920 static int      stbi__bmp_test(stbi__context *s);
921 static void    *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
922 static int      stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);
923 #endif
924 
925 #ifndef STBI_NO_TGA
926 static int      stbi__tga_test(stbi__context *s);
927 static void    *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
928 static int      stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
929 #endif
930 
931 #ifndef STBI_NO_PSD
932 static int      stbi__psd_test(stbi__context *s);
933 static void    *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);
934 static int      stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
935 static int      stbi__psd_is16(stbi__context *s);
936 #endif
937 
938 #ifndef STBI_NO_HDR
939 static int      stbi__hdr_test(stbi__context *s);
940 static float   *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
941 static int      stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);
942 #endif
943 
944 #ifndef STBI_NO_PIC
945 static int      stbi__pic_test(stbi__context *s);
946 static void    *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
947 static int      stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
948 #endif
949 
950 #ifndef STBI_NO_GIF
951 static int      stbi__gif_test(stbi__context *s);
952 static void    *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
953 static void    *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
954 static int      stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
955 #endif
956 
957 #ifndef STBI_NO_PNM
958 static int      stbi__pnm_test(stbi__context *s);
959 static void    *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
960 static int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
961 static int      stbi__pnm_is16(stbi__context *s);
962 #endif
963 
964 static
965 #ifdef STBI_THREAD_LOCAL
966 STBI_THREAD_LOCAL
967 #endif
968 const char *stbi__g_failure_reason;
969 
stbi_failure_reason(void)970 STBIDEF const char *stbi_failure_reason(void)
971 {
972    return stbi__g_failure_reason;
973 }
974 
975 #ifndef STBI_NO_FAILURE_STRINGS
stbi__err(const char * str)976 static int stbi__err(const char *str)
977 {
978    stbi__g_failure_reason = str;
979    return 0;
980 }
981 #endif
982 
stbi__malloc(size_t size)983 static void *stbi__malloc(size_t size)
984 {
985     return STBI_MALLOC(size);
986 }
987 
988 // stb_image uses ints pervasively, including for offset calculations.
989 // therefore the largest decoded image size we can support with the
990 // current code, even on 64-bit targets, is INT_MAX. this is not a
991 // significant limitation for the intended use case.
992 //
993 // we do, however, need to make sure our size calculations don't
994 // overflow. hence a few helper functions for size calculations that
995 // multiply integers together, making sure that they're non-negative
996 // and no overflow occurs.
997 
998 // return 1 if the sum is valid, 0 on overflow.
999 // negative terms are considered invalid.
stbi__addsizes_valid(int a,int b)1000 static int stbi__addsizes_valid(int a, int b)
1001 {
1002    if (b < 0) return 0;
1003    // now 0 <= b <= INT_MAX, hence also
1004    // 0 <= INT_MAX - b <= INTMAX.
1005    // And "a + b <= INT_MAX" (which might overflow) is the
1006    // same as a <= INT_MAX - b (no overflow)
1007    return a <= INT_MAX - b;
1008 }
1009 
1010 // returns 1 if the product is valid, 0 on overflow.
1011 // negative factors are considered invalid.
stbi__mul2sizes_valid(int a,int b)1012 static int stbi__mul2sizes_valid(int a, int b)
1013 {
1014    if (a < 0 || b < 0) return 0;
1015    if (b == 0) return 1; // mul-by-0 is always safe
1016    // portable way to check for no overflows in a*b
1017    return a <= INT_MAX/b;
1018 }
1019 
1020 #if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1021 // returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow
stbi__mad2sizes_valid(int a,int b,int add)1022 static int stbi__mad2sizes_valid(int a, int b, int add)
1023 {
1024    return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
1025 }
1026 #endif
1027 
1028 // returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow
stbi__mad3sizes_valid(int a,int b,int c,int add)1029 static int stbi__mad3sizes_valid(int a, int b, int c, int add)
1030 {
1031    return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
1032       stbi__addsizes_valid(a*b*c, add);
1033 }
1034 
1035 // returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow
1036 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
stbi__mad4sizes_valid(int a,int b,int c,int d,int add)1037 static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
1038 {
1039    return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
1040       stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
1041 }
1042 #endif
1043 
1044 #if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1045 // mallocs with size overflow checking
stbi__malloc_mad2(int a,int b,int add)1046 static void *stbi__malloc_mad2(int a, int b, int add)
1047 {
1048    if (!stbi__mad2sizes_valid(a, b, add)) return NULL;
1049    return stbi__malloc(a*b + add);
1050 }
1051 #endif
1052 
stbi__malloc_mad3(int a,int b,int c,int add)1053 static void *stbi__malloc_mad3(int a, int b, int c, int add)
1054 {
1055    if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;
1056    return stbi__malloc(a*b*c + add);
1057 }
1058 
1059 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
stbi__malloc_mad4(int a,int b,int c,int d,int add)1060 static void *stbi__malloc_mad4(int a, int b, int c, int d, int add)
1061 {
1062    if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;
1063    return stbi__malloc(a*b*c*d + add);
1064 }
1065 #endif
1066 
1067 // returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow.
stbi__addints_valid(int a,int b)1068 static int stbi__addints_valid(int a, int b)
1069 {
1070    if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow
1071    if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0.
1072    return a <= INT_MAX - b;
1073 }
1074 
1075 // returns 1 if the product of two signed shorts is valid, 0 on overflow.
stbi__mul2shorts_valid(short a,short b)1076 static int stbi__mul2shorts_valid(short a, short b)
1077 {
1078    if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow
1079    if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid
1080    if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN
1081    return a >= SHRT_MIN / b;
1082 }
1083 
1084 // stbi__err - error
1085 // stbi__errpf - error returning pointer to float
1086 // stbi__errpuc - error returning pointer to unsigned char
1087 
1088 #ifdef STBI_NO_FAILURE_STRINGS
1089    #define stbi__err(x,y)  0
1090 #elif defined(STBI_FAILURE_USERMSG)
1091    #define stbi__err(x,y)  stbi__err(y)
1092 #else
1093    #define stbi__err(x,y)  stbi__err(x)
1094 #endif
1095 
1096 #define stbi__errpf(x,y)   ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
1097 #define stbi__errpuc(x,y)  ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
1098 
stbi_image_free(void * retval_from_stbi_load)1099 STBIDEF void stbi_image_free(void *retval_from_stbi_load)
1100 {
1101    STBI_FREE(retval_from_stbi_load);
1102 }
1103 
1104 #ifndef STBI_NO_LINEAR
1105 static float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
1106 #endif
1107 
1108 #ifndef STBI_NO_HDR
1109 static stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp);
1110 #endif
1111 
1112 static int stbi__vertically_flip_on_load_global = 0;
1113 
stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)1114 STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
1115 {
1116    stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
1117 }
1118 
1119 #ifndef STBI_THREAD_LOCAL
1120 #define stbi__vertically_flip_on_load  stbi__vertically_flip_on_load_global
1121 #else
1122 static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
1123 
stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)1124 STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)
1125 {
1126    stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
1127    stbi__vertically_flip_on_load_set = 1;
1128 }
1129 
1130 #define stbi__vertically_flip_on_load  (stbi__vertically_flip_on_load_set       \
1131                                          ? stbi__vertically_flip_on_load_local  \
1132                                          : stbi__vertically_flip_on_load_global)
1133 #endif // STBI_THREAD_LOCAL
1134 
stbi__load_main(stbi__context * s,int * x,int * y,int * comp,int req_comp,stbi__result_info * ri,int bpc)1135 static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
1136 {
1137    memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
1138    ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed
1139    ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order
1140    ri->num_channels = 0;
1141 
1142    // test the formats with a very explicit header first (at least a FOURCC
1143    // or distinctive magic number first)
1144    #ifndef STBI_NO_PNG
1145    if (stbi__png_test(s))  return stbi__png_load(s,x,y,comp,req_comp, ri);
1146    #endif
1147    #ifndef STBI_NO_BMP
1148    if (stbi__bmp_test(s))  return stbi__bmp_load(s,x,y,comp,req_comp, ri);
1149    #endif
1150    #ifndef STBI_NO_GIF
1151    if (stbi__gif_test(s))  return stbi__gif_load(s,x,y,comp,req_comp, ri);
1152    #endif
1153    #ifndef STBI_NO_PSD
1154    if (stbi__psd_test(s))  return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
1155    #else
1156    STBI_NOTUSED(bpc);
1157    #endif
1158    #ifndef STBI_NO_PIC
1159    if (stbi__pic_test(s))  return stbi__pic_load(s,x,y,comp,req_comp, ri);
1160    #endif
1161 
1162    // then the formats that can end up attempting to load with just 1 or 2
1163    // bytes matching expectations; these are prone to false positives, so
1164    // try them later
1165    #ifndef STBI_NO_JPEG
1166    if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
1167    #endif
1168    #ifndef STBI_NO_PNM
1169    if (stbi__pnm_test(s))  return stbi__pnm_load(s,x,y,comp,req_comp, ri);
1170    #endif
1171 
1172    #ifndef STBI_NO_HDR
1173    if (stbi__hdr_test(s)) {
1174       float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
1175       return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
1176    }
1177    #endif
1178 
1179    #ifndef STBI_NO_TGA
1180    // test tga last because it's a crappy test!
1181    if (stbi__tga_test(s))
1182       return stbi__tga_load(s,x,y,comp,req_comp, ri);
1183    #endif
1184 
1185    return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
1186 }
1187 
stbi__convert_16_to_8(stbi__uint16 * orig,int w,int h,int channels)1188 static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)
1189 {
1190    int i;
1191    int img_len = w * h * channels;
1192    stbi_uc *reduced;
1193 
1194    reduced = (stbi_uc *) stbi__malloc(img_len);
1195    if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory");
1196 
1197    for (i = 0; i < img_len; ++i)
1198       reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling
1199 
1200    STBI_FREE(orig);
1201    return reduced;
1202 }
1203 
stbi__convert_8_to_16(stbi_uc * orig,int w,int h,int channels)1204 static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)
1205 {
1206    int i;
1207    int img_len = w * h * channels;
1208    stbi__uint16 *enlarged;
1209 
1210    enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
1211    if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
1212 
1213    for (i = 0; i < img_len; ++i)
1214       enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff
1215 
1216    STBI_FREE(orig);
1217    return enlarged;
1218 }
1219 
stbi__vertical_flip(void * image,int w,int h,int bytes_per_pixel)1220 static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)
1221 {
1222    int row;
1223    size_t bytes_per_row = (size_t)w * bytes_per_pixel;
1224    stbi_uc temp[2048];
1225    stbi_uc *bytes = (stbi_uc *)image;
1226 
1227    for (row = 0; row < (h>>1); row++) {
1228       stbi_uc *row0 = bytes + row*bytes_per_row;
1229       stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
1230       // swap row0 with row1
1231       size_t bytes_left = bytes_per_row;
1232       while (bytes_left) {
1233          size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);
1234          memcpy(temp, row0, bytes_copy);
1235          memcpy(row0, row1, bytes_copy);
1236          memcpy(row1, temp, bytes_copy);
1237          row0 += bytes_copy;
1238          row1 += bytes_copy;
1239          bytes_left -= bytes_copy;
1240       }
1241    }
1242 }
1243 
1244 #ifndef STBI_NO_GIF
stbi__vertical_flip_slices(void * image,int w,int h,int z,int bytes_per_pixel)1245 static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)
1246 {
1247    int slice;
1248    int slice_size = w * h * bytes_per_pixel;
1249 
1250    stbi_uc *bytes = (stbi_uc *)image;
1251    for (slice = 0; slice < z; ++slice) {
1252       stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
1253       bytes += slice_size;
1254    }
1255 }
1256 #endif
1257 
stbi__load_and_postprocess_8bit(stbi__context * s,int * x,int * y,int * comp,int req_comp)1258 static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1259 {
1260    stbi__result_info ri;
1261    void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1262 
1263    if (result == NULL)
1264       return NULL;
1265 
1266    // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
1267    STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1268 
1269    if (ri.bits_per_channel != 8) {
1270       result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1271       ri.bits_per_channel = 8;
1272    }
1273 
1274    // @TODO: move stbi__convert_format to here
1275 
1276    if (stbi__vertically_flip_on_load) {
1277       int channels = req_comp ? req_comp : *comp;
1278       stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));
1279    }
1280 
1281    return (unsigned char *) result;
1282 }
1283 
stbi__load_and_postprocess_16bit(stbi__context * s,int * x,int * y,int * comp,int req_comp)1284 static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1285 {
1286    stbi__result_info ri;
1287    void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1288 
1289    if (result == NULL)
1290       return NULL;
1291 
1292    // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
1293    STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1294 
1295    if (ri.bits_per_channel != 16) {
1296       result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
1297       ri.bits_per_channel = 16;
1298    }
1299 
1300    // @TODO: move stbi__convert_format16 to here
1301    // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision
1302 
1303    if (stbi__vertically_flip_on_load) {
1304       int channels = req_comp ? req_comp : *comp;
1305       stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));
1306    }
1307 
1308    return (stbi__uint16 *) result;
1309 }
1310 
1311 #if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
stbi__float_postprocess(float * result,int * x,int * y,int * comp,int req_comp)1312 static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
1313 {
1314    if (stbi__vertically_flip_on_load && result != NULL) {
1315       int channels = req_comp ? req_comp : *comp;
1316       stbi__vertical_flip(result, *x, *y, channels * sizeof(float));
1317    }
1318 }
1319 #endif
1320 
1321 #ifndef STBI_NO_STDIO
1322 
1323 #if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1324 STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
1325 STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);
1326 #endif
1327 
1328 #if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
stbi_convert_wchar_to_utf8(char * buffer,size_t bufferlen,const wchar_t * input)1329 STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
1330 {
1331 	return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);
1332 }
1333 #endif
1334 
stbi__fopen(char const * filename,char const * mode)1335 static FILE *stbi__fopen(char const *filename, char const *mode)
1336 {
1337    FILE *f;
1338 #if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1339    wchar_t wMode[64];
1340    wchar_t wFilename[1024];
1341 	if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename)))
1342       return 0;
1343 
1344 	if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode)))
1345       return 0;
1346 
1347 #if defined(_MSC_VER) && _MSC_VER >= 1400
1348 	if (0 != _wfopen_s(&f, wFilename, wMode))
1349 		f = 0;
1350 #else
1351    f = _wfopen(wFilename, wMode);
1352 #endif
1353 
1354 #elif defined(_MSC_VER) && _MSC_VER >= 1400
1355    if (0 != fopen_s(&f, filename, mode))
1356       f=0;
1357 #else
1358    f = fopen(filename, mode);
1359 #endif
1360    return f;
1361 }
1362 
1363 
stbi_load(char const * filename,int * x,int * y,int * comp,int req_comp)1364 STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
1365 {
1366    FILE *f = stbi__fopen(filename, "rb");
1367    unsigned char *result;
1368    if (!f) return stbi__errpuc("can't fopen", "Unable to open file");
1369    result = stbi_load_from_file(f,x,y,comp,req_comp);
1370    fclose(f);
1371    return result;
1372 }
1373 
stbi_load_from_file(FILE * f,int * x,int * y,int * comp,int req_comp)1374 STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
1375 {
1376    unsigned char *result;
1377    stbi__context s;
1378    stbi__start_file(&s,f);
1379    result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1380    if (result) {
1381       // need to 'unget' all the characters in the IO buffer
1382       fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1383    }
1384    return result;
1385 }
1386 
stbi_load_from_file_16(FILE * f,int * x,int * y,int * comp,int req_comp)1387 STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)
1388 {
1389    stbi__uint16 *result;
1390    stbi__context s;
1391    stbi__start_file(&s,f);
1392    result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
1393    if (result) {
1394       // need to 'unget' all the characters in the IO buffer
1395       fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1396    }
1397    return result;
1398 }
1399 
stbi_load_16(char const * filename,int * x,int * y,int * comp,int req_comp)1400 STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)
1401 {
1402    FILE *f = stbi__fopen(filename, "rb");
1403    stbi__uint16 *result;
1404    if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file");
1405    result = stbi_load_from_file_16(f,x,y,comp,req_comp);
1406    fclose(f);
1407    return result;
1408 }
1409 
1410 
1411 #endif //!STBI_NO_STDIO
1412 
stbi_load_16_from_memory(stbi_uc const * buffer,int len,int * x,int * y,int * channels_in_file,int desired_channels)1413 STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)
1414 {
1415    stbi__context s;
1416    stbi__start_mem(&s,buffer,len);
1417    return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1418 }
1419 
stbi_load_16_from_callbacks(stbi_io_callbacks const * clbk,void * user,int * x,int * y,int * channels_in_file,int desired_channels)1420 STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels)
1421 {
1422    stbi__context s;
1423    stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);
1424    return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1425 }
1426 
stbi_load_from_memory(stbi_uc const * buffer,int len,int * x,int * y,int * comp,int req_comp)1427 STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
1428 {
1429    stbi__context s;
1430    stbi__start_mem(&s,buffer,len);
1431    return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1432 }
1433 
stbi_load_from_callbacks(stbi_io_callbacks const * clbk,void * user,int * x,int * y,int * comp,int req_comp)1434 STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
1435 {
1436    stbi__context s;
1437    stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
1438    return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1439 }
1440 
1441 #ifndef STBI_NO_GIF
stbi_load_gif_from_memory(stbi_uc const * buffer,int len,int ** delays,int * x,int * y,int * z,int * comp,int req_comp)1442 STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
1443 {
1444    unsigned char *result;
1445    stbi__context s;
1446    stbi__start_mem(&s,buffer,len);
1447 
1448    result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
1449    if (stbi__vertically_flip_on_load && result) {
1450       int channels = req_comp ? req_comp : *comp;
1451       stbi__vertical_flip_slices( result, *x, *y, *z, channels );
1452    }
1453 
1454    return result;
1455 }
1456 #endif
1457 
1458 #ifndef STBI_NO_LINEAR
stbi__loadf_main(stbi__context * s,int * x,int * y,int * comp,int req_comp)1459 static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1460 {
1461    unsigned char *data;
1462    #ifndef STBI_NO_HDR
1463    if (stbi__hdr_test(s)) {
1464       stbi__result_info ri;
1465       float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
1466       if (hdr_data)
1467          stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1468       return hdr_data;
1469    }
1470    #endif
1471    data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
1472    if (data)
1473       return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1474    return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");
1475 }
1476 
stbi_loadf_from_memory(stbi_uc const * buffer,int len,int * x,int * y,int * comp,int req_comp)1477 STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
1478 {
1479    stbi__context s;
1480    stbi__start_mem(&s,buffer,len);
1481    return stbi__loadf_main(&s,x,y,comp,req_comp);
1482 }
1483 
stbi_loadf_from_callbacks(stbi_io_callbacks const * clbk,void * user,int * x,int * y,int * comp,int req_comp)1484 STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
1485 {
1486    stbi__context s;
1487    stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
1488    return stbi__loadf_main(&s,x,y,comp,req_comp);
1489 }
1490 
1491 #ifndef STBI_NO_STDIO
stbi_loadf(char const * filename,int * x,int * y,int * comp,int req_comp)1492 STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
1493 {
1494    float *result;
1495    FILE *f = stbi__fopen(filename, "rb");
1496    if (!f) return stbi__errpf("can't fopen", "Unable to open file");
1497    result = stbi_loadf_from_file(f,x,y,comp,req_comp);
1498    fclose(f);
1499    return result;
1500 }
1501 
stbi_loadf_from_file(FILE * f,int * x,int * y,int * comp,int req_comp)1502 STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
1503 {
1504    stbi__context s;
1505    stbi__start_file(&s,f);
1506    return stbi__loadf_main(&s,x,y,comp,req_comp);
1507 }
1508 #endif // !STBI_NO_STDIO
1509 
1510 #endif // !STBI_NO_LINEAR
1511 
1512 // these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is
1513 // defined, for API simplicity; if STBI_NO_LINEAR is defined, it always
1514 // reports false!
1515 
stbi_is_hdr_from_memory(stbi_uc const * buffer,int len)1516 STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
1517 {
1518    #ifndef STBI_NO_HDR
1519    stbi__context s;
1520    stbi__start_mem(&s,buffer,len);
1521    return stbi__hdr_test(&s);
1522    #else
1523    STBI_NOTUSED(buffer);
1524    STBI_NOTUSED(len);
1525    return 0;
1526    #endif
1527 }
1528 
1529 #ifndef STBI_NO_STDIO
stbi_is_hdr(char const * filename)1530 STBIDEF int      stbi_is_hdr          (char const *filename)
1531 {
1532    FILE *f = stbi__fopen(filename, "rb");
1533    int result=0;
1534    if (f) {
1535       result = stbi_is_hdr_from_file(f);
1536       fclose(f);
1537    }
1538    return result;
1539 }
1540 
stbi_is_hdr_from_file(FILE * f)1541 STBIDEF int stbi_is_hdr_from_file(FILE *f)
1542 {
1543    #ifndef STBI_NO_HDR
1544    long pos = ftell(f);
1545    int res;
1546    stbi__context s;
1547    stbi__start_file(&s,f);
1548    res = stbi__hdr_test(&s);
1549    fseek(f, pos, SEEK_SET);
1550    return res;
1551    #else
1552    STBI_NOTUSED(f);
1553    return 0;
1554    #endif
1555 }
1556 #endif // !STBI_NO_STDIO
1557 
stbi_is_hdr_from_callbacks(stbi_io_callbacks const * clbk,void * user)1558 STBIDEF int      stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
1559 {
1560    #ifndef STBI_NO_HDR
1561    stbi__context s;
1562    stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
1563    return stbi__hdr_test(&s);
1564    #else
1565    STBI_NOTUSED(clbk);
1566    STBI_NOTUSED(user);
1567    return 0;
1568    #endif
1569 }
1570 
1571 #ifndef STBI_NO_LINEAR
1572 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1573 
stbi_ldr_to_hdr_gamma(float gamma)1574 STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
stbi_ldr_to_hdr_scale(float scale)1575 STBIDEF void   stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
1576 #endif
1577 
1578 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1579 
stbi_hdr_to_ldr_gamma(float gamma)1580 STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
stbi_hdr_to_ldr_scale(float scale)1581 STBIDEF void   stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
1582 
1583 
1584 //////////////////////////////////////////////////////////////////////////////
1585 //
1586 // Common code used by all image loaders
1587 //
1588 
1589 enum
1590 {
1591    STBI__SCAN_load=0,
1592    STBI__SCAN_type,
1593    STBI__SCAN_header
1594 };
1595 
stbi__refill_buffer(stbi__context * s)1596 static void stbi__refill_buffer(stbi__context *s)
1597 {
1598    int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);
1599    s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original);
1600    if (n == 0) {
1601       // at end of file, treat same as if from memory, but need to handle case
1602       // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file
1603       s->read_from_callbacks = 0;
1604       s->img_buffer = s->buffer_start;
1605       s->img_buffer_end = s->buffer_start+1;
1606       *s->img_buffer = 0;
1607    } else {
1608       s->img_buffer = s->buffer_start;
1609       s->img_buffer_end = s->buffer_start + n;
1610    }
1611 }
1612 
stbi__get8(stbi__context * s)1613 stbi_inline static stbi_uc stbi__get8(stbi__context *s)
1614 {
1615    if (s->img_buffer < s->img_buffer_end)
1616       return *s->img_buffer++;
1617    if (s->read_from_callbacks) {
1618       stbi__refill_buffer(s);
1619       return *s->img_buffer++;
1620    }
1621    return 0;
1622 }
1623 
1624 #if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1625 // nothing
1626 #else
stbi__at_eof(stbi__context * s)1627 stbi_inline static int stbi__at_eof(stbi__context *s)
1628 {
1629    if (s->io.read) {
1630       if (!(s->io.eof)(s->io_user_data)) return 0;
1631       // if feof() is true, check if buffer = end
1632       // special case: we've only got the special 0 character at the end
1633       if (s->read_from_callbacks == 0) return 1;
1634    }
1635 
1636    return s->img_buffer >= s->img_buffer_end;
1637 }
1638 #endif
1639 
1640 #if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC)
1641 // nothing
1642 #else
stbi__skip(stbi__context * s,int n)1643 static void stbi__skip(stbi__context *s, int n)
1644 {
1645    if (n == 0) return;  // already there!
1646    if (n < 0) {
1647       s->img_buffer = s->img_buffer_end;
1648       return;
1649    }
1650    if (s->io.read) {
1651       int blen = (int) (s->img_buffer_end - s->img_buffer);
1652       if (blen < n) {
1653          s->img_buffer = s->img_buffer_end;
1654          (s->io.skip)(s->io_user_data, n - blen);
1655          return;
1656       }
1657    }
1658    s->img_buffer += n;
1659 }
1660 #endif
1661 
1662 #if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
1663 // nothing
1664 #else
stbi__getn(stbi__context * s,stbi_uc * buffer,int n)1665 static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
1666 {
1667    if (s->io.read) {
1668       int blen = (int) (s->img_buffer_end - s->img_buffer);
1669       if (blen < n) {
1670          int res, count;
1671 
1672          memcpy(buffer, s->img_buffer, blen);
1673 
1674          count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);
1675          res = (count == (n-blen));
1676          s->img_buffer = s->img_buffer_end;
1677          return res;
1678       }
1679    }
1680 
1681    if (s->img_buffer+n <= s->img_buffer_end) {
1682       memcpy(buffer, s->img_buffer, n);
1683       s->img_buffer += n;
1684       return 1;
1685    } else
1686       return 0;
1687 }
1688 #endif
1689 
1690 #if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1691 // nothing
1692 #else
stbi__get16be(stbi__context * s)1693 static int stbi__get16be(stbi__context *s)
1694 {
1695    int z = stbi__get8(s);
1696    return (z << 8) + stbi__get8(s);
1697 }
1698 #endif
1699 
1700 #if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1701 // nothing
1702 #else
stbi__get32be(stbi__context * s)1703 static stbi__uint32 stbi__get32be(stbi__context *s)
1704 {
1705    stbi__uint32 z = stbi__get16be(s);
1706    return (z << 16) + stbi__get16be(s);
1707 }
1708 #endif
1709 
1710 #if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1711 // nothing
1712 #else
stbi__get16le(stbi__context * s)1713 static int stbi__get16le(stbi__context *s)
1714 {
1715    int z = stbi__get8(s);
1716    return z + (stbi__get8(s) << 8);
1717 }
1718 #endif
1719 
1720 #ifndef STBI_NO_BMP
stbi__get32le(stbi__context * s)1721 static stbi__uint32 stbi__get32le(stbi__context *s)
1722 {
1723    stbi__uint32 z = stbi__get16le(s);
1724    z += (stbi__uint32)stbi__get16le(s) << 16;
1725    return z;
1726 }
1727 #endif
1728 
1729 #define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))  // truncate int to byte without warnings
1730 
1731 #if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1732 // nothing
1733 #else
1734 //////////////////////////////////////////////////////////////////////////////
1735 //
1736 //  generic converter from built-in img_n to req_comp
1737 //    individual types do this automatically as much as possible (e.g. jpeg
1738 //    does all cases internally since it needs to colorspace convert anyway,
1739 //    and it never has alpha, so very few cases ). png can automatically
1740 //    interleave an alpha=255 channel, but falls back to this for other cases
1741 //
1742 //  assume data buffer is malloced, so malloc a new one and free that one
1743 //  only failure mode is malloc failing
1744 
stbi__compute_y(int r,int g,int b)1745 static stbi_uc stbi__compute_y(int r, int g, int b)
1746 {
1747    return (stbi_uc) (((r*77) + (g*150) +  (29*b)) >> 8);
1748 }
1749 #endif
1750 
1751 #if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1752 // nothing
1753 #else
stbi__convert_format(unsigned char * data,int img_n,int req_comp,unsigned int x,unsigned int y)1754 static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
1755 {
1756    int i,j;
1757    unsigned char *good;
1758 
1759    if (req_comp == img_n) return data;
1760    STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1761 
1762    good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
1763    if (good == NULL) {
1764       STBI_FREE(data);
1765       return stbi__errpuc("outofmem", "Out of memory");
1766    }
1767 
1768    for (j=0; j < (int) y; ++j) {
1769       unsigned char *src  = data + j * x * img_n   ;
1770       unsigned char *dest = good + j * x * req_comp;
1771 
1772       #define STBI__COMBO(a,b)  ((a)*8+(b))
1773       #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1774       // convert source image with img_n components to one with req_comp components;
1775       // avoid switch per pixel, so use switch per scanline and massive macros
1776       switch (STBI__COMBO(img_n, req_comp)) {
1777          STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255;                                     } break;
1778          STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } break;
1779          STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255;                     } break;
1780          STBI__CASE(2,1) { dest[0]=src[0];                                                  } break;
1781          STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } break;
1782          STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                  } break;
1783          STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255;        } break;
1784          STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } break;
1785          STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255;    } break;
1786          STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } break;
1787          STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;
1788          STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                    } break;
1789          default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion");
1790       }
1791       #undef STBI__CASE
1792    }
1793 
1794    STBI_FREE(data);
1795    return good;
1796 }
1797 #endif
1798 
1799 #if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1800 // nothing
1801 #else
stbi__compute_y_16(int r,int g,int b)1802 static stbi__uint16 stbi__compute_y_16(int r, int g, int b)
1803 {
1804    return (stbi__uint16) (((r*77) + (g*150) +  (29*b)) >> 8);
1805 }
1806 #endif
1807 
1808 #if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1809 // nothing
1810 #else
stbi__convert_format16(stbi__uint16 * data,int img_n,int req_comp,unsigned int x,unsigned int y)1811 static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)
1812 {
1813    int i,j;
1814    stbi__uint16 *good;
1815 
1816    if (req_comp == img_n) return data;
1817    STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1818 
1819    good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
1820    if (good == NULL) {
1821       STBI_FREE(data);
1822       return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
1823    }
1824 
1825    for (j=0; j < (int) y; ++j) {
1826       stbi__uint16 *src  = data + j * x * img_n   ;
1827       stbi__uint16 *dest = good + j * x * req_comp;
1828 
1829       #define STBI__COMBO(a,b)  ((a)*8+(b))
1830       #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1831       // convert source image with img_n components to one with req_comp components;
1832       // avoid switch per pixel, so use switch per scanline and massive macros
1833       switch (STBI__COMBO(img_n, req_comp)) {
1834          STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff;                                     } break;
1835          STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } break;
1836          STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff;                     } break;
1837          STBI__CASE(2,1) { dest[0]=src[0];                                                     } break;
1838          STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } break;
1839          STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                     } break;
1840          STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff;        } break;
1841          STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;
1842          STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;
1843          STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;
1844          STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;
1845          STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                       } break;
1846          default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion");
1847       }
1848       #undef STBI__CASE
1849    }
1850 
1851    STBI_FREE(data);
1852    return good;
1853 }
1854 #endif
1855 
1856 #ifndef STBI_NO_LINEAR
stbi__ldr_to_hdr(stbi_uc * data,int x,int y,int comp)1857 static float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
1858 {
1859    int i,k,n;
1860    float *output;
1861    if (!data) return NULL;
1862    output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0);
1863    if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); }
1864    // compute number of non-alpha components
1865    if (comp & 1) n = comp; else n = comp-1;
1866    for (i=0; i < x*y; ++i) {
1867       for (k=0; k < n; ++k) {
1868          output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1869       }
1870    }
1871    if (n < comp) {
1872       for (i=0; i < x*y; ++i) {
1873          output[i*comp + n] = data[i*comp + n]/255.0f;
1874       }
1875    }
1876    STBI_FREE(data);
1877    return output;
1878 }
1879 #endif
1880 
1881 #ifndef STBI_NO_HDR
1882 #define stbi__float2int(x)   ((int) (x))
stbi__hdr_to_ldr(float * data,int x,int y,int comp)1883 static stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp)
1884 {
1885    int i,k,n;
1886    stbi_uc *output;
1887    if (!data) return NULL;
1888    output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
1889    if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); }
1890    // compute number of non-alpha components
1891    if (comp & 1) n = comp; else n = comp-1;
1892    for (i=0; i < x*y; ++i) {
1893       for (k=0; k < n; ++k) {
1894          float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1895          if (z < 0) z = 0;
1896          if (z > 255) z = 255;
1897          output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1898       }
1899       if (k < comp) {
1900          float z = data[i*comp+k] * 255 + 0.5f;
1901          if (z < 0) z = 0;
1902          if (z > 255) z = 255;
1903          output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1904       }
1905    }
1906    STBI_FREE(data);
1907    return output;
1908 }
1909 #endif
1910 
1911 //////////////////////////////////////////////////////////////////////////////
1912 //
1913 //  "baseline" JPEG/JFIF decoder
1914 //
1915 //    simple implementation
1916 //      - doesn't support delayed output of y-dimension
1917 //      - simple interface (only one output format: 8-bit interleaved RGB)
1918 //      - doesn't try to recover corrupt jpegs
1919 //      - doesn't allow partial loading, loading multiple at once
1920 //      - still fast on x86 (copying globals into locals doesn't help x86)
1921 //      - allocates lots of intermediate memory (full size of all components)
1922 //        - non-interleaved case requires this anyway
1923 //        - allows good upsampling (see next)
1924 //    high-quality
1925 //      - upsampled channels are bilinearly interpolated, even across blocks
1926 //      - quality integer IDCT derived from IJG's 'slow'
1927 //    performance
1928 //      - fast huffman; reasonable integer IDCT
1929 //      - some SIMD kernels for common paths on targets with SSE2/NEON
1930 //      - uses a lot of intermediate memory, could cache poorly
1931 
1932 #ifndef STBI_NO_JPEG
1933 
1934 // huffman decoding acceleration
1935 #define FAST_BITS   9  // larger handles more cases; smaller stomps less cache
1936 
1937 typedef struct
1938 {
1939    stbi_uc  fast[1 << FAST_BITS];
1940    // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
1941    stbi__uint16 code[256];
1942    stbi_uc  values[256];
1943    stbi_uc  size[257];
1944    unsigned int maxcode[18];
1945    int    delta[17];   // old 'firstsymbol' - old 'firstcode'
1946 } stbi__huffman;
1947 
1948 typedef struct
1949 {
1950    stbi__context *s;
1951    stbi__huffman huff_dc[4];
1952    stbi__huffman huff_ac[4];
1953    stbi__uint16 dequant[4][64];
1954    stbi__int16 fast_ac[4][1 << FAST_BITS];
1955 
1956 // sizes for components, interleaved MCUs
1957    int img_h_max, img_v_max;
1958    int img_mcu_x, img_mcu_y;
1959    int img_mcu_w, img_mcu_h;
1960 
1961 // definition of jpeg image component
1962    struct
1963    {
1964       int id;
1965       int h,v;
1966       int tq;
1967       int hd,ha;
1968       int dc_pred;
1969 
1970       int x,y,w2,h2;
1971       stbi_uc *data;
1972       void *raw_data, *raw_coeff;
1973       stbi_uc *linebuf;
1974       short   *coeff;   // progressive only
1975       int      coeff_w, coeff_h; // number of 8x8 coefficient blocks
1976    } img_comp[4];
1977 
1978    stbi__uint32   code_buffer; // jpeg entropy-coded buffer
1979    int            code_bits;   // number of valid bits
1980    unsigned char  marker;      // marker seen while filling entropy buffer
1981    int            nomore;      // flag if we saw a marker so must stop
1982 
1983    int            progressive;
1984    int            spec_start;
1985    int            spec_end;
1986    int            succ_high;
1987    int            succ_low;
1988    int            eob_run;
1989    int            jfif;
1990    int            app14_color_transform; // Adobe APP14 tag
1991    int            rgb;
1992 
1993    int scan_n, order[4];
1994    int restart_interval, todo;
1995 
1996 // kernels
1997    void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);
1998    void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);
1999    stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);
2000 } stbi__jpeg;
2001 
stbi__build_huffman(stbi__huffman * h,int * count)2002 static int stbi__build_huffman(stbi__huffman *h, int *count)
2003 {
2004    int i,j,k=0;
2005    unsigned int code;
2006    // build size list for each symbol (from JPEG spec)
2007    for (i=0; i < 16; ++i) {
2008       for (j=0; j < count[i]; ++j) {
2009          h->size[k++] = (stbi_uc) (i+1);
2010          if(k >= 257) return stbi__err("bad size list","Corrupt JPEG");
2011       }
2012    }
2013    h->size[k] = 0;
2014 
2015    // compute actual symbols (from jpeg spec)
2016    code = 0;
2017    k = 0;
2018    for(j=1; j <= 16; ++j) {
2019       // compute delta to add to code to compute symbol id
2020       h->delta[j] = k - code;
2021       if (h->size[k] == j) {
2022          while (h->size[k] == j)
2023             h->code[k++] = (stbi__uint16) (code++);
2024          if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG");
2025       }
2026       // compute largest code + 1 for this size, preshifted as needed later
2027       h->maxcode[j] = code << (16-j);
2028       code <<= 1;
2029    }
2030    h->maxcode[j] = 0xffffffff;
2031 
2032    // build non-spec acceleration table; 255 is flag for not-accelerated
2033    memset(h->fast, 255, 1 << FAST_BITS);
2034    for (i=0; i < k; ++i) {
2035       int s = h->size[i];
2036       if (s <= FAST_BITS) {
2037          int c = h->code[i] << (FAST_BITS-s);
2038          int m = 1 << (FAST_BITS-s);
2039          for (j=0; j < m; ++j) {
2040             h->fast[c+j] = (stbi_uc) i;
2041          }
2042       }
2043    }
2044    return 1;
2045 }
2046 
2047 // build a table that decodes both magnitude and value of small ACs in
2048 // one go.
stbi__build_fast_ac(stbi__int16 * fast_ac,stbi__huffman * h)2049 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
2050 {
2051    int i;
2052    for (i=0; i < (1 << FAST_BITS); ++i) {
2053       stbi_uc fast = h->fast[i];
2054       fast_ac[i] = 0;
2055       if (fast < 255) {
2056          int rs = h->values[fast];
2057          int run = (rs >> 4) & 15;
2058          int magbits = rs & 15;
2059          int len = h->size[fast];
2060 
2061          if (magbits && len + magbits <= FAST_BITS) {
2062             // magnitude code followed by receive_extend code
2063             int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
2064             int m = 1 << (magbits - 1);
2065             if (k < m) k += (~0U << magbits) + 1;
2066             // if the result is small enough, we can fit it in fast_ac table
2067             if (k >= -128 && k <= 127)
2068                fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
2069          }
2070       }
2071    }
2072 }
2073 
stbi__grow_buffer_unsafe(stbi__jpeg * j)2074 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
2075 {
2076    do {
2077       unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
2078       if (b == 0xff) {
2079          int c = stbi__get8(j->s);
2080          while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes
2081          if (c != 0) {
2082             j->marker = (unsigned char) c;
2083             j->nomore = 1;
2084             return;
2085          }
2086       }
2087       j->code_buffer |= b << (24 - j->code_bits);
2088       j->code_bits += 8;
2089    } while (j->code_bits <= 24);
2090 }
2091 
2092 // (1 << n) - 1
2093 static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
2094 
2095 // decode a jpeg huffman value from the bitstream
stbi__jpeg_huff_decode(stbi__jpeg * j,stbi__huffman * h)2096 stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
2097 {
2098    unsigned int temp;
2099    int c,k;
2100 
2101    if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2102 
2103    // look at the top FAST_BITS and determine what symbol ID it is,
2104    // if the code is <= FAST_BITS
2105    c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2106    k = h->fast[c];
2107    if (k < 255) {
2108       int s = h->size[k];
2109       if (s > j->code_bits)
2110          return -1;
2111       j->code_buffer <<= s;
2112       j->code_bits -= s;
2113       return h->values[k];
2114    }
2115 
2116    // naive test is to shift the code_buffer down so k bits are
2117    // valid, then test against maxcode. To speed this up, we've
2118    // preshifted maxcode left so that it has (16-k) 0s at the
2119    // end; in other words, regardless of the number of bits, it
2120    // wants to be compared against something shifted to have 16;
2121    // that way we don't need to shift inside the loop.
2122    temp = j->code_buffer >> 16;
2123    for (k=FAST_BITS+1 ; ; ++k)
2124       if (temp < h->maxcode[k])
2125          break;
2126    if (k == 17) {
2127       // error! code not found
2128       j->code_bits -= 16;
2129       return -1;
2130    }
2131 
2132    if (k > j->code_bits)
2133       return -1;
2134 
2135    // convert the huffman code to the symbol id
2136    c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
2137    if(c < 0 || c >= 256) // symbol id out of bounds!
2138        return -1;
2139    STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
2140 
2141    // convert the id to a symbol
2142    j->code_bits -= k;
2143    j->code_buffer <<= k;
2144    return h->values[c];
2145 }
2146 
2147 // bias[n] = (-1<<n) + 1
2148 static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
2149 
2150 // combined JPEG 'receive' and JPEG 'extend', since baseline
2151 // always extends everything it receives.
stbi__extend_receive(stbi__jpeg * j,int n)2152 stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
2153 {
2154    unsigned int k;
2155    int sgn;
2156    if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
2157    if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing
2158 
2159    sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative)
2160    k = stbi_lrot(j->code_buffer, n);
2161    j->code_buffer = k & ~stbi__bmask[n];
2162    k &= stbi__bmask[n];
2163    j->code_bits -= n;
2164    return k + (stbi__jbias[n] & (sgn - 1));
2165 }
2166 
2167 // get some unsigned bits
stbi__jpeg_get_bits(stbi__jpeg * j,int n)2168 stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)
2169 {
2170    unsigned int k;
2171    if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
2172    if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing
2173    k = stbi_lrot(j->code_buffer, n);
2174    j->code_buffer = k & ~stbi__bmask[n];
2175    k &= stbi__bmask[n];
2176    j->code_bits -= n;
2177    return k;
2178 }
2179 
stbi__jpeg_get_bit(stbi__jpeg * j)2180 stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
2181 {
2182    unsigned int k;
2183    if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
2184    if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing
2185    k = j->code_buffer;
2186    j->code_buffer <<= 1;
2187    --j->code_bits;
2188    return k & 0x80000000;
2189 }
2190 
2191 // given a value that's at position X in the zigzag stream,
2192 // where does it appear in the 8x8 matrix coded as row-major?
2193 static const stbi_uc stbi__jpeg_dezigzag[64+15] =
2194 {
2195     0,  1,  8, 16,  9,  2,  3, 10,
2196    17, 24, 32, 25, 18, 11,  4,  5,
2197    12, 19, 26, 33, 40, 48, 41, 34,
2198    27, 20, 13,  6,  7, 14, 21, 28,
2199    35, 42, 49, 56, 57, 50, 43, 36,
2200    29, 22, 15, 23, 30, 37, 44, 51,
2201    58, 59, 52, 45, 38, 31, 39, 46,
2202    53, 60, 61, 54, 47, 55, 62, 63,
2203    // let corrupt input sample past end
2204    63, 63, 63, 63, 63, 63, 63, 63,
2205    63, 63, 63, 63, 63, 63, 63
2206 };
2207 
2208 // decode one 64-entry block--
stbi__jpeg_decode_block(stbi__jpeg * j,short data[64],stbi__huffman * hdc,stbi__huffman * hac,stbi__int16 * fac,int b,stbi__uint16 * dequant)2209 static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi__uint16 *dequant)
2210 {
2211    int diff,dc,k;
2212    int t;
2213 
2214    if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2215    t = stbi__jpeg_huff_decode(j, hdc);
2216    if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG");
2217 
2218    // 0 all the ac values now so we can do it 32-bits at a time
2219    memset(data,0,64*sizeof(data[0]));
2220 
2221    diff = t ? stbi__extend_receive(j, t) : 0;
2222    if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG");
2223    dc = j->img_comp[b].dc_pred + diff;
2224    j->img_comp[b].dc_pred = dc;
2225    if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
2226    data[0] = (short) (dc * dequant[0]);
2227 
2228    // decode AC components, see JPEG spec
2229    k = 1;
2230    do {
2231       unsigned int zig;
2232       int c,r,s;
2233       if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2234       c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2235       r = fac[c];
2236       if (r) { // fast-AC path
2237          k += (r >> 4) & 15; // run
2238          s = r & 15; // combined length
2239          if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available");
2240          j->code_buffer <<= s;
2241          j->code_bits -= s;
2242          // decode into unzigzag'd location
2243          zig = stbi__jpeg_dezigzag[k++];
2244          data[zig] = (short) ((r >> 8) * dequant[zig]);
2245       } else {
2246          int rs = stbi__jpeg_huff_decode(j, hac);
2247          if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
2248          s = rs & 15;
2249          r = rs >> 4;
2250          if (s == 0) {
2251             if (rs != 0xf0) break; // end block
2252             k += 16;
2253          } else {
2254             k += r;
2255             // decode into unzigzag'd location
2256             zig = stbi__jpeg_dezigzag[k++];
2257             data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
2258          }
2259       }
2260    } while (k < 64);
2261    return 1;
2262 }
2263 
stbi__jpeg_decode_block_prog_dc(stbi__jpeg * j,short data[64],stbi__huffman * hdc,int b)2264 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)
2265 {
2266    int diff,dc;
2267    int t;
2268    if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
2269 
2270    if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2271 
2272    if (j->succ_high == 0) {
2273       // first scan for DC coefficient, must be first
2274       memset(data,0,64*sizeof(data[0])); // 0 all the ac values now
2275       t = stbi__jpeg_huff_decode(j, hdc);
2276       if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
2277       diff = t ? stbi__extend_receive(j, t) : 0;
2278 
2279       if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG");
2280       dc = j->img_comp[b].dc_pred + diff;
2281       j->img_comp[b].dc_pred = dc;
2282       if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
2283       data[0] = (short) (dc * (1 << j->succ_low));
2284    } else {
2285       // refinement scan for DC coefficient
2286       if (stbi__jpeg_get_bit(j))
2287          data[0] += (short) (1 << j->succ_low);
2288    }
2289    return 1;
2290 }
2291 
2292 // @OPTIMIZE: store non-zigzagged during the decode passes,
2293 // and only de-zigzag when dequantizing
stbi__jpeg_decode_block_prog_ac(stbi__jpeg * j,short data[64],stbi__huffman * hac,stbi__int16 * fac)2294 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)
2295 {
2296    int k;
2297    if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
2298 
2299    if (j->succ_high == 0) {
2300       int shift = j->succ_low;
2301 
2302       if (j->eob_run) {
2303          --j->eob_run;
2304          return 1;
2305       }
2306 
2307       k = j->spec_start;
2308       do {
2309          unsigned int zig;
2310          int c,r,s;
2311          if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
2312          c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
2313          r = fac[c];
2314          if (r) { // fast-AC path
2315             k += (r >> 4) & 15; // run
2316             s = r & 15; // combined length
2317             if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available");
2318             j->code_buffer <<= s;
2319             j->code_bits -= s;
2320             zig = stbi__jpeg_dezigzag[k++];
2321             data[zig] = (short) ((r >> 8) * (1 << shift));
2322          } else {
2323             int rs = stbi__jpeg_huff_decode(j, hac);
2324             if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
2325             s = rs & 15;
2326             r = rs >> 4;
2327             if (s == 0) {
2328                if (r < 15) {
2329                   j->eob_run = (1 << r);
2330                   if (r)
2331                      j->eob_run += stbi__jpeg_get_bits(j, r);
2332                   --j->eob_run;
2333                   break;
2334                }
2335                k += 16;
2336             } else {
2337                k += r;
2338                zig = stbi__jpeg_dezigzag[k++];
2339                data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift));
2340             }
2341          }
2342       } while (k <= j->spec_end);
2343    } else {
2344       // refinement scan for these AC coefficients
2345 
2346       short bit = (short) (1 << j->succ_low);
2347 
2348       if (j->eob_run) {
2349          --j->eob_run;
2350          for (k = j->spec_start; k <= j->spec_end; ++k) {
2351             short *p = &data[stbi__jpeg_dezigzag[k]];
2352             if (*p != 0)
2353                if (stbi__jpeg_get_bit(j))
2354                   if ((*p & bit)==0) {
2355                      if (*p > 0)
2356                         *p += bit;
2357                      else
2358                         *p -= bit;
2359                   }
2360          }
2361       } else {
2362          k = j->spec_start;
2363          do {
2364             int r,s;
2365             int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh
2366             if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
2367             s = rs & 15;
2368             r = rs >> 4;
2369             if (s == 0) {
2370                if (r < 15) {
2371                   j->eob_run = (1 << r) - 1;
2372                   if (r)
2373                      j->eob_run += stbi__jpeg_get_bits(j, r);
2374                   r = 64; // force end of block
2375                } else {
2376                   // r=15 s=0 should write 16 0s, so we just do
2377                   // a run of 15 0s and then write s (which is 0),
2378                   // so we don't have to do anything special here
2379                }
2380             } else {
2381                if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG");
2382                // sign bit
2383                if (stbi__jpeg_get_bit(j))
2384                   s = bit;
2385                else
2386                   s = -bit;
2387             }
2388 
2389             // advance by r
2390             while (k <= j->spec_end) {
2391                short *p = &data[stbi__jpeg_dezigzag[k++]];
2392                if (*p != 0) {
2393                   if (stbi__jpeg_get_bit(j))
2394                      if ((*p & bit)==0) {
2395                         if (*p > 0)
2396                            *p += bit;
2397                         else
2398                            *p -= bit;
2399                      }
2400                } else {
2401                   if (r == 0) {
2402                      *p = (short) s;
2403                      break;
2404                   }
2405                   --r;
2406                }
2407             }
2408          } while (k <= j->spec_end);
2409       }
2410    }
2411    return 1;
2412 }
2413 
2414 // take a -128..127 value and stbi__clamp it and convert to 0..255
stbi__clamp(int x)2415 stbi_inline static stbi_uc stbi__clamp(int x)
2416 {
2417    // trick to use a single test to catch both cases
2418    if ((unsigned int) x > 255) {
2419       if (x < 0) return 0;
2420       if (x > 255) return 255;
2421    }
2422    return (stbi_uc) x;
2423 }
2424 
2425 #define stbi__f2f(x)  ((int) (((x) * 4096 + 0.5)))
2426 #define stbi__fsh(x)  ((x) * 4096)
2427 
2428 // derived from jidctint -- DCT_ISLOW
2429 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2430    int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2431    p2 = s2;                                    \
2432    p3 = s6;                                    \
2433    p1 = (p2+p3) * stbi__f2f(0.5411961f);       \
2434    t2 = p1 + p3*stbi__f2f(-1.847759065f);      \
2435    t3 = p1 + p2*stbi__f2f( 0.765366865f);      \
2436    p2 = s0;                                    \
2437    p3 = s4;                                    \
2438    t0 = stbi__fsh(p2+p3);                      \
2439    t1 = stbi__fsh(p2-p3);                      \
2440    x0 = t0+t3;                                 \
2441    x3 = t0-t3;                                 \
2442    x1 = t1+t2;                                 \
2443    x2 = t1-t2;                                 \
2444    t0 = s7;                                    \
2445    t1 = s5;                                    \
2446    t2 = s3;                                    \
2447    t3 = s1;                                    \
2448    p3 = t0+t2;                                 \
2449    p4 = t1+t3;                                 \
2450    p1 = t0+t3;                                 \
2451    p2 = t1+t2;                                 \
2452    p5 = (p3+p4)*stbi__f2f( 1.175875602f);      \
2453    t0 = t0*stbi__f2f( 0.298631336f);           \
2454    t1 = t1*stbi__f2f( 2.053119869f);           \
2455    t2 = t2*stbi__f2f( 3.072711026f);           \
2456    t3 = t3*stbi__f2f( 1.501321110f);           \
2457    p1 = p5 + p1*stbi__f2f(-0.899976223f);      \
2458    p2 = p5 + p2*stbi__f2f(-2.562915447f);      \
2459    p3 = p3*stbi__f2f(-1.961570560f);           \
2460    p4 = p4*stbi__f2f(-0.390180644f);           \
2461    t3 += p1+p4;                                \
2462    t2 += p2+p3;                                \
2463    t1 += p2+p4;                                \
2464    t0 += p1+p3;
2465 
stbi__idct_block(stbi_uc * out,int out_stride,short data[64])2466 static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
2467 {
2468    int i,val[64],*v=val;
2469    stbi_uc *o;
2470    short *d = data;
2471 
2472    // columns
2473    for (i=0; i < 8; ++i,++d, ++v) {
2474       // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
2475       if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
2476            && d[40]==0 && d[48]==0 && d[56]==0) {
2477          //    no shortcut                 0     seconds
2478          //    (1|2|3|4|5|6|7)==0          0     seconds
2479          //    all separate               -0.047 seconds
2480          //    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds
2481          int dcterm = d[0]*4;
2482          v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2483       } else {
2484          STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
2485          // constants scaled things up by 1<<12; let's bring them back
2486          // down, but keep 2 extra bits of precision
2487          x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2488          v[ 0] = (x0+t3) >> 10;
2489          v[56] = (x0-t3) >> 10;
2490          v[ 8] = (x1+t2) >> 10;
2491          v[48] = (x1-t2) >> 10;
2492          v[16] = (x2+t1) >> 10;
2493          v[40] = (x2-t1) >> 10;
2494          v[24] = (x3+t0) >> 10;
2495          v[32] = (x3-t0) >> 10;
2496       }
2497    }
2498 
2499    for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
2500       // no fast case since the first 1D IDCT spread components out
2501       STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
2502       // constants scaled things up by 1<<12, plus we had 1<<2 from first
2503       // loop, plus horizontal and vertical each scale by sqrt(8) so together
2504       // we've got an extra 1<<3, so 1<<17 total we need to remove.
2505       // so we want to round that, which means adding 0.5 * 1<<17,
2506       // aka 65536. Also, we'll end up with -128 to 127 that we want
2507       // to encode as 0..255 by adding 128, so we'll add that before the shift
2508       x0 += 65536 + (128<<17);
2509       x1 += 65536 + (128<<17);
2510       x2 += 65536 + (128<<17);
2511       x3 += 65536 + (128<<17);
2512       // tried computing the shifts into temps, or'ing the temps to see
2513       // if any were out of range, but that was slower
2514       o[0] = stbi__clamp((x0+t3) >> 17);
2515       o[7] = stbi__clamp((x0-t3) >> 17);
2516       o[1] = stbi__clamp((x1+t2) >> 17);
2517       o[6] = stbi__clamp((x1-t2) >> 17);
2518       o[2] = stbi__clamp((x2+t1) >> 17);
2519       o[5] = stbi__clamp((x2-t1) >> 17);
2520       o[3] = stbi__clamp((x3+t0) >> 17);
2521       o[4] = stbi__clamp((x3-t0) >> 17);
2522    }
2523 }
2524 
2525 #ifdef STBI_SSE2
2526 // sse2 integer IDCT. not the fastest possible implementation but it
2527 // produces bit-identical results to the generic C version so it's
2528 // fully "transparent".
stbi__idct_simd(stbi_uc * out,int out_stride,short data[64])2529 static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
2530 {
2531    // This is constructed to match our regular (generic) integer IDCT exactly.
2532    __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2533    __m128i tmp;
2534 
2535    // dot product constant: even elems=x, odd elems=y
2536    #define dct_const(x,y)  _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2537 
2538    // out(0) = c0[even]*x + c0[odd]*y   (c0, x, y 16-bit, out 32-bit)
2539    // out(1) = c1[even]*x + c1[odd]*y
2540    #define dct_rot(out0,out1, x,y,c0,c1) \
2541       __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2542       __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2543       __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2544       __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2545       __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2546       __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2547 
2548    // out = in << 12  (in 16-bit, out 32-bit)
2549    #define dct_widen(out, in) \
2550       __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2551       __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2552 
2553    // wide add
2554    #define dct_wadd(out, a, b) \
2555       __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2556       __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2557 
2558    // wide sub
2559    #define dct_wsub(out, a, b) \
2560       __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2561       __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2562 
2563    // butterfly a/b, add bias, then shift by "s" and pack
2564    #define dct_bfly32o(out0, out1, a,b,bias,s) \
2565       { \
2566          __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2567          __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2568          dct_wadd(sum, abiased, b); \
2569          dct_wsub(dif, abiased, b); \
2570          out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2571          out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2572       }
2573 
2574    // 8-bit interleave step (for transposes)
2575    #define dct_interleave8(a, b) \
2576       tmp = a; \
2577       a = _mm_unpacklo_epi8(a, b); \
2578       b = _mm_unpackhi_epi8(tmp, b)
2579 
2580    // 16-bit interleave step (for transposes)
2581    #define dct_interleave16(a, b) \
2582       tmp = a; \
2583       a = _mm_unpacklo_epi16(a, b); \
2584       b = _mm_unpackhi_epi16(tmp, b)
2585 
2586    #define dct_pass(bias,shift) \
2587       { \
2588          /* even part */ \
2589          dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2590          __m128i sum04 = _mm_add_epi16(row0, row4); \
2591          __m128i dif04 = _mm_sub_epi16(row0, row4); \
2592          dct_widen(t0e, sum04); \
2593          dct_widen(t1e, dif04); \
2594          dct_wadd(x0, t0e, t3e); \
2595          dct_wsub(x3, t0e, t3e); \
2596          dct_wadd(x1, t1e, t2e); \
2597          dct_wsub(x2, t1e, t2e); \
2598          /* odd part */ \
2599          dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2600          dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2601          __m128i sum17 = _mm_add_epi16(row1, row7); \
2602          __m128i sum35 = _mm_add_epi16(row3, row5); \
2603          dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2604          dct_wadd(x4, y0o, y4o); \
2605          dct_wadd(x5, y1o, y5o); \
2606          dct_wadd(x6, y2o, y5o); \
2607          dct_wadd(x7, y3o, y4o); \
2608          dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2609          dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2610          dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2611          dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2612       }
2613 
2614    __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2615    __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2616    __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2617    __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2618    __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2619    __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2620    __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2621    __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
2622 
2623    // rounding biases in column/row passes, see stbi__idct_block for explanation.
2624    __m128i bias_0 = _mm_set1_epi32(512);
2625    __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2626 
2627    // load
2628    row0 = _mm_load_si128((const __m128i *) (data + 0*8));
2629    row1 = _mm_load_si128((const __m128i *) (data + 1*8));
2630    row2 = _mm_load_si128((const __m128i *) (data + 2*8));
2631    row3 = _mm_load_si128((const __m128i *) (data + 3*8));
2632    row4 = _mm_load_si128((const __m128i *) (data + 4*8));
2633    row5 = _mm_load_si128((const __m128i *) (data + 5*8));
2634    row6 = _mm_load_si128((const __m128i *) (data + 6*8));
2635    row7 = _mm_load_si128((const __m128i *) (data + 7*8));
2636 
2637    // column pass
2638    dct_pass(bias_0, 10);
2639 
2640    {
2641       // 16bit 8x8 transpose pass 1
2642       dct_interleave16(row0, row4);
2643       dct_interleave16(row1, row5);
2644       dct_interleave16(row2, row6);
2645       dct_interleave16(row3, row7);
2646 
2647       // transpose pass 2
2648       dct_interleave16(row0, row2);
2649       dct_interleave16(row1, row3);
2650       dct_interleave16(row4, row6);
2651       dct_interleave16(row5, row7);
2652 
2653       // transpose pass 3
2654       dct_interleave16(row0, row1);
2655       dct_interleave16(row2, row3);
2656       dct_interleave16(row4, row5);
2657       dct_interleave16(row6, row7);
2658    }
2659 
2660    // row pass
2661    dct_pass(bias_1, 17);
2662 
2663    {
2664       // pack
2665       __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7
2666       __m128i p1 = _mm_packus_epi16(row2, row3);
2667       __m128i p2 = _mm_packus_epi16(row4, row5);
2668       __m128i p3 = _mm_packus_epi16(row6, row7);
2669 
2670       // 8bit 8x8 transpose pass 1
2671       dct_interleave8(p0, p2); // a0e0a1e1...
2672       dct_interleave8(p1, p3); // c0g0c1g1...
2673 
2674       // transpose pass 2
2675       dct_interleave8(p0, p1); // a0c0e0g0...
2676       dct_interleave8(p2, p3); // b0d0f0h0...
2677 
2678       // transpose pass 3
2679       dct_interleave8(p0, p2); // a0b0c0d0...
2680       dct_interleave8(p1, p3); // a4b4c4d4...
2681 
2682       // store
2683       _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2684       _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2685       _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2686       _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2687       _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2688       _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2689       _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2690       _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2691    }
2692 
2693 #undef dct_const
2694 #undef dct_rot
2695 #undef dct_widen
2696 #undef dct_wadd
2697 #undef dct_wsub
2698 #undef dct_bfly32o
2699 #undef dct_interleave8
2700 #undef dct_interleave16
2701 #undef dct_pass
2702 }
2703 
2704 #endif // STBI_SSE2
2705 
2706 #ifdef STBI_NEON
2707 
2708 // NEON integer IDCT. should produce bit-identical
2709 // results to the generic C version.
stbi__idct_simd(stbi_uc * out,int out_stride,short data[64])2710 static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
2711 {
2712    int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2713 
2714    int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2715    int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2716    int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2717    int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2718    int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2719    int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2720    int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2721    int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2722    int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2723    int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2724    int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2725    int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2726 
2727 #define dct_long_mul(out, inq, coeff) \
2728    int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2729    int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2730 
2731 #define dct_long_mac(out, acc, inq, coeff) \
2732    int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2733    int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2734 
2735 #define dct_widen(out, inq) \
2736    int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2737    int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2738 
2739 // wide add
2740 #define dct_wadd(out, a, b) \
2741    int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2742    int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2743 
2744 // wide sub
2745 #define dct_wsub(out, a, b) \
2746    int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2747    int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2748 
2749 // butterfly a/b, then shift using "shiftop" by "s" and pack
2750 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2751    { \
2752       dct_wadd(sum, a, b); \
2753       dct_wsub(dif, a, b); \
2754       out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2755       out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2756    }
2757 
2758 #define dct_pass(shiftop, shift) \
2759    { \
2760       /* even part */ \
2761       int16x8_t sum26 = vaddq_s16(row2, row6); \
2762       dct_long_mul(p1e, sum26, rot0_0); \
2763       dct_long_mac(t2e, p1e, row6, rot0_1); \
2764       dct_long_mac(t3e, p1e, row2, rot0_2); \
2765       int16x8_t sum04 = vaddq_s16(row0, row4); \
2766       int16x8_t dif04 = vsubq_s16(row0, row4); \
2767       dct_widen(t0e, sum04); \
2768       dct_widen(t1e, dif04); \
2769       dct_wadd(x0, t0e, t3e); \
2770       dct_wsub(x3, t0e, t3e); \
2771       dct_wadd(x1, t1e, t2e); \
2772       dct_wsub(x2, t1e, t2e); \
2773       /* odd part */ \
2774       int16x8_t sum15 = vaddq_s16(row1, row5); \
2775       int16x8_t sum17 = vaddq_s16(row1, row7); \
2776       int16x8_t sum35 = vaddq_s16(row3, row5); \
2777       int16x8_t sum37 = vaddq_s16(row3, row7); \
2778       int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2779       dct_long_mul(p5o, sumodd, rot1_0); \
2780       dct_long_mac(p1o, p5o, sum17, rot1_1); \
2781       dct_long_mac(p2o, p5o, sum35, rot1_2); \
2782       dct_long_mul(p3o, sum37, rot2_0); \
2783       dct_long_mul(p4o, sum15, rot2_1); \
2784       dct_wadd(sump13o, p1o, p3o); \
2785       dct_wadd(sump24o, p2o, p4o); \
2786       dct_wadd(sump23o, p2o, p3o); \
2787       dct_wadd(sump14o, p1o, p4o); \
2788       dct_long_mac(x4, sump13o, row7, rot3_0); \
2789       dct_long_mac(x5, sump24o, row5, rot3_1); \
2790       dct_long_mac(x6, sump23o, row3, rot3_2); \
2791       dct_long_mac(x7, sump14o, row1, rot3_3); \
2792       dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2793       dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2794       dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2795       dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2796    }
2797 
2798    // load
2799    row0 = vld1q_s16(data + 0*8);
2800    row1 = vld1q_s16(data + 1*8);
2801    row2 = vld1q_s16(data + 2*8);
2802    row3 = vld1q_s16(data + 3*8);
2803    row4 = vld1q_s16(data + 4*8);
2804    row5 = vld1q_s16(data + 5*8);
2805    row6 = vld1q_s16(data + 6*8);
2806    row7 = vld1q_s16(data + 7*8);
2807 
2808    // add DC bias
2809    row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2810 
2811    // column pass
2812    dct_pass(vrshrn_n_s32, 10);
2813 
2814    // 16bit 8x8 transpose
2815    {
2816 // these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.
2817 // whether compilers actually get this is another story, sadly.
2818 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2819 #define dct_trn32(x, y) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); }
2820 #define dct_trn64(x, y) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); }
2821 
2822       // pass 1
2823       dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
2824       dct_trn16(row2, row3);
2825       dct_trn16(row4, row5);
2826       dct_trn16(row6, row7);
2827 
2828       // pass 2
2829       dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
2830       dct_trn32(row1, row3);
2831       dct_trn32(row4, row6);
2832       dct_trn32(row5, row7);
2833 
2834       // pass 3
2835       dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
2836       dct_trn64(row1, row5);
2837       dct_trn64(row2, row6);
2838       dct_trn64(row3, row7);
2839 
2840 #undef dct_trn16
2841 #undef dct_trn32
2842 #undef dct_trn64
2843    }
2844 
2845    // row pass
2846    // vrshrn_n_s32 only supports shifts up to 16, we need
2847    // 17. so do a non-rounding shift of 16 first then follow
2848    // up with a rounding shift by 1.
2849    dct_pass(vshrn_n_s32, 16);
2850 
2851    {
2852       // pack and round
2853       uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2854       uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2855       uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2856       uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2857       uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2858       uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2859       uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2860       uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2861 
2862       // again, these can translate into one instruction, but often don't.
2863 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2864 #define dct_trn8_16(x, y) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); }
2865 #define dct_trn8_32(x, y) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); }
2866 
2867       // sadly can't use interleaved stores here since we only write
2868       // 8 bytes to each scan line!
2869 
2870       // 8x8 8-bit transpose pass 1
2871       dct_trn8_8(p0, p1);
2872       dct_trn8_8(p2, p3);
2873       dct_trn8_8(p4, p5);
2874       dct_trn8_8(p6, p7);
2875 
2876       // pass 2
2877       dct_trn8_16(p0, p2);
2878       dct_trn8_16(p1, p3);
2879       dct_trn8_16(p4, p6);
2880       dct_trn8_16(p5, p7);
2881 
2882       // pass 3
2883       dct_trn8_32(p0, p4);
2884       dct_trn8_32(p1, p5);
2885       dct_trn8_32(p2, p6);
2886       dct_trn8_32(p3, p7);
2887 
2888       // store
2889       vst1_u8(out, p0); out += out_stride;
2890       vst1_u8(out, p1); out += out_stride;
2891       vst1_u8(out, p2); out += out_stride;
2892       vst1_u8(out, p3); out += out_stride;
2893       vst1_u8(out, p4); out += out_stride;
2894       vst1_u8(out, p5); out += out_stride;
2895       vst1_u8(out, p6); out += out_stride;
2896       vst1_u8(out, p7);
2897 
2898 #undef dct_trn8_8
2899 #undef dct_trn8_16
2900 #undef dct_trn8_32
2901    }
2902 
2903 #undef dct_long_mul
2904 #undef dct_long_mac
2905 #undef dct_widen
2906 #undef dct_wadd
2907 #undef dct_wsub
2908 #undef dct_bfly32o
2909 #undef dct_pass
2910 }
2911 
2912 #endif // STBI_NEON
2913 
2914 #define STBI__MARKER_none  0xff
2915 // if there's a pending marker from the entropy stream, return that
2916 // otherwise, fetch from the stream and get a marker. if there's no
2917 // marker, return 0xff, which is never a valid marker value
stbi__get_marker(stbi__jpeg * j)2918 static stbi_uc stbi__get_marker(stbi__jpeg *j)
2919 {
2920    stbi_uc x;
2921    if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
2922    x = stbi__get8(j->s);
2923    if (x != 0xff) return STBI__MARKER_none;
2924    while (x == 0xff)
2925       x = stbi__get8(j->s); // consume repeated 0xff fill bytes
2926    return x;
2927 }
2928 
2929 // in each scan, we'll have scan_n components, and the order
2930 // of the components is specified by order[]
2931 #define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)
2932 
2933 // after a restart interval, stbi__jpeg_reset the entropy decoder and
2934 // the dc prediction
stbi__jpeg_reset(stbi__jpeg * j)2935 static void stbi__jpeg_reset(stbi__jpeg *j)
2936 {
2937    j->code_bits = 0;
2938    j->code_buffer = 0;
2939    j->nomore = 0;
2940    j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;
2941    j->marker = STBI__MARKER_none;
2942    j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2943    j->eob_run = 0;
2944    // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
2945    // since we don't even allow 1<<30 pixels
2946 }
2947 
stbi__parse_entropy_coded_data(stbi__jpeg * z)2948 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2949 {
2950    stbi__jpeg_reset(z);
2951    if (!z->progressive) {
2952       if (z->scan_n == 1) {
2953          int i,j;
2954          STBI_SIMD_ALIGN(short, data[64]);
2955          int n = z->order[0];
2956          // non-interleaved data, we just need to process one block at a time,
2957          // in trivial scanline order
2958          // number of blocks to do just depends on how many actual "pixels" this
2959          // component has, independent of interleaved MCU blocking and such
2960          int w = (z->img_comp[n].x+7) >> 3;
2961          int h = (z->img_comp[n].y+7) >> 3;
2962          for (j=0; j < h; ++j) {
2963             for (i=0; i < w; ++i) {
2964                int ha = z->img_comp[n].ha;
2965                if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;
2966                z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2967                // every data block is an MCU, so countdown the restart interval
2968                if (--z->todo <= 0) {
2969                   if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2970                   // if it's NOT a restart, then just bail, so we get corrupt data
2971                   // rather than no data
2972                   if (!STBI__RESTART(z->marker)) return 1;
2973                   stbi__jpeg_reset(z);
2974                }
2975             }
2976          }
2977          return 1;
2978       } else { // interleaved
2979          int i,j,k,x,y;
2980          STBI_SIMD_ALIGN(short, data[64]);
2981          for (j=0; j < z->img_mcu_y; ++j) {
2982             for (i=0; i < z->img_mcu_x; ++i) {
2983                // scan an interleaved mcu... process scan_n components in order
2984                for (k=0; k < z->scan_n; ++k) {
2985                   int n = z->order[k];
2986                   // scan out an mcu's worth of this component; that's just determined
2987                   // by the basic H and V specified for the component
2988                   for (y=0; y < z->img_comp[n].v; ++y) {
2989                      for (x=0; x < z->img_comp[n].h; ++x) {
2990                         int x2 = (i*z->img_comp[n].h + x)*8;
2991                         int y2 = (j*z->img_comp[n].v + y)*8;
2992                         int ha = z->img_comp[n].ha;
2993                         if (!stbi__jpeg_decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+ha, z->fast_ac[ha], n, z->dequant[z->img_comp[n].tq])) return 0;
2994                         z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2995                      }
2996                   }
2997                }
2998                // after all interleaved components, that's an interleaved MCU,
2999                // so now count down the restart interval
3000                if (--z->todo <= 0) {
3001                   if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3002                   if (!STBI__RESTART(z->marker)) return 1;
3003                   stbi__jpeg_reset(z);
3004                }
3005             }
3006          }
3007          return 1;
3008       }
3009    } else {
3010       if (z->scan_n == 1) {
3011          int i,j;
3012          int n = z->order[0];
3013          // non-interleaved data, we just need to process one block at a time,
3014          // in trivial scanline order
3015          // number of blocks to do just depends on how many actual "pixels" this
3016          // component has, independent of interleaved MCU blocking and such
3017          int w = (z->img_comp[n].x+7) >> 3;
3018          int h = (z->img_comp[n].y+7) >> 3;
3019          for (j=0; j < h; ++j) {
3020             for (i=0; i < w; ++i) {
3021                short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
3022                if (z->spec_start == 0) {
3023                   if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
3024                      return 0;
3025                } else {
3026                   int ha = z->img_comp[n].ha;
3027                   if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
3028                      return 0;
3029                }
3030                // every data block is an MCU, so countdown the restart interval
3031                if (--z->todo <= 0) {
3032                   if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3033                   if (!STBI__RESTART(z->marker)) return 1;
3034                   stbi__jpeg_reset(z);
3035                }
3036             }
3037          }
3038          return 1;
3039       } else { // interleaved
3040          int i,j,k,x,y;
3041          for (j=0; j < z->img_mcu_y; ++j) {
3042             for (i=0; i < z->img_mcu_x; ++i) {
3043                // scan an interleaved mcu... process scan_n components in order
3044                for (k=0; k < z->scan_n; ++k) {
3045                   int n = z->order[k];
3046                   // scan out an mcu's worth of this component; that's just determined
3047                   // by the basic H and V specified for the component
3048                   for (y=0; y < z->img_comp[n].v; ++y) {
3049                      for (x=0; x < z->img_comp[n].h; ++x) {
3050                         int x2 = (i*z->img_comp[n].h + x);
3051                         int y2 = (j*z->img_comp[n].v + y);
3052                         short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
3053                         if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
3054                            return 0;
3055                      }
3056                   }
3057                }
3058                // after all interleaved components, that's an interleaved MCU,
3059                // so now count down the restart interval
3060                if (--z->todo <= 0) {
3061                   if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
3062                   if (!STBI__RESTART(z->marker)) return 1;
3063                   stbi__jpeg_reset(z);
3064                }
3065             }
3066          }
3067          return 1;
3068       }
3069    }
3070 }
3071 
stbi__jpeg_dequantize(short * data,stbi__uint16 * dequant)3072 static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)
3073 {
3074    int i;
3075    for (i=0; i < 64; ++i)
3076       data[i] *= dequant[i];
3077 }
3078 
stbi__jpeg_finish(stbi__jpeg * z)3079 static void stbi__jpeg_finish(stbi__jpeg *z)
3080 {
3081    if (z->progressive) {
3082       // dequantize and idct the data
3083       int i,j,n;
3084       for (n=0; n < z->s->img_n; ++n) {
3085          int w = (z->img_comp[n].x+7) >> 3;
3086          int h = (z->img_comp[n].y+7) >> 3;
3087          for (j=0; j < h; ++j) {
3088             for (i=0; i < w; ++i) {
3089                short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
3090                stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
3091                z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
3092             }
3093          }
3094       }
3095    }
3096 }
3097 
stbi__process_marker(stbi__jpeg * z,int m)3098 static int stbi__process_marker(stbi__jpeg *z, int m)
3099 {
3100    int L;
3101    switch (m) {
3102       case STBI__MARKER_none: // no marker found
3103          return stbi__err("expected marker","Corrupt JPEG");
3104 
3105       case 0xDD: // DRI - specify restart interval
3106          if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
3107          z->restart_interval = stbi__get16be(z->s);
3108          return 1;
3109 
3110       case 0xDB: // DQT - define quantization table
3111          L = stbi__get16be(z->s)-2;
3112          while (L > 0) {
3113             int q = stbi__get8(z->s);
3114             int p = q >> 4, sixteen = (p != 0);
3115             int t = q & 15,i;
3116             if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG");
3117             if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
3118 
3119             for (i=0; i < 64; ++i)
3120                z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
3121             L -= (sixteen ? 129 : 65);
3122          }
3123          return L==0;
3124 
3125       case 0xC4: // DHT - define huffman table
3126          L = stbi__get16be(z->s)-2;
3127          while (L > 0) {
3128             stbi_uc *v;
3129             int sizes[16],i,n=0;
3130             int q = stbi__get8(z->s);
3131             int tc = q >> 4;
3132             int th = q & 15;
3133             if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
3134             for (i=0; i < 16; ++i) {
3135                sizes[i] = stbi__get8(z->s);
3136                n += sizes[i];
3137             }
3138             if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values!
3139             L -= 17;
3140             if (tc == 0) {
3141                if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
3142                v = z->huff_dc[th].values;
3143             } else {
3144                if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
3145                v = z->huff_ac[th].values;
3146             }
3147             for (i=0; i < n; ++i)
3148                v[i] = stbi__get8(z->s);
3149             if (tc != 0)
3150                stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
3151             L -= n;
3152          }
3153          return L==0;
3154    }
3155 
3156    // check for comment block or APP blocks
3157    if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
3158       L = stbi__get16be(z->s);
3159       if (L < 2) {
3160          if (m == 0xFE)
3161             return stbi__err("bad COM len","Corrupt JPEG");
3162          else
3163             return stbi__err("bad APP len","Corrupt JPEG");
3164       }
3165       L -= 2;
3166 
3167       if (m == 0xE0 && L >= 5) { // JFIF APP0 segment
3168          static const unsigned char tag[5] = {'J','F','I','F','\0'};
3169          int ok = 1;
3170          int i;
3171          for (i=0; i < 5; ++i)
3172             if (stbi__get8(z->s) != tag[i])
3173                ok = 0;
3174          L -= 5;
3175          if (ok)
3176             z->jfif = 1;
3177       } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment
3178          static const unsigned char tag[6] = {'A','d','o','b','e','\0'};
3179          int ok = 1;
3180          int i;
3181          for (i=0; i < 6; ++i)
3182             if (stbi__get8(z->s) != tag[i])
3183                ok = 0;
3184          L -= 6;
3185          if (ok) {
3186             stbi__get8(z->s); // version
3187             stbi__get16be(z->s); // flags0
3188             stbi__get16be(z->s); // flags1
3189             z->app14_color_transform = stbi__get8(z->s); // color transform
3190             L -= 6;
3191          }
3192       }
3193 
3194       stbi__skip(z->s, L);
3195       return 1;
3196    }
3197 
3198    return stbi__err("unknown marker","Corrupt JPEG");
3199 }
3200 
3201 // after we see SOS
stbi__process_scan_header(stbi__jpeg * z)3202 static int stbi__process_scan_header(stbi__jpeg *z)
3203 {
3204    int i;
3205    int Ls = stbi__get16be(z->s);
3206    z->scan_n = stbi__get8(z->s);
3207    if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s->img_n) return stbi__err("bad SOS component count","Corrupt JPEG");
3208    if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG");
3209    for (i=0; i < z->scan_n; ++i) {
3210       int id = stbi__get8(z->s), which;
3211       int q = stbi__get8(z->s);
3212       for (which = 0; which < z->s->img_n; ++which)
3213          if (z->img_comp[which].id == id)
3214             break;
3215       if (which == z->s->img_n) return 0; // no match
3216       z->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG");
3217       z->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG");
3218       z->order[i] = which;
3219    }
3220 
3221    {
3222       int aa;
3223       z->spec_start = stbi__get8(z->s);
3224       z->spec_end   = stbi__get8(z->s); // should be 63, but might be 0
3225       aa = stbi__get8(z->s);
3226       z->succ_high = (aa >> 4);
3227       z->succ_low  = (aa & 15);
3228       if (z->progressive) {
3229          if (z->spec_start > 63 || z->spec_end > 63  || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
3230             return stbi__err("bad SOS", "Corrupt JPEG");
3231       } else {
3232          if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG");
3233          if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG");
3234          z->spec_end = 63;
3235       }
3236    }
3237 
3238    return 1;
3239 }
3240 
stbi__free_jpeg_components(stbi__jpeg * z,int ncomp,int why)3241 static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)
3242 {
3243    int i;
3244    for (i=0; i < ncomp; ++i) {
3245       if (z->img_comp[i].raw_data) {
3246          STBI_FREE(z->img_comp[i].raw_data);
3247          z->img_comp[i].raw_data = NULL;
3248          z->img_comp[i].data = NULL;
3249       }
3250       if (z->img_comp[i].raw_coeff) {
3251          STBI_FREE(z->img_comp[i].raw_coeff);
3252          z->img_comp[i].raw_coeff = 0;
3253          z->img_comp[i].coeff = 0;
3254       }
3255       if (z->img_comp[i].linebuf) {
3256          STBI_FREE(z->img_comp[i].linebuf);
3257          z->img_comp[i].linebuf = NULL;
3258       }
3259    }
3260    return why;
3261 }
3262 
stbi__process_frame_header(stbi__jpeg * z,int scan)3263 static int stbi__process_frame_header(stbi__jpeg *z, int scan)
3264 {
3265    stbi__context *s = z->s;
3266    int Lf,p,i,q, h_max=1,v_max=1,c;
3267    Lf = stbi__get16be(s);         if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG
3268    p  = stbi__get8(s);            if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
3269    s->img_y = stbi__get16be(s);   if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
3270    s->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
3271    if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
3272    if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
3273    c = stbi__get8(s);
3274    if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG");
3275    s->img_n = c;
3276    for (i=0; i < c; ++i) {
3277       z->img_comp[i].data = NULL;
3278       z->img_comp[i].linebuf = NULL;
3279    }
3280 
3281    if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
3282 
3283    z->rgb = 0;
3284    for (i=0; i < s->img_n; ++i) {
3285       static const unsigned char rgb[3] = { 'R', 'G', 'B' };
3286       z->img_comp[i].id = stbi__get8(s);
3287       if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3288          ++z->rgb;
3289       q = stbi__get8(s);
3290       z->img_comp[i].h = (q >> 4);  if (!z->img_comp[i].h || z->img_comp[i].h > 4) return stbi__err("bad H","Corrupt JPEG");
3291       z->img_comp[i].v = q & 15;    if (!z->img_comp[i].v || z->img_comp[i].v > 4) return stbi__err("bad V","Corrupt JPEG");
3292       z->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
3293    }
3294 
3295    if (scan != STBI__SCAN_load) return 1;
3296 
3297    if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode");
3298 
3299    for (i=0; i < s->img_n; ++i) {
3300       if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
3301       if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
3302    }
3303 
3304    // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios
3305    // and I've never seen a non-corrupted JPEG file actually use them
3306    for (i=0; i < s->img_n; ++i) {
3307       if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG");
3308       if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG");
3309    }
3310 
3311    // compute interleaved mcu info
3312    z->img_h_max = h_max;
3313    z->img_v_max = v_max;
3314    z->img_mcu_w = h_max * 8;
3315    z->img_mcu_h = v_max * 8;
3316    // these sizes can't be more than 17 bits
3317    z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
3318    z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
3319 
3320    for (i=0; i < s->img_n; ++i) {
3321       // number of effective pixels (e.g. for non-interleaved MCU)
3322       z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
3323       z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
3324       // to simplify generation, we'll allocate enough memory to decode
3325       // the bogus oversized data from using interleaved MCUs and their
3326       // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
3327       // discard the extra data until colorspace conversion
3328       //
3329       // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)
3330       // so these muls can't overflow with 32-bit ints (which we require)
3331       z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3332       z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3333       z->img_comp[i].coeff = 0;
3334       z->img_comp[i].raw_coeff = 0;
3335       z->img_comp[i].linebuf = NULL;
3336       z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3337       if (z->img_comp[i].raw_data == NULL)
3338          return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
3339       // align blocks for idct using mmx/sse
3340       z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
3341       if (z->progressive) {
3342          // w2, h2 are multiples of 8 (see above)
3343          z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3344          z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3345          z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);
3346          if (z->img_comp[i].raw_coeff == NULL)
3347             return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
3348          z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
3349       }
3350    }
3351 
3352    return 1;
3353 }
3354 
3355 // use comparisons since in some cases we handle more than one case (e.g. SOF)
3356 #define stbi__DNL(x)         ((x) == 0xdc)
3357 #define stbi__SOI(x)         ((x) == 0xd8)
3358 #define stbi__EOI(x)         ((x) == 0xd9)
3359 #define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3360 #define stbi__SOS(x)         ((x) == 0xda)
3361 
3362 #define stbi__SOF_progressive(x)   ((x) == 0xc2)
3363 
stbi__decode_jpeg_header(stbi__jpeg * z,int scan)3364 static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
3365 {
3366    int m;
3367    z->jfif = 0;
3368    z->app14_color_transform = -1; // valid values are 0,1,2
3369    z->marker = STBI__MARKER_none; // initialize cached marker to empty
3370    m = stbi__get_marker(z);
3371    if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
3372    if (scan == STBI__SCAN_type) return 1;
3373    m = stbi__get_marker(z);
3374    while (!stbi__SOF(m)) {
3375       if (!stbi__process_marker(z,m)) return 0;
3376       m = stbi__get_marker(z);
3377       while (m == STBI__MARKER_none) {
3378          // some files have extra padding after their blocks, so ok, we'll scan
3379          if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");
3380          m = stbi__get_marker(z);
3381       }
3382    }
3383    z->progressive = stbi__SOF_progressive(m);
3384    if (!stbi__process_frame_header(z, scan)) return 0;
3385    return 1;
3386 }
3387 
stbi__skip_jpeg_junk_at_end(stbi__jpeg * j)3388 static int stbi__skip_jpeg_junk_at_end(stbi__jpeg *j)
3389 {
3390    // some JPEGs have junk at end, skip over it but if we find what looks
3391    // like a valid marker, resume there
3392    while (!stbi__at_eof(j->s)) {
3393       int x = stbi__get8(j->s);
3394       while (x == 255) { // might be a marker
3395          if (stbi__at_eof(j->s)) return STBI__MARKER_none;
3396          x = stbi__get8(j->s);
3397          if (x != 0x00 && x != 0xff) {
3398             // not a stuffed zero or lead-in to another marker, looks
3399             // like an actual marker, return it
3400             return x;
3401          }
3402          // stuffed zero has x=0 now which ends the loop, meaning we go
3403          // back to regular scan loop.
3404          // repeated 0xff keeps trying to read the next byte of the marker.
3405       }
3406    }
3407    return STBI__MARKER_none;
3408 }
3409 
3410 // decode image to YCbCr format
stbi__decode_jpeg_image(stbi__jpeg * j)3411 static int stbi__decode_jpeg_image(stbi__jpeg *j)
3412 {
3413    int m;
3414    for (m = 0; m < 4; m++) {
3415       j->img_comp[m].raw_data = NULL;
3416       j->img_comp[m].raw_coeff = NULL;
3417    }
3418    j->restart_interval = 0;
3419    if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;
3420    m = stbi__get_marker(j);
3421    while (!stbi__EOI(m)) {
3422       if (stbi__SOS(m)) {
3423          if (!stbi__process_scan_header(j)) return 0;
3424          if (!stbi__parse_entropy_coded_data(j)) return 0;
3425          if (j->marker == STBI__MARKER_none ) {
3426          j->marker = stbi__skip_jpeg_junk_at_end(j);
3427             // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
3428          }
3429          m = stbi__get_marker(j);
3430          if (STBI__RESTART(m))
3431             m = stbi__get_marker(j);
3432       } else if (stbi__DNL(m)) {
3433          int Ld = stbi__get16be(j->s);
3434          stbi__uint32 NL = stbi__get16be(j->s);
3435          if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG");
3436          if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG");
3437          m = stbi__get_marker(j);
3438       } else {
3439          if (!stbi__process_marker(j, m)) return 1;
3440          m = stbi__get_marker(j);
3441       }
3442    }
3443    if (j->progressive)
3444       stbi__jpeg_finish(j);
3445    return 1;
3446 }
3447 
3448 // static jfif-centered resampling (across block boundaries)
3449 
3450 typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
3451                                     int w, int hs);
3452 
3453 #define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3454 
resample_row_1(stbi_uc * out,stbi_uc * in_near,stbi_uc * in_far,int w,int hs)3455 static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3456 {
3457    STBI_NOTUSED(out);
3458    STBI_NOTUSED(in_far);
3459    STBI_NOTUSED(w);
3460    STBI_NOTUSED(hs);
3461    return in_near;
3462 }
3463 
stbi__resample_row_v_2(stbi_uc * out,stbi_uc * in_near,stbi_uc * in_far,int w,int hs)3464 static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3465 {
3466    // need to generate two samples vertically for every one in input
3467    int i;
3468    STBI_NOTUSED(hs);
3469    for (i=0; i < w; ++i)
3470       out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
3471    return out;
3472 }
3473 
stbi__resample_row_h_2(stbi_uc * out,stbi_uc * in_near,stbi_uc * in_far,int w,int hs)3474 static stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3475 {
3476    // need to generate two samples horizontally for every one in input
3477    int i;
3478    stbi_uc *input = in_near;
3479 
3480    if (w == 1) {
3481       // if only one sample, can't do any interpolation
3482       out[0] = out[1] = input[0];
3483       return out;
3484    }
3485 
3486    out[0] = input[0];
3487    out[1] = stbi__div4(input[0]*3 + input[1] + 2);
3488    for (i=1; i < w-1; ++i) {
3489       int n = 3*input[i]+2;
3490       out[i*2+0] = stbi__div4(n+input[i-1]);
3491       out[i*2+1] = stbi__div4(n+input[i+1]);
3492    }
3493    out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
3494    out[i*2+1] = input[w-1];
3495 
3496    STBI_NOTUSED(in_far);
3497    STBI_NOTUSED(hs);
3498 
3499    return out;
3500 }
3501 
3502 #define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3503 
stbi__resample_row_hv_2(stbi_uc * out,stbi_uc * in_near,stbi_uc * in_far,int w,int hs)3504 static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3505 {
3506    // need to generate 2x2 samples for every one in input
3507    int i,t0,t1;
3508    if (w == 1) {
3509       out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3510       return out;
3511    }
3512 
3513    t1 = 3*in_near[0] + in_far[0];
3514    out[0] = stbi__div4(t1+2);
3515    for (i=1; i < w; ++i) {
3516       t0 = t1;
3517       t1 = 3*in_near[i]+in_far[i];
3518       out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3519       out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
3520    }
3521    out[w*2-1] = stbi__div4(t1+2);
3522 
3523    STBI_NOTUSED(hs);
3524 
3525    return out;
3526 }
3527 
3528 #if defined(STBI_SSE2) || defined(STBI_NEON)
stbi__resample_row_hv_2_simd(stbi_uc * out,stbi_uc * in_near,stbi_uc * in_far,int w,int hs)3529 static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3530 {
3531    // need to generate 2x2 samples for every one in input
3532    int i=0,t0,t1;
3533 
3534    if (w == 1) {
3535       out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3536       return out;
3537    }
3538 
3539    t1 = 3*in_near[0] + in_far[0];
3540    // process groups of 8 pixels for as long as we can.
3541    // note we can't handle the last pixel in a row in this loop
3542    // because we need to handle the filter boundary conditions.
3543    for (; i < ((w-1) & ~7); i += 8) {
3544 #if defined(STBI_SSE2)
3545       // load and perform the vertical filtering pass
3546       // this uses 3*x + y = 4*x + (y - x)
3547       __m128i zero  = _mm_setzero_si128();
3548       __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));
3549       __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
3550       __m128i farw  = _mm_unpacklo_epi8(farb, zero);
3551       __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3552       __m128i diff  = _mm_sub_epi16(farw, nearw);
3553       __m128i nears = _mm_slli_epi16(nearw, 2);
3554       __m128i curr  = _mm_add_epi16(nears, diff); // current row
3555 
3556       // horizontal filter works the same based on shifted vers of current
3557       // row. "prev" is current row shifted right by 1 pixel; we need to
3558       // insert the previous pixel value (from t1).
3559       // "next" is current row shifted left by 1 pixel, with first pixel
3560       // of next block of 8 pixels added in.
3561       __m128i prv0 = _mm_slli_si128(curr, 2);
3562       __m128i nxt0 = _mm_srli_si128(curr, 2);
3563       __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3564       __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
3565 
3566       // horizontal filter, polyphase implementation since it's convenient:
3567       // even pixels = 3*cur + prev = cur*4 + (prev - cur)
3568       // odd  pixels = 3*cur + next = cur*4 + (next - cur)
3569       // note the shared term.
3570       __m128i bias  = _mm_set1_epi16(8);
3571       __m128i curs = _mm_slli_epi16(curr, 2);
3572       __m128i prvd = _mm_sub_epi16(prev, curr);
3573       __m128i nxtd = _mm_sub_epi16(next, curr);
3574       __m128i curb = _mm_add_epi16(curs, bias);
3575       __m128i even = _mm_add_epi16(prvd, curb);
3576       __m128i odd  = _mm_add_epi16(nxtd, curb);
3577 
3578       // interleave even and odd pixels, then undo scaling.
3579       __m128i int0 = _mm_unpacklo_epi16(even, odd);
3580       __m128i int1 = _mm_unpackhi_epi16(even, odd);
3581       __m128i de0  = _mm_srli_epi16(int0, 4);
3582       __m128i de1  = _mm_srli_epi16(int1, 4);
3583 
3584       // pack and write output
3585       __m128i outv = _mm_packus_epi16(de0, de1);
3586       _mm_storeu_si128((__m128i *) (out + i*2), outv);
3587 #elif defined(STBI_NEON)
3588       // load and perform the vertical filtering pass
3589       // this uses 3*x + y = 4*x + (y - x)
3590       uint8x8_t farb  = vld1_u8(in_far + i);
3591       uint8x8_t nearb = vld1_u8(in_near + i);
3592       int16x8_t diff  = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3593       int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3594       int16x8_t curr  = vaddq_s16(nears, diff); // current row
3595 
3596       // horizontal filter works the same based on shifted vers of current
3597       // row. "prev" is current row shifted right by 1 pixel; we need to
3598       // insert the previous pixel value (from t1).
3599       // "next" is current row shifted left by 1 pixel, with first pixel
3600       // of next block of 8 pixels added in.
3601       int16x8_t prv0 = vextq_s16(curr, curr, 7);
3602       int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3603       int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3604       int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3605 
3606       // horizontal filter, polyphase implementation since it's convenient:
3607       // even pixels = 3*cur + prev = cur*4 + (prev - cur)
3608       // odd  pixels = 3*cur + next = cur*4 + (next - cur)
3609       // note the shared term.
3610       int16x8_t curs = vshlq_n_s16(curr, 2);
3611       int16x8_t prvd = vsubq_s16(prev, curr);
3612       int16x8_t nxtd = vsubq_s16(next, curr);
3613       int16x8_t even = vaddq_s16(curs, prvd);
3614       int16x8_t odd  = vaddq_s16(curs, nxtd);
3615 
3616       // undo scaling and round, then store with even/odd phases interleaved
3617       uint8x8x2_t o;
3618       o.val[0] = vqrshrun_n_s16(even, 4);
3619       o.val[1] = vqrshrun_n_s16(odd,  4);
3620       vst2_u8(out + i*2, o);
3621 #endif
3622 
3623       // "previous" value for next iter
3624       t1 = 3*in_near[i+7] + in_far[i+7];
3625    }
3626 
3627    t0 = t1;
3628    t1 = 3*in_near[i] + in_far[i];
3629    out[i*2] = stbi__div16(3*t1 + t0 + 8);
3630 
3631    for (++i; i < w; ++i) {
3632       t0 = t1;
3633       t1 = 3*in_near[i]+in_far[i];
3634       out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3635       out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
3636    }
3637    out[w*2-1] = stbi__div4(t1+2);
3638 
3639    STBI_NOTUSED(hs);
3640 
3641    return out;
3642 }
3643 #endif
3644 
stbi__resample_row_generic(stbi_uc * out,stbi_uc * in_near,stbi_uc * in_far,int w,int hs)3645 static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3646 {
3647    // resample with nearest-neighbor
3648    int i,j;
3649    STBI_NOTUSED(in_far);
3650    for (i=0; i < w; ++i)
3651       for (j=0; j < hs; ++j)
3652          out[i*hs+j] = in_near[i];
3653    return out;
3654 }
3655 
3656 // this is a reduced-precision calculation of YCbCr-to-RGB introduced
3657 // to make sure the code produces the same results in both SIMD and scalar
3658 #define stbi__float2fixed(x)  (((int) ((x) * 4096.0f + 0.5f)) << 8)
stbi__YCbCr_to_RGB_row(stbi_uc * out,const stbi_uc * y,const stbi_uc * pcb,const stbi_uc * pcr,int count,int step)3659 static void stbi__YCbCr_to_RGB_row(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step)
3660 {
3661    int i;
3662    for (i=0; i < count; ++i) {
3663       int y_fixed = (y[i] << 20) + (1<<19); // rounding
3664       int r,g,b;
3665       int cr = pcr[i] - 128;
3666       int cb = pcb[i] - 128;
3667       r = y_fixed +  cr* stbi__float2fixed(1.40200f);
3668       g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3669       b = y_fixed                                     +   cb* stbi__float2fixed(1.77200f);
3670       r >>= 20;
3671       g >>= 20;
3672       b >>= 20;
3673       if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
3674       if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
3675       if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
3676       out[0] = (stbi_uc)r;
3677       out[1] = (stbi_uc)g;
3678       out[2] = (stbi_uc)b;
3679       out[3] = 255;
3680       out += step;
3681    }
3682 }
3683 
3684 #if defined(STBI_SSE2) || defined(STBI_NEON)
stbi__YCbCr_to_RGB_simd(stbi_uc * out,stbi_uc const * y,stbi_uc const * pcb,stbi_uc const * pcr,int count,int step)3685 static void stbi__YCbCr_to_RGB_simd(stbi_uc *out, stbi_uc const *y, stbi_uc const *pcb, stbi_uc const *pcr, int count, int step)
3686 {
3687    int i = 0;
3688 
3689 #ifdef STBI_SSE2
3690    // step == 3 is pretty ugly on the final interleave, and i'm not convinced
3691    // it's useful in practice (you wouldn't use it for textures, for example).
3692    // so just accelerate step == 4 case.
3693    if (step == 4) {
3694       // this is a fairly straightforward implementation and not super-optimized.
3695       __m128i signflip  = _mm_set1_epi8(-0x80);
3696       __m128i cr_const0 = _mm_set1_epi16(   (short) ( 1.40200f*4096.0f+0.5f));
3697       __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
3698       __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
3699       __m128i cb_const1 = _mm_set1_epi16(   (short) ( 1.77200f*4096.0f+0.5f));
3700       __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
3701       __m128i xw = _mm_set1_epi16(255); // alpha channel
3702 
3703       for (; i+7 < count; i += 8) {
3704          // load
3705          __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3706          __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3707          __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3708          __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
3709          __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128
3710 
3711          // unpack to short (and left-shift cr, cb by 8)
3712          __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);
3713          __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3714          __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3715 
3716          // color transform
3717          __m128i yws = _mm_srli_epi16(yw, 4);
3718          __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3719          __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3720          __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3721          __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3722          __m128i rws = _mm_add_epi16(cr0, yws);
3723          __m128i gwt = _mm_add_epi16(cb0, yws);
3724          __m128i bws = _mm_add_epi16(yws, cb1);
3725          __m128i gws = _mm_add_epi16(gwt, cr1);
3726 
3727          // descale
3728          __m128i rw = _mm_srai_epi16(rws, 4);
3729          __m128i bw = _mm_srai_epi16(bws, 4);
3730          __m128i gw = _mm_srai_epi16(gws, 4);
3731 
3732          // back to byte, set up for transpose
3733          __m128i brb = _mm_packus_epi16(rw, bw);
3734          __m128i gxb = _mm_packus_epi16(gw, xw);
3735 
3736          // transpose to interleave channels
3737          __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3738          __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3739          __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3740          __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3741 
3742          // store
3743          _mm_storeu_si128((__m128i *) (out + 0), o0);
3744          _mm_storeu_si128((__m128i *) (out + 16), o1);
3745          out += 32;
3746       }
3747    }
3748 #endif
3749 
3750 #ifdef STBI_NEON
3751    // in this version, step=3 support would be easy to add. but is there demand?
3752    if (step == 4) {
3753       // this is a fairly straightforward implementation and not super-optimized.
3754       uint8x8_t signflip = vdup_n_u8(0x80);
3755       int16x8_t cr_const0 = vdupq_n_s16(   (short) ( 1.40200f*4096.0f+0.5f));
3756       int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));
3757       int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));
3758       int16x8_t cb_const1 = vdupq_n_s16(   (short) ( 1.77200f*4096.0f+0.5f));
3759 
3760       for (; i+7 < count; i += 8) {
3761          // load
3762          uint8x8_t y_bytes  = vld1_u8(y + i);
3763          uint8x8_t cr_bytes = vld1_u8(pcr + i);
3764          uint8x8_t cb_bytes = vld1_u8(pcb + i);
3765          int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3766          int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3767 
3768          // expand to s16
3769          int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3770          int16x8_t crw = vshll_n_s8(cr_biased, 7);
3771          int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3772 
3773          // color transform
3774          int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3775          int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3776          int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3777          int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3778          int16x8_t rws = vaddq_s16(yws, cr0);
3779          int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3780          int16x8_t bws = vaddq_s16(yws, cb1);
3781 
3782          // undo scaling, round, convert to byte
3783          uint8x8x4_t o;
3784          o.val[0] = vqrshrun_n_s16(rws, 4);
3785          o.val[1] = vqrshrun_n_s16(gws, 4);
3786          o.val[2] = vqrshrun_n_s16(bws, 4);
3787          o.val[3] = vdup_n_u8(255);
3788 
3789          // store, interleaving r/g/b/a
3790          vst4_u8(out, o);
3791          out += 8*4;
3792       }
3793    }
3794 #endif
3795 
3796    for (; i < count; ++i) {
3797       int y_fixed = (y[i] << 20) + (1<<19); // rounding
3798       int r,g,b;
3799       int cr = pcr[i] - 128;
3800       int cb = pcb[i] - 128;
3801       r = y_fixed + cr* stbi__float2fixed(1.40200f);
3802       g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3803       b = y_fixed                                   +   cb* stbi__float2fixed(1.77200f);
3804       r >>= 20;
3805       g >>= 20;
3806       b >>= 20;
3807       if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
3808       if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
3809       if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
3810       out[0] = (stbi_uc)r;
3811       out[1] = (stbi_uc)g;
3812       out[2] = (stbi_uc)b;
3813       out[3] = 255;
3814       out += step;
3815    }
3816 }
3817 #endif
3818 
3819 // set up the kernels
stbi__setup_jpeg(stbi__jpeg * j)3820 static void stbi__setup_jpeg(stbi__jpeg *j)
3821 {
3822    j->idct_block_kernel = stbi__idct_block;
3823    j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3824    j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3825 
3826 #ifdef STBI_SSE2
3827    if (stbi__sse2_available()) {
3828       j->idct_block_kernel = stbi__idct_simd;
3829       j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3830       j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3831    }
3832 #endif
3833 
3834 #ifdef STBI_NEON
3835    j->idct_block_kernel = stbi__idct_simd;
3836    j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3837    j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3838 #endif
3839 }
3840 
3841 // clean up the temporary component buffers
stbi__cleanup_jpeg(stbi__jpeg * j)3842 static void stbi__cleanup_jpeg(stbi__jpeg *j)
3843 {
3844    stbi__free_jpeg_components(j, j->s->img_n, 0);
3845 }
3846 
3847 typedef struct
3848 {
3849    resample_row_func resample;
3850    stbi_uc *line0,*line1;
3851    int hs,vs;   // expansion factor in each axis
3852    int w_lores; // horizontal pixels pre-expansion
3853    int ystep;   // how far through vertical expansion we are
3854    int ypos;    // which pre-expansion row we're on
3855 } stbi__resample;
3856 
3857 // fast 0..255 * 0..255 => 0..255 rounded multiplication
stbi__blinn_8x8(stbi_uc x,stbi_uc y)3858 static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
3859 {
3860    unsigned int t = x*y + 128;
3861    return (stbi_uc) ((t + (t >>8)) >> 8);
3862 }
3863 
load_jpeg_image(stbi__jpeg * z,int * out_x,int * out_y,int * comp,int req_comp)3864 static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
3865 {
3866    int n, decode_n, is_rgb;
3867    z->s->img_n = 0; // make stbi__cleanup_jpeg safe
3868 
3869    // validate req_comp
3870    if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
3871 
3872    // load a jpeg image from whichever source, but leave in YCbCr format
3873    if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
3874 
3875    // determine actual number of components to generate
3876    n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3877 
3878    is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3879 
3880    if (z->s->img_n == 3 && n < 3 && !is_rgb)
3881       decode_n = 1;
3882    else
3883       decode_n = z->s->img_n;
3884 
3885    // nothing to do if no components requested; check this now to avoid
3886    // accessing uninitialized coutput[0] later
3887    if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; }
3888 
3889    // resample and color-convert
3890    {
3891       int k;
3892       unsigned int i,j;
3893       stbi_uc *output;
3894       stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
3895 
3896       stbi__resample res_comp[4];
3897 
3898       for (k=0; k < decode_n; ++k) {
3899          stbi__resample *r = &res_comp[k];
3900 
3901          // allocate line buffer big enough for upsampling off the edges
3902          // with upsample factor of 4
3903          z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
3904          if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
3905 
3906          r->hs      = z->img_h_max / z->img_comp[k].h;
3907          r->vs      = z->img_v_max / z->img_comp[k].v;
3908          r->ystep   = r->vs >> 1;
3909          r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3910          r->ypos    = 0;
3911          r->line0   = r->line1 = z->img_comp[k].data;
3912 
3913          if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3914          else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3915          else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3916          else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3917          else                               r->resample = stbi__resample_row_generic;
3918       }
3919 
3920       // can't error after this so, this is safe
3921       output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3922       if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
3923 
3924       // now go ahead and resample
3925       for (j=0; j < z->s->img_y; ++j) {
3926          stbi_uc *out = output + n * z->s->img_x * j;
3927          for (k=0; k < decode_n; ++k) {
3928             stbi__resample *r = &res_comp[k];
3929             int y_bot = r->ystep >= (r->vs >> 1);
3930             coutput[k] = r->resample(z->img_comp[k].linebuf,
3931                                      y_bot ? r->line1 : r->line0,
3932                                      y_bot ? r->line0 : r->line1,
3933                                      r->w_lores, r->hs);
3934             if (++r->ystep >= r->vs) {
3935                r->ystep = 0;
3936                r->line0 = r->line1;
3937                if (++r->ypos < z->img_comp[k].y)
3938                   r->line1 += z->img_comp[k].w2;
3939             }
3940          }
3941          if (n >= 3) {
3942             stbi_uc *y = coutput[0];
3943             if (z->s->img_n == 3) {
3944                if (is_rgb) {
3945                   for (i=0; i < z->s->img_x; ++i) {
3946                      out[0] = y[i];
3947                      out[1] = coutput[1][i];
3948                      out[2] = coutput[2][i];
3949                      out[3] = 255;
3950                      out += n;
3951                   }
3952                } else {
3953                   z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3954                }
3955             } else if (z->s->img_n == 4) {
3956                if (z->app14_color_transform == 0) { // CMYK
3957                   for (i=0; i < z->s->img_x; ++i) {
3958                      stbi_uc m = coutput[3][i];
3959                      out[0] = stbi__blinn_8x8(coutput[0][i], m);
3960                      out[1] = stbi__blinn_8x8(coutput[1][i], m);
3961                      out[2] = stbi__blinn_8x8(coutput[2][i], m);
3962                      out[3] = 255;
3963                      out += n;
3964                   }
3965                } else if (z->app14_color_transform == 2) { // YCCK
3966                   z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3967                   for (i=0; i < z->s->img_x; ++i) {
3968                      stbi_uc m = coutput[3][i];
3969                      out[0] = stbi__blinn_8x8(255 - out[0], m);
3970                      out[1] = stbi__blinn_8x8(255 - out[1], m);
3971                      out[2] = stbi__blinn_8x8(255 - out[2], m);
3972                      out += n;
3973                   }
3974                } else { // YCbCr + alpha?  Ignore the fourth channel for now
3975                   z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3976                }
3977             } else
3978                for (i=0; i < z->s->img_x; ++i) {
3979                   out[0] = out[1] = out[2] = y[i];
3980                   out[3] = 255; // not used if n==3
3981                   out += n;
3982                }
3983          } else {
3984             if (is_rgb) {
3985                if (n == 1)
3986                   for (i=0; i < z->s->img_x; ++i)
3987                      *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3988                else {
3989                   for (i=0; i < z->s->img_x; ++i, out += 2) {
3990                      out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
3991                      out[1] = 255;
3992                   }
3993                }
3994             } else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
3995                for (i=0; i < z->s->img_x; ++i) {
3996                   stbi_uc m = coutput[3][i];
3997                   stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
3998                   stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
3999                   stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
4000                   out[0] = stbi__compute_y(r, g, b);
4001                   out[1] = 255;
4002                   out += n;
4003                }
4004             } else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
4005                for (i=0; i < z->s->img_x; ++i) {
4006                   out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
4007                   out[1] = 255;
4008                   out += n;
4009                }
4010             } else {
4011                stbi_uc *y = coutput[0];
4012                if (n == 1)
4013                   for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
4014                else
4015                   for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
4016             }
4017          }
4018       }
4019       stbi__cleanup_jpeg(z);
4020       *out_x = z->s->img_x;
4021       *out_y = z->s->img_y;
4022       if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output
4023       return output;
4024    }
4025 }
4026 
stbi__jpeg_load(stbi__context * s,int * x,int * y,int * comp,int req_comp,stbi__result_info * ri)4027 static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
4028 {
4029    unsigned char* result;
4030    stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));
4031    if (!j) return stbi__errpuc("outofmem", "Out of memory");
4032    memset(j, 0, sizeof(stbi__jpeg));
4033    STBI_NOTUSED(ri);
4034    j->s = s;
4035    stbi__setup_jpeg(j);
4036    result = load_jpeg_image(j, x,y,comp,req_comp);
4037    STBI_FREE(j);
4038    return result;
4039 }
4040 
stbi__jpeg_test(stbi__context * s)4041 static int stbi__jpeg_test(stbi__context *s)
4042 {
4043    int r;
4044    stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));
4045    if (!j) return stbi__err("outofmem", "Out of memory");
4046    memset(j, 0, sizeof(stbi__jpeg));
4047    j->s = s;
4048    stbi__setup_jpeg(j);
4049    r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
4050    stbi__rewind(s);
4051    STBI_FREE(j);
4052    return r;
4053 }
4054 
stbi__jpeg_info_raw(stbi__jpeg * j,int * x,int * y,int * comp)4055 static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
4056 {
4057    if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
4058       stbi__rewind( j->s );
4059       return 0;
4060    }
4061    if (x) *x = j->s->img_x;
4062    if (y) *y = j->s->img_y;
4063    if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
4064    return 1;
4065 }
4066 
stbi__jpeg_info(stbi__context * s,int * x,int * y,int * comp)4067 static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
4068 {
4069    int result;
4070    stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));
4071    if (!j) return stbi__err("outofmem", "Out of memory");
4072    memset(j, 0, sizeof(stbi__jpeg));
4073    j->s = s;
4074    result = stbi__jpeg_info_raw(j, x, y, comp);
4075    STBI_FREE(j);
4076    return result;
4077 }
4078 #endif
4079 
4080 // public domain zlib decode    v0.2  Sean Barrett 2006-11-18
4081 //    simple implementation
4082 //      - all input must be provided in an upfront buffer
4083 //      - all output is written to a single output buffer (can malloc/realloc)
4084 //    performance
4085 //      - fast huffman
4086 
4087 #ifndef STBI_NO_ZLIB
4088 
4089 // fast-way is faster to check than jpeg huffman, but slow way is slower
4090 #define STBI__ZFAST_BITS  9 // accelerate all cases in default tables
4091 #define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1)
4092 #define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet
4093 
4094 // zlib-style huffman encoding
4095 // (jpegs packs from left, zlib from right, so can't share code)
4096 typedef struct
4097 {
4098    stbi__uint16 fast[1 << STBI__ZFAST_BITS];
4099    stbi__uint16 firstcode[16];
4100    int maxcode[17];
4101    stbi__uint16 firstsymbol[16];
4102    stbi_uc  size[STBI__ZNSYMS];
4103    stbi__uint16 value[STBI__ZNSYMS];
4104 } stbi__zhuffman;
4105 
stbi__bitreverse16(int n)4106 stbi_inline static int stbi__bitreverse16(int n)
4107 {
4108   n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);
4109   n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);
4110   n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);
4111   n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);
4112   return n;
4113 }
4114 
stbi__bit_reverse(int v,int bits)4115 stbi_inline static int stbi__bit_reverse(int v, int bits)
4116 {
4117    STBI_ASSERT(bits <= 16);
4118    // to bit reverse n bits, reverse 16 and shift
4119    // e.g. 11 bits, bit reverse and shift away 5
4120    return stbi__bitreverse16(v) >> (16-bits);
4121 }
4122 
stbi__zbuild_huffman(stbi__zhuffman * z,const stbi_uc * sizelist,int num)4123 static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)
4124 {
4125    int i,k=0;
4126    int code, next_code[16], sizes[17];
4127 
4128    // DEFLATE spec for generating codes
4129    memset(sizes, 0, sizeof(sizes));
4130    memset(z->fast, 0, sizeof(z->fast));
4131    for (i=0; i < num; ++i)
4132       ++sizes[sizelist[i]];
4133    sizes[0] = 0;
4134    for (i=1; i < 16; ++i)
4135       if (sizes[i] > (1 << i))
4136          return stbi__err("bad sizes", "Corrupt PNG");
4137    code = 0;
4138    for (i=1; i < 16; ++i) {
4139       next_code[i] = code;
4140       z->firstcode[i] = (stbi__uint16) code;
4141       z->firstsymbol[i] = (stbi__uint16) k;
4142       code = (code + sizes[i]);
4143       if (sizes[i])
4144          if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG");
4145       z->maxcode[i] = code << (16-i); // preshift for inner loop
4146       code <<= 1;
4147       k += sizes[i];
4148    }
4149    z->maxcode[16] = 0x10000; // sentinel
4150    for (i=0; i < num; ++i) {
4151       int s = sizelist[i];
4152       if (s) {
4153          int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
4154          stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
4155          z->size [c] = (stbi_uc     ) s;
4156          z->value[c] = (stbi__uint16) i;
4157          if (s <= STBI__ZFAST_BITS) {
4158             int j = stbi__bit_reverse(next_code[s],s);
4159             while (j < (1 << STBI__ZFAST_BITS)) {
4160                z->fast[j] = fastv;
4161                j += (1 << s);
4162             }
4163          }
4164          ++next_code[s];
4165       }
4166    }
4167    return 1;
4168 }
4169 
4170 // zlib-from-memory implementation for PNG reading
4171 //    because PNG allows splitting the zlib stream arbitrarily,
4172 //    and it's annoying structurally to have PNG call ZLIB call PNG,
4173 //    we require PNG read all the IDATs and combine them into a single
4174 //    memory buffer
4175 
4176 typedef struct
4177 {
4178    stbi_uc *zbuffer, *zbuffer_end;
4179    int num_bits;
4180    stbi__uint32 code_buffer;
4181 
4182    char *zout;
4183    char *zout_start;
4184    char *zout_end;
4185    int   z_expandable;
4186 
4187    stbi__zhuffman z_length, z_distance;
4188 } stbi__zbuf;
4189 
stbi__zeof(stbi__zbuf * z)4190 stbi_inline static int stbi__zeof(stbi__zbuf *z)
4191 {
4192    return (z->zbuffer >= z->zbuffer_end);
4193 }
4194 
stbi__zget8(stbi__zbuf * z)4195 stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)
4196 {
4197    return stbi__zeof(z) ? 0 : *z->zbuffer++;
4198 }
4199 
stbi__fill_bits(stbi__zbuf * z)4200 static void stbi__fill_bits(stbi__zbuf *z)
4201 {
4202    do {
4203       if (z->code_buffer >= (1U << z->num_bits)) {
4204         z->zbuffer = z->zbuffer_end;  /* treat this as EOF so we fail. */
4205         return;
4206       }
4207       z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;
4208       z->num_bits += 8;
4209    } while (z->num_bits <= 24);
4210 }
4211 
stbi__zreceive(stbi__zbuf * z,int n)4212 stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
4213 {
4214    unsigned int k;
4215    if (z->num_bits < n) stbi__fill_bits(z);
4216    k = z->code_buffer & ((1 << n) - 1);
4217    z->code_buffer >>= n;
4218    z->num_bits -= n;
4219    return k;
4220 }
4221 
stbi__zhuffman_decode_slowpath(stbi__zbuf * a,stbi__zhuffman * z)4222 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
4223 {
4224    int b,s,k;
4225    // not resolved by fast table, so compute it the slow way
4226    // use jpeg approach, which requires MSbits at top
4227    k = stbi__bit_reverse(a->code_buffer, 16);
4228    for (s=STBI__ZFAST_BITS+1; ; ++s)
4229       if (k < z->maxcode[s])
4230          break;
4231    if (s >= 16) return -1; // invalid code!
4232    // code size is s, so:
4233    b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
4234    if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere!
4235    if (z->size[b] != s) return -1;  // was originally an assert, but report failure instead.
4236    a->code_buffer >>= s;
4237    a->num_bits -= s;
4238    return z->value[b];
4239 }
4240 
stbi__zhuffman_decode(stbi__zbuf * a,stbi__zhuffman * z)4241 stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
4242 {
4243    int b,s;
4244    if (a->num_bits < 16) {
4245       if (stbi__zeof(a)) {
4246          return -1;   /* report error for unexpected end of data. */
4247       }
4248       stbi__fill_bits(a);
4249    }
4250    b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
4251    if (b) {
4252       s = b >> 9;
4253       a->code_buffer >>= s;
4254       a->num_bits -= s;
4255       return b & 511;
4256    }
4257    return stbi__zhuffman_decode_slowpath(a, z);
4258 }
4259 
stbi__zexpand(stbi__zbuf * z,char * zout,int n)4260 static int stbi__zexpand(stbi__zbuf *z, char *zout, int n)  // need to make room for n bytes
4261 {
4262    char *q;
4263    unsigned int cur, limit, old_limit;
4264    z->zout = zout;
4265    if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");
4266    cur   = (unsigned int) (z->zout - z->zout_start);
4267    limit = old_limit = (unsigned) (z->zout_end - z->zout_start);
4268    if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory");
4269    while (cur + n > limit) {
4270       if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory");
4271       limit *= 2;
4272    }
4273    q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
4274    STBI_NOTUSED(old_limit);
4275    if (q == NULL) return stbi__err("outofmem", "Out of memory");
4276    z->zout_start = q;
4277    z->zout       = q + cur;
4278    z->zout_end   = q + limit;
4279    return 1;
4280 }
4281 
4282 static const int stbi__zlength_base[31] = {
4283    3,4,5,6,7,8,9,10,11,13,
4284    15,17,19,23,27,31,35,43,51,59,
4285    67,83,99,115,131,163,195,227,258,0,0 };
4286 
4287 static const int stbi__zlength_extra[31]=
4288 { 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 };
4289 
4290 static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
4291 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
4292 
4293 static const int stbi__zdist_extra[32] =
4294 { 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};
4295 
stbi__parse_huffman_block(stbi__zbuf * a)4296 static int stbi__parse_huffman_block(stbi__zbuf *a)
4297 {
4298    char *zout = a->zout;
4299    for(;;) {
4300       int z = stbi__zhuffman_decode(a, &a->z_length);
4301       if (z < 256) {
4302          if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes
4303          if (zout >= a->zout_end) {
4304             if (!stbi__zexpand(a, zout, 1)) return 0;
4305             zout = a->zout;
4306          }
4307          *zout++ = (char) z;
4308       } else {
4309          stbi_uc *p;
4310          int len,dist;
4311          if (z == 256) {
4312             a->zout = zout;
4313             return 1;
4314          }
4315          if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data
4316          z -= 257;
4317          len = stbi__zlength_base[z];
4318          if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
4319          z = stbi__zhuffman_decode(a, &a->z_distance);
4320          if (z < 0 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data
4321          dist = stbi__zdist_base[z];
4322          if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
4323          if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG");
4324          if (zout + len > a->zout_end) {
4325             if (!stbi__zexpand(a, zout, len)) return 0;
4326             zout = a->zout;
4327          }
4328          p = (stbi_uc *) (zout - dist);
4329          if (dist == 1) { // run of one byte; common in images.
4330             stbi_uc v = *p;
4331             if (len) { do *zout++ = v; while (--len); }
4332          } else {
4333             if (len) { do *zout++ = *p++; while (--len); }
4334          }
4335       }
4336    }
4337 }
4338 
stbi__compute_huffman_codes(stbi__zbuf * a)4339 static int stbi__compute_huffman_codes(stbi__zbuf *a)
4340 {
4341    static const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
4342    stbi__zhuffman z_codelength;
4343    stbi_uc lencodes[286+32+137];//padding for maximum single op
4344    stbi_uc codelength_sizes[19];
4345    int i,n;
4346 
4347    int hlit  = stbi__zreceive(a,5) + 257;
4348    int hdist = stbi__zreceive(a,5) + 1;
4349    int hclen = stbi__zreceive(a,4) + 4;
4350    int ntot  = hlit + hdist;
4351 
4352    memset(codelength_sizes, 0, sizeof(codelength_sizes));
4353    for (i=0; i < hclen; ++i) {
4354       int s = stbi__zreceive(a,3);
4355       codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
4356    }
4357    if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
4358 
4359    n = 0;
4360    while (n < ntot) {
4361       int c = stbi__zhuffman_decode(a, &z_codelength);
4362       if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG");
4363       if (c < 16)
4364          lencodes[n++] = (stbi_uc) c;
4365       else {
4366          stbi_uc fill = 0;
4367          if (c == 16) {
4368             c = stbi__zreceive(a,2)+3;
4369             if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG");
4370             fill = lencodes[n-1];
4371          } else if (c == 17) {
4372             c = stbi__zreceive(a,3)+3;
4373          } else if (c == 18) {
4374             c = stbi__zreceive(a,7)+11;
4375          } else {
4376             return stbi__err("bad codelengths", "Corrupt PNG");
4377          }
4378          if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG");
4379          memset(lencodes+n, fill, c);
4380          n += c;
4381       }
4382    }
4383    if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG");
4384    if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
4385    if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
4386    return 1;
4387 }
4388 
stbi__parse_uncompressed_block(stbi__zbuf * a)4389 static int stbi__parse_uncompressed_block(stbi__zbuf *a)
4390 {
4391    stbi_uc header[4];
4392    int len,nlen,k;
4393    if (a->num_bits & 7)
4394       stbi__zreceive(a, a->num_bits & 7); // discard
4395    // drain the bit-packed data into header
4396    k = 0;
4397    while (a->num_bits > 0) {
4398       header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check
4399       a->code_buffer >>= 8;
4400       a->num_bits -= 8;
4401    }
4402    if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG");
4403    // now fill header the normal way
4404    while (k < 4)
4405       header[k++] = stbi__zget8(a);
4406    len  = header[1] * 256 + header[0];
4407    nlen = header[3] * 256 + header[2];
4408    if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG");
4409    if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG");
4410    if (a->zout + len > a->zout_end)
4411       if (!stbi__zexpand(a, a->zout, len)) return 0;
4412    memcpy(a->zout, a->zbuffer, len);
4413    a->zbuffer += len;
4414    a->zout += len;
4415    return 1;
4416 }
4417 
stbi__parse_zlib_header(stbi__zbuf * a)4418 static int stbi__parse_zlib_header(stbi__zbuf *a)
4419 {
4420    int cmf   = stbi__zget8(a);
4421    int cm    = cmf & 15;
4422    /* int cinfo = cmf >> 4; */
4423    int flg   = stbi__zget8(a);
4424    if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
4425    if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
4426    if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
4427    if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png
4428    // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
4429    return 1;
4430 }
4431 
4432 static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] =
4433 {
4434    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4435    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4436    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4437    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,
4438    8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4439    9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4440    9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4441    9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,
4442    7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8
4443 };
4444 static const stbi_uc stbi__zdefault_distance[32] =
4445 {
4446    5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5
4447 };
4448 /*
4449 Init algorithm:
4450 {
4451    int i;   // use <= to match clearly with spec
4452    for (i=0; i <= 143; ++i)     stbi__zdefault_length[i]   = 8;
4453    for (   ; i <= 255; ++i)     stbi__zdefault_length[i]   = 9;
4454    for (   ; i <= 279; ++i)     stbi__zdefault_length[i]   = 7;
4455    for (   ; i <= 287; ++i)     stbi__zdefault_length[i]   = 8;
4456 
4457    for (i=0; i <=  31; ++i)     stbi__zdefault_distance[i] = 5;
4458 }
4459 */
4460 
stbi__parse_zlib(stbi__zbuf * a,int parse_header)4461 static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
4462 {
4463    int final, type;
4464    if (parse_header)
4465       if (!stbi__parse_zlib_header(a)) return 0;
4466    a->num_bits = 0;
4467    a->code_buffer = 0;
4468    do {
4469       final = stbi__zreceive(a,1);
4470       type = stbi__zreceive(a,2);
4471       if (type == 0) {
4472          if (!stbi__parse_uncompressed_block(a)) return 0;
4473       } else if (type == 3) {
4474          return 0;
4475       } else {
4476          if (type == 1) {
4477             // use fixed code lengths
4478             if (!stbi__zbuild_huffman(&a->z_length  , stbi__zdefault_length  , STBI__ZNSYMS)) return 0;
4479             if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance,  32)) return 0;
4480          } else {
4481             if (!stbi__compute_huffman_codes(a)) return 0;
4482          }
4483          if (!stbi__parse_huffman_block(a)) return 0;
4484       }
4485    } while (!final);
4486    return 1;
4487 }
4488 
stbi__do_zlib(stbi__zbuf * a,char * obuf,int olen,int exp,int parse_header)4489 static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)
4490 {
4491    a->zout_start = obuf;
4492    a->zout       = obuf;
4493    a->zout_end   = obuf + olen;
4494    a->z_expandable = exp;
4495 
4496    return stbi__parse_zlib(a, parse_header);
4497 }
4498 
stbi_zlib_decode_malloc_guesssize(const char * buffer,int len,int initial_size,int * outlen)4499 STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
4500 {
4501    stbi__zbuf a;
4502    char *p = (char *) stbi__malloc(initial_size);
4503    if (p == NULL) return NULL;
4504    a.zbuffer = (stbi_uc *) buffer;
4505    a.zbuffer_end = (stbi_uc *) buffer + len;
4506    if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
4507       if (outlen) *outlen = (int) (a.zout - a.zout_start);
4508       return a.zout_start;
4509    } else {
4510       STBI_FREE(a.zout_start);
4511       return NULL;
4512    }
4513 }
4514 
stbi_zlib_decode_malloc(char const * buffer,int len,int * outlen)4515 STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
4516 {
4517    return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
4518 }
4519 
stbi_zlib_decode_malloc_guesssize_headerflag(const char * buffer,int len,int initial_size,int * outlen,int parse_header)4520 STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
4521 {
4522    stbi__zbuf a;
4523    char *p = (char *) stbi__malloc(initial_size);
4524    if (p == NULL) return NULL;
4525    a.zbuffer = (stbi_uc *) buffer;
4526    a.zbuffer_end = (stbi_uc *) buffer + len;
4527    if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
4528       if (outlen) *outlen = (int) (a.zout - a.zout_start);
4529       return a.zout_start;
4530    } else {
4531       STBI_FREE(a.zout_start);
4532       return NULL;
4533    }
4534 }
4535 
stbi_zlib_decode_buffer(char * obuffer,int olen,char const * ibuffer,int ilen)4536 STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
4537 {
4538    stbi__zbuf a;
4539    a.zbuffer = (stbi_uc *) ibuffer;
4540    a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
4541    if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
4542       return (int) (a.zout - a.zout_start);
4543    else
4544       return -1;
4545 }
4546 
stbi_zlib_decode_noheader_malloc(char const * buffer,int len,int * outlen)4547 STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
4548 {
4549    stbi__zbuf a;
4550    char *p = (char *) stbi__malloc(16384);
4551    if (p == NULL) return NULL;
4552    a.zbuffer = (stbi_uc *) buffer;
4553    a.zbuffer_end = (stbi_uc *) buffer+len;
4554    if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
4555       if (outlen) *outlen = (int) (a.zout - a.zout_start);
4556       return a.zout_start;
4557    } else {
4558       STBI_FREE(a.zout_start);
4559       return NULL;
4560    }
4561 }
4562 
stbi_zlib_decode_noheader_buffer(char * obuffer,int olen,const char * ibuffer,int ilen)4563 STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
4564 {
4565    stbi__zbuf a;
4566    a.zbuffer = (stbi_uc *) ibuffer;
4567    a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
4568    if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
4569       return (int) (a.zout - a.zout_start);
4570    else
4571       return -1;
4572 }
4573 #endif
4574 
4575 // public domain "baseline" PNG decoder   v0.10  Sean Barrett 2006-11-18
4576 //    simple implementation
4577 //      - only 8-bit samples
4578 //      - no CRC checking
4579 //      - allocates lots of intermediate memory
4580 //        - avoids problem of streaming data between subsystems
4581 //        - avoids explicit window management
4582 //    performance
4583 //      - uses stb_zlib, a PD zlib implementation with fast huffman decoding
4584 
4585 #ifndef STBI_NO_PNG
4586 typedef struct
4587 {
4588    stbi__uint32 length;
4589    stbi__uint32 type;
4590 } stbi__pngchunk;
4591 
stbi__get_chunk_header(stbi__context * s)4592 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
4593 {
4594    stbi__pngchunk c;
4595    c.length = stbi__get32be(s);
4596    c.type   = stbi__get32be(s);
4597    return c;
4598 }
4599 
stbi__check_png_header(stbi__context * s)4600 static int stbi__check_png_header(stbi__context *s)
4601 {
4602    static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4603    int i;
4604    for (i=0; i < 8; ++i)
4605       if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
4606    return 1;
4607 }
4608 
4609 typedef struct
4610 {
4611    stbi__context *s;
4612    stbi_uc *idata, *expanded, *out;
4613    int depth;
4614 } stbi__png;
4615 
4616 
4617 enum {
4618    STBI__F_none=0,
4619    STBI__F_sub=1,
4620    STBI__F_up=2,
4621    STBI__F_avg=3,
4622    STBI__F_paeth=4,
4623    // synthetic filters used for first scanline to avoid needing a dummy row of 0s
4624    STBI__F_avg_first,
4625    STBI__F_paeth_first
4626 };
4627 
4628 static stbi_uc first_row_filter[5] =
4629 {
4630    STBI__F_none,
4631    STBI__F_sub,
4632    STBI__F_none,
4633    STBI__F_avg_first,
4634    STBI__F_paeth_first
4635 };
4636 
stbi__paeth(int a,int b,int c)4637 static int stbi__paeth(int a, int b, int c)
4638 {
4639    int p = a + b - c;
4640    int pa = abs(p-a);
4641    int pb = abs(p-b);
4642    int pc = abs(p-c);
4643    if (pa <= pb && pa <= pc) return a;
4644    if (pb <= pc) return b;
4645    return c;
4646 }
4647 
4648 static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4649 
4650 // create the png data from post-deflated data
stbi__create_png_image_raw(stbi__png * a,stbi_uc * raw,stbi__uint32 raw_len,int out_n,stbi__uint32 x,stbi__uint32 y,int depth,int color)4651 static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color)
4652 {
4653    int bytes = (depth == 16? 2 : 1);
4654    stbi__context *s = a->s;
4655    stbi__uint32 i,j,stride = x*out_n*bytes;
4656    stbi__uint32 img_len, img_width_bytes;
4657    int k;
4658    int img_n = s->img_n; // copy it into a local for later
4659 
4660    int output_bytes = out_n*bytes;
4661    int filter_bytes = img_n*bytes;
4662    int width = x;
4663 
4664    STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
4665    a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into
4666    if (!a->out) return stbi__err("outofmem", "Out of memory");
4667 
4668    if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG");
4669    img_width_bytes = (((img_n * x * depth) + 7) >> 3);
4670    img_len = (img_width_bytes + 1) * y;
4671 
4672    // we used to check for exact match between raw_len and img_len on non-interlaced PNGs,
4673    // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),
4674    // so just check for raw_len < img_len always.
4675    if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
4676 
4677    for (j=0; j < y; ++j) {
4678       stbi_uc *cur = a->out + stride*j;
4679       stbi_uc *prior;
4680       int filter = *raw++;
4681 
4682       if (filter > 4)
4683          return stbi__err("invalid filter","Corrupt PNG");
4684 
4685       if (depth < 8) {
4686          if (img_width_bytes > x) return stbi__err("invalid width","Corrupt PNG");
4687          cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place
4688          filter_bytes = 1;
4689          width = img_width_bytes;
4690       }
4691       prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above
4692 
4693       // if first row, use special filter that doesn't sample previous row
4694       if (j == 0) filter = first_row_filter[filter];
4695 
4696       // handle first byte explicitly
4697       for (k=0; k < filter_bytes; ++k) {
4698          switch (filter) {
4699             case STBI__F_none       : cur[k] = raw[k]; break;
4700             case STBI__F_sub        : cur[k] = raw[k]; break;
4701             case STBI__F_up         : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
4702             case STBI__F_avg        : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break;
4703             case STBI__F_paeth      : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break;
4704             case STBI__F_avg_first  : cur[k] = raw[k]; break;
4705             case STBI__F_paeth_first: cur[k] = raw[k]; break;
4706          }
4707       }
4708 
4709       if (depth == 8) {
4710          if (img_n != out_n)
4711             cur[img_n] = 255; // first pixel
4712          raw += img_n;
4713          cur += out_n;
4714          prior += out_n;
4715       } else if (depth == 16) {
4716          if (img_n != out_n) {
4717             cur[filter_bytes]   = 255; // first pixel top byte
4718             cur[filter_bytes+1] = 255; // first pixel bottom byte
4719          }
4720          raw += filter_bytes;
4721          cur += output_bytes;
4722          prior += output_bytes;
4723       } else {
4724          raw += 1;
4725          cur += 1;
4726          prior += 1;
4727       }
4728 
4729       // this is a little gross, so that we don't switch per-pixel or per-component
4730       if (depth < 8 || img_n == out_n) {
4731          int nk = (width - 1)*filter_bytes;
4732          #define STBI__CASE(f) \
4733              case f:     \
4734                 for (k=0; k < nk; ++k)
4735          switch (filter) {
4736             // "none" filter turns into a memcpy here; make that explicit.
4737             case STBI__F_none:         memcpy(cur, raw, nk); break;
4738             STBI__CASE(STBI__F_sub)          { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break;
4739             STBI__CASE(STBI__F_up)           { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;
4740             STBI__CASE(STBI__F_avg)          { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break;
4741             STBI__CASE(STBI__F_paeth)        { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break;
4742             STBI__CASE(STBI__F_avg_first)    { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break;
4743             STBI__CASE(STBI__F_paeth_first)  { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break;
4744          }
4745          #undef STBI__CASE
4746          raw += nk;
4747       } else {
4748          STBI_ASSERT(img_n+1 == out_n);
4749          #define STBI__CASE(f) \
4750              case f:     \
4751                 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \
4752                    for (k=0; k < filter_bytes; ++k)
4753          switch (filter) {
4754             STBI__CASE(STBI__F_none)         { cur[k] = raw[k]; } break;
4755             STBI__CASE(STBI__F_sub)          { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break;
4756             STBI__CASE(STBI__F_up)           { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;
4757             STBI__CASE(STBI__F_avg)          { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break;
4758             STBI__CASE(STBI__F_paeth)        { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break;
4759             STBI__CASE(STBI__F_avg_first)    { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break;
4760             STBI__CASE(STBI__F_paeth_first)  { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break;
4761          }
4762          #undef STBI__CASE
4763 
4764          // the loop above sets the high byte of the pixels' alpha, but for
4765          // 16 bit png files we also need the low byte set. we'll do that here.
4766          if (depth == 16) {
4767             cur = a->out + stride*j; // start at the beginning of the row again
4768             for (i=0; i < x; ++i,cur+=output_bytes) {
4769                cur[filter_bytes+1] = 255;
4770             }
4771          }
4772       }
4773    }
4774 
4775    // we make a separate pass to expand bits to pixels; for performance,
4776    // this could run two scanlines behind the above code, so it won't
4777    // intefere with filtering but will still be in the cache.
4778    if (depth < 8) {
4779       for (j=0; j < y; ++j) {
4780          stbi_uc *cur = a->out + stride*j;
4781          stbi_uc *in  = a->out + stride*j + x*out_n - img_width_bytes;
4782          // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit
4783          // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop
4784          stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range
4785 
4786          // note that the final byte might overshoot and write more data than desired.
4787          // we can allocate enough data that this never writes out of memory, but it
4788          // could also overwrite the next scanline. can it overwrite non-empty data
4789          // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel.
4790          // so we need to explicitly clamp the final ones
4791 
4792          if (depth == 4) {
4793             for (k=x*img_n; k >= 2; k-=2, ++in) {
4794                *cur++ = scale * ((*in >> 4)       );
4795                *cur++ = scale * ((*in     ) & 0x0f);
4796             }
4797             if (k > 0) *cur++ = scale * ((*in >> 4)       );
4798          } else if (depth == 2) {
4799             for (k=x*img_n; k >= 4; k-=4, ++in) {
4800                *cur++ = scale * ((*in >> 6)       );
4801                *cur++ = scale * ((*in >> 4) & 0x03);
4802                *cur++ = scale * ((*in >> 2) & 0x03);
4803                *cur++ = scale * ((*in     ) & 0x03);
4804             }
4805             if (k > 0) *cur++ = scale * ((*in >> 6)       );
4806             if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4807             if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4808          } else if (depth == 1) {
4809             for (k=x*img_n; k >= 8; k-=8, ++in) {
4810                *cur++ = scale * ((*in >> 7)       );
4811                *cur++ = scale * ((*in >> 6) & 0x01);
4812                *cur++ = scale * ((*in >> 5) & 0x01);
4813                *cur++ = scale * ((*in >> 4) & 0x01);
4814                *cur++ = scale * ((*in >> 3) & 0x01);
4815                *cur++ = scale * ((*in >> 2) & 0x01);
4816                *cur++ = scale * ((*in >> 1) & 0x01);
4817                *cur++ = scale * ((*in     ) & 0x01);
4818             }
4819             if (k > 0) *cur++ = scale * ((*in >> 7)       );
4820             if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4821             if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4822             if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4823             if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4824             if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4825             if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4826          }
4827          if (img_n != out_n) {
4828             int q;
4829             // insert alpha = 255
4830             cur = a->out + stride*j;
4831             if (img_n == 1) {
4832                for (q=x-1; q >= 0; --q) {
4833                   cur[q*2+1] = 255;
4834                   cur[q*2+0] = cur[q];
4835                }
4836             } else {
4837                STBI_ASSERT(img_n == 3);
4838                for (q=x-1; q >= 0; --q) {
4839                   cur[q*4+3] = 255;
4840                   cur[q*4+2] = cur[q*3+2];
4841                   cur[q*4+1] = cur[q*3+1];
4842                   cur[q*4+0] = cur[q*3+0];
4843                }
4844             }
4845          }
4846       }
4847    } else if (depth == 16) {
4848       // force the image data from big-endian to platform-native.
4849       // this is done in a separate pass due to the decoding relying
4850       // on the data being untouched, but could probably be done
4851       // per-line during decode if care is taken.
4852       stbi_uc *cur = a->out;
4853       stbi__uint16 *cur16 = (stbi__uint16*)cur;
4854 
4855       for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {
4856          *cur16 = (cur[0] << 8) | cur[1];
4857       }
4858    }
4859 
4860    return 1;
4861 }
4862 
stbi__create_png_image(stbi__png * a,stbi_uc * image_data,stbi__uint32 image_data_len,int out_n,int depth,int color,int interlaced)4863 static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced)
4864 {
4865    int bytes = (depth == 16 ? 2 : 1);
4866    int out_bytes = out_n * bytes;
4867    stbi_uc *final;
4868    int p;
4869    if (!interlaced)
4870       return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4871 
4872    // de-interlacing
4873    final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
4874    if (!final) return stbi__err("outofmem", "Out of memory");
4875    for (p=0; p < 7; ++p) {
4876       int xorig[] = { 0,4,0,2,0,1,0 };
4877       int yorig[] = { 0,0,4,0,2,0,1 };
4878       int xspc[]  = { 8,8,4,4,2,2,1 };
4879       int yspc[]  = { 8,8,8,4,4,2,2 };
4880       int i,j,x,y;
4881       // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
4882       x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4883       y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4884       if (x && y) {
4885          stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4886          if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4887             STBI_FREE(final);
4888             return 0;
4889          }
4890          for (j=0; j < y; ++j) {
4891             for (i=0; i < x; ++i) {
4892                int out_y = j*yspc[p]+yorig[p];
4893                int out_x = i*xspc[p]+xorig[p];
4894                memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
4895                       a->out + (j*x+i)*out_bytes, out_bytes);
4896             }
4897          }
4898          STBI_FREE(a->out);
4899          image_data += img_len;
4900          image_data_len -= img_len;
4901       }
4902    }
4903    a->out = final;
4904 
4905    return 1;
4906 }
4907 
stbi__compute_transparency(stbi__png * z,stbi_uc tc[3],int out_n)4908 static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)
4909 {
4910    stbi__context *s = z->s;
4911    stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4912    stbi_uc *p = z->out;
4913 
4914    // compute color-based transparency, assuming we've
4915    // already got 255 as the alpha value in the output
4916    STBI_ASSERT(out_n == 2 || out_n == 4);
4917 
4918    if (out_n == 2) {
4919       for (i=0; i < pixel_count; ++i) {
4920          p[1] = (p[0] == tc[0] ? 0 : 255);
4921          p += 2;
4922       }
4923    } else {
4924       for (i=0; i < pixel_count; ++i) {
4925          if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4926             p[3] = 0;
4927          p += 4;
4928       }
4929    }
4930    return 1;
4931 }
4932 
stbi__compute_transparency16(stbi__png * z,stbi__uint16 tc[3],int out_n)4933 static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)
4934 {
4935    stbi__context *s = z->s;
4936    stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4937    stbi__uint16 *p = (stbi__uint16*) z->out;
4938 
4939    // compute color-based transparency, assuming we've
4940    // already got 65535 as the alpha value in the output
4941    STBI_ASSERT(out_n == 2 || out_n == 4);
4942 
4943    if (out_n == 2) {
4944       for (i = 0; i < pixel_count; ++i) {
4945          p[1] = (p[0] == tc[0] ? 0 : 65535);
4946          p += 2;
4947       }
4948    } else {
4949       for (i = 0; i < pixel_count; ++i) {
4950          if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4951             p[3] = 0;
4952          p += 4;
4953       }
4954    }
4955    return 1;
4956 }
4957 
stbi__expand_png_palette(stbi__png * a,stbi_uc * palette,int len,int pal_img_n)4958 static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)
4959 {
4960    stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4961    stbi_uc *p, *temp_out, *orig = a->out;
4962 
4963    p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
4964    if (p == NULL) return stbi__err("outofmem", "Out of memory");
4965 
4966    // between here and free(out) below, exitting would leak
4967    temp_out = p;
4968 
4969    if (pal_img_n == 3) {
4970       for (i=0; i < pixel_count; ++i) {
4971          int n = orig[i]*4;
4972          p[0] = palette[n  ];
4973          p[1] = palette[n+1];
4974          p[2] = palette[n+2];
4975          p += 3;
4976       }
4977    } else {
4978       for (i=0; i < pixel_count; ++i) {
4979          int n = orig[i]*4;
4980          p[0] = palette[n  ];
4981          p[1] = palette[n+1];
4982          p[2] = palette[n+2];
4983          p[3] = palette[n+3];
4984          p += 4;
4985       }
4986    }
4987    STBI_FREE(a->out);
4988    a->out = temp_out;
4989 
4990    STBI_NOTUSED(len);
4991 
4992    return 1;
4993 }
4994 
4995 static int stbi__unpremultiply_on_load_global = 0;
4996 static int stbi__de_iphone_flag_global = 0;
4997 
stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)4998 STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
4999 {
5000    stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;
5001 }
5002 
stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)5003 STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
5004 {
5005    stbi__de_iphone_flag_global = flag_true_if_should_convert;
5006 }
5007 
5008 #ifndef STBI_THREAD_LOCAL
5009 #define stbi__unpremultiply_on_load  stbi__unpremultiply_on_load_global
5010 #define stbi__de_iphone_flag  stbi__de_iphone_flag_global
5011 #else
5012 static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;
5013 static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;
5014 
stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply)5015 STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply)
5016 {
5017    stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;
5018    stbi__unpremultiply_on_load_set = 1;
5019 }
5020 
stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert)5021 STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert)
5022 {
5023    stbi__de_iphone_flag_local = flag_true_if_should_convert;
5024    stbi__de_iphone_flag_set = 1;
5025 }
5026 
5027 #define stbi__unpremultiply_on_load  (stbi__unpremultiply_on_load_set           \
5028                                        ? stbi__unpremultiply_on_load_local      \
5029                                        : stbi__unpremultiply_on_load_global)
5030 #define stbi__de_iphone_flag  (stbi__de_iphone_flag_set                         \
5031                                 ? stbi__de_iphone_flag_local                    \
5032                                 : stbi__de_iphone_flag_global)
5033 #endif // STBI_THREAD_LOCAL
5034 
stbi__de_iphone(stbi__png * z)5035 static void stbi__de_iphone(stbi__png *z)
5036 {
5037    stbi__context *s = z->s;
5038    stbi__uint32 i, pixel_count = s->img_x * s->img_y;
5039    stbi_uc *p = z->out;
5040 
5041    if (s->img_out_n == 3) {  // convert bgr to rgb
5042       for (i=0; i < pixel_count; ++i) {
5043          stbi_uc t = p[0];
5044          p[0] = p[2];
5045          p[2] = t;
5046          p += 3;
5047       }
5048    } else {
5049       STBI_ASSERT(s->img_out_n == 4);
5050       if (stbi__unpremultiply_on_load) {
5051          // convert bgr to rgb and unpremultiply
5052          for (i=0; i < pixel_count; ++i) {
5053             stbi_uc a = p[3];
5054             stbi_uc t = p[0];
5055             if (a) {
5056                stbi_uc half = a / 2;
5057                p[0] = (p[2] * 255 + half) / a;
5058                p[1] = (p[1] * 255 + half) / a;
5059                p[2] = ( t   * 255 + half) / a;
5060             } else {
5061                p[0] = p[2];
5062                p[2] = t;
5063             }
5064             p += 4;
5065          }
5066       } else {
5067          // convert bgr to rgb
5068          for (i=0; i < pixel_count; ++i) {
5069             stbi_uc t = p[0];
5070             p[0] = p[2];
5071             p[2] = t;
5072             p += 4;
5073          }
5074       }
5075    }
5076 }
5077 
5078 #define STBI__PNG_TYPE(a,b,c,d)  (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
5079 
stbi__parse_png_file(stbi__png * z,int scan,int req_comp)5080 static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
5081 {
5082    stbi_uc palette[1024], pal_img_n=0;
5083    stbi_uc has_trans=0, tc[3]={0};
5084    stbi__uint16 tc16[3];
5085    stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
5086    int first=1,k,interlace=0, color=0, is_iphone=0;
5087    stbi__context *s = z->s;
5088 
5089    z->expanded = NULL;
5090    z->idata = NULL;
5091    z->out = NULL;
5092 
5093    if (!stbi__check_png_header(s)) return 0;
5094 
5095    if (scan == STBI__SCAN_type) return 1;
5096 
5097    for (;;) {
5098       stbi__pngchunk c = stbi__get_chunk_header(s);
5099       switch (c.type) {
5100          case STBI__PNG_TYPE('C','g','B','I'):
5101             is_iphone = 1;
5102             stbi__skip(s, c.length);
5103             break;
5104          case STBI__PNG_TYPE('I','H','D','R'): {
5105             int comp,filter;
5106             if (!first) return stbi__err("multiple IHDR","Corrupt PNG");
5107             first = 0;
5108             if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");
5109             s->img_x = stbi__get32be(s);
5110             s->img_y = stbi__get32be(s);
5111             if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
5112             if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
5113             z->depth = stbi__get8(s);  if (z->depth != 1 && z->depth != 2 && z->depth != 4 && z->depth != 8 && z->depth != 16)  return stbi__err("1/2/4/8/16-bit only","PNG not supported: 1/2/4/8/16-bit only");
5114             color = stbi__get8(s);  if (color > 6)         return stbi__err("bad ctype","Corrupt PNG");
5115             if (color == 3 && z->depth == 16)                  return stbi__err("bad ctype","Corrupt PNG");
5116             if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");
5117             comp  = stbi__get8(s);  if (comp) return stbi__err("bad comp method","Corrupt PNG");
5118             filter= stbi__get8(s);  if (filter) return stbi__err("bad filter method","Corrupt PNG");
5119             interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG");
5120             if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG");
5121             if (!pal_img_n) {
5122                s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
5123                if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
5124             } else {
5125                // if paletted, then pal_n is our final components, and
5126                // img_n is # components to decompress/filter.
5127                s->img_n = 1;
5128                if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG");
5129             }
5130             // even with SCAN_header, have to scan to see if we have a tRNS
5131             break;
5132          }
5133 
5134          case STBI__PNG_TYPE('P','L','T','E'):  {
5135             if (first) return stbi__err("first not IHDR", "Corrupt PNG");
5136             if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG");
5137             pal_len = c.length / 3;
5138             if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG");
5139             for (i=0; i < pal_len; ++i) {
5140                palette[i*4+0] = stbi__get8(s);
5141                palette[i*4+1] = stbi__get8(s);
5142                palette[i*4+2] = stbi__get8(s);
5143                palette[i*4+3] = 255;
5144             }
5145             break;
5146          }
5147 
5148          case STBI__PNG_TYPE('t','R','N','S'): {
5149             if (first) return stbi__err("first not IHDR", "Corrupt PNG");
5150             if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG");
5151             if (pal_img_n) {
5152                if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }
5153                if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG");
5154                if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG");
5155                pal_img_n = 4;
5156                for (i=0; i < c.length; ++i)
5157                   palette[i*4+3] = stbi__get8(s);
5158             } else {
5159                if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
5160                if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
5161                has_trans = 1;
5162                // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now.
5163                if (scan == STBI__SCAN_header) { ++s->img_n; return 1; }
5164                if (z->depth == 16) {
5165                   for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is
5166                } else {
5167                   for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger
5168                }
5169             }
5170             break;
5171          }
5172 
5173          case STBI__PNG_TYPE('I','D','A','T'): {
5174             if (first) return stbi__err("first not IHDR", "Corrupt PNG");
5175             if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG");
5176             if (scan == STBI__SCAN_header) {
5177                // header scan definitely stops at first IDAT
5178                if (pal_img_n)
5179                   s->img_n = pal_img_n;
5180                return 1;
5181             }
5182             if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes");
5183             if ((int)(ioff + c.length) < (int)ioff) return 0;
5184             if (ioff + c.length > idata_limit) {
5185                stbi__uint32 idata_limit_old = idata_limit;
5186                stbi_uc *p;
5187                if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
5188                while (ioff + c.length > idata_limit)
5189                   idata_limit *= 2;
5190                STBI_NOTUSED(idata_limit_old);
5191                p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
5192                z->idata = p;
5193             }
5194             if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");
5195             ioff += c.length;
5196             break;
5197          }
5198 
5199          case STBI__PNG_TYPE('I','E','N','D'): {
5200             stbi__uint32 raw_len, bpl;
5201             if (first) return stbi__err("first not IHDR", "Corrupt PNG");
5202             if (scan != STBI__SCAN_load) return 1;
5203             if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");
5204             // initial guess for decoded data size to avoid unnecessary reallocs
5205             bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component
5206             raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
5207             z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);
5208             if (z->expanded == NULL) return 0; // zlib should set error
5209             STBI_FREE(z->idata); z->idata = NULL;
5210             if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
5211                s->img_out_n = s->img_n+1;
5212             else
5213                s->img_out_n = s->img_n;
5214             if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;
5215             if (has_trans) {
5216                if (z->depth == 16) {
5217                   if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;
5218                } else {
5219                   if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
5220                }
5221             }
5222             if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
5223                stbi__de_iphone(z);
5224             if (pal_img_n) {
5225                // pal_img_n == 3 or 4
5226                s->img_n = pal_img_n; // record the actual colors we had
5227                s->img_out_n = pal_img_n;
5228                if (req_comp >= 3) s->img_out_n = req_comp;
5229                if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
5230                   return 0;
5231             } else if (has_trans) {
5232                // non-paletted image with tRNS -> source image has (constant) alpha
5233                ++s->img_n;
5234             }
5235             STBI_FREE(z->expanded); z->expanded = NULL;
5236             // end of PNG chunk, read and skip CRC
5237             stbi__get32be(s);
5238             return 1;
5239          }
5240 
5241          default:
5242             // if critical, fail
5243             if (first) return stbi__err("first not IHDR", "Corrupt PNG");
5244             if ((c.type & (1 << 29)) == 0) {
5245                #ifndef STBI_NO_FAILURE_STRINGS
5246                // not threadsafe
5247                static char invalid_chunk[] = "XXXX PNG chunk not known";
5248                invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
5249                invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
5250                invalid_chunk[2] = STBI__BYTECAST(c.type >>  8);
5251                invalid_chunk[3] = STBI__BYTECAST(c.type >>  0);
5252                #endif
5253                return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type");
5254             }
5255             stbi__skip(s, c.length);
5256             break;
5257       }
5258       // end of PNG chunk, read and skip CRC
5259       stbi__get32be(s);
5260    }
5261 }
5262 
stbi__do_png(stbi__png * p,int * x,int * y,int * n,int req_comp,stbi__result_info * ri)5263 static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)
5264 {
5265    void *result=NULL;
5266    if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
5267    if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
5268       if (p->depth <= 8)
5269          ri->bits_per_channel = 8;
5270       else if (p->depth == 16)
5271          ri->bits_per_channel = 16;
5272       else
5273          return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth");
5274       result = p->out;
5275       p->out = NULL;
5276       if (req_comp && req_comp != p->s->img_out_n) {
5277          if (ri->bits_per_channel == 8)
5278             result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
5279          else
5280             result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
5281          p->s->img_out_n = req_comp;
5282          if (result == NULL) return result;
5283       }
5284       *x = p->s->img_x;
5285       *y = p->s->img_y;
5286       if (n) *n = p->s->img_n;
5287    }
5288    STBI_FREE(p->out);      p->out      = NULL;
5289    STBI_FREE(p->expanded); p->expanded = NULL;
5290    STBI_FREE(p->idata);    p->idata    = NULL;
5291 
5292    return result;
5293 }
5294 
stbi__png_load(stbi__context * s,int * x,int * y,int * comp,int req_comp,stbi__result_info * ri)5295 static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
5296 {
5297    stbi__png p;
5298    p.s = s;
5299    return stbi__do_png(&p, x,y,comp,req_comp, ri);
5300 }
5301 
stbi__png_test(stbi__context * s)5302 static int stbi__png_test(stbi__context *s)
5303 {
5304    int r;
5305    r = stbi__check_png_header(s);
5306    stbi__rewind(s);
5307    return r;
5308 }
5309 
stbi__png_info_raw(stbi__png * p,int * x,int * y,int * comp)5310 static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
5311 {
5312    if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
5313       stbi__rewind( p->s );
5314       return 0;
5315    }
5316    if (x) *x = p->s->img_x;
5317    if (y) *y = p->s->img_y;
5318    if (comp) *comp = p->s->img_n;
5319    return 1;
5320 }
5321 
stbi__png_info(stbi__context * s,int * x,int * y,int * comp)5322 static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
5323 {
5324    stbi__png p;
5325    p.s = s;
5326    return stbi__png_info_raw(&p, x, y, comp);
5327 }
5328 
stbi__png_is16(stbi__context * s)5329 static int stbi__png_is16(stbi__context *s)
5330 {
5331    stbi__png p;
5332    p.s = s;
5333    if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5334 	   return 0;
5335    if (p.depth != 16) {
5336       stbi__rewind(p.s);
5337       return 0;
5338    }
5339    return 1;
5340 }
5341 #endif
5342 
5343 // Microsoft/Windows BMP image
5344 
5345 #ifndef STBI_NO_BMP
stbi__bmp_test_raw(stbi__context * s)5346 static int stbi__bmp_test_raw(stbi__context *s)
5347 {
5348    int r;
5349    int sz;
5350    if (stbi__get8(s) != 'B') return 0;
5351    if (stbi__get8(s) != 'M') return 0;
5352    stbi__get32le(s); // discard filesize
5353    stbi__get16le(s); // discard reserved
5354    stbi__get16le(s); // discard reserved
5355    stbi__get32le(s); // discard data offset
5356    sz = stbi__get32le(s);
5357    r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5358    return r;
5359 }
5360 
stbi__bmp_test(stbi__context * s)5361 static int stbi__bmp_test(stbi__context *s)
5362 {
5363    int r = stbi__bmp_test_raw(s);
5364    stbi__rewind(s);
5365    return r;
5366 }
5367 
5368 
5369 // returns 0..31 for the highest set bit
stbi__high_bit(unsigned int z)5370 static int stbi__high_bit(unsigned int z)
5371 {
5372    int n=0;
5373    if (z == 0) return -1;
5374    if (z >= 0x10000) { n += 16; z >>= 16; }
5375    if (z >= 0x00100) { n +=  8; z >>=  8; }
5376    if (z >= 0x00010) { n +=  4; z >>=  4; }
5377    if (z >= 0x00004) { n +=  2; z >>=  2; }
5378    if (z >= 0x00002) { n +=  1;/* >>=  1;*/ }
5379    return n;
5380 }
5381 
stbi__bitcount(unsigned int a)5382 static int stbi__bitcount(unsigned int a)
5383 {
5384    a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2
5385    a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4
5386    a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
5387    a = (a + (a >> 8)); // max 16 per 8 bits
5388    a = (a + (a >> 16)); // max 32 per 8 bits
5389    return a & 0xff;
5390 }
5391 
5392 // extract an arbitrarily-aligned N-bit value (N=bits)
5393 // from v, and then make it 8-bits long and fractionally
5394 // extend it to full full range.
stbi__shiftsigned(unsigned int v,int shift,int bits)5395 static int stbi__shiftsigned(unsigned int v, int shift, int bits)
5396 {
5397    static unsigned int mul_table[9] = {
5398       0,
5399       0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,
5400       0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,
5401    };
5402    static unsigned int shift_table[9] = {
5403       0, 0,0,1,0,2,4,6,0,
5404    };
5405    if (shift < 0)
5406       v <<= -shift;
5407    else
5408       v >>= shift;
5409    STBI_ASSERT(v < 256);
5410    v >>= (8-bits);
5411    STBI_ASSERT(bits >= 0 && bits <= 8);
5412    return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
5413 }
5414 
5415 typedef struct
5416 {
5417    int bpp, offset, hsz;
5418    unsigned int mr,mg,mb,ma, all_a;
5419    int extra_read;
5420 } stbi__bmp_data;
5421 
stbi__bmp_set_mask_defaults(stbi__bmp_data * info,int compress)5422 static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress)
5423 {
5424    // BI_BITFIELDS specifies masks explicitly, don't override
5425    if (compress == 3)
5426       return 1;
5427 
5428    if (compress == 0) {
5429       if (info->bpp == 16) {
5430          info->mr = 31u << 10;
5431          info->mg = 31u <<  5;
5432          info->mb = 31u <<  0;
5433       } else if (info->bpp == 32) {
5434          info->mr = 0xffu << 16;
5435          info->mg = 0xffu <<  8;
5436          info->mb = 0xffu <<  0;
5437          info->ma = 0xffu << 24;
5438          info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0
5439       } else {
5440          // otherwise, use defaults, which is all-0
5441          info->mr = info->mg = info->mb = info->ma = 0;
5442       }
5443       return 1;
5444    }
5445    return 0; // error
5446 }
5447 
stbi__bmp_parse_header(stbi__context * s,stbi__bmp_data * info)5448 static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
5449 {
5450    int hsz;
5451    if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
5452    stbi__get32le(s); // discard filesize
5453    stbi__get16le(s); // discard reserved
5454    stbi__get16le(s); // discard reserved
5455    info->offset = stbi__get32le(s);
5456    info->hsz = hsz = stbi__get32le(s);
5457    info->mr = info->mg = info->mb = info->ma = 0;
5458    info->extra_read = 14;
5459 
5460    if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP");
5461 
5462    if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
5463    if (hsz == 12) {
5464       s->img_x = stbi__get16le(s);
5465       s->img_y = stbi__get16le(s);
5466    } else {
5467       s->img_x = stbi__get32le(s);
5468       s->img_y = stbi__get32le(s);
5469    }
5470    if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
5471    info->bpp = stbi__get16le(s);
5472    if (hsz != 12) {
5473       int compress = stbi__get32le(s);
5474       if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
5475       if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes
5476       if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel
5477       stbi__get32le(s); // discard sizeof
5478       stbi__get32le(s); // discard hres
5479       stbi__get32le(s); // discard vres
5480       stbi__get32le(s); // discard colorsused
5481       stbi__get32le(s); // discard max important
5482       if (hsz == 40 || hsz == 56) {
5483          if (hsz == 56) {
5484             stbi__get32le(s);
5485             stbi__get32le(s);
5486             stbi__get32le(s);
5487             stbi__get32le(s);
5488          }
5489          if (info->bpp == 16 || info->bpp == 32) {
5490             if (compress == 0) {
5491                stbi__bmp_set_mask_defaults(info, compress);
5492             } else if (compress == 3) {
5493                info->mr = stbi__get32le(s);
5494                info->mg = stbi__get32le(s);
5495                info->mb = stbi__get32le(s);
5496                info->extra_read += 12;
5497                // not documented, but generated by photoshop and handled by mspaint
5498                if (info->mr == info->mg && info->mg == info->mb) {
5499                   // ?!?!?
5500                   return stbi__errpuc("bad BMP", "bad BMP");
5501                }
5502             } else
5503                return stbi__errpuc("bad BMP", "bad BMP");
5504          }
5505       } else {
5506          // V4/V5 header
5507          int i;
5508          if (hsz != 108 && hsz != 124)
5509             return stbi__errpuc("bad BMP", "bad BMP");
5510          info->mr = stbi__get32le(s);
5511          info->mg = stbi__get32le(s);
5512          info->mb = stbi__get32le(s);
5513          info->ma = stbi__get32le(s);
5514          if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs
5515             stbi__bmp_set_mask_defaults(info, compress);
5516          stbi__get32le(s); // discard color space
5517          for (i=0; i < 12; ++i)
5518             stbi__get32le(s); // discard color space parameters
5519          if (hsz == 124) {
5520             stbi__get32le(s); // discard rendering intent
5521             stbi__get32le(s); // discard offset of profile data
5522             stbi__get32le(s); // discard size of profile data
5523             stbi__get32le(s); // discard reserved
5524          }
5525       }
5526    }
5527    return (void *) 1;
5528 }
5529 
5530 
stbi__bmp_load(stbi__context * s,int * x,int * y,int * comp,int req_comp,stbi__result_info * ri)5531 static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
5532 {
5533    stbi_uc *out;
5534    unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
5535    stbi_uc pal[256][4];
5536    int psize=0,i,j,width;
5537    int flip_vertically, pad, target;
5538    stbi__bmp_data info;
5539    STBI_NOTUSED(ri);
5540 
5541    info.all_a = 255;
5542    if (stbi__bmp_parse_header(s, &info) == NULL)
5543       return NULL; // error code already set
5544 
5545    flip_vertically = ((int) s->img_y) > 0;
5546    s->img_y = abs((int) s->img_y);
5547 
5548    if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5549    if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5550 
5551    mr = info.mr;
5552    mg = info.mg;
5553    mb = info.mb;
5554    ma = info.ma;
5555    all_a = info.all_a;
5556 
5557    if (info.hsz == 12) {
5558       if (info.bpp < 24)
5559          psize = (info.offset - info.extra_read - 24) / 3;
5560    } else {
5561       if (info.bpp < 16)
5562          psize = (info.offset - info.extra_read - info.hsz) >> 2;
5563    }
5564    if (psize == 0) {
5565       // accept some number of extra bytes after the header, but if the offset points either to before
5566       // the header ends or implies a large amount of extra data, reject the file as malformed
5567       int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original);
5568       int header_limit = 1024; // max we actually read is below 256 bytes currently.
5569       int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size.
5570       if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) {
5571          return stbi__errpuc("bad header", "Corrupt BMP");
5572       }
5573       // we established that bytes_read_so_far is positive and sensible.
5574       // the first half of this test rejects offsets that are either too small positives, or
5575       // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn
5576       // ensures the number computed in the second half of the test can't overflow.
5577       if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) {
5578          return stbi__errpuc("bad offset", "Corrupt BMP");
5579       } else {
5580          stbi__skip(s, info.offset - bytes_read_so_far);
5581       }
5582    }
5583 
5584    if (info.bpp == 24 && ma == 0xff000000)
5585       s->img_n = 3;
5586    else
5587       s->img_n = ma ? 4 : 3;
5588    if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
5589       target = req_comp;
5590    else
5591       target = s->img_n; // if they want monochrome, we'll post-convert
5592 
5593    // sanity-check size
5594    if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5595       return stbi__errpuc("too large", "Corrupt BMP");
5596 
5597    out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5598    if (!out) return stbi__errpuc("outofmem", "Out of memory");
5599    if (info.bpp < 16) {
5600       int z=0;
5601       if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
5602       for (i=0; i < psize; ++i) {
5603          pal[i][2] = stbi__get8(s);
5604          pal[i][1] = stbi__get8(s);
5605          pal[i][0] = stbi__get8(s);
5606          if (info.hsz != 12) stbi__get8(s);
5607          pal[i][3] = 255;
5608       }
5609       stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5610       if (info.bpp == 1) width = (s->img_x + 7) >> 3;
5611       else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5612       else if (info.bpp == 8) width = s->img_x;
5613       else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
5614       pad = (-width)&3;
5615       if (info.bpp == 1) {
5616          for (j=0; j < (int) s->img_y; ++j) {
5617             int bit_offset = 7, v = stbi__get8(s);
5618             for (i=0; i < (int) s->img_x; ++i) {
5619                int color = (v>>bit_offset)&0x1;
5620                out[z++] = pal[color][0];
5621                out[z++] = pal[color][1];
5622                out[z++] = pal[color][2];
5623                if (target == 4) out[z++] = 255;
5624                if (i+1 == (int) s->img_x) break;
5625                if((--bit_offset) < 0) {
5626                   bit_offset = 7;
5627                   v = stbi__get8(s);
5628                }
5629             }
5630             stbi__skip(s, pad);
5631          }
5632       } else {
5633          for (j=0; j < (int) s->img_y; ++j) {
5634             for (i=0; i < (int) s->img_x; i += 2) {
5635                int v=stbi__get8(s),v2=0;
5636                if (info.bpp == 4) {
5637                   v2 = v & 15;
5638                   v >>= 4;
5639                }
5640                out[z++] = pal[v][0];
5641                out[z++] = pal[v][1];
5642                out[z++] = pal[v][2];
5643                if (target == 4) out[z++] = 255;
5644                if (i+1 == (int) s->img_x) break;
5645                v = (info.bpp == 8) ? stbi__get8(s) : v2;
5646                out[z++] = pal[v][0];
5647                out[z++] = pal[v][1];
5648                out[z++] = pal[v][2];
5649                if (target == 4) out[z++] = 255;
5650             }
5651             stbi__skip(s, pad);
5652          }
5653       }
5654    } else {
5655       int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
5656       int z = 0;
5657       int easy=0;
5658       stbi__skip(s, info.offset - info.extra_read - info.hsz);
5659       if (info.bpp == 24) width = 3 * s->img_x;
5660       else if (info.bpp == 16) width = 2*s->img_x;
5661       else /* bpp = 32 and pad = 0 */ width=0;
5662       pad = (-width) & 3;
5663       if (info.bpp == 24) {
5664          easy = 1;
5665       } else if (info.bpp == 32) {
5666          if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5667             easy = 2;
5668       }
5669       if (!easy) {
5670          if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
5671          // right shift amt to put high bit in position #7
5672          rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
5673          gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
5674          bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
5675          ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
5676          if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
5677       }
5678       for (j=0; j < (int) s->img_y; ++j) {
5679          if (easy) {
5680             for (i=0; i < (int) s->img_x; ++i) {
5681                unsigned char a;
5682                out[z+2] = stbi__get8(s);
5683                out[z+1] = stbi__get8(s);
5684                out[z+0] = stbi__get8(s);
5685                z += 3;
5686                a = (easy == 2 ? stbi__get8(s) : 255);
5687                all_a |= a;
5688                if (target == 4) out[z++] = a;
5689             }
5690          } else {
5691             int bpp = info.bpp;
5692             for (i=0; i < (int) s->img_x; ++i) {
5693                stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
5694                unsigned int a;
5695                out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5696                out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5697                out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5698                a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5699                all_a |= a;
5700                if (target == 4) out[z++] = STBI__BYTECAST(a);
5701             }
5702          }
5703          stbi__skip(s, pad);
5704       }
5705    }
5706 
5707    // if alpha channel is all 0s, replace with all 255s
5708    if (target == 4 && all_a == 0)
5709       for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
5710          out[i] = 255;
5711 
5712    if (flip_vertically) {
5713       stbi_uc t;
5714       for (j=0; j < (int) s->img_y>>1; ++j) {
5715          stbi_uc *p1 = out +      j     *s->img_x*target;
5716          stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
5717          for (i=0; i < (int) s->img_x*target; ++i) {
5718             t = p1[i]; p1[i] = p2[i]; p2[i] = t;
5719          }
5720       }
5721    }
5722 
5723    if (req_comp && req_comp != target) {
5724       out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
5725       if (out == NULL) return out; // stbi__convert_format frees input on failure
5726    }
5727 
5728    *x = s->img_x;
5729    *y = s->img_y;
5730    if (comp) *comp = s->img_n;
5731    return out;
5732 }
5733 #endif
5734 
5735 // Targa Truevision - TGA
5736 // by Jonathan Dummer
5737 #ifndef STBI_NO_TGA
5738 // returns STBI_rgb or whatever, 0 on error
stbi__tga_get_comp(int bits_per_pixel,int is_grey,int * is_rgb16)5739 static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)
5740 {
5741    // only RGB or RGBA (incl. 16bit) or grey allowed
5742    if (is_rgb16) *is_rgb16 = 0;
5743    switch(bits_per_pixel) {
5744       case 8:  return STBI_grey;
5745       case 16: if(is_grey) return STBI_grey_alpha;
5746                // fallthrough
5747       case 15: if(is_rgb16) *is_rgb16 = 1;
5748                return STBI_rgb;
5749       case 24: // fallthrough
5750       case 32: return bits_per_pixel/8;
5751       default: return 0;
5752    }
5753 }
5754 
stbi__tga_info(stbi__context * s,int * x,int * y,int * comp)5755 static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
5756 {
5757     int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5758     int sz, tga_colormap_type;
5759     stbi__get8(s);                   // discard Offset
5760     tga_colormap_type = stbi__get8(s); // colormap type
5761     if( tga_colormap_type > 1 ) {
5762         stbi__rewind(s);
5763         return 0;      // only RGB or indexed allowed
5764     }
5765     tga_image_type = stbi__get8(s); // image type
5766     if ( tga_colormap_type == 1 ) { // colormapped (paletted) image
5767         if (tga_image_type != 1 && tga_image_type != 9) {
5768             stbi__rewind(s);
5769             return 0;
5770         }
5771         stbi__skip(s,4);       // skip index of first colormap entry and number of entries
5772         sz = stbi__get8(s);    //   check bits per palette color entry
5773         if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5774             stbi__rewind(s);
5775             return 0;
5776         }
5777         stbi__skip(s,4);       // skip image x and y origin
5778         tga_colormap_bpp = sz;
5779     } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE
5780         if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5781             stbi__rewind(s);
5782             return 0; // only RGB or grey allowed, +/- RLE
5783         }
5784         stbi__skip(s,9); // skip colormap specification and image x/y origin
5785         tga_colormap_bpp = 0;
5786     }
5787     tga_w = stbi__get16le(s);
5788     if( tga_w < 1 ) {
5789         stbi__rewind(s);
5790         return 0;   // test width
5791     }
5792     tga_h = stbi__get16le(s);
5793     if( tga_h < 1 ) {
5794         stbi__rewind(s);
5795         return 0;   // test height
5796     }
5797     tga_bits_per_pixel = stbi__get8(s); // bits per pixel
5798     stbi__get8(s); // ignore alpha bits
5799     if (tga_colormap_bpp != 0) {
5800         if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5801             // when using a colormap, tga_bits_per_pixel is the size of the indexes
5802             // I don't think anything but 8 or 16bit indexes makes sense
5803             stbi__rewind(s);
5804             return 0;
5805         }
5806         tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5807     } else {
5808         tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5809     }
5810     if(!tga_comp) {
5811       stbi__rewind(s);
5812       return 0;
5813     }
5814     if (x) *x = tga_w;
5815     if (y) *y = tga_h;
5816     if (comp) *comp = tga_comp;
5817     return 1;                   // seems to have passed everything
5818 }
5819 
stbi__tga_test(stbi__context * s)5820 static int stbi__tga_test(stbi__context *s)
5821 {
5822    int res = 0;
5823    int sz, tga_color_type;
5824    stbi__get8(s);      //   discard Offset
5825    tga_color_type = stbi__get8(s);   //   color type
5826    if ( tga_color_type > 1 ) goto errorEnd;   //   only RGB or indexed allowed
5827    sz = stbi__get8(s);   //   image type
5828    if ( tga_color_type == 1 ) { // colormapped (paletted) image
5829       if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9
5830       stbi__skip(s,4);       // skip index of first colormap entry and number of entries
5831       sz = stbi__get8(s);    //   check bits per palette color entry
5832       if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
5833       stbi__skip(s,4);       // skip image x and y origin
5834    } else { // "normal" image w/o colormap
5835       if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE
5836       stbi__skip(s,9); // skip colormap specification and image x/y origin
5837    }
5838    if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test width
5839    if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test height
5840    sz = stbi__get8(s);   //   bits per pixel
5841    if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index
5842    if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
5843 
5844    res = 1; // if we got this far, everything's good and we can return 1 instead of 0
5845 
5846 errorEnd:
5847    stbi__rewind(s);
5848    return res;
5849 }
5850 
5851 // read 16bit value and convert to 24bit RGB
stbi__tga_read_rgb16(stbi__context * s,stbi_uc * out)5852 static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
5853 {
5854    stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5855    stbi__uint16 fiveBitMask = 31;
5856    // we have 3 channels with 5bits each
5857    int r = (px >> 10) & fiveBitMask;
5858    int g = (px >> 5) & fiveBitMask;
5859    int b = px & fiveBitMask;
5860    // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later
5861    out[0] = (stbi_uc)((r * 255)/31);
5862    out[1] = (stbi_uc)((g * 255)/31);
5863    out[2] = (stbi_uc)((b * 255)/31);
5864 
5865    // some people claim that the most significant bit might be used for alpha
5866    // (possibly if an alpha-bit is set in the "image descriptor byte")
5867    // but that only made 16bit test images completely translucent..
5868    // so let's treat all 15 and 16bit TGAs as RGB with no alpha.
5869 }
5870 
stbi__tga_load(stbi__context * s,int * x,int * y,int * comp,int req_comp,stbi__result_info * ri)5871 static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
5872 {
5873    //   read in the TGA header stuff
5874    int tga_offset = stbi__get8(s);
5875    int tga_indexed = stbi__get8(s);
5876    int tga_image_type = stbi__get8(s);
5877    int tga_is_RLE = 0;
5878    int tga_palette_start = stbi__get16le(s);
5879    int tga_palette_len = stbi__get16le(s);
5880    int tga_palette_bits = stbi__get8(s);
5881    int tga_x_origin = stbi__get16le(s);
5882    int tga_y_origin = stbi__get16le(s);
5883    int tga_width = stbi__get16le(s);
5884    int tga_height = stbi__get16le(s);
5885    int tga_bits_per_pixel = stbi__get8(s);
5886    int tga_comp, tga_rgb16=0;
5887    int tga_inverted = stbi__get8(s);
5888    // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)
5889    //   image data
5890    unsigned char *tga_data;
5891    unsigned char *tga_palette = NULL;
5892    int i, j;
5893    unsigned char raw_data[4] = {0};
5894    int RLE_count = 0;
5895    int RLE_repeating = 0;
5896    int read_next_pixel = 1;
5897    STBI_NOTUSED(ri);
5898    STBI_NOTUSED(tga_x_origin); // @TODO
5899    STBI_NOTUSED(tga_y_origin); // @TODO
5900 
5901    if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5902    if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5903 
5904    //   do a tiny bit of precessing
5905    if ( tga_image_type >= 8 )
5906    {
5907       tga_image_type -= 8;
5908       tga_is_RLE = 1;
5909    }
5910    tga_inverted = 1 - ((tga_inverted >> 5) & 1);
5911 
5912    //   If I'm paletted, then I'll use the number of bits from the palette
5913    if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5914    else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5915 
5916    if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency
5917       return stbi__errpuc("bad format", "Can't find out TGA pixelformat");
5918 
5919    //   tga info
5920    *x = tga_width;
5921    *y = tga_height;
5922    if (comp) *comp = tga_comp;
5923 
5924    if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5925       return stbi__errpuc("too large", "Corrupt TGA");
5926 
5927    tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5928    if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
5929 
5930    // skip to the data's starting position (offset usually = 0)
5931    stbi__skip(s, tga_offset );
5932 
5933    if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
5934       for (i=0; i < tga_height; ++i) {
5935          int row = tga_inverted ? tga_height -i - 1 : i;
5936          stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5937          stbi__getn(s, tga_row, tga_width * tga_comp);
5938       }
5939    } else  {
5940       //   do I need to load a palette?
5941       if ( tga_indexed)
5942       {
5943          if (tga_palette_len == 0) {  /* you have to have at least one entry! */
5944             STBI_FREE(tga_data);
5945             return stbi__errpuc("bad palette", "Corrupt TGA");
5946          }
5947 
5948          //   any data to skip? (offset usually = 0)
5949          stbi__skip(s, tga_palette_start );
5950          //   load the palette
5951          tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5952          if (!tga_palette) {
5953             STBI_FREE(tga_data);
5954             return stbi__errpuc("outofmem", "Out of memory");
5955          }
5956          if (tga_rgb16) {
5957             stbi_uc *pal_entry = tga_palette;
5958             STBI_ASSERT(tga_comp == STBI_rgb);
5959             for (i=0; i < tga_palette_len; ++i) {
5960                stbi__tga_read_rgb16(s, pal_entry);
5961                pal_entry += tga_comp;
5962             }
5963          } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
5964                STBI_FREE(tga_data);
5965                STBI_FREE(tga_palette);
5966                return stbi__errpuc("bad palette", "Corrupt TGA");
5967          }
5968       }
5969       //   load the data
5970       for (i=0; i < tga_width * tga_height; ++i)
5971       {
5972          //   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
5973          if ( tga_is_RLE )
5974          {
5975             if ( RLE_count == 0 )
5976             {
5977                //   yep, get the next byte as a RLE command
5978                int RLE_cmd = stbi__get8(s);
5979                RLE_count = 1 + (RLE_cmd & 127);
5980                RLE_repeating = RLE_cmd >> 7;
5981                read_next_pixel = 1;
5982             } else if ( !RLE_repeating )
5983             {
5984                read_next_pixel = 1;
5985             }
5986          } else
5987          {
5988             read_next_pixel = 1;
5989          }
5990          //   OK, if I need to read a pixel, do it now
5991          if ( read_next_pixel )
5992          {
5993             //   load however much data we did have
5994             if ( tga_indexed )
5995             {
5996                // read in index, then perform the lookup
5997                int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
5998                if ( pal_idx >= tga_palette_len ) {
5999                   // invalid index
6000                   pal_idx = 0;
6001                }
6002                pal_idx *= tga_comp;
6003                for (j = 0; j < tga_comp; ++j) {
6004                   raw_data[j] = tga_palette[pal_idx+j];
6005                }
6006             } else if(tga_rgb16) {
6007                STBI_ASSERT(tga_comp == STBI_rgb);
6008                stbi__tga_read_rgb16(s, raw_data);
6009             } else {
6010                //   read in the data raw
6011                for (j = 0; j < tga_comp; ++j) {
6012                   raw_data[j] = stbi__get8(s);
6013                }
6014             }
6015             //   clear the reading flag for the next pixel
6016             read_next_pixel = 0;
6017          } // end of reading a pixel
6018 
6019          // copy data
6020          for (j = 0; j < tga_comp; ++j)
6021            tga_data[i*tga_comp+j] = raw_data[j];
6022 
6023          //   in case we're in RLE mode, keep counting down
6024          --RLE_count;
6025       }
6026       //   do I need to invert the image?
6027       if ( tga_inverted )
6028       {
6029          for (j = 0; j*2 < tga_height; ++j)
6030          {
6031             int index1 = j * tga_width * tga_comp;
6032             int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
6033             for (i = tga_width * tga_comp; i > 0; --i)
6034             {
6035                unsigned char temp = tga_data[index1];
6036                tga_data[index1] = tga_data[index2];
6037                tga_data[index2] = temp;
6038                ++index1;
6039                ++index2;
6040             }
6041          }
6042       }
6043       //   clear my palette, if I had one
6044       if ( tga_palette != NULL )
6045       {
6046          STBI_FREE( tga_palette );
6047       }
6048    }
6049 
6050    // swap RGB - if the source data was RGB16, it already is in the right order
6051    if (tga_comp >= 3 && !tga_rgb16)
6052    {
6053       unsigned char* tga_pixel = tga_data;
6054       for (i=0; i < tga_width * tga_height; ++i)
6055       {
6056          unsigned char temp = tga_pixel[0];
6057          tga_pixel[0] = tga_pixel[2];
6058          tga_pixel[2] = temp;
6059          tga_pixel += tga_comp;
6060       }
6061    }
6062 
6063    // convert to target component count
6064    if (req_comp && req_comp != tga_comp)
6065       tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
6066 
6067    //   the things I do to get rid of an error message, and yet keep
6068    //   Microsoft's C compilers happy... [8^(
6069    tga_palette_start = tga_palette_len = tga_palette_bits =
6070          tga_x_origin = tga_y_origin = 0;
6071    STBI_NOTUSED(tga_palette_start);
6072    //   OK, done
6073    return tga_data;
6074 }
6075 #endif
6076 
6077 // *************************************************************************************************
6078 // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
6079 
6080 #ifndef STBI_NO_PSD
stbi__psd_test(stbi__context * s)6081 static int stbi__psd_test(stbi__context *s)
6082 {
6083    int r = (stbi__get32be(s) == 0x38425053);
6084    stbi__rewind(s);
6085    return r;
6086 }
6087 
stbi__psd_decode_rle(stbi__context * s,stbi_uc * p,int pixelCount)6088 static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)
6089 {
6090    int count, nleft, len;
6091 
6092    count = 0;
6093    while ((nleft = pixelCount - count) > 0) {
6094       len = stbi__get8(s);
6095       if (len == 128) {
6096          // No-op.
6097       } else if (len < 128) {
6098          // Copy next len+1 bytes literally.
6099          len++;
6100          if (len > nleft) return 0; // corrupt data
6101          count += len;
6102          while (len) {
6103             *p = stbi__get8(s);
6104             p += 4;
6105             len--;
6106          }
6107       } else if (len > 128) {
6108          stbi_uc   val;
6109          // Next -len+1 bytes in the dest are replicated from next source byte.
6110          // (Interpret len as a negative 8-bit int.)
6111          len = 257 - len;
6112          if (len > nleft) return 0; // corrupt data
6113          val = stbi__get8(s);
6114          count += len;
6115          while (len) {
6116             *p = val;
6117             p += 4;
6118             len--;
6119          }
6120       }
6121    }
6122 
6123    return 1;
6124 }
6125 
stbi__psd_load(stbi__context * s,int * x,int * y,int * comp,int req_comp,stbi__result_info * ri,int bpc)6126 static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
6127 {
6128    int pixelCount;
6129    int channelCount, compression;
6130    int channel, i;
6131    int bitdepth;
6132    int w,h;
6133    stbi_uc *out;
6134    STBI_NOTUSED(ri);
6135 
6136    // Check identifier
6137    if (stbi__get32be(s) != 0x38425053)   // "8BPS"
6138       return stbi__errpuc("not PSD", "Corrupt PSD image");
6139 
6140    // Check file type version.
6141    if (stbi__get16be(s) != 1)
6142       return stbi__errpuc("wrong version", "Unsupported version of PSD image");
6143 
6144    // Skip 6 reserved bytes.
6145    stbi__skip(s, 6 );
6146 
6147    // Read the number of channels (R, G, B, A, etc).
6148    channelCount = stbi__get16be(s);
6149    if (channelCount < 0 || channelCount > 16)
6150       return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image");
6151 
6152    // Read the rows and columns of the image.
6153    h = stbi__get32be(s);
6154    w = stbi__get32be(s);
6155 
6156    if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
6157    if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
6158 
6159    // Make sure the depth is 8 bits.
6160    bitdepth = stbi__get16be(s);
6161    if (bitdepth != 8 && bitdepth != 16)
6162       return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit");
6163 
6164    // Make sure the color mode is RGB.
6165    // Valid options are:
6166    //   0: Bitmap
6167    //   1: Grayscale
6168    //   2: Indexed color
6169    //   3: RGB color
6170    //   4: CMYK color
6171    //   7: Multichannel
6172    //   8: Duotone
6173    //   9: Lab color
6174    if (stbi__get16be(s) != 3)
6175       return stbi__errpuc("wrong color format", "PSD is not in RGB color format");
6176 
6177    // Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)
6178    stbi__skip(s,stbi__get32be(s) );
6179 
6180    // Skip the image resources.  (resolution, pen tool paths, etc)
6181    stbi__skip(s, stbi__get32be(s) );
6182 
6183    // Skip the reserved data.
6184    stbi__skip(s, stbi__get32be(s) );
6185 
6186    // Find out if the data is compressed.
6187    // Known values:
6188    //   0: no compression
6189    //   1: RLE compressed
6190    compression = stbi__get16be(s);
6191    if (compression > 1)
6192       return stbi__errpuc("bad compression", "PSD has an unknown compression format");
6193 
6194    // Check size
6195    if (!stbi__mad3sizes_valid(4, w, h, 0))
6196       return stbi__errpuc("too large", "Corrupt PSD");
6197 
6198    // Create the destination image.
6199 
6200    if (!compression && bitdepth == 16 && bpc == 16) {
6201       out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
6202       ri->bits_per_channel = 16;
6203    } else
6204       out = (stbi_uc *) stbi__malloc(4 * w*h);
6205 
6206    if (!out) return stbi__errpuc("outofmem", "Out of memory");
6207    pixelCount = w*h;
6208 
6209    // Initialize the data to zero.
6210    //memset( out, 0, pixelCount * 4 );
6211 
6212    // Finally, the image data.
6213    if (compression) {
6214       // RLE as used by .PSD and .TIFF
6215       // Loop until you get the number of unpacked bytes you are expecting:
6216       //     Read the next source byte into n.
6217       //     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
6218       //     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
6219       //     Else if n is 128, noop.
6220       // Endloop
6221 
6222       // The RLE-compressed data is preceded by a 2-byte data count for each row in the data,
6223       // which we're going to just skip.
6224       stbi__skip(s, h * channelCount * 2 );
6225 
6226       // Read the RLE data by channel.
6227       for (channel = 0; channel < 4; channel++) {
6228          stbi_uc *p;
6229 
6230          p = out+channel;
6231          if (channel >= channelCount) {
6232             // Fill this channel with default data.
6233             for (i = 0; i < pixelCount; i++, p += 4)
6234                *p = (channel == 3 ? 255 : 0);
6235          } else {
6236             // Read the RLE data.
6237             if (!stbi__psd_decode_rle(s, p, pixelCount)) {
6238                STBI_FREE(out);
6239                return stbi__errpuc("corrupt", "bad RLE data");
6240             }
6241          }
6242       }
6243 
6244    } else {
6245       // We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)
6246       // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.
6247 
6248       // Read the data by channel.
6249       for (channel = 0; channel < 4; channel++) {
6250          if (channel >= channelCount) {
6251             // Fill this channel with default data.
6252             if (bitdepth == 16 && bpc == 16) {
6253                stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
6254                stbi__uint16 val = channel == 3 ? 65535 : 0;
6255                for (i = 0; i < pixelCount; i++, q += 4)
6256                   *q = val;
6257             } else {
6258                stbi_uc *p = out+channel;
6259                stbi_uc val = channel == 3 ? 255 : 0;
6260                for (i = 0; i < pixelCount; i++, p += 4)
6261                   *p = val;
6262             }
6263          } else {
6264             if (ri->bits_per_channel == 16) {    // output bpc
6265                stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
6266                for (i = 0; i < pixelCount; i++, q += 4)
6267                   *q = (stbi__uint16) stbi__get16be(s);
6268             } else {
6269                stbi_uc *p = out+channel;
6270                if (bitdepth == 16) {  // input bpc
6271                   for (i = 0; i < pixelCount; i++, p += 4)
6272                      *p = (stbi_uc) (stbi__get16be(s) >> 8);
6273                } else {
6274                   for (i = 0; i < pixelCount; i++, p += 4)
6275                      *p = stbi__get8(s);
6276                }
6277             }
6278          }
6279       }
6280    }
6281 
6282    // remove weird white matte from PSD
6283    if (channelCount >= 4) {
6284       if (ri->bits_per_channel == 16) {
6285          for (i=0; i < w*h; ++i) {
6286             stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
6287             if (pixel[3] != 0 && pixel[3] != 65535) {
6288                float a = pixel[3] / 65535.0f;
6289                float ra = 1.0f / a;
6290                float inv_a = 65535.0f * (1 - ra);
6291                pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
6292                pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
6293                pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
6294             }
6295          }
6296       } else {
6297          for (i=0; i < w*h; ++i) {
6298             unsigned char *pixel = out + 4*i;
6299             if (pixel[3] != 0 && pixel[3] != 255) {
6300                float a = pixel[3] / 255.0f;
6301                float ra = 1.0f / a;
6302                float inv_a = 255.0f * (1 - ra);
6303                pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);
6304                pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);
6305                pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);
6306             }
6307          }
6308       }
6309    }
6310 
6311    // convert to desired output format
6312    if (req_comp && req_comp != 4) {
6313       if (ri->bits_per_channel == 16)
6314          out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
6315       else
6316          out = stbi__convert_format(out, 4, req_comp, w, h);
6317       if (out == NULL) return out; // stbi__convert_format frees input on failure
6318    }
6319 
6320    if (comp) *comp = 4;
6321    *y = h;
6322    *x = w;
6323 
6324    return out;
6325 }
6326 #endif
6327 
6328 // *************************************************************************************************
6329 // Softimage PIC loader
6330 // by Tom Seddon
6331 //
6332 // See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
6333 // See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
6334 
6335 #ifndef STBI_NO_PIC
stbi__pic_is4(stbi__context * s,const char * str)6336 static int stbi__pic_is4(stbi__context *s,const char *str)
6337 {
6338    int i;
6339    for (i=0; i<4; ++i)
6340       if (stbi__get8(s) != (stbi_uc)str[i])
6341          return 0;
6342 
6343    return 1;
6344 }
6345 
stbi__pic_test_core(stbi__context * s)6346 static int stbi__pic_test_core(stbi__context *s)
6347 {
6348    int i;
6349 
6350    if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
6351       return 0;
6352 
6353    for(i=0;i<84;++i)
6354       stbi__get8(s);
6355 
6356    if (!stbi__pic_is4(s,"PICT"))
6357       return 0;
6358 
6359    return 1;
6360 }
6361 
6362 typedef struct
6363 {
6364    stbi_uc size,type,channel;
6365 } stbi__pic_packet;
6366 
stbi__readval(stbi__context * s,int channel,stbi_uc * dest)6367 static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)
6368 {
6369    int mask=0x80, i;
6370 
6371    for (i=0; i<4; ++i, mask>>=1) {
6372       if (channel & mask) {
6373          if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short");
6374          dest[i]=stbi__get8(s);
6375       }
6376    }
6377 
6378    return dest;
6379 }
6380 
stbi__copyval(int channel,stbi_uc * dest,const stbi_uc * src)6381 static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)
6382 {
6383    int mask=0x80,i;
6384 
6385    for (i=0;i<4; ++i, mask>>=1)
6386       if (channel&mask)
6387          dest[i]=src[i];
6388 }
6389 
stbi__pic_load_core(stbi__context * s,int width,int height,int * comp,stbi_uc * result)6390 static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)
6391 {
6392    int act_comp=0,num_packets=0,y,chained;
6393    stbi__pic_packet packets[10];
6394 
6395    // this will (should...) cater for even some bizarre stuff like having data
6396     // for the same channel in multiple packets.
6397    do {
6398       stbi__pic_packet *packet;
6399 
6400       if (num_packets==sizeof(packets)/sizeof(packets[0]))
6401          return stbi__errpuc("bad format","too many packets");
6402 
6403       packet = &packets[num_packets++];
6404 
6405       chained = stbi__get8(s);
6406       packet->size    = stbi__get8(s);
6407       packet->type    = stbi__get8(s);
6408       packet->channel = stbi__get8(s);
6409 
6410       act_comp |= packet->channel;
6411 
6412       if (stbi__at_eof(s))          return stbi__errpuc("bad file","file too short (reading packets)");
6413       if (packet->size != 8)  return stbi__errpuc("bad format","packet isn't 8bpp");
6414    } while (chained);
6415 
6416    *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
6417 
6418    for(y=0; y<height; ++y) {
6419       int packet_idx;
6420 
6421       for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
6422          stbi__pic_packet *packet = &packets[packet_idx];
6423          stbi_uc *dest = result+y*width*4;
6424 
6425          switch (packet->type) {
6426             default:
6427                return stbi__errpuc("bad format","packet has bad compression type");
6428 
6429             case 0: {//uncompressed
6430                int x;
6431 
6432                for(x=0;x<width;++x, dest+=4)
6433                   if (!stbi__readval(s,packet->channel,dest))
6434                      return 0;
6435                break;
6436             }
6437 
6438             case 1://Pure RLE
6439                {
6440                   int left=width, i;
6441 
6442                   while (left>0) {
6443                      stbi_uc count,value[4];
6444 
6445                      count=stbi__get8(s);
6446                      if (stbi__at_eof(s))   return stbi__errpuc("bad file","file too short (pure read count)");
6447 
6448                      if (count > left)
6449                         count = (stbi_uc) left;
6450 
6451                      if (!stbi__readval(s,packet->channel,value))  return 0;
6452 
6453                      for(i=0; i<count; ++i,dest+=4)
6454                         stbi__copyval(packet->channel,dest,value);
6455                      left -= count;
6456                   }
6457                }
6458                break;
6459 
6460             case 2: {//Mixed RLE
6461                int left=width;
6462                while (left>0) {
6463                   int count = stbi__get8(s), i;
6464                   if (stbi__at_eof(s))  return stbi__errpuc("bad file","file too short (mixed read count)");
6465 
6466                   if (count >= 128) { // Repeated
6467                      stbi_uc value[4];
6468 
6469                      if (count==128)
6470                         count = stbi__get16be(s);
6471                      else
6472                         count -= 127;
6473                      if (count > left)
6474                         return stbi__errpuc("bad file","scanline overrun");
6475 
6476                      if (!stbi__readval(s,packet->channel,value))
6477                         return 0;
6478 
6479                      for(i=0;i<count;++i, dest += 4)
6480                         stbi__copyval(packet->channel,dest,value);
6481                   } else { // Raw
6482                      ++count;
6483                      if (count>left) return stbi__errpuc("bad file","scanline overrun");
6484 
6485                      for(i=0;i<count;++i, dest+=4)
6486                         if (!stbi__readval(s,packet->channel,dest))
6487                            return 0;
6488                   }
6489                   left-=count;
6490                }
6491                break;
6492             }
6493          }
6494       }
6495    }
6496 
6497    return result;
6498 }
6499 
stbi__pic_load(stbi__context * s,int * px,int * py,int * comp,int req_comp,stbi__result_info * ri)6500 static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri)
6501 {
6502    stbi_uc *result;
6503    int i, x,y, internal_comp;
6504    STBI_NOTUSED(ri);
6505 
6506    if (!comp) comp = &internal_comp;
6507 
6508    for (i=0; i<92; ++i)
6509       stbi__get8(s);
6510 
6511    x = stbi__get16be(s);
6512    y = stbi__get16be(s);
6513 
6514    if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
6515    if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
6516 
6517    if (stbi__at_eof(s))  return stbi__errpuc("bad file","file too short (pic header)");
6518    if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode");
6519 
6520    stbi__get32be(s); //skip `ratio'
6521    stbi__get16be(s); //skip `fields'
6522    stbi__get16be(s); //skip `pad'
6523 
6524    // intermediate buffer is RGBA
6525    result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
6526    if (!result) return stbi__errpuc("outofmem", "Out of memory");
6527    memset(result, 0xff, x*y*4);
6528 
6529    if (!stbi__pic_load_core(s,x,y,comp, result)) {
6530       STBI_FREE(result);
6531       result=0;
6532    }
6533    *px = x;
6534    *py = y;
6535    if (req_comp == 0) req_comp = *comp;
6536    result=stbi__convert_format(result,4,req_comp,x,y);
6537 
6538    return result;
6539 }
6540 
stbi__pic_test(stbi__context * s)6541 static int stbi__pic_test(stbi__context *s)
6542 {
6543    int r = stbi__pic_test_core(s);
6544    stbi__rewind(s);
6545    return r;
6546 }
6547 #endif
6548 
6549 // *************************************************************************************************
6550 // GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
6551 
6552 #ifndef STBI_NO_GIF
6553 typedef struct
6554 {
6555    stbi__int16 prefix;
6556    stbi_uc first;
6557    stbi_uc suffix;
6558 } stbi__gif_lzw;
6559 
6560 typedef struct
6561 {
6562    int w,h;
6563    stbi_uc *out;                 // output buffer (always 4 components)
6564    stbi_uc *background;          // The current "background" as far as a gif is concerned
6565    stbi_uc *history;
6566    int flags, bgindex, ratio, transparent, eflags;
6567    stbi_uc  pal[256][4];
6568    stbi_uc lpal[256][4];
6569    stbi__gif_lzw codes[8192];
6570    stbi_uc *color_table;
6571    int parse, step;
6572    int lflags;
6573    int start_x, start_y;
6574    int max_x, max_y;
6575    int cur_x, cur_y;
6576    int line_size;
6577    int delay;
6578 } stbi__gif;
6579 
stbi__gif_test_raw(stbi__context * s)6580 static int stbi__gif_test_raw(stbi__context *s)
6581 {
6582    int sz;
6583    if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
6584    sz = stbi__get8(s);
6585    if (sz != '9' && sz != '7') return 0;
6586    if (stbi__get8(s) != 'a') return 0;
6587    return 1;
6588 }
6589 
stbi__gif_test(stbi__context * s)6590 static int stbi__gif_test(stbi__context *s)
6591 {
6592    int r = stbi__gif_test_raw(s);
6593    stbi__rewind(s);
6594    return r;
6595 }
6596 
stbi__gif_parse_colortable(stbi__context * s,stbi_uc pal[256][4],int num_entries,int transp)6597 static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
6598 {
6599    int i;
6600    for (i=0; i < num_entries; ++i) {
6601       pal[i][2] = stbi__get8(s);
6602       pal[i][1] = stbi__get8(s);
6603       pal[i][0] = stbi__get8(s);
6604       pal[i][3] = transp == i ? 0 : 255;
6605    }
6606 }
6607 
stbi__gif_header(stbi__context * s,stbi__gif * g,int * comp,int is_info)6608 static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
6609 {
6610    stbi_uc version;
6611    if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
6612       return stbi__err("not GIF", "Corrupt GIF");
6613 
6614    version = stbi__get8(s);
6615    if (version != '7' && version != '9')    return stbi__err("not GIF", "Corrupt GIF");
6616    if (stbi__get8(s) != 'a')                return stbi__err("not GIF", "Corrupt GIF");
6617 
6618    stbi__g_failure_reason = "";
6619    g->w = stbi__get16le(s);
6620    g->h = stbi__get16le(s);
6621    g->flags = stbi__get8(s);
6622    g->bgindex = stbi__get8(s);
6623    g->ratio = stbi__get8(s);
6624    g->transparent = -1;
6625 
6626    if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
6627    if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
6628 
6629    if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments
6630 
6631    if (is_info) return 1;
6632 
6633    if (g->flags & 0x80)
6634       stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
6635 
6636    return 1;
6637 }
6638 
stbi__gif_info_raw(stbi__context * s,int * x,int * y,int * comp)6639 static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
6640 {
6641    stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));
6642    if (!g) return stbi__err("outofmem", "Out of memory");
6643    if (!stbi__gif_header(s, g, comp, 1)) {
6644       STBI_FREE(g);
6645       stbi__rewind( s );
6646       return 0;
6647    }
6648    if (x) *x = g->w;
6649    if (y) *y = g->h;
6650    STBI_FREE(g);
6651    return 1;
6652 }
6653 
stbi__out_gif_code(stbi__gif * g,stbi__uint16 code)6654 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6655 {
6656    stbi_uc *p, *c;
6657    int idx;
6658 
6659    // recurse to decode the prefixes, since the linked-list is backwards,
6660    // and working backwards through an interleaved image would be nasty
6661    if (g->codes[code].prefix >= 0)
6662       stbi__out_gif_code(g, g->codes[code].prefix);
6663 
6664    if (g->cur_y >= g->max_y) return;
6665 
6666    idx = g->cur_x + g->cur_y;
6667    p = &g->out[idx];
6668    g->history[idx / 4] = 1;
6669 
6670    c = &g->color_table[g->codes[code].suffix * 4];
6671    if (c[3] > 128) { // don't render transparent pixels;
6672       p[0] = c[2];
6673       p[1] = c[1];
6674       p[2] = c[0];
6675       p[3] = c[3];
6676    }
6677    g->cur_x += 4;
6678 
6679    if (g->cur_x >= g->max_x) {
6680       g->cur_x = g->start_x;
6681       g->cur_y += g->step;
6682 
6683       while (g->cur_y >= g->max_y && g->parse > 0) {
6684          g->step = (1 << g->parse) * g->line_size;
6685          g->cur_y = g->start_y + (g->step >> 1);
6686          --g->parse;
6687       }
6688    }
6689 }
6690 
stbi__process_gif_raster(stbi__context * s,stbi__gif * g)6691 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
6692 {
6693    stbi_uc lzw_cs;
6694    stbi__int32 len, init_code;
6695    stbi__uint32 first;
6696    stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6697    stbi__gif_lzw *p;
6698 
6699    lzw_cs = stbi__get8(s);
6700    if (lzw_cs > 12) return NULL;
6701    clear = 1 << lzw_cs;
6702    first = 1;
6703    codesize = lzw_cs + 1;
6704    codemask = (1 << codesize) - 1;
6705    bits = 0;
6706    valid_bits = 0;
6707    for (init_code = 0; init_code < clear; init_code++) {
6708       g->codes[init_code].prefix = -1;
6709       g->codes[init_code].first = (stbi_uc) init_code;
6710       g->codes[init_code].suffix = (stbi_uc) init_code;
6711    }
6712 
6713    // support no starting clear code
6714    avail = clear+2;
6715    oldcode = -1;
6716 
6717    len = 0;
6718    for(;;) {
6719       if (valid_bits < codesize) {
6720          if (len == 0) {
6721             len = stbi__get8(s); // start new block
6722             if (len == 0)
6723                return g->out;
6724          }
6725          --len;
6726          bits |= (stbi__int32) stbi__get8(s) << valid_bits;
6727          valid_bits += 8;
6728       } else {
6729          stbi__int32 code = bits & codemask;
6730          bits >>= codesize;
6731          valid_bits -= codesize;
6732          // @OPTIMIZE: is there some way we can accelerate the non-clear path?
6733          if (code == clear) {  // clear code
6734             codesize = lzw_cs + 1;
6735             codemask = (1 << codesize) - 1;
6736             avail = clear + 2;
6737             oldcode = -1;
6738             first = 0;
6739          } else if (code == clear + 1) { // end of stream code
6740             stbi__skip(s, len);
6741             while ((len = stbi__get8(s)) > 0)
6742                stbi__skip(s,len);
6743             return g->out;
6744          } else if (code <= avail) {
6745             if (first) {
6746                return stbi__errpuc("no clear code", "Corrupt GIF");
6747             }
6748 
6749             if (oldcode >= 0) {
6750                p = &g->codes[avail++];
6751                if (avail > 8192) {
6752                   return stbi__errpuc("too many codes", "Corrupt GIF");
6753                }
6754 
6755                p->prefix = (stbi__int16) oldcode;
6756                p->first = g->codes[oldcode].first;
6757                p->suffix = (code == avail) ? p->first : g->codes[code].first;
6758             } else if (code == avail)
6759                return stbi__errpuc("illegal code in raster", "Corrupt GIF");
6760 
6761             stbi__out_gif_code(g, (stbi__uint16) code);
6762 
6763             if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6764                codesize++;
6765                codemask = (1 << codesize) - 1;
6766             }
6767 
6768             oldcode = code;
6769          } else {
6770             return stbi__errpuc("illegal code in raster", "Corrupt GIF");
6771          }
6772       }
6773    }
6774 }
6775 
6776 // this function is designed to support animated gifs, although stb_image doesn't support it
6777 // two back is the image from two frames ago, used for a very specific disposal format
stbi__gif_load_next(stbi__context * s,stbi__gif * g,int * comp,int req_comp,stbi_uc * two_back)6778 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)
6779 {
6780    int dispose;
6781    int first_frame;
6782    int pi;
6783    int pcount;
6784    STBI_NOTUSED(req_comp);
6785 
6786    // on first frame, any non-written pixels get the background colour (non-transparent)
6787    first_frame = 0;
6788    if (g->out == 0) {
6789       if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
6790       if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
6791          return stbi__errpuc("too large", "GIF image is too large");
6792       pcount = g->w * g->h;
6793       g->out = (stbi_uc *) stbi__malloc(4 * pcount);
6794       g->background = (stbi_uc *) stbi__malloc(4 * pcount);
6795       g->history = (stbi_uc *) stbi__malloc(pcount);
6796       if (!g->out || !g->background || !g->history)
6797          return stbi__errpuc("outofmem", "Out of memory");
6798 
6799       // image is treated as "transparent" at the start - ie, nothing overwrites the current background;
6800       // background colour is only used for pixels that are not rendered first frame, after that "background"
6801       // color refers to the color that was there the previous frame.
6802       memset(g->out, 0x00, 4 * pcount);
6803       memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
6804       memset(g->history, 0x00, pcount);        // pixels that were affected previous frame
6805       first_frame = 1;
6806    } else {
6807       // second frame - how do we dispose of the previous one?
6808       dispose = (g->eflags & 0x1C) >> 2;
6809       pcount = g->w * g->h;
6810 
6811       if ((dispose == 3) && (two_back == 0)) {
6812          dispose = 2; // if I don't have an image to revert back to, default to the old background
6813       }
6814 
6815       if (dispose == 3) { // use previous graphic
6816          for (pi = 0; pi < pcount; ++pi) {
6817             if (g->history[pi]) {
6818                memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
6819             }
6820          }
6821       } else if (dispose == 2) {
6822          // restore what was changed last frame to background before that frame;
6823          for (pi = 0; pi < pcount; ++pi) {
6824             if (g->history[pi]) {
6825                memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
6826             }
6827          }
6828       } else {
6829          // This is a non-disposal case eithe way, so just
6830          // leave the pixels as is, and they will become the new background
6831          // 1: do not dispose
6832          // 0:  not specified.
6833       }
6834 
6835       // background is what out is after the undoing of the previou frame;
6836       memcpy( g->background, g->out, 4 * g->w * g->h );
6837    }
6838 
6839    // clear my history;
6840    memset( g->history, 0x00, g->w * g->h );        // pixels that were affected previous frame
6841 
6842    for (;;) {
6843       int tag = stbi__get8(s);
6844       switch (tag) {
6845          case 0x2C: /* Image Descriptor */
6846          {
6847             stbi__int32 x, y, w, h;
6848             stbi_uc *o;
6849 
6850             x = stbi__get16le(s);
6851             y = stbi__get16le(s);
6852             w = stbi__get16le(s);
6853             h = stbi__get16le(s);
6854             if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6855                return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
6856 
6857             g->line_size = g->w * 4;
6858             g->start_x = x * 4;
6859             g->start_y = y * g->line_size;
6860             g->max_x   = g->start_x + w * 4;
6861             g->max_y   = g->start_y + h * g->line_size;
6862             g->cur_x   = g->start_x;
6863             g->cur_y   = g->start_y;
6864 
6865             // if the width of the specified rectangle is 0, that means
6866             // we may not see *any* pixels or the image is malformed;
6867             // to make sure this is caught, move the current y down to
6868             // max_y (which is what out_gif_code checks).
6869             if (w == 0)
6870                g->cur_y = g->max_y;
6871 
6872             g->lflags = stbi__get8(s);
6873 
6874             if (g->lflags & 0x40) {
6875                g->step = 8 * g->line_size; // first interlaced spacing
6876                g->parse = 3;
6877             } else {
6878                g->step = g->line_size;
6879                g->parse = 0;
6880             }
6881 
6882             if (g->lflags & 0x80) {
6883                stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6884                g->color_table = (stbi_uc *) g->lpal;
6885             } else if (g->flags & 0x80) {
6886                g->color_table = (stbi_uc *) g->pal;
6887             } else
6888                return stbi__errpuc("missing color table", "Corrupt GIF");
6889 
6890             o = stbi__process_gif_raster(s, g);
6891             if (!o) return NULL;
6892 
6893             // if this was the first frame,
6894             pcount = g->w * g->h;
6895             if (first_frame && (g->bgindex > 0)) {
6896                // if first frame, any pixel not drawn to gets the background color
6897                for (pi = 0; pi < pcount; ++pi) {
6898                   if (g->history[pi] == 0) {
6899                      g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
6900                      memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
6901                   }
6902                }
6903             }
6904 
6905             return o;
6906          }
6907 
6908          case 0x21: // Comment Extension.
6909          {
6910             int len;
6911             int ext = stbi__get8(s);
6912             if (ext == 0xF9) { // Graphic Control Extension.
6913                len = stbi__get8(s);
6914                if (len == 4) {
6915                   g->eflags = stbi__get8(s);
6916                   g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths.
6917 
6918                   // unset old transparent
6919                   if (g->transparent >= 0) {
6920                      g->pal[g->transparent][3] = 255;
6921                   }
6922                   if (g->eflags & 0x01) {
6923                      g->transparent = stbi__get8(s);
6924                      if (g->transparent >= 0) {
6925                         g->pal[g->transparent][3] = 0;
6926                      }
6927                   } else {
6928                      // don't need transparent
6929                      stbi__skip(s, 1);
6930                      g->transparent = -1;
6931                   }
6932                } else {
6933                   stbi__skip(s, len);
6934                   break;
6935                }
6936             }
6937             while ((len = stbi__get8(s)) != 0) {
6938                stbi__skip(s, len);
6939             }
6940             break;
6941          }
6942 
6943          case 0x3B: // gif stream termination code
6944             return (stbi_uc *) s; // using '1' causes warning on some compilers
6945 
6946          default:
6947             return stbi__errpuc("unknown code", "Corrupt GIF");
6948       }
6949    }
6950 }
6951 
stbi__load_gif_main_outofmem(stbi__gif * g,stbi_uc * out,int ** delays)6952 static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays)
6953 {
6954    STBI_FREE(g->out);
6955    STBI_FREE(g->history);
6956    STBI_FREE(g->background);
6957 
6958    if (out) STBI_FREE(out);
6959    if (delays && *delays) STBI_FREE(*delays);
6960    return stbi__errpuc("outofmem", "Out of memory");
6961 }
6962 
stbi__load_gif_main(stbi__context * s,int ** delays,int * x,int * y,int * z,int * comp,int req_comp)6963 static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
6964 {
6965    if (stbi__gif_test(s)) {
6966       int layers = 0;
6967       stbi_uc *u = 0;
6968       stbi_uc *out = 0;
6969       stbi_uc *two_back = 0;
6970       stbi__gif g;
6971       int stride;
6972       int out_size = 0;
6973       int delays_size = 0;
6974 
6975       STBI_NOTUSED(out_size);
6976       STBI_NOTUSED(delays_size);
6977 
6978       memset(&g, 0, sizeof(g));
6979       if (delays) {
6980          *delays = 0;
6981       }
6982 
6983       do {
6984          u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
6985          if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker
6986 
6987          if (u) {
6988             *x = g.w;
6989             *y = g.h;
6990             ++layers;
6991             stride = g.w * g.h * 4;
6992 
6993             if (out) {
6994                void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );
6995                if (!tmp) {
6996                   void *ret = stbi__load_gif_main_outofmem(&g, out, delays);
6997                   if (delays && *delays) *delays = 0;
6998                   return ret;
6999                }
7000                else {
7001                    out = (stbi_uc*) tmp;
7002                    out_size = layers * stride;
7003                }
7004 
7005                if (delays) {
7006                   int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers );
7007                   if (!new_delays)
7008                      return stbi__load_gif_main_outofmem(&g, out, delays);
7009                   *delays = new_delays;
7010                   delays_size = layers * sizeof(int);
7011                }
7012             } else {
7013                out = (stbi_uc*)stbi__malloc( layers * stride );
7014                if (!out) {
7015                   void *ret = stbi__load_gif_main_outofmem(&g, out, delays);
7016                   if (delays && *delays) *delays = 0;
7017                   return ret;
7018                }
7019                out_size = layers * stride;
7020                if (delays) {
7021                   *delays = (int*) stbi__malloc( layers * sizeof(int) );
7022                   if (!*delays)
7023                      return stbi__load_gif_main_outofmem(&g, out, delays);
7024                   delays_size = layers * sizeof(int);
7025                }
7026             }
7027             memcpy( out + ((layers - 1) * stride), u, stride );
7028             if (layers >= 2) {
7029                two_back = out + (layers - 2) * stride;
7030             }
7031 
7032             if (delays) {
7033                (*delays)[layers - 1U] = g.delay;
7034             }
7035          }
7036       } while (u != 0);
7037 
7038       // free temp buffer;
7039       STBI_FREE(g.out);
7040       STBI_FREE(g.history);
7041       STBI_FREE(g.background);
7042 
7043       // do the final conversion after loading everything;
7044       if (req_comp && req_comp != 4)
7045          out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
7046 
7047       *z = layers;
7048       return out;
7049    } else {
7050       return stbi__errpuc("not GIF", "Image was not as a gif type.");
7051    }
7052 }
7053 
stbi__gif_load(stbi__context * s,int * x,int * y,int * comp,int req_comp,stbi__result_info * ri)7054 static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
7055 {
7056    stbi_uc *u = 0;
7057    stbi__gif g;
7058    memset(&g, 0, sizeof(g));
7059    STBI_NOTUSED(ri);
7060 
7061    u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
7062    if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker
7063    if (u) {
7064       *x = g.w;
7065       *y = g.h;
7066 
7067       // moved conversion to after successful load so that the same
7068       // can be done for multiple frames.
7069       if (req_comp && req_comp != 4)
7070          u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
7071    } else if (g.out) {
7072       // if there was an error and we allocated an image buffer, free it!
7073       STBI_FREE(g.out);
7074    }
7075 
7076    // free buffers needed for multiple frame loading;
7077    STBI_FREE(g.history);
7078    STBI_FREE(g.background);
7079 
7080    return u;
7081 }
7082 
stbi__gif_info(stbi__context * s,int * x,int * y,int * comp)7083 static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
7084 {
7085    return stbi__gif_info_raw(s,x,y,comp);
7086 }
7087 #endif
7088 
7089 // *************************************************************************************************
7090 // Radiance RGBE HDR loader
7091 // originally by Nicolas Schulz
7092 #ifndef STBI_NO_HDR
stbi__hdr_test_core(stbi__context * s,const char * signature)7093 static int stbi__hdr_test_core(stbi__context *s, const char *signature)
7094 {
7095    int i;
7096    for (i=0; signature[i]; ++i)
7097       if (stbi__get8(s) != signature[i])
7098           return 0;
7099    stbi__rewind(s);
7100    return 1;
7101 }
7102 
stbi__hdr_test(stbi__context * s)7103 static int stbi__hdr_test(stbi__context* s)
7104 {
7105    int r = stbi__hdr_test_core(s, "#?RADIANCE\n");
7106    stbi__rewind(s);
7107    if(!r) {
7108        r = stbi__hdr_test_core(s, "#?RGBE\n");
7109        stbi__rewind(s);
7110    }
7111    return r;
7112 }
7113 
7114 #define STBI__HDR_BUFLEN  1024
stbi__hdr_gettoken(stbi__context * z,char * buffer)7115 static char *stbi__hdr_gettoken(stbi__context *z, char *buffer)
7116 {
7117    int len=0;
7118    char c = '\0';
7119 
7120    c = (char) stbi__get8(z);
7121 
7122    while (!stbi__at_eof(z) && c != '\n') {
7123       buffer[len++] = c;
7124       if (len == STBI__HDR_BUFLEN-1) {
7125          // flush to end of line
7126          while (!stbi__at_eof(z) && stbi__get8(z) != '\n')
7127             ;
7128          break;
7129       }
7130       c = (char) stbi__get8(z);
7131    }
7132 
7133    buffer[len] = 0;
7134    return buffer;
7135 }
7136 
stbi__hdr_convert(float * output,stbi_uc * input,int req_comp)7137 static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
7138 {
7139    if ( input[3] != 0 ) {
7140       float f1;
7141       // Exponent
7142       f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
7143       if (req_comp <= 2)
7144          output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
7145       else {
7146          output[0] = input[0] * f1;
7147          output[1] = input[1] * f1;
7148          output[2] = input[2] * f1;
7149       }
7150       if (req_comp == 2) output[1] = 1;
7151       if (req_comp == 4) output[3] = 1;
7152    } else {
7153       switch (req_comp) {
7154          case 4: output[3] = 1; /* fallthrough */
7155          case 3: output[0] = output[1] = output[2] = 0;
7156                  break;
7157          case 2: output[1] = 1; /* fallthrough */
7158          case 1: output[0] = 0;
7159                  break;
7160       }
7161    }
7162 }
7163 
stbi__hdr_load(stbi__context * s,int * x,int * y,int * comp,int req_comp,stbi__result_info * ri)7164 static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
7165 {
7166    char buffer[STBI__HDR_BUFLEN];
7167    char *token;
7168    int valid = 0;
7169    int width, height;
7170    stbi_uc *scanline;
7171    float *hdr_data;
7172    int len;
7173    unsigned char count, value;
7174    int i, j, k, c1,c2, z;
7175    const char *headerToken;
7176    STBI_NOTUSED(ri);
7177 
7178    // Check identifier
7179    headerToken = stbi__hdr_gettoken(s,buffer);
7180    if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0)
7181       return stbi__errpf("not HDR", "Corrupt HDR image");
7182 
7183    // Parse header
7184    for(;;) {
7185       token = stbi__hdr_gettoken(s,buffer);
7186       if (token[0] == 0) break;
7187       if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7188    }
7189 
7190    if (!valid)    return stbi__errpf("unsupported format", "Unsupported HDR format");
7191 
7192    // Parse width and height
7193    // can't use sscanf() if we're not using stdio!
7194    token = stbi__hdr_gettoken(s,buffer);
7195    if (strncmp(token, "-Y ", 3))  return stbi__errpf("unsupported data layout", "Unsupported HDR format");
7196    token += 3;
7197    height = (int) strtol(token, &token, 10);
7198    while (*token == ' ') ++token;
7199    if (strncmp(token, "+X ", 3))  return stbi__errpf("unsupported data layout", "Unsupported HDR format");
7200    token += 3;
7201    width = (int) strtol(token, NULL, 10);
7202 
7203    if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)");
7204    if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)");
7205 
7206    *x = width;
7207    *y = height;
7208 
7209    if (comp) *comp = 3;
7210    if (req_comp == 0) req_comp = 3;
7211 
7212    if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))
7213       return stbi__errpf("too large", "HDR image is too large");
7214 
7215    // Read data
7216    hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);
7217    if (!hdr_data)
7218       return stbi__errpf("outofmem", "Out of memory");
7219 
7220    // Load image data
7221    // image data is stored as some number of sca
7222    if ( width < 8 || width >= 32768) {
7223       // Read flat data
7224       for (j=0; j < height; ++j) {
7225          for (i=0; i < width; ++i) {
7226             stbi_uc rgbe[4];
7227            main_decode_loop:
7228             stbi__getn(s, rgbe, 4);
7229             stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
7230          }
7231       }
7232    } else {
7233       // Read RLE-encoded data
7234       scanline = NULL;
7235 
7236       for (j = 0; j < height; ++j) {
7237          c1 = stbi__get8(s);
7238          c2 = stbi__get8(s);
7239          len = stbi__get8(s);
7240          if (c1 != 2 || c2 != 2 || (len & 0x80)) {
7241             // not run-length encoded, so we have to actually use THIS data as a decoded
7242             // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
7243             stbi_uc rgbe[4];
7244             rgbe[0] = (stbi_uc) c1;
7245             rgbe[1] = (stbi_uc) c2;
7246             rgbe[2] = (stbi_uc) len;
7247             rgbe[3] = (stbi_uc) stbi__get8(s);
7248             stbi__hdr_convert(hdr_data, rgbe, req_comp);
7249             i = 1;
7250             j = 0;
7251             STBI_FREE(scanline);
7252             goto main_decode_loop; // yes, this makes no sense
7253          }
7254          len <<= 8;
7255          len |= stbi__get8(s);
7256          if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
7257          if (scanline == NULL) {
7258             scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
7259             if (!scanline) {
7260                STBI_FREE(hdr_data);
7261                return stbi__errpf("outofmem", "Out of memory");
7262             }
7263          }
7264 
7265          for (k = 0; k < 4; ++k) {
7266             int nleft;
7267             i = 0;
7268             while ((nleft = width - i) > 0) {
7269                count = stbi__get8(s);
7270                if (count > 128) {
7271                   // Run
7272                   value = stbi__get8(s);
7273                   count -= 128;
7274                   if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
7275                   for (z = 0; z < count; ++z)
7276                      scanline[i++ * 4 + k] = value;
7277                } else {
7278                   // Dump
7279                   if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
7280                   for (z = 0; z < count; ++z)
7281                      scanline[i++ * 4 + k] = stbi__get8(s);
7282                }
7283             }
7284          }
7285          for (i=0; i < width; ++i)
7286             stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
7287       }
7288       if (scanline)
7289          STBI_FREE(scanline);
7290    }
7291 
7292    return hdr_data;
7293 }
7294 
stbi__hdr_info(stbi__context * s,int * x,int * y,int * comp)7295 static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
7296 {
7297    char buffer[STBI__HDR_BUFLEN];
7298    char *token;
7299    int valid = 0;
7300    int dummy;
7301 
7302    if (!x) x = &dummy;
7303    if (!y) y = &dummy;
7304    if (!comp) comp = &dummy;
7305 
7306    if (stbi__hdr_test(s) == 0) {
7307        stbi__rewind( s );
7308        return 0;
7309    }
7310 
7311    for(;;) {
7312       token = stbi__hdr_gettoken(s,buffer);
7313       if (token[0] == 0) break;
7314       if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7315    }
7316 
7317    if (!valid) {
7318        stbi__rewind( s );
7319        return 0;
7320    }
7321    token = stbi__hdr_gettoken(s,buffer);
7322    if (strncmp(token, "-Y ", 3)) {
7323        stbi__rewind( s );
7324        return 0;
7325    }
7326    token += 3;
7327    *y = (int) strtol(token, &token, 10);
7328    while (*token == ' ') ++token;
7329    if (strncmp(token, "+X ", 3)) {
7330        stbi__rewind( s );
7331        return 0;
7332    }
7333    token += 3;
7334    *x = (int) strtol(token, NULL, 10);
7335    *comp = 3;
7336    return 1;
7337 }
7338 #endif // STBI_NO_HDR
7339 
7340 #ifndef STBI_NO_BMP
stbi__bmp_info(stbi__context * s,int * x,int * y,int * comp)7341 static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
7342 {
7343    void *p;
7344    stbi__bmp_data info;
7345 
7346    info.all_a = 255;
7347    p = stbi__bmp_parse_header(s, &info);
7348    if (p == NULL) {
7349       stbi__rewind( s );
7350       return 0;
7351    }
7352    if (x) *x = s->img_x;
7353    if (y) *y = s->img_y;
7354    if (comp) {
7355       if (info.bpp == 24 && info.ma == 0xff000000)
7356          *comp = 3;
7357       else
7358          *comp = info.ma ? 4 : 3;
7359    }
7360    return 1;
7361 }
7362 #endif
7363 
7364 #ifndef STBI_NO_PSD
stbi__psd_info(stbi__context * s,int * x,int * y,int * comp)7365 static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
7366 {
7367    int channelCount, dummy, depth;
7368    if (!x) x = &dummy;
7369    if (!y) y = &dummy;
7370    if (!comp) comp = &dummy;
7371    if (stbi__get32be(s) != 0x38425053) {
7372        stbi__rewind( s );
7373        return 0;
7374    }
7375    if (stbi__get16be(s) != 1) {
7376        stbi__rewind( s );
7377        return 0;
7378    }
7379    stbi__skip(s, 6);
7380    channelCount = stbi__get16be(s);
7381    if (channelCount < 0 || channelCount > 16) {
7382        stbi__rewind( s );
7383        return 0;
7384    }
7385    *y = stbi__get32be(s);
7386    *x = stbi__get32be(s);
7387    depth = stbi__get16be(s);
7388    if (depth != 8 && depth != 16) {
7389        stbi__rewind( s );
7390        return 0;
7391    }
7392    if (stbi__get16be(s) != 3) {
7393        stbi__rewind( s );
7394        return 0;
7395    }
7396    *comp = 4;
7397    return 1;
7398 }
7399 
stbi__psd_is16(stbi__context * s)7400 static int stbi__psd_is16(stbi__context *s)
7401 {
7402    int channelCount, depth;
7403    if (stbi__get32be(s) != 0x38425053) {
7404        stbi__rewind( s );
7405        return 0;
7406    }
7407    if (stbi__get16be(s) != 1) {
7408        stbi__rewind( s );
7409        return 0;
7410    }
7411    stbi__skip(s, 6);
7412    channelCount = stbi__get16be(s);
7413    if (channelCount < 0 || channelCount > 16) {
7414        stbi__rewind( s );
7415        return 0;
7416    }
7417    STBI_NOTUSED(stbi__get32be(s));
7418    STBI_NOTUSED(stbi__get32be(s));
7419    depth = stbi__get16be(s);
7420    if (depth != 16) {
7421        stbi__rewind( s );
7422        return 0;
7423    }
7424    return 1;
7425 }
7426 #endif
7427 
7428 #ifndef STBI_NO_PIC
stbi__pic_info(stbi__context * s,int * x,int * y,int * comp)7429 static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
7430 {
7431    int act_comp=0,num_packets=0,chained,dummy;
7432    stbi__pic_packet packets[10];
7433 
7434    if (!x) x = &dummy;
7435    if (!y) y = &dummy;
7436    if (!comp) comp = &dummy;
7437 
7438    if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
7439       stbi__rewind(s);
7440       return 0;
7441    }
7442 
7443    stbi__skip(s, 88);
7444 
7445    *x = stbi__get16be(s);
7446    *y = stbi__get16be(s);
7447    if (stbi__at_eof(s)) {
7448       stbi__rewind( s);
7449       return 0;
7450    }
7451    if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
7452       stbi__rewind( s );
7453       return 0;
7454    }
7455 
7456    stbi__skip(s, 8);
7457 
7458    do {
7459       stbi__pic_packet *packet;
7460 
7461       if (num_packets==sizeof(packets)/sizeof(packets[0]))
7462          return 0;
7463 
7464       packet = &packets[num_packets++];
7465       chained = stbi__get8(s);
7466       packet->size    = stbi__get8(s);
7467       packet->type    = stbi__get8(s);
7468       packet->channel = stbi__get8(s);
7469       act_comp |= packet->channel;
7470 
7471       if (stbi__at_eof(s)) {
7472           stbi__rewind( s );
7473           return 0;
7474       }
7475       if (packet->size != 8) {
7476           stbi__rewind( s );
7477           return 0;
7478       }
7479    } while (chained);
7480 
7481    *comp = (act_comp & 0x10 ? 4 : 3);
7482 
7483    return 1;
7484 }
7485 #endif
7486 
7487 // *************************************************************************************************
7488 // Portable Gray Map and Portable Pixel Map loader
7489 // by Ken Miller
7490 //
7491 // PGM: http://netpbm.sourceforge.net/doc/pgm.html
7492 // PPM: http://netpbm.sourceforge.net/doc/ppm.html
7493 //
7494 // Known limitations:
7495 //    Does not support comments in the header section
7496 //    Does not support ASCII image data (formats P2 and P3)
7497 
7498 #ifndef STBI_NO_PNM
7499 
stbi__pnm_test(stbi__context * s)7500 static int      stbi__pnm_test(stbi__context *s)
7501 {
7502    char p, t;
7503    p = (char) stbi__get8(s);
7504    t = (char) stbi__get8(s);
7505    if (p != 'P' || (t != '5' && t != '6')) {
7506        stbi__rewind( s );
7507        return 0;
7508    }
7509    return 1;
7510 }
7511 
stbi__pnm_load(stbi__context * s,int * x,int * y,int * comp,int req_comp,stbi__result_info * ri)7512 static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
7513 {
7514    stbi_uc *out;
7515    STBI_NOTUSED(ri);
7516 
7517    ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n);
7518    if (ri->bits_per_channel == 0)
7519       return 0;
7520 
7521    if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
7522    if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
7523 
7524    *x = s->img_x;
7525    *y = s->img_y;
7526    if (comp) *comp = s->img_n;
7527 
7528    if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))
7529       return stbi__errpuc("too large", "PNM too large");
7530 
7531    out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);
7532    if (!out) return stbi__errpuc("outofmem", "Out of memory");
7533    if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) {
7534       STBI_FREE(out);
7535       return stbi__errpuc("bad PNM", "PNM file truncated");
7536    }
7537 
7538    if (req_comp && req_comp != s->img_n) {
7539       if (ri->bits_per_channel == 16) {
7540          out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y);
7541       } else {
7542          out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7543       }
7544       if (out == NULL) return out; // stbi__convert_format frees input on failure
7545    }
7546    return out;
7547 }
7548 
stbi__pnm_isspace(char c)7549 static int      stbi__pnm_isspace(char c)
7550 {
7551    return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
7552 }
7553 
stbi__pnm_skip_whitespace(stbi__context * s,char * c)7554 static void     stbi__pnm_skip_whitespace(stbi__context *s, char *c)
7555 {
7556    for (;;) {
7557       while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7558          *c = (char) stbi__get8(s);
7559 
7560       if (stbi__at_eof(s) || *c != '#')
7561          break;
7562 
7563       while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' )
7564          *c = (char) stbi__get8(s);
7565    }
7566 }
7567 
stbi__pnm_isdigit(char c)7568 static int      stbi__pnm_isdigit(char c)
7569 {
7570    return c >= '0' && c <= '9';
7571 }
7572 
stbi__pnm_getinteger(stbi__context * s,char * c)7573 static int      stbi__pnm_getinteger(stbi__context *s, char *c)
7574 {
7575    int value = 0;
7576 
7577    while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7578       value = value*10 + (*c - '0');
7579       *c = (char) stbi__get8(s);
7580       if((value > 214748364) || (value == 214748364 && *c > '7'))
7581           return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int");
7582    }
7583 
7584    return value;
7585 }
7586 
stbi__pnm_info(stbi__context * s,int * x,int * y,int * comp)7587 static int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
7588 {
7589    int maxv, dummy;
7590    char c, p, t;
7591 
7592    if (!x) x = &dummy;
7593    if (!y) y = &dummy;
7594    if (!comp) comp = &dummy;
7595 
7596    stbi__rewind(s);
7597 
7598    // Get identifier
7599    p = (char) stbi__get8(s);
7600    t = (char) stbi__get8(s);
7601    if (p != 'P' || (t != '5' && t != '6')) {
7602        stbi__rewind(s);
7603        return 0;
7604    }
7605 
7606    *comp = (t == '6') ? 3 : 1;  // '5' is 1-component .pgm; '6' is 3-component .ppm
7607 
7608    c = (char) stbi__get8(s);
7609    stbi__pnm_skip_whitespace(s, &c);
7610 
7611    *x = stbi__pnm_getinteger(s, &c); // read width
7612    if(*x == 0)
7613        return stbi__err("invalid width", "PPM image header had zero or overflowing width");
7614    stbi__pnm_skip_whitespace(s, &c);
7615 
7616    *y = stbi__pnm_getinteger(s, &c); // read height
7617    if (*y == 0)
7618        return stbi__err("invalid width", "PPM image header had zero or overflowing width");
7619    stbi__pnm_skip_whitespace(s, &c);
7620 
7621    maxv = stbi__pnm_getinteger(s, &c);  // read max value
7622    if (maxv > 65535)
7623       return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images");
7624    else if (maxv > 255)
7625       return 16;
7626    else
7627       return 8;
7628 }
7629 
stbi__pnm_is16(stbi__context * s)7630 static int stbi__pnm_is16(stbi__context *s)
7631 {
7632    if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)
7633 	   return 1;
7634    return 0;
7635 }
7636 #endif
7637 
stbi__info_main(stbi__context * s,int * x,int * y,int * comp)7638 static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
7639 {
7640    #ifndef STBI_NO_JPEG
7641    if (stbi__jpeg_info(s, x, y, comp)) return 1;
7642    #endif
7643 
7644    #ifndef STBI_NO_PNG
7645    if (stbi__png_info(s, x, y, comp))  return 1;
7646    #endif
7647 
7648    #ifndef STBI_NO_GIF
7649    if (stbi__gif_info(s, x, y, comp))  return 1;
7650    #endif
7651 
7652    #ifndef STBI_NO_BMP
7653    if (stbi__bmp_info(s, x, y, comp))  return 1;
7654    #endif
7655 
7656    #ifndef STBI_NO_PSD
7657    if (stbi__psd_info(s, x, y, comp))  return 1;
7658    #endif
7659 
7660    #ifndef STBI_NO_PIC
7661    if (stbi__pic_info(s, x, y, comp))  return 1;
7662    #endif
7663 
7664    #ifndef STBI_NO_PNM
7665    if (stbi__pnm_info(s, x, y, comp))  return 1;
7666    #endif
7667 
7668    #ifndef STBI_NO_HDR
7669    if (stbi__hdr_info(s, x, y, comp))  return 1;
7670    #endif
7671 
7672    // test tga last because it's a crappy test!
7673    #ifndef STBI_NO_TGA
7674    if (stbi__tga_info(s, x, y, comp))
7675        return 1;
7676    #endif
7677    return stbi__err("unknown image type", "Image not of any known type, or corrupt");
7678 }
7679 
stbi__is_16_main(stbi__context * s)7680 static int stbi__is_16_main(stbi__context *s)
7681 {
7682    #ifndef STBI_NO_PNG
7683    if (stbi__png_is16(s))  return 1;
7684    #endif
7685 
7686    #ifndef STBI_NO_PSD
7687    if (stbi__psd_is16(s))  return 1;
7688    #endif
7689 
7690    #ifndef STBI_NO_PNM
7691    if (stbi__pnm_is16(s))  return 1;
7692    #endif
7693    return 0;
7694 }
7695 
7696 #ifndef STBI_NO_STDIO
stbi_info(char const * filename,int * x,int * y,int * comp)7697 STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
7698 {
7699     FILE *f = stbi__fopen(filename, "rb");
7700     int result;
7701     if (!f) return stbi__err("can't fopen", "Unable to open file");
7702     result = stbi_info_from_file(f, x, y, comp);
7703     fclose(f);
7704     return result;
7705 }
7706 
stbi_info_from_file(FILE * f,int * x,int * y,int * comp)7707 STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
7708 {
7709    int r;
7710    stbi__context s;
7711    long pos = ftell(f);
7712    stbi__start_file(&s, f);
7713    r = stbi__info_main(&s,x,y,comp);
7714    fseek(f,pos,SEEK_SET);
7715    return r;
7716 }
7717 
stbi_is_16_bit(char const * filename)7718 STBIDEF int stbi_is_16_bit(char const *filename)
7719 {
7720     FILE *f = stbi__fopen(filename, "rb");
7721     int result;
7722     if (!f) return stbi__err("can't fopen", "Unable to open file");
7723     result = stbi_is_16_bit_from_file(f);
7724     fclose(f);
7725     return result;
7726 }
7727 
stbi_is_16_bit_from_file(FILE * f)7728 STBIDEF int stbi_is_16_bit_from_file(FILE *f)
7729 {
7730    int r;
7731    stbi__context s;
7732    long pos = ftell(f);
7733    stbi__start_file(&s, f);
7734    r = stbi__is_16_main(&s);
7735    fseek(f,pos,SEEK_SET);
7736    return r;
7737 }
7738 #endif // !STBI_NO_STDIO
7739 
stbi_info_from_memory(stbi_uc const * buffer,int len,int * x,int * y,int * comp)7740 STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
7741 {
7742    stbi__context s;
7743    stbi__start_mem(&s,buffer,len);
7744    return stbi__info_main(&s,x,y,comp);
7745 }
7746 
stbi_info_from_callbacks(stbi_io_callbacks const * c,void * user,int * x,int * y,int * comp)7747 STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)
7748 {
7749    stbi__context s;
7750    stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
7751    return stbi__info_main(&s,x,y,comp);
7752 }
7753 
stbi_is_16_bit_from_memory(stbi_uc const * buffer,int len)7754 STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)
7755 {
7756    stbi__context s;
7757    stbi__start_mem(&s,buffer,len);
7758    return stbi__is_16_main(&s);
7759 }
7760 
stbi_is_16_bit_from_callbacks(stbi_io_callbacks const * c,void * user)7761 STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user)
7762 {
7763    stbi__context s;
7764    stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
7765    return stbi__is_16_main(&s);
7766 }
7767 
7768 #endif // STB_IMAGE_IMPLEMENTATION
7769 
7770 /*
7771    revision history:
7772       2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
7773       2.19  (2018-02-11) fix warning
7774       2.18  (2018-01-30) fix warnings
7775       2.17  (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
7776                          1-bit BMP
7777                          *_is_16_bit api
7778                          avoid warnings
7779       2.16  (2017-07-23) all functions have 16-bit variants;
7780                          STBI_NO_STDIO works again;
7781                          compilation fixes;
7782                          fix rounding in unpremultiply;
7783                          optimize vertical flip;
7784                          disable raw_len validation;
7785                          documentation fixes
7786       2.15  (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;
7787                          warning fixes; disable run-time SSE detection on gcc;
7788                          uniform handling of optional "return" values;
7789                          thread-safe initialization of zlib tables
7790       2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
7791       2.13  (2016-11-29) add 16-bit API, only supported for PNG right now
7792       2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
7793       2.11  (2016-04-02) allocate large structures on the stack
7794                          remove white matting for transparent PSD
7795                          fix reported channel count for PNG & BMP
7796                          re-enable SSE2 in non-gcc 64-bit
7797                          support RGB-formatted JPEG
7798                          read 16-bit PNGs (only as 8-bit)
7799       2.10  (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED
7800       2.09  (2016-01-16) allow comments in PNM files
7801                          16-bit-per-pixel TGA (not bit-per-component)
7802                          info() for TGA could break due to .hdr handling
7803                          info() for BMP to shares code instead of sloppy parse
7804                          can use STBI_REALLOC_SIZED if allocator doesn't support realloc
7805                          code cleanup
7806       2.08  (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
7807       2.07  (2015-09-13) fix compiler warnings
7808                          partial animated GIF support
7809                          limited 16-bpc PSD support
7810                          #ifdef unused functions
7811                          bug with < 92 byte PIC,PNM,HDR,TGA
7812       2.06  (2015-04-19) fix bug where PSD returns wrong '*comp' value
7813       2.05  (2015-04-19) fix bug in progressive JPEG handling, fix warning
7814       2.04  (2015-04-15) try to re-enable SIMD on MinGW 64-bit
7815       2.03  (2015-04-12) extra corruption checking (mmozeiko)
7816                          stbi_set_flip_vertically_on_load (nguillemot)
7817                          fix NEON support; fix mingw support
7818       2.02  (2015-01-19) fix incorrect assert, fix warning
7819       2.01  (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2
7820       2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
7821       2.00  (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)
7822                          progressive JPEG (stb)
7823                          PGM/PPM support (Ken Miller)
7824                          STBI_MALLOC,STBI_REALLOC,STBI_FREE
7825                          GIF bugfix -- seemingly never worked
7826                          STBI_NO_*, STBI_ONLY_*
7827       1.48  (2014-12-14) fix incorrectly-named assert()
7828       1.47  (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)
7829                          optimize PNG (ryg)
7830                          fix bug in interlaced PNG with user-specified channel count (stb)
7831       1.46  (2014-08-26)
7832               fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG
7833       1.45  (2014-08-16)
7834               fix MSVC-ARM internal compiler error by wrapping malloc
7835       1.44  (2014-08-07)
7836               various warning fixes from Ronny Chevalier
7837       1.43  (2014-07-15)
7838               fix MSVC-only compiler problem in code changed in 1.42
7839       1.42  (2014-07-09)
7840               don't define _CRT_SECURE_NO_WARNINGS (affects user code)
7841               fixes to stbi__cleanup_jpeg path
7842               added STBI_ASSERT to avoid requiring assert.h
7843       1.41  (2014-06-25)
7844               fix search&replace from 1.36 that messed up comments/error messages
7845       1.40  (2014-06-22)
7846               fix gcc struct-initialization warning
7847       1.39  (2014-06-15)
7848               fix to TGA optimization when req_comp != number of components in TGA;
7849               fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)
7850               add support for BMP version 5 (more ignored fields)
7851       1.38  (2014-06-06)
7852               suppress MSVC warnings on integer casts truncating values
7853               fix accidental rename of 'skip' field of I/O
7854       1.37  (2014-06-04)
7855               remove duplicate typedef
7856       1.36  (2014-06-03)
7857               convert to header file single-file library
7858               if de-iphone isn't set, load iphone images color-swapped instead of returning NULL
7859       1.35  (2014-05-27)
7860               various warnings
7861               fix broken STBI_SIMD path
7862               fix bug where stbi_load_from_file no longer left file pointer in correct place
7863               fix broken non-easy path for 32-bit BMP (possibly never used)
7864               TGA optimization by Arseny Kapoulkine
7865       1.34  (unknown)
7866               use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case
7867       1.33  (2011-07-14)
7868               make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements
7869       1.32  (2011-07-13)
7870               support for "info" function for all supported filetypes (SpartanJ)
7871       1.31  (2011-06-20)
7872               a few more leak fixes, bug in PNG handling (SpartanJ)
7873       1.30  (2011-06-11)
7874               added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)
7875               removed deprecated format-specific test/load functions
7876               removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway
7877               error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)
7878               fix inefficiency in decoding 32-bit BMP (David Woo)
7879       1.29  (2010-08-16)
7880               various warning fixes from Aurelien Pocheville
7881       1.28  (2010-08-01)
7882               fix bug in GIF palette transparency (SpartanJ)
7883       1.27  (2010-08-01)
7884               cast-to-stbi_uc to fix warnings
7885       1.26  (2010-07-24)
7886               fix bug in file buffering for PNG reported by SpartanJ
7887       1.25  (2010-07-17)
7888               refix trans_data warning (Won Chun)
7889       1.24  (2010-07-12)
7890               perf improvements reading from files on platforms with lock-heavy fgetc()
7891               minor perf improvements for jpeg
7892               deprecated type-specific functions so we'll get feedback if they're needed
7893               attempt to fix trans_data warning (Won Chun)
7894       1.23    fixed bug in iPhone support
7895       1.22  (2010-07-10)
7896               removed image *writing* support
7897               stbi_info support from Jetro Lauha
7898               GIF support from Jean-Marc Lienher
7899               iPhone PNG-extensions from James Brown
7900               warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)
7901       1.21    fix use of 'stbi_uc' in header (reported by jon blow)
7902       1.20    added support for Softimage PIC, by Tom Seddon
7903       1.19    bug in interlaced PNG corruption check (found by ryg)
7904       1.18  (2008-08-02)
7905               fix a threading bug (local mutable static)
7906       1.17    support interlaced PNG
7907       1.16    major bugfix - stbi__convert_format converted one too many pixels
7908       1.15    initialize some fields for thread safety
7909       1.14    fix threadsafe conversion bug
7910               header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
7911       1.13    threadsafe
7912       1.12    const qualifiers in the API
7913       1.11    Support installable IDCT, colorspace conversion routines
7914       1.10    Fixes for 64-bit (don't use "unsigned long")
7915               optimized upsampling by Fabian "ryg" Giesen
7916       1.09    Fix format-conversion for PSD code (bad global variables!)
7917       1.08    Thatcher Ulrich's PSD code integrated by Nicolas Schulz
7918       1.07    attempt to fix C++ warning/errors again
7919       1.06    attempt to fix C++ warning/errors again
7920       1.05    fix TGA loading to return correct *comp and use good luminance calc
7921       1.04    default float alpha is 1, not 255; use 'void *' for stbi_image_free
7922       1.03    bugfixes to STBI_NO_STDIO, STBI_NO_HDR
7923       1.02    support for (subset of) HDR files, float interface for preferred access to them
7924       1.01    fix bug: possible bug in handling right-side up bmps... not sure
7925               fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all
7926       1.00    interface to zlib that skips zlib header
7927       0.99    correct handling of alpha in palette
7928       0.98    TGA loader by lonesock; dynamically add loaders (untested)
7929       0.97    jpeg errors on too large a file; also catch another malloc failure
7930       0.96    fix detection of invalid v value - particleman@mollyrocket forum
7931       0.95    during header scan, seek to markers in case of padding
7932       0.94    STBI_NO_STDIO to disable stdio usage; rename all #defines the same
7933       0.93    handle jpegtran output; verbose errors
7934       0.92    read 4,8,16,24,32-bit BMP files of several formats
7935       0.91    output 24-bit Windows 3.0 BMP files
7936       0.90    fix a few more warnings; bump version number to approach 1.0
7937       0.61    bugfixes due to Marc LeBlanc, Christopher Lloyd
7938       0.60    fix compiling as c++
7939       0.59    fix warnings: merge Dave Moore's -Wall fixes
7940       0.58    fix bug: zlib uncompressed mode len/nlen was wrong endian
7941       0.57    fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available
7942       0.56    fix bug: zlib uncompressed mode len vs. nlen
7943       0.55    fix bug: restart_interval not initialized to 0
7944       0.54    allow NULL for 'int *comp'
7945       0.53    fix bug in png 3->4; speedup png decoding
7946       0.52    png handles req_comp=3,4 directly; minor cleanup; jpeg comments
7947       0.51    obey req_comp requests, 1-component jpegs return as 1-component,
7948               on 'test' only check type, not whether we support this variant
7949       0.50  (2006-11-19)
7950               first released version
7951 */
7952 
7953 
7954 /*
7955 ------------------------------------------------------------------------------
7956 This software is available under 2 licenses -- choose whichever you prefer.
7957 ------------------------------------------------------------------------------
7958 ALTERNATIVE A - MIT License
7959 Copyright (c) 2017 Sean Barrett
7960 Permission is hereby granted, free of charge, to any person obtaining a copy of
7961 this software and associated documentation files (the "Software"), to deal in
7962 the Software without restriction, including without limitation the rights to
7963 use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7964 of the Software, and to permit persons to whom the Software is furnished to do
7965 so, subject to the following conditions:
7966 The above copyright notice and this permission notice shall be included in all
7967 copies or substantial portions of the Software.
7968 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7969 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7970 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7971 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
7972 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
7973 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
7974 SOFTWARE.
7975 ------------------------------------------------------------------------------
7976 ALTERNATIVE B - Public Domain (www.unlicense.org)
7977 This is free and unencumbered software released into the public domain.
7978 Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
7979 software, either in source code form or as a compiled binary, for any purpose,
7980 commercial or non-commercial, and by any means.
7981 In jurisdictions that recognize copyright laws, the author or authors of this
7982 software dedicate any and all copyright interest in the software to the public
7983 domain. We make this dedication for the benefit of the public at large and to
7984 the detriment of our heirs and successors. We intend this dedication to be an
7985 overt act of relinquishment in perpetuity of all present and future rights to
7986 this software under copyright law.
7987 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7988 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7989 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7990 AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
7991 ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
7992 WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7993 ------------------------------------------------------------------------------
7994 */
7995