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