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