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