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