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