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