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