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