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