xref: /minix/sys/dev/stbi/stb_image.c (revision 0a6a1f1d)
1 /* stbi-1.29 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c
2    when you control the images you're loading
3                                      no warranty implied; use at your own risk
4 
5    QUICK NOTES:
6       Primarily of interest to game developers and other people who can
7           avoid problematic images and only need the trivial interface
8 
9       JPEG baseline (no JPEG progressive)
10       PNG 8-bit only
11 
12       TGA (not sure what subset, if a subset)
13       BMP non-1bpp, non-RLE
14       PSD (composited view only, no extra channels)
15 
16       GIF (*comp always reports as 4-channel)
17       HDR (radiance rgbE format)
18       PIC (Softimage PIC)
19 
20       - decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code)
21       - supports installable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD)
22 
23    Latest revisions:
24       1.29 (2010-08-16) various warning fixes from Aurelien Pocheville
25       1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ)
26       1.27 (2010-08-01) cast-to-uint8 to fix warnings (Laurent Gomila)
27                         allow trailing 0s at end of image data (Laurent Gomila)
28       1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ
29       1.25 (2010-07-17) refix trans_data warning (Won Chun)
30       1.24 (2010-07-12) perf improvements reading from files
31                         minor perf improvements for jpeg
32                         deprecated type-specific functions in hope of feedback
33                         attempt to fix trans_data warning (Won Chun)
34       1.23              fixed bug in iPhone support
35       1.22 (2010-07-10) removed image *writing* support to stb_image_write.h
36                         stbi_info support from Jetro Lauha
37                         GIF support from Jean-Marc Lienher
38                         iPhone PNG-extensions from James Brown
39                         warning-fixes from Nicolas Schulz and Janez Zemva
40       1.21              fix use of 'uint8' in header (reported by jon blow)
41       1.20              added support for Softimage PIC, by Tom Seddon
42 
43    See end of file for full revision history.
44 
45    TODO:
46       stbi_info support for BMP,PSD,HDR,PIC
47       rewrite stbi_info and load_file variations to share file handling code
48            (current system allows individual functions to be called directly,
49            since each does all the work, but I doubt anyone uses this in practice)
50 
51 
52  ============================    Contributors    =========================
53 
54  Image formats                                Optimizations & bugfixes
55     Sean Barrett (jpeg, png, bmp)                Fabian "ryg" Giesen
56     Nicolas Schulz (hdr, psd)
57     Jonathan Dummer (tga)                     Bug fixes & warning fixes
58     Jean-Marc Lienher (gif)                      Marc LeBlanc
59     Tom Seddon (pic)                             Christpher Lloyd
60     Thatcher Ulrich (psd)                        Dave Moore
61                                                  Won Chun
62                                                  the Horde3D community
63  Extensions, features                            Janez Zemva
64     Jetro Lauha (stbi_info)                      Jonathan Blow
65     James "moose2000" Brown (iPhone PNG)         Laurent Gomila
66                                                  Aruelien Pocheville
67 
68  If your name should be here but isn't, let Sean know.
69 
70 */
71 
72 #ifdef _KERNEL
73 #include <dev/stbi/stbiconfig.h>
74 #endif
75 
76 #ifndef STBI_INCLUDE_STB_IMAGE_H
77 #define STBI_INCLUDE_STB_IMAGE_H
78 
79 // To get a header file for this, either cut and paste the header,
80 // or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and
81 // then include stb_image.c from it.
82 
83 ////   begin header file  ////////////////////////////////////////////////////
84 //
85 // Limitations:
86 //    - no jpeg progressive support
87 //    - non-HDR formats support 8-bit samples only (jpeg, png)
88 //    - no delayed line count (jpeg) -- IJG doesn't support either
89 //    - no 1-bit BMP
90 //    - GIF always returns *comp=4
91 //
92 // Basic usage (see HDR discussion below):
93 //    int x,y,n;
94 //    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
95 //    // ... process data if not NULL ...
96 //    // ... x = width, y = height, n = # 8-bit components per pixel ...
97 //    // ... replace '0' with '1'..'4' to force that many components per pixel
98 //    stbi_image_free(data)
99 //
100 // Standard parameters:
101 //    int *x       -- outputs image width in pixels
102 //    int *y       -- outputs image height in pixels
103 //    int *comp    -- outputs # of image components in image file
104 //    int req_comp -- if non-zero, # of image components requested in result
105 //
106 // The return value from an image loader is an 'unsigned char *' which points
107 // to the pixel data. The pixel data consists of *y scanlines of *x pixels,
108 // with each pixel consisting of N interleaved 8-bit components; the first
109 // pixel pointed to is top-left-most in the image. There is no padding between
110 // image scanlines or between pixels, regardless of format. The number of
111 // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.
112 // If req_comp is non-zero, *comp has the number of components that _would_
113 // have been output otherwise. E.g. if you set req_comp to 4, you will always
114 // get RGBA output, but you can check *comp to easily see if it's opaque.
115 //
116 // An output image with N components has the following components interleaved
117 // in this order in each pixel:
118 //
119 //     N=#comp     components
120 //       1           grey
121 //       2           grey, alpha
122 //       3           red, green, blue
123 //       4           red, green, blue, alpha
124 //
125 // If image loading fails for any reason, the return value will be NULL,
126 // and *x, *y, *comp will be unchanged. The function stbi_failure_reason()
127 // can be queried for an extremely brief, end-user unfriendly explanation
128 // of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid
129 // compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
130 // more user-friendly ones.
131 //
132 // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
133 //
134 // ===========================================================================
135 //
136 // iPhone PNG support:
137 //
138 // By default we convert iphone-formatted PNGs back to RGB; nominally they
139 // would silently load as BGR, except the existing code should have just
140 // failed on such iPhone PNGs. But you can disable this conversion by
141 // by calling stbi_convert_iphone_png_to_rgb(0), in which case
142 // you will always just get the native iphone "format" through.
143 //
144 // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
145 // pixel to remove any premultiplied alpha *only* if the image file explicitly
146 // says there's premultiplied data (currently only happens in iPhone images,
147 // and only if iPhone convert-to-rgb processing is on).
148 //
149 // ===========================================================================
150 //
151 // HDR image support   (disable by defining STBI_NO_HDR)
152 //
153 // stb_image now supports loading HDR images in general, and currently
154 // the Radiance .HDR file format, although the support is provided
155 // generically. You can still load any file through the existing interface;
156 // if you attempt to load an HDR file, it will be automatically remapped to
157 // LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
158 // both of these constants can be reconfigured through this interface:
159 //
160 //     stbi_hdr_to_ldr_gamma(2.2f);
161 //     stbi_hdr_to_ldr_scale(1.0f);
162 //
163 // (note, do not use _inverse_ constants; stbi_image will invert them
164 // appropriately).
165 //
166 // Additionally, there is a new, parallel interface for loading files as
167 // (linear) floats to preserve the full dynamic range:
168 //
169 //    float *data = stbi_loadf(filename, &x, &y, &n, 0);
170 //
171 // If you load LDR images through this interface, those images will
172 // be promoted to floating point values, run through the inverse of
173 // constants corresponding to the above:
174 //
175 //     stbi_ldr_to_hdr_scale(1.0f);
176 //     stbi_ldr_to_hdr_gamma(2.2f);
177 //
178 // Finally, given a filename (or an open file or memory block--see header
179 // file for details) containing image data, you can query for the "most
180 // appropriate" interface to use (that is, whether the image is HDR or
181 // not), using:
182 //
183 //     stbi_is_hdr(char *filename);
184 
185 #ifndef STBI_NO_STDIO
186 #include <stdio.h>
187 #endif
188 
189 #define STBI_VERSION 1
190 
191 enum
192 {
193    STBI_default = 0, // only used for req_comp
194 
195    STBI_grey       = 1,
196    STBI_grey_alpha = 2,
197    STBI_rgb        = 3,
198    STBI_rgb_alpha  = 4
199 };
200 
201 typedef unsigned char stbi_uc;
202 
203 #ifdef __cplusplus
204 extern "C" {
205 #endif
206 
207 // PRIMARY API - works on images of any type
208 
209 // load image by filename, open file, or memory buffer
210 extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
211 
212 #ifndef STBI_NO_STDIO
213 extern stbi_uc *stbi_load            (char const *filename,     int *x, int *y, int *comp, int req_comp);
214 extern stbi_uc *stbi_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp);
215 // for stbi_load_from_file, file pointer is left pointing immediately after image
216 #endif
217 
218 #ifndef STBI_NO_HDR
219    extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
220 
221    #ifndef STBI_NO_STDIO
222    extern float *stbi_loadf            (char const *filename,   int *x, int *y, int *comp, int req_comp);
223    extern float *stbi_loadf_from_file  (FILE *f,                int *x, int *y, int *comp, int req_comp);
224    #endif
225 
226    extern void   stbi_hdr_to_ldr_gamma(float gamma);
227    extern void   stbi_hdr_to_ldr_scale(float scale);
228 
229    extern void   stbi_ldr_to_hdr_gamma(float gamma);
230    extern void   stbi_ldr_to_hdr_scale(float scale);
231 #endif // STBI_NO_HDR
232 
233 // get a VERY brief reason for failure
234 // NOT THREADSAFE
235 extern const char *stbi_failure_reason  (void);
236 
237 // free the loaded image -- this is just free()
238 extern void     stbi_image_free      (void *retval_from_stbi_load);
239 
240 // get image dimensions & components without fully decoding
241 extern int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
242 extern int      stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
243 
244 #ifndef STBI_NO_STDIO
245 extern int      stbi_info            (char const *filename,     int *x, int *y, int *comp);
246 extern int      stbi_info_from_file  (FILE *f,                  int *x, int *y, int *comp);
247 
248 extern int      stbi_is_hdr          (char const *filename);
249 extern int      stbi_is_hdr_from_file(FILE *f);
250 #endif
251 
252 // for image formats that explicitly notate that they have premultiplied alpha,
253 // we just return the colors as stored in the file. set this flag to force
254 // unpremultiplication. results are undefined if the unpremultiply overflow.
255 extern void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
256 
257 // indicate whether we should process iphone images back to canonical format,
258 // or just pass them through "as-is"
259 extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
260 
261 
262 // ZLIB client - used by PNG, available for other purposes
263 
264 extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
265 extern char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
266 extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
267 extern int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
268 
269 extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
270 extern int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
271 
272 // define new loaders
273 typedef struct
274 {
275    int       (*test_memory)(stbi_uc const *buffer, int len);
276    stbi_uc * (*load_from_memory)(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
277    #ifndef STBI_NO_STDIO
278    int       (*test_file)(FILE *f);
279    stbi_uc * (*load_from_file)(FILE *f, int *x, int *y, int *comp, int req_comp);
280    #endif
281 } stbi_loader;
282 
283 // register a loader by filling out the above structure (you must define ALL functions)
284 // returns 1 if added or already added, 0 if not added (too many loaders)
285 // NOT THREADSAFE
286 extern int stbi_register_loader(stbi_loader *loader);
287 
288 // define faster low-level operations (typically SIMD support)
289 #ifdef STBI_SIMD
290 typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize);
291 // compute an integer IDCT on "input"
292 //     input[x] = data[x] * dequantize[x]
293 //     write results to 'out': 64 samples, each run of 8 spaced by 'out_stride'
294 //                             CLAMP results to 0..255
295 typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const  *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step);
296 // compute a conversion from YCbCr to RGB
297 //     'count' pixels
298 //     write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B
299 //     y: Y input channel
300 //     cb: Cb input channel; scale/biased to be 0..255
301 //     cr: Cr input channel; scale/biased to be 0..255
302 
303 extern void stbi_install_idct(stbi_idct_8x8 func);
304 extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func);
305 #endif // STBI_SIMD
306 
307 
308 
309 
310 // TYPE-SPECIFIC ACCESS
311 
312 #ifdef STBI_TYPE_SPECIFIC_FUNCTIONS
313 
314 // is it a jpeg?
315 extern int      stbi_jpeg_test_memory     (stbi_uc const *buffer, int len);
316 extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
317 extern int      stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
318 
319 #ifndef STBI_NO_STDIO
320 extern stbi_uc *stbi_jpeg_load            (char const *filename,     int *x, int *y, int *comp, int req_comp);
321 extern int      stbi_jpeg_test_file       (FILE *f);
322 extern stbi_uc *stbi_jpeg_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp);
323 
324 extern int      stbi_jpeg_info            (char const *filename,     int *x, int *y, int *comp);
325 extern int      stbi_jpeg_info_from_file  (FILE *f,                  int *x, int *y, int *comp);
326 #endif
327 
328 // is it a png?
329 extern int      stbi_png_test_memory      (stbi_uc const *buffer, int len);
330 extern stbi_uc *stbi_png_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
331 extern int      stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
332 
333 #ifndef STBI_NO_STDIO
334 extern stbi_uc *stbi_png_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
335 extern int      stbi_png_info             (char const *filename,     int *x, int *y, int *comp);
336 extern int      stbi_png_test_file        (FILE *f);
337 extern stbi_uc *stbi_png_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
338 extern int      stbi_png_info_from_file   (FILE *f,                  int *x, int *y, int *comp);
339 #endif
340 
341 // is it a bmp?
342 extern int      stbi_bmp_test_memory      (stbi_uc const *buffer, int len);
343 
344 extern stbi_uc *stbi_bmp_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
345 extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
346 #ifndef STBI_NO_STDIO
347 extern int      stbi_bmp_test_file        (FILE *f);
348 extern stbi_uc *stbi_bmp_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
349 #endif
350 
351 // is it a tga?
352 extern int      stbi_tga_test_memory      (stbi_uc const *buffer, int len);
353 
354 extern stbi_uc *stbi_tga_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
355 extern stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
356 extern int stbi_tga_info_from_memory      (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
357 #ifndef STBI_NO_STDIO
358 extern int stbi_tga_info_from_file        (FILE *f, int *x, int *y, int *comp);
359 extern int      stbi_tga_test_file        (FILE *f);
360 extern stbi_uc *stbi_tga_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
361 #endif
362 
363 // is it a psd?
364 extern int      stbi_psd_test_memory      (stbi_uc const *buffer, int len);
365 
366 extern stbi_uc *stbi_psd_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
367 extern stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
368 #ifndef STBI_NO_STDIO
369 extern int      stbi_psd_test_file        (FILE *f);
370 extern stbi_uc *stbi_psd_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
371 #endif
372 
373 // is it an hdr?
374 extern int      stbi_hdr_test_memory      (stbi_uc const *buffer, int len);
375 
376 extern float *  stbi_hdr_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
377 extern float *  stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
378 #ifndef STBI_NO_STDIO
379 extern int      stbi_hdr_test_file        (FILE *f);
380 extern float *  stbi_hdr_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
381 #endif
382 
383 // is it a pic?
384 extern int      stbi_pic_test_memory      (stbi_uc const *buffer, int len);
385 
386 extern stbi_uc *stbi_pic_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
387 extern stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
388 #ifndef STBI_NO_STDIO
389 extern int      stbi_pic_test_file        (FILE *f);
390 extern stbi_uc *stbi_pic_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
391 #endif
392 
393 // is it a gif?
394 extern int      stbi_gif_test_memory      (stbi_uc const *buffer, int len);
395 
396 extern stbi_uc *stbi_gif_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
397 extern stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
398 extern int      stbi_gif_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
399 
400 #ifndef STBI_NO_STDIO
401 extern int      stbi_gif_test_file        (FILE *f);
402 extern stbi_uc *stbi_gif_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
403 extern int      stbi_gif_info             (char const *filename,     int *x, int *y, int *comp);
404 extern int      stbi_gif_info_from_file   (FILE *f,                  int *x, int *y, int *comp);
405 #endif
406 
407 #endif//STBI_TYPE_SPECIFIC_FUNCTIONS
408 
409 
410 
411 
412 #ifdef __cplusplus
413 }
414 #endif
415 
416 //
417 //
418 ////   end header file   /////////////////////////////////////////////////////
419 #endif // STBI_INCLUDE_STB_IMAGE_H
420 
421 #ifndef STBI_HEADER_FILE_ONLY
422 
423 #ifndef STBI_NO_HDR
424 #include <math.h>  // ldexp
425 #include <string.h> // strcmp
426 #endif
427 
428 #ifndef STBI_NO_STDIO
429 #include <stdio.h>
430 #endif
431 #ifdef _KERNEL
432 #include <sys/cdefs.h>
433 __KERNEL_RCSID(0, "$NetBSD: stb_image.c,v 1.6 2013/09/15 14:06:10 martin Exp $");
434 #include <sys/param.h>
435 #include <sys/systm.h>
436 #include <sys/kernel.h>
437 #include <sys/types.h>
438 #include <sys/malloc.h>
439 #else
440 #include <stdlib.h>
441 #include <memory.h>
442 #include <assert.h>
443 #include <stdarg.h>
444 #endif
445 
446 #ifdef _KERNEL
447 #define	MALLOC(size)		malloc((size), M_TEMP, M_WAITOK)
448 #define	REALLOC(ptr, size)	realloc((ptr), (size), M_TEMP, M_WAITOK)
449 #define	FREE(ptr) \
450     do { if (ptr) free((ptr), M_TEMP); } while (/*CONSTCOND*/0)
451 #else
452 #define	MALLOC(size)		malloc((size))
453 #define	REALLOC(ptr, size)	realloc((ptr), (size))
454 #define	FREE(ptr)		free((ptr))
455 #endif
456 
457 #ifndef _MSC_VER
458   #ifdef __cplusplus
459   #define __forceinline inline
460   #else
461   #define __forceinline
462   #endif
463 #endif
464 
465 
466 // implementation:
467 typedef unsigned char uint8;
468 typedef unsigned short uint16;
469 typedef   signed short  int16;
470 typedef unsigned int   uint32;
471 typedef   signed int    int32;
472 #ifndef __NetBSD__
473 typedef unsigned int   uint;
474 #endif
475 
476 // should produce compiler error if size is wrong
477 typedef unsigned char validate_uint32[sizeof(uint32)==4 ? 1 : -1];
478 
479 #if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE)
480 #define STBI_NO_WRITE
481 #endif
482 
483 #define STBI_NOTUSED(v)  v=v
484 
485 #ifdef _MSC_VER
486 #define STBI_HAS_LRTOL
487 #endif
488 
489 #ifdef STBI_HAS_LRTOL
490    #define stbi_lrot(x,y)  _lrotl(x,y)
491 #else
492    #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (32 - (y))))
493 #endif
494 
495 //////////////////////////////////////////////////////////////////////////////
496 //
497 // Generic API that works on all image types
498 //
499 
500 // deprecated functions
501 
502 // is it a jpeg?
503 extern int      stbi_jpeg_test_memory     (stbi_uc const *buffer, int len);
504 extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
505 extern int      stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
506 
507 #ifndef STBI_NO_STDIO
508 extern stbi_uc *stbi_jpeg_load            (char const *filename,     int *x, int *y, int *comp, int req_comp);
509 extern int      stbi_jpeg_test_file       (FILE *f);
510 extern stbi_uc *stbi_jpeg_load_from_file  (FILE *f,                  int *x, int *y, int *comp, int req_comp);
511 
512 extern int      stbi_jpeg_info            (char const *filename,     int *x, int *y, int *comp);
513 extern int      stbi_jpeg_info_from_file  (FILE *f,                  int *x, int *y, int *comp);
514 #endif
515 
516 // is it a png?
517 extern int      stbi_png_test_memory      (stbi_uc const *buffer, int len);
518 extern stbi_uc *stbi_png_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
519 extern int      stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
520 
521 #ifndef STBI_NO_STDIO
522 extern stbi_uc *stbi_png_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
523 extern int      stbi_png_info             (char const *filename,     int *x, int *y, int *comp);
524 extern int      stbi_png_test_file        (FILE *f);
525 extern stbi_uc *stbi_png_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
526 extern int      stbi_png_info_from_file   (FILE *f,                  int *x, int *y, int *comp);
527 #endif
528 
529 // is it a bmp?
530 extern int      stbi_bmp_test_memory      (stbi_uc const *buffer, int len);
531 
532 extern stbi_uc *stbi_bmp_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
533 extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
534 #ifndef STBI_NO_STDIO
535 extern int      stbi_bmp_test_file        (FILE *f);
536 extern stbi_uc *stbi_bmp_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
537 #endif
538 
539 // is it a tga?
540 extern int      stbi_tga_test_memory      (stbi_uc const *buffer, int len);
541 
542 extern stbi_uc *stbi_tga_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
543 extern stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
544 #ifndef STBI_NO_STDIO
545 extern int      stbi_tga_test_file        (FILE *f);
546 extern stbi_uc *stbi_tga_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
547 #endif
548 
549 // is it a psd?
550 extern int      stbi_psd_test_memory      (stbi_uc const *buffer, int len);
551 
552 extern stbi_uc *stbi_psd_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
553 extern stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
554 #ifndef STBI_NO_STDIO
555 extern int      stbi_psd_test_file        (FILE *f);
556 extern stbi_uc *stbi_psd_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
557 #endif
558 
559 // is it an hdr?
560 extern int      stbi_hdr_test_memory      (stbi_uc const *buffer, int len);
561 
562 extern float *  stbi_hdr_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
563 extern float *  stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
564 #ifndef STBI_NO_STDIO
565 extern int      stbi_hdr_test_file        (FILE *f);
566 extern float *  stbi_hdr_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
567 #endif
568 
569 // is it a pic?
570 extern int      stbi_pic_test_memory      (stbi_uc const *buffer, int len);
571 
572 extern stbi_uc *stbi_pic_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
573 extern stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
574 #ifndef STBI_NO_STDIO
575 extern int      stbi_pic_test_file        (FILE *f);
576 extern stbi_uc *stbi_pic_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
577 #endif
578 
579 // is it a gif?
580 extern int      stbi_gif_test_memory      (stbi_uc const *buffer, int len);
581 
582 extern stbi_uc *stbi_gif_load             (char const *filename,     int *x, int *y, int *comp, int req_comp);
583 extern stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
584 extern int      stbi_gif_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
585 
586 #ifndef STBI_NO_STDIO
587 extern int      stbi_gif_test_file        (FILE *f);
588 extern stbi_uc *stbi_gif_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp);
589 extern int      stbi_gif_info             (char const *filename,     int *x, int *y, int *comp);
590 extern int      stbi_gif_info_from_file   (FILE *f,                  int *x, int *y, int *comp);
591 #endif
592 
593 
594 // this is not threadsafe
595 static const char *failure_reason;
596 
597 const char *stbi_failure_reason(void)
598 {
599    return failure_reason;
600 }
601 
602 #ifndef STBI_NO_FAILURE_STRINGS
603 static int e(const char *str)
604 {
605    failure_reason = str;
606    return 0;
607 }
608 #endif
609 
610 #ifdef STBI_NO_FAILURE_STRINGS
611    #define e(x,y)  0
612 #elif defined(STBI_FAILURE_USERMSG)
613    #define e(x,y)  e(y)
614 #else
615    #define e(x,y)  e(x)
616 #endif
617 
618 #define epf(x,y)   ((float *) (e(x,y)?NULL:NULL))
619 #define epuc(x,y)  ((unsigned char *) (e(x,y)?NULL:NULL))
620 
621 void stbi_image_free(void *retval_from_stbi_load)
622 {
623    FREE(retval_from_stbi_load);
624 }
625 
626 #define MAX_LOADERS  32
627 stbi_loader *loaders[MAX_LOADERS];
628 static int max_loaders = 0;
629 
630 int stbi_register_loader(stbi_loader *loader)
631 {
632    int i;
633    for (i=0; i < MAX_LOADERS; ++i) {
634       // already present?
635       if (loaders[i] == loader)
636          return 1;
637       // end of the list?
638       if (loaders[i] == NULL) {
639          loaders[i] = loader;
640          max_loaders = i+1;
641          return 1;
642       }
643    }
644    // no room for it
645    return 0;
646 }
647 
648 #ifndef STBI_NO_HDR
649 static float   *ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
650 static stbi_uc *hdr_to_ldr(float   *data, int x, int y, int comp);
651 #endif
652 
653 #ifndef STBI_NO_STDIO
654 unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
655 {
656    FILE *f = fopen(filename, "rb");
657    unsigned char *result;
658    if (!f) return epuc("can't fopen", "Unable to open file");
659    result = stbi_load_from_file(f,x,y,comp,req_comp);
660    fclose(f);
661    return result;
662 }
663 
664 unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
665 {
666    int i;
667    if (stbi_jpeg_test_file(f)) return stbi_jpeg_load_from_file(f,x,y,comp,req_comp);
668    if (stbi_png_test_file(f))  return stbi_png_load_from_file(f,x,y,comp,req_comp);
669    if (stbi_bmp_test_file(f))  return stbi_bmp_load_from_file(f,x,y,comp,req_comp);
670    if (stbi_gif_test_file(f))  return stbi_gif_load_from_file(f,x,y,comp,req_comp);
671    if (stbi_psd_test_file(f))  return stbi_psd_load_from_file(f,x,y,comp,req_comp);
672    if (stbi_pic_test_file(f))  return stbi_pic_load_from_file(f,x,y,comp,req_comp);
673 
674    #ifndef STBI_NO_HDR
675    if (stbi_hdr_test_file(f)) {
676       float *hdr = stbi_hdr_load_from_file(f, x,y,comp,req_comp);
677       return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
678    }
679    #endif
680 
681    for (i=0; i < max_loaders; ++i)
682       if (loaders[i]->test_file(f))
683          return loaders[i]->load_from_file(f,x,y,comp,req_comp);
684    // test tga last because it's a crappy test!
685    if (stbi_tga_test_file(f))
686       return stbi_tga_load_from_file(f,x,y,comp,req_comp);
687    return epuc("unknown image type", "Image not of any known type, or corrupt");
688 }
689 #endif
690 
691 unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
692 {
693    int i;
694    if (stbi_jpeg_test_memory(buffer,len)) return stbi_jpeg_load_from_memory(buffer,len,x,y,comp,req_comp);
695    if (stbi_png_test_memory(buffer,len))  return stbi_png_load_from_memory(buffer,len,x,y,comp,req_comp);
696    if (stbi_bmp_test_memory(buffer,len))  return stbi_bmp_load_from_memory(buffer,len,x,y,comp,req_comp);
697    if (stbi_gif_test_memory(buffer,len))  return stbi_gif_load_from_memory(buffer,len,x,y,comp,req_comp);
698    if (stbi_psd_test_memory(buffer,len))  return stbi_psd_load_from_memory(buffer,len,x,y,comp,req_comp);
699    if (stbi_pic_test_memory(buffer,len))  return stbi_pic_load_from_memory(buffer,len,x,y,comp,req_comp);
700 
701    #ifndef STBI_NO_HDR
702    if (stbi_hdr_test_memory(buffer, len)) {
703       float *hdr = stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp);
704       return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
705    }
706    #endif
707 
708    for (i=0; i < max_loaders; ++i)
709       if (loaders[i]->test_memory(buffer,len))
710          return loaders[i]->load_from_memory(buffer,len,x,y,comp,req_comp);
711    // test tga last because it's a crappy test!
712    if (stbi_tga_test_memory(buffer,len))
713       return stbi_tga_load_from_memory(buffer,len,x,y,comp,req_comp);
714    return epuc("unknown image type", "Image not of any known type, or corrupt");
715 }
716 
717 #ifndef STBI_NO_HDR
718 
719 #ifndef STBI_NO_STDIO
720 float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
721 {
722    FILE *f = fopen(filename, "rb");
723    float *result;
724    if (!f) return epf("can't fopen", "Unable to open file");
725    result = stbi_loadf_from_file(f,x,y,comp,req_comp);
726    fclose(f);
727    return result;
728 }
729 
730 float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
731 {
732    unsigned char *data;
733    #ifndef STBI_NO_HDR
734    if (stbi_hdr_test_file(f))
735       return stbi_hdr_load_from_file(f,x,y,comp,req_comp);
736    #endif
737    data = stbi_load_from_file(f, x, y, comp, req_comp);
738    if (data)
739       return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
740    return epf("unknown image type", "Image not of any known type, or corrupt");
741 }
742 #endif
743 
744 float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
745 {
746    stbi_uc *data;
747    #ifndef STBI_NO_HDR
748    if (stbi_hdr_test_memory(buffer, len))
749       return stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp);
750    #endif
751    data = stbi_load_from_memory(buffer, len, x, y, comp, req_comp);
752    if (data)
753       return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
754    return epf("unknown image type", "Image not of any known type, or corrupt");
755 }
756 #endif
757 
758 // these is-hdr-or-not is defined independent of whether STBI_NO_HDR is
759 // defined, for API simplicity; if STBI_NO_HDR is defined, it always
760 // reports false!
761 
762 int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
763 {
764    #ifndef STBI_NO_HDR
765    return stbi_hdr_test_memory(buffer, len);
766    #else
767    STBI_NOTUSED(buffer);
768    STBI_NOTUSED(len);
769    return 0;
770    #endif
771 }
772 
773 #ifndef STBI_NO_STDIO
774 extern int      stbi_is_hdr          (char const *filename)
775 {
776    FILE *f = fopen(filename, "rb");
777    int result=0;
778    if (f) {
779       result = stbi_is_hdr_from_file(f);
780       fclose(f);
781    }
782    return result;
783 }
784 
785 extern int      stbi_is_hdr_from_file(FILE *f)
786 {
787    #ifndef STBI_NO_HDR
788    return stbi_hdr_test_file(f);
789    #else
790    return 0;
791    #endif
792 }
793 
794 #endif
795 
796 #ifndef STBI_NO_HDR
797 static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f;
798 static float l2h_gamma=2.2f, l2h_scale=1.0f;
799 
800 void   stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; }
801 void   stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; }
802 
803 void   stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; }
804 void   stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; }
805 #endif
806 
807 
808 //////////////////////////////////////////////////////////////////////////////
809 //
810 // Common code used by all image loaders
811 //
812 
813 enum
814 {
815    SCAN_load=0,
816    SCAN_type,
817    SCAN_header
818 };
819 
820 typedef struct
821 {
822    uint32 img_x, img_y;
823    int img_n, img_out_n;
824 
825    #ifndef STBI_NO_STDIO
826    FILE  *img_file;
827    int buflen;
828    uint8 buffer_start[128];
829    int from_file;
830    #endif
831    uint8 const *img_buffer, *img_buffer_end;
832 } stbi;
833 
834 #ifndef STBI_NO_STDIO
835 static void start_file(stbi *s, FILE *f)
836 {
837    s->img_file = f;
838    s->buflen = sizeof(s->buffer_start);
839    s->img_buffer_end = s->buffer_start + s->buflen;
840    s->img_buffer = s->img_buffer_end;
841    s->from_file = 1;
842 }
843 #endif
844 
845 static void start_mem(stbi *s, uint8 const *buffer, int len)
846 {
847 #ifndef STBI_NO_STDIO
848    s->img_file = NULL;
849    s->from_file = 0;
850 #endif
851    s->img_buffer = (uint8 const *) buffer;
852    s->img_buffer_end = (uint8 const *) buffer+len;
853 }
854 
855 #ifndef STBI_NO_STDIO
856 static void refill_buffer(stbi *s)
857 {
858    int n = fread(s->buffer_start, 1, s->buflen, s->img_file);
859    if (n == 0) {
860       s->from_file = 0;
861       s->img_buffer = s->img_buffer_end-1;
862 #if 0
863       *s->img_buffer = 0;
864 #endif
865    } else {
866       s->img_buffer = s->buffer_start;
867       s->img_buffer_end = s->buffer_start + n;
868    }
869 }
870 #endif
871 
872 __forceinline static int get8(stbi *s)
873 {
874    if (s->img_buffer < s->img_buffer_end)
875       return *s->img_buffer++;
876 #ifndef STBI_NO_STDIO
877    if (s->from_file) {
878       refill_buffer(s);
879       return *s->img_buffer++;
880    }
881 #endif
882    return 0;
883 }
884 
885 __forceinline static int at_eof(stbi *s)
886 {
887 #ifndef STBI_NO_STDIO
888    if (s->img_file) {
889       if (!feof(s->img_file)) return 0;
890       // if feof() is true, check if buffer = end
891       // special case: we've only got the special 0 character at the end
892       if (s->from_file == 0) return 1;
893    }
894 #endif
895    return s->img_buffer >= s->img_buffer_end;
896 }
897 
898 __forceinline static uint8 get8u(stbi *s)
899 {
900    return (uint8) get8(s);
901 }
902 
903 static void skip(stbi *s, int n)
904 {
905 #ifndef STBI_NO_STDIO
906    if (s->img_file) {
907       int blen = s->img_buffer_end - s->img_buffer;
908       if (blen < n) {
909          s->img_buffer = s->img_buffer_end;
910          fseek(s->img_file, n - blen, SEEK_CUR);
911          return;
912       }
913    }
914 #endif
915    s->img_buffer += n;
916 }
917 
918 static int getn(stbi *s, stbi_uc *buffer, int n)
919 {
920 #ifndef STBI_NO_STDIO
921    if (s->img_file) {
922       int blen = s->img_buffer_end - s->img_buffer;
923       if (blen < n) {
924          int res;
925          memcpy(buffer, s->img_buffer, blen);
926          res = ((int) fread(buffer + blen, 1, n - blen, s->img_file) == (n-blen));
927          s->img_buffer = s->img_buffer_end;
928          return res;
929       }
930    }
931 #endif
932    if (s->img_buffer+n <= s->img_buffer_end) {
933       memcpy(buffer, s->img_buffer, n);
934       s->img_buffer += n;
935       return 1;
936    } else
937       return 0;
938 }
939 
940 static int get16(stbi *s)
941 {
942    int z = get8(s);
943    return (z << 8) + get8(s);
944 }
945 
946 static uint32 get32(stbi *s)
947 {
948    uint32 z = get16(s);
949    return (z << 16) + get16(s);
950 }
951 
952 static int get16le(stbi *s)
953 {
954    int z = get8(s);
955    return z + (get8(s) << 8);
956 }
957 
958 static uint32 get32le(stbi *s)
959 {
960    uint32 z = get16le(s);
961    return z + (get16le(s) << 16);
962 }
963 
964 //////////////////////////////////////////////////////////////////////////////
965 //
966 //  generic converter from built-in img_n to req_comp
967 //    individual types do this automatically as much as possible (e.g. jpeg
968 //    does all cases internally since it needs to colorspace convert anyway,
969 //    and it never has alpha, so very few cases ). png can automatically
970 //    interleave an alpha=255 channel, but falls back to this for other cases
971 //
972 //  assume data buffer is malloced, so malloc a new one and free that one
973 //  only failure mode is malloc failing
974 
975 static uint8 compute_y(int r, int g, int b)
976 {
977    return (uint8) (((r*77) + (g*150) +  (29*b)) >> 8);
978 }
979 
980 static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y)
981 {
982    int i,j;
983    unsigned char *good;
984 
985    if (req_comp == img_n) return data;
986    assert(req_comp >= 1 && req_comp <= 4);
987 
988    good = (unsigned char *) MALLOC(req_comp * x * y);
989    if (good == NULL) {
990       FREE(data);
991       return epuc("outofmem", "Out of memory");
992    }
993 
994    for (j=0; j < (int) y; ++j) {
995       unsigned char *src  = data + j * x * img_n   ;
996       unsigned char *dest = good + j * x * req_comp;
997 
998       #define COMBO(a,b)  ((a)*8+(b))
999       #define CASE(a,b)   case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1000       // convert source image with img_n components to one with req_comp components;
1001       // avoid switch per pixel, so use switch per scanline and massive macros
1002       switch (COMBO(img_n, req_comp)) {
1003          CASE(1,2) dest[0]=src[0], dest[1]=255; break;
1004          CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1005          CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
1006          CASE(2,1) dest[0]=src[0]; break;
1007          CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1008          CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
1009          CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
1010          CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]); break;
1011          CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
1012          CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]); break;
1013          CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
1014          CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
1015          default: assert(0);
1016       }
1017       #undef CASE
1018    }
1019 
1020    FREE(data);
1021    return good;
1022 }
1023 
1024 #ifndef STBI_NO_HDR
1025 static float   *ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
1026 {
1027    int i,k,n;
1028    float *output = (float *) MALLOC(x * y * comp * sizeof(float));
1029    if (output == NULL) { FREE(data); return epf("outofmem", "Out of memory"); }
1030    // compute number of non-alpha components
1031    if (comp & 1) n = comp; else n = comp-1;
1032    for (i=0; i < x*y; ++i) {
1033       for (k=0; k < n; ++k) {
1034          output[i*comp + k] = (float) pow(data[i*comp+k]/255.0f, l2h_gamma) * l2h_scale;
1035       }
1036       if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
1037    }
1038    FREE(data);
1039    return output;
1040 }
1041 
1042 #define float2int(x)   ((int) (x))
1043 static stbi_uc *hdr_to_ldr(float   *data, int x, int y, int comp)
1044 {
1045    int i,k,n;
1046    stbi_uc *output = (stbi_uc *) MALLOC(x * y * comp);
1047    if (output == NULL) { FREE(data); return epuc("outofmem", "Out of memory"); }
1048    // compute number of non-alpha components
1049    if (comp & 1) n = comp; else n = comp-1;
1050    for (i=0; i < x*y; ++i) {
1051       for (k=0; k < n; ++k) {
1052          float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f;
1053          if (z < 0) z = 0;
1054          if (z > 255) z = 255;
1055          output[i*comp + k] = (uint8) float2int(z);
1056       }
1057       if (k < comp) {
1058          float z = data[i*comp+k] * 255 + 0.5f;
1059          if (z < 0) z = 0;
1060          if (z > 255) z = 255;
1061          output[i*comp + k] = (uint8) float2int(z);
1062       }
1063    }
1064    FREE(data);
1065    return output;
1066 }
1067 #endif
1068 
1069 //////////////////////////////////////////////////////////////////////////////
1070 //
1071 //  "baseline" JPEG/JFIF decoder (not actually fully baseline implementation)
1072 //
1073 //    simple implementation
1074 //      - channel subsampling of at most 2 in each dimension
1075 //      - doesn't support delayed output of y-dimension
1076 //      - simple interface (only one output format: 8-bit interleaved RGB)
1077 //      - doesn't try to recover corrupt jpegs
1078 //      - doesn't allow partial loading, loading multiple at once
1079 //      - still fast on x86 (copying globals into locals doesn't help x86)
1080 //      - allocates lots of intermediate memory (full size of all components)
1081 //        - non-interleaved case requires this anyway
1082 //        - allows good upsampling (see next)
1083 //    high-quality
1084 //      - upsampled channels are bilinearly interpolated, even across blocks
1085 //      - quality integer IDCT derived from IJG's 'slow'
1086 //    performance
1087 //      - fast huffman; reasonable integer IDCT
1088 //      - uses a lot of intermediate memory, could cache poorly
1089 //      - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4
1090 //          stb_jpeg:   1.34 seconds (MSVC6, default release build)
1091 //          stb_jpeg:   1.06 seconds (MSVC6, processor = Pentium Pro)
1092 //          IJL11.dll:  1.08 seconds (compiled by intel)
1093 //          IJG 1998:   0.98 seconds (MSVC6, makefile provided by IJG)
1094 //          IJG 1998:   0.95 seconds (MSVC6, makefile + proc=PPro)
1095 
1096 // huffman decoding acceleration
1097 #define FAST_BITS   9  // larger handles more cases; smaller stomps less cache
1098 
1099 typedef struct
1100 {
1101    uint8  fast[1 << FAST_BITS];
1102    // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
1103    uint16 code[256];
1104    uint8  values[256];
1105    uint8  size[257];
1106    unsigned int maxcode[18];
1107    int    delta[17];   // old 'firstsymbol' - old 'firstcode'
1108 } huffman;
1109 
1110 typedef struct
1111 {
1112    #ifdef STBI_SIMD
1113    unsigned short dequant2[4][64];
1114    #endif
1115    stbi s;
1116    huffman huff_dc[4];
1117    huffman huff_ac[4];
1118    uint8 dequant[4][64];
1119 
1120 // sizes for components, interleaved MCUs
1121    int img_h_max, img_v_max;
1122    int img_mcu_x, img_mcu_y;
1123    int img_mcu_w, img_mcu_h;
1124 
1125 // definition of jpeg image component
1126    struct
1127    {
1128       int id;
1129       int h,v;
1130       int tq;
1131       int hd,ha;
1132       int dc_pred;
1133 
1134       int x,y,w2,h2;
1135       uint8 *data;
1136       void *raw_data;
1137       uint8 *linebuf;
1138    } img_comp[4];
1139 
1140    uint32         code_buffer; // jpeg entropy-coded buffer
1141    int            code_bits;   // number of valid bits
1142    unsigned char  marker;      // marker seen while filling entropy buffer
1143    int            nomore;      // flag if we saw a marker so must stop
1144 
1145    int scan_n, order[4];
1146    int restart_interval, todo;
1147 } jpeg;
1148 
1149 static int build_huffman(huffman *h, int *count)
1150 {
1151    int i,j,k=0,code;
1152    // build size list for each symbol (from JPEG spec)
1153    for (i=0; i < 16; ++i)
1154       for (j=0; j < count[i]; ++j)
1155          h->size[k++] = (uint8) (i+1);
1156    h->size[k] = 0;
1157 
1158    // compute actual symbols (from jpeg spec)
1159    code = 0;
1160    k = 0;
1161    for(j=1; j <= 16; ++j) {
1162       // compute delta to add to code to compute symbol id
1163       h->delta[j] = k - code;
1164       if (h->size[k] == j) {
1165          while (h->size[k] == j)
1166             h->code[k++] = (uint16) (code++);
1167          if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG");
1168       }
1169       // compute largest code + 1 for this size, preshifted as needed later
1170       h->maxcode[j] = code << (16-j);
1171       code <<= 1;
1172    }
1173    h->maxcode[j] = 0xffffffff;
1174 
1175    // build non-spec acceleration table; 255 is flag for not-accelerated
1176    memset(h->fast, 255, 1 << FAST_BITS);
1177    for (i=0; i < k; ++i) {
1178       int s = h->size[i];
1179       if (s <= FAST_BITS) {
1180          int c = h->code[i] << (FAST_BITS-s);
1181          int m = 1 << (FAST_BITS-s);
1182          for (j=0; j < m; ++j) {
1183             h->fast[c+j] = (uint8) i;
1184          }
1185       }
1186    }
1187    return 1;
1188 }
1189 
1190 static void grow_buffer_unsafe(jpeg *j)
1191 {
1192    do {
1193       int b = j->nomore ? 0 : get8(&j->s);
1194       if (b == 0xff) {
1195          int c = get8(&j->s);
1196          if (c != 0) {
1197             j->marker = (unsigned char) c;
1198             j->nomore = 1;
1199             return;
1200          }
1201       }
1202       j->code_buffer |= b << (24 - j->code_bits);
1203       j->code_bits += 8;
1204    } while (j->code_bits <= 24);
1205 }
1206 
1207 // (1 << n) - 1
1208 static uint32 bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1209 
1210 // decode a jpeg huffman value from the bitstream
1211 __forceinline static int decode(jpeg *j, huffman *h)
1212 {
1213    unsigned int temp;
1214    int c,k;
1215 
1216    if (j->code_bits < 16) grow_buffer_unsafe(j);
1217 
1218    // look at the top FAST_BITS and determine what symbol ID it is,
1219    // if the code is <= FAST_BITS
1220    c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1221    k = h->fast[c];
1222    if (k < 255) {
1223       int s = h->size[k];
1224       if (s > j->code_bits)
1225          return -1;
1226       j->code_buffer <<= s;
1227       j->code_bits -= s;
1228       return h->values[k];
1229    }
1230 
1231    // naive test is to shift the code_buffer down so k bits are
1232    // valid, then test against maxcode. To speed this up, we've
1233    // preshifted maxcode left so that it has (16-k) 0s at the
1234    // end; in other words, regardless of the number of bits, it
1235    // wants to be compared against something shifted to have 16;
1236    // that way we don't need to shift inside the loop.
1237    temp = j->code_buffer >> 16;
1238    for (k=FAST_BITS+1 ; ; ++k)
1239       if (temp < h->maxcode[k])
1240          break;
1241    if (k == 17) {
1242       // error! code not found
1243       j->code_bits -= 16;
1244       return -1;
1245    }
1246 
1247    if (k > j->code_bits)
1248       return -1;
1249 
1250    // convert the huffman code to the symbol id
1251    c = ((j->code_buffer >> (32 - k)) & bmask[k]) + h->delta[k];
1252    assert((((j->code_buffer) >> (32 - h->size[c])) & bmask[h->size[c]]) == h->code[c]);
1253 
1254    // convert the id to a symbol
1255    j->code_bits -= k;
1256    j->code_buffer <<= k;
1257    return h->values[c];
1258 }
1259 
1260 // combined JPEG 'receive' and JPEG 'extend', since baseline
1261 // always extends everything it receives.
1262 __forceinline static int extend_receive(jpeg *j, int n)
1263 {
1264    unsigned int m = 1 << (n-1);
1265    unsigned int k;
1266    if (j->code_bits < n) grow_buffer_unsafe(j);
1267 
1268    #if 1
1269    k = stbi_lrot(j->code_buffer, n);
1270    j->code_buffer = k & ~bmask[n];
1271    k &= bmask[n];
1272    j->code_bits -= n;
1273    #else
1274    k = (j->code_buffer >> (32 - n)) & bmask[n];
1275    j->code_bits -= n;
1276    j->code_buffer <<= n;
1277    #endif
1278    // the following test is probably a random branch that won't
1279    // predict well. I tried to table accelerate it but failed.
1280    // maybe it's compiling as a conditional move?
1281    if (k < m)
1282       return (-1 << n) + k + 1;
1283    else
1284       return k;
1285 }
1286 
1287 // given a value that's at position X in the zigzag stream,
1288 // where does it appear in the 8x8 matrix coded as row-major?
1289 static uint8 dezigzag[64+15] =
1290 {
1291     0,  1,  8, 16,  9,  2,  3, 10,
1292    17, 24, 32, 25, 18, 11,  4,  5,
1293    12, 19, 26, 33, 40, 48, 41, 34,
1294    27, 20, 13,  6,  7, 14, 21, 28,
1295    35, 42, 49, 56, 57, 50, 43, 36,
1296    29, 22, 15, 23, 30, 37, 44, 51,
1297    58, 59, 52, 45, 38, 31, 39, 46,
1298    53, 60, 61, 54, 47, 55, 62, 63,
1299    // let corrupt input sample past end
1300    63, 63, 63, 63, 63, 63, 63, 63,
1301    63, 63, 63, 63, 63, 63, 63
1302 };
1303 
1304 // decode one 64-entry block--
1305 static int decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b)
1306 {
1307    int diff,dc,k;
1308    int t = decode(j, hdc);
1309    if (t < 0) return e("bad huffman code","Corrupt JPEG");
1310 
1311    // 0 all the ac values now so we can do it 32-bits at a time
1312    memset(data,0,64*sizeof(data[0]));
1313 
1314    diff = t ? extend_receive(j, t) : 0;
1315    dc = j->img_comp[b].dc_pred + diff;
1316    j->img_comp[b].dc_pred = dc;
1317    data[0] = (short) dc;
1318 
1319    // decode AC components, see JPEG spec
1320    k = 1;
1321    do {
1322       int r,s;
1323       int rs = decode(j, hac);
1324       if (rs < 0) return e("bad huffman code","Corrupt JPEG");
1325       s = rs & 15;
1326       r = rs >> 4;
1327       if (s == 0) {
1328          if (rs != 0xf0) break; // end block
1329          k += 16;
1330       } else {
1331          k += r;
1332          // decode into unzigzag'd location
1333          data[dezigzag[k++]] = (short) extend_receive(j,s);
1334       }
1335    } while (k < 64);
1336    return 1;
1337 }
1338 
1339 // take a -128..127 value and clamp it and convert to 0..255
1340 __forceinline static uint8 clamp(int x)
1341 {
1342    // trick to use a single test to catch both cases
1343    if ((unsigned int) x > 255) {
1344       if (x < 0) return 0;
1345       if (x > 255) return 255;
1346    }
1347    return (uint8) x;
1348 }
1349 
1350 #define f2f(x)  (int) (((x) * 4096 + 0.5))
1351 #define fsh(x)  ((x) << 12)
1352 
1353 // derived from jidctint -- DCT_ISLOW
1354 #define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7)       \
1355    int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
1356    p2 = s2;                                    \
1357    p3 = s6;                                    \
1358    p1 = (p2+p3) * f2f(0.5411961f);             \
1359    t2 = p1 + p3*f2f(-1.847759065f);            \
1360    t3 = p1 + p2*f2f( 0.765366865f);            \
1361    p2 = s0;                                    \
1362    p3 = s4;                                    \
1363    t0 = fsh(p2+p3);                            \
1364    t1 = fsh(p2-p3);                            \
1365    x0 = t0+t3;                                 \
1366    x3 = t0-t3;                                 \
1367    x1 = t1+t2;                                 \
1368    x2 = t1-t2;                                 \
1369    t0 = s7;                                    \
1370    t1 = s5;                                    \
1371    t2 = s3;                                    \
1372    t3 = s1;                                    \
1373    p3 = t0+t2;                                 \
1374    p4 = t1+t3;                                 \
1375    p1 = t0+t3;                                 \
1376    p2 = t1+t2;                                 \
1377    p5 = (p3+p4)*f2f( 1.175875602f);            \
1378    t0 = t0*f2f( 0.298631336f);                 \
1379    t1 = t1*f2f( 2.053119869f);                 \
1380    t2 = t2*f2f( 3.072711026f);                 \
1381    t3 = t3*f2f( 1.501321110f);                 \
1382    p1 = p5 + p1*f2f(-0.899976223f);            \
1383    p2 = p5 + p2*f2f(-2.562915447f);            \
1384    p3 = p3*f2f(-1.961570560f);                 \
1385    p4 = p4*f2f(-0.390180644f);                 \
1386    t3 += p1+p4;                                \
1387    t2 += p2+p3;                                \
1388    t1 += p2+p4;                                \
1389    t0 += p1+p3;
1390 
1391 #ifdef STBI_SIMD
1392 typedef unsigned short stbi_dequantize_t;
1393 #else
1394 typedef uint8 stbi_dequantize_t;
1395 #endif
1396 
1397 // .344 seconds on 3*anemones.jpg
1398 static void idct_block(uint8 *out, int out_stride, short data[64], stbi_dequantize_t *dequantize)
1399 {
1400    int i,val[64],*v=val;
1401    stbi_dequantize_t *dq = dequantize;
1402    uint8 *o;
1403    short *d = data;
1404 
1405    // columns
1406    for (i=0; i < 8; ++i,++d,++dq, ++v) {
1407       // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
1408       if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
1409            && d[40]==0 && d[48]==0 && d[56]==0) {
1410          //    no shortcut                 0     seconds
1411          //    (1|2|3|4|5|6|7)==0          0     seconds
1412          //    all separate               -0.047 seconds
1413          //    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds
1414          int dcterm = d[0] * dq[0] << 2;
1415          v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1416       } else {
1417          IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24],
1418                  d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56])
1419          // constants scaled things up by 1<<12; let's bring them back
1420          // down, but keep 2 extra bits of precision
1421          x0 += 512; x1 += 512; x2 += 512; x3 += 512;
1422          v[ 0] = (x0+t3) >> 10;
1423          v[56] = (x0-t3) >> 10;
1424          v[ 8] = (x1+t2) >> 10;
1425          v[48] = (x1-t2) >> 10;
1426          v[16] = (x2+t1) >> 10;
1427          v[40] = (x2-t1) >> 10;
1428          v[24] = (x3+t0) >> 10;
1429          v[32] = (x3-t0) >> 10;
1430       }
1431    }
1432 
1433    for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
1434       // no fast case since the first 1D IDCT spread components out
1435       IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
1436       // constants scaled things up by 1<<12, plus we had 1<<2 from first
1437       // loop, plus horizontal and vertical each scale by sqrt(8) so together
1438       // we've got an extra 1<<3, so 1<<17 total we need to remove.
1439       // so we want to round that, which means adding 0.5 * 1<<17,
1440       // aka 65536. Also, we'll end up with -128 to 127 that we want
1441       // to encode as 0..255 by adding 128, so we'll add that before the shift
1442       x0 += 65536 + (128<<17);
1443       x1 += 65536 + (128<<17);
1444       x2 += 65536 + (128<<17);
1445       x3 += 65536 + (128<<17);
1446       // tried computing the shifts into temps, or'ing the temps to see
1447       // if any were out of range, but that was slower
1448       o[0] = clamp((x0+t3) >> 17);
1449       o[7] = clamp((x0-t3) >> 17);
1450       o[1] = clamp((x1+t2) >> 17);
1451       o[6] = clamp((x1-t2) >> 17);
1452       o[2] = clamp((x2+t1) >> 17);
1453       o[5] = clamp((x2-t1) >> 17);
1454       o[3] = clamp((x3+t0) >> 17);
1455       o[4] = clamp((x3-t0) >> 17);
1456    }
1457 }
1458 
1459 #ifdef STBI_SIMD
1460 static stbi_idct_8x8 stbi_idct_installed = idct_block;
1461 
1462 extern void stbi_install_idct(stbi_idct_8x8 func)
1463 {
1464    stbi_idct_installed = func;
1465 }
1466 #endif
1467 
1468 #define MARKER_none  0xff
1469 // if there's a pending marker from the entropy stream, return that
1470 // otherwise, fetch from the stream and get a marker. if there's no
1471 // marker, return 0xff, which is never a valid marker value
1472 static uint8 get_marker(jpeg *j)
1473 {
1474    uint8 x;
1475    if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; }
1476    x = get8u(&j->s);
1477    if (x != 0xff) return MARKER_none;
1478    while (x == 0xff)
1479       x = get8u(&j->s);
1480    return x;
1481 }
1482 
1483 // in each scan, we'll have scan_n components, and the order
1484 // of the components is specified by order[]
1485 #define RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)
1486 
1487 // after a restart interval, reset the entropy decoder and
1488 // the dc prediction
1489 static void reset(jpeg *j)
1490 {
1491    j->code_bits = 0;
1492    j->code_buffer = 0;
1493    j->nomore = 0;
1494    j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
1495    j->marker = MARKER_none;
1496    j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
1497    // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
1498    // since we don't even allow 1<<30 pixels
1499 }
1500 
1501 static int parse_entropy_coded_data(jpeg *z)
1502 {
1503    reset(z);
1504    if (z->scan_n == 1) {
1505       int i,j;
1506       #ifdef STBI_SIMD
1507       __declspec(align(16))
1508       #endif
1509       short data[64];
1510       int n = z->order[0];
1511       // non-interleaved data, we just need to process one block at a time,
1512       // in trivial scanline order
1513       // number of blocks to do just depends on how many actual "pixels" this
1514       // component has, independent of interleaved MCU blocking and such
1515       int w = (z->img_comp[n].x+7) >> 3;
1516       int h = (z->img_comp[n].y+7) >> 3;
1517       for (j=0; j < h; ++j) {
1518          for (i=0; i < w; ++i) {
1519             if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0;
1520             #ifdef STBI_SIMD
1521             stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1522             #else
1523             idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1524             #endif
1525             // every data block is an MCU, so countdown the restart interval
1526             if (--z->todo <= 0) {
1527                if (z->code_bits < 24) grow_buffer_unsafe(z);
1528                // if it's NOT a restart, then just bail, so we get corrupt data
1529                // rather than no data
1530                if (!RESTART(z->marker)) return 1;
1531                reset(z);
1532             }
1533          }
1534       }
1535    } else { // interleaved!
1536       int i,j,k,x,y;
1537       short data[64];
1538       for (j=0; j < z->img_mcu_y; ++j) {
1539          for (i=0; i < z->img_mcu_x; ++i) {
1540             // scan an interleaved mcu... process scan_n components in order
1541             for (k=0; k < z->scan_n; ++k) {
1542                int n = z->order[k];
1543                // scan out an mcu's worth of this component; that's just determined
1544                // by the basic H and V specified for the component
1545                for (y=0; y < z->img_comp[n].v; ++y) {
1546                   for (x=0; x < z->img_comp[n].h; ++x) {
1547                      int x2 = (i*z->img_comp[n].h + x)*8;
1548                      int y2 = (j*z->img_comp[n].v + y)*8;
1549                      if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0;
1550                      #ifdef STBI_SIMD
1551                      stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1552                      #else
1553                      idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1554                      #endif
1555                   }
1556                }
1557             }
1558             // after all interleaved components, that's an interleaved MCU,
1559             // so now count down the restart interval
1560             if (--z->todo <= 0) {
1561                if (z->code_bits < 24) grow_buffer_unsafe(z);
1562                // if it's NOT a restart, then just bail, so we get corrupt data
1563                // rather than no data
1564                if (!RESTART(z->marker)) return 1;
1565                reset(z);
1566             }
1567          }
1568       }
1569    }
1570    return 1;
1571 }
1572 
1573 static int process_marker(jpeg *z, int marker)
1574 {
1575    int L;
1576    switch (marker) {
1577       case MARKER_none: // no marker found
1578          return e("expected marker","Corrupt JPEG");
1579 
1580       case 0xC2: // SOF - progressive
1581          return e("progressive jpeg","JPEG format not supported (progressive)");
1582 
1583       case 0xDD: // DRI - specify restart interval
1584          if (get16(&z->s) != 4) return e("bad DRI len","Corrupt JPEG");
1585          z->restart_interval = get16(&z->s);
1586          return 1;
1587 
1588       case 0xDB: // DQT - define quantization table
1589          L = get16(&z->s)-2;
1590          while (L > 0) {
1591             int q = get8(&z->s);
1592             int p = q >> 4;
1593             int t = q & 15,i;
1594             if (p != 0) return e("bad DQT type","Corrupt JPEG");
1595             if (t > 3) return e("bad DQT table","Corrupt JPEG");
1596             for (i=0; i < 64; ++i)
1597                z->dequant[t][dezigzag[i]] = get8u(&z->s);
1598             #ifdef STBI_SIMD
1599             for (i=0; i < 64; ++i)
1600                z->dequant2[t][i] = z->dequant[t][i];
1601             #endif
1602             L -= 65;
1603          }
1604          return L==0;
1605 
1606       case 0xC4: // DHT - define huffman table
1607          L = get16(&z->s)-2;
1608          while (L > 0) {
1609             uint8 *v;
1610             int sizes[16],i,m=0;
1611             int q = get8(&z->s);
1612             int tc = q >> 4;
1613             int th = q & 15;
1614             if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG");
1615             for (i=0; i < 16; ++i) {
1616                sizes[i] = get8(&z->s);
1617                m += sizes[i];
1618             }
1619             L -= 17;
1620             if (tc == 0) {
1621                if (!build_huffman(z->huff_dc+th, sizes)) return 0;
1622                v = z->huff_dc[th].values;
1623             } else {
1624                if (!build_huffman(z->huff_ac+th, sizes)) return 0;
1625                v = z->huff_ac[th].values;
1626             }
1627             for (i=0; i < m; ++i)
1628                v[i] = get8u(&z->s);
1629             L -= m;
1630          }
1631          return L==0;
1632    }
1633    // check for comment block or APP blocks
1634    if ((marker >= 0xE0 && marker <= 0xEF) || marker == 0xFE) {
1635       skip(&z->s, get16(&z->s)-2);
1636       return 1;
1637    }
1638    return 0;
1639 }
1640 
1641 // after we see SOS
1642 static int process_scan_header(jpeg *z)
1643 {
1644    int i;
1645    int Ls = get16(&z->s);
1646    z->scan_n = get8(&z->s);
1647    if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s.img_n) return e("bad SOS component count","Corrupt JPEG");
1648    if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG");
1649    for (i=0; i < z->scan_n; ++i) {
1650       int id = get8(&z->s), which;
1651       int q = get8(&z->s);
1652       for (which = 0; which < z->s.img_n; ++which)
1653          if (z->img_comp[which].id == id)
1654             break;
1655       if (which == z->s.img_n) return 0;
1656       z->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG");
1657       z->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG");
1658       z->order[i] = which;
1659    }
1660    if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG");
1661    get8(&z->s); // should be 63, but might be 0
1662    if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG");
1663 
1664    return 1;
1665 }
1666 
1667 static int process_frame_header(jpeg *z, int scan)
1668 {
1669    stbi *s = &z->s;
1670    int Lf,p,i,q, h_max=1,v_max=1,c;
1671    Lf = get16(s);         if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG
1672    p  = get8(s);          if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
1673    s->img_y = get16(s);   if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
1674    s->img_x = get16(s);   if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires
1675    c = get8(s);
1676    if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG");    // JFIF requires
1677    s->img_n = c;
1678    for (i=0; i < c; ++i) {
1679       z->img_comp[i].data = NULL;
1680       z->img_comp[i].linebuf = NULL;
1681    }
1682 
1683    if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG");
1684 
1685    for (i=0; i < s->img_n; ++i) {
1686       z->img_comp[i].id = get8(s);
1687       if (z->img_comp[i].id != i+1)   // JFIF requires
1688          if (z->img_comp[i].id != i)  // some version of jpegtran outputs non-JFIF-compliant files!
1689             return e("bad component ID","Corrupt JPEG");
1690       q = get8(s);
1691       z->img_comp[i].h = (q >> 4);  if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG");
1692       z->img_comp[i].v = q & 15;    if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG");
1693       z->img_comp[i].tq = get8(s);  if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG");
1694    }
1695 
1696    if (scan != SCAN_load) return 1;
1697 
1698    if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode");
1699 
1700    for (i=0; i < s->img_n; ++i) {
1701       if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
1702       if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
1703    }
1704 
1705    // compute interleaved mcu info
1706    z->img_h_max = h_max;
1707    z->img_v_max = v_max;
1708    z->img_mcu_w = h_max * 8;
1709    z->img_mcu_h = v_max * 8;
1710    z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
1711    z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
1712 
1713    for (i=0; i < s->img_n; ++i) {
1714       // number of effective pixels (e.g. for non-interleaved MCU)
1715       z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
1716       z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
1717       // to simplify generation, we'll allocate enough memory to decode
1718       // the bogus oversized data from using interleaved MCUs and their
1719       // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
1720       // discard the extra data until colorspace conversion
1721       z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
1722       z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
1723       z->img_comp[i].raw_data = MALLOC(z->img_comp[i].w2 * z->img_comp[i].h2+15);
1724       if (z->img_comp[i].raw_data == NULL) {
1725          for(--i; i >= 0; --i) {
1726             FREE(z->img_comp[i].raw_data);
1727             z->img_comp[i].data = NULL;
1728          }
1729          return e("outofmem", "Out of memory");
1730       }
1731       // align blocks for installable-idct using mmx/sse
1732       z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
1733       z->img_comp[i].linebuf = NULL;
1734    }
1735 
1736    return 1;
1737 }
1738 
1739 // use comparisons since in some cases we handle more than one case (e.g. SOF)
1740 #define DNL(x)         ((x) == 0xdc)
1741 #define SOI(x)         ((x) == 0xd8)
1742 #define EOI(x)         ((x) == 0xd9)
1743 #define SOF(x)         ((x) == 0xc0 || (x) == 0xc1)
1744 #define SOS(x)         ((x) == 0xda)
1745 
1746 static int decode_jpeg_header(jpeg *z, int scan)
1747 {
1748    int m;
1749    z->marker = MARKER_none; // initialize cached marker to empty
1750    m = get_marker(z);
1751    if (!SOI(m)) return e("no SOI","Corrupt JPEG");
1752    if (scan == SCAN_type) return 1;
1753    m = get_marker(z);
1754    while (!SOF(m)) {
1755       if (!process_marker(z,m)) return 0;
1756       m = get_marker(z);
1757       while (m == MARKER_none) {
1758          // some files have extra padding after their blocks, so ok, we'll scan
1759          if (at_eof(&z->s)) return e("no SOF", "Corrupt JPEG");
1760          m = get_marker(z);
1761       }
1762    }
1763    if (!process_frame_header(z, scan)) return 0;
1764    return 1;
1765 }
1766 
1767 static int decode_jpeg_image(jpeg *j)
1768 {
1769    int m;
1770    j->restart_interval = 0;
1771    if (!decode_jpeg_header(j, SCAN_load)) return 0;
1772    m = get_marker(j);
1773    while (!EOI(m)) {
1774       if (SOS(m)) {
1775          if (!process_scan_header(j)) return 0;
1776          if (!parse_entropy_coded_data(j)) return 0;
1777          if (j->marker == MARKER_none ) {
1778             // handle 0s at the end of image data from IP Kamera 9060
1779             while (!at_eof(&j->s)) {
1780                int x = get8(&j->s);
1781                if (x == 255) {
1782                   j->marker = get8u(&j->s);
1783                   break;
1784                } else if (x != 0) {
1785                   return 0;
1786                }
1787             }
1788             // if we reach eof without hitting a marker, get_marker() below will fail and we'll eventually return 0
1789          }
1790       } else {
1791          if (!process_marker(j, m)) return 0;
1792       }
1793       m = get_marker(j);
1794    }
1795    return 1;
1796 }
1797 
1798 // static jfif-centered resampling (across block boundaries)
1799 
1800 typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1,
1801                                     int w, int hs);
1802 
1803 #define div4(x) ((uint8) ((x) >> 2))
1804 
1805 static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1806 {
1807    STBI_NOTUSED(out);
1808    STBI_NOTUSED(in_far);
1809    STBI_NOTUSED(w);
1810    STBI_NOTUSED(hs);
1811    return in_near;
1812 }
1813 
1814 static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1815 {
1816    // need to generate two samples vertically for every one in input
1817    int i;
1818    STBI_NOTUSED(hs);
1819    for (i=0; i < w; ++i)
1820       out[i] = div4(3*in_near[i] + in_far[i] + 2);
1821    return out;
1822 }
1823 
1824 static uint8*  resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1825 {
1826    // need to generate two samples horizontally for every one in input
1827    int i;
1828    uint8 *input = in_near;
1829 
1830    if (w == 1) {
1831       // if only one sample, can't do any interpolation
1832       out[0] = out[1] = input[0];
1833       return out;
1834    }
1835 
1836    out[0] = input[0];
1837    out[1] = div4(input[0]*3 + input[1] + 2);
1838    for (i=1; i < w-1; ++i) {
1839       int n = 3*input[i]+2;
1840       out[i*2+0] = div4(n+input[i-1]);
1841       out[i*2+1] = div4(n+input[i+1]);
1842    }
1843    out[i*2+0] = div4(input[w-2]*3 + input[w-1] + 2);
1844    out[i*2+1] = input[w-1];
1845 
1846    STBI_NOTUSED(in_far);
1847    STBI_NOTUSED(hs);
1848 
1849    return out;
1850 }
1851 
1852 #define div16(x) ((uint8) ((x) >> 4))
1853 
1854 static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1855 {
1856    // need to generate 2x2 samples for every one in input
1857    int i,t0,t1;
1858    if (w == 1) {
1859       out[0] = out[1] = div4(3*in_near[0] + in_far[0] + 2);
1860       return out;
1861    }
1862 
1863    t1 = 3*in_near[0] + in_far[0];
1864    out[0] = div4(t1+2);
1865    for (i=1; i < w; ++i) {
1866       t0 = t1;
1867       t1 = 3*in_near[i]+in_far[i];
1868       out[i*2-1] = div16(3*t0 + t1 + 8);
1869       out[i*2  ] = div16(3*t1 + t0 + 8);
1870    }
1871    out[w*2-1] = div4(t1+2);
1872 
1873    STBI_NOTUSED(hs);
1874 
1875    return out;
1876 }
1877 
1878 static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1879 {
1880    // resample with nearest-neighbor
1881    int i,j;
1882    in_far = in_far;
1883    for (i=0; i < w; ++i)
1884       for (j=0; j < hs; ++j)
1885          out[i*hs+j] = in_near[i];
1886    return out;
1887 }
1888 
1889 #define float2fixed(x)  ((int) ((x) * 65536 + 0.5))
1890 
1891 // 0.38 seconds on 3*anemones.jpg   (0.25 with processor = Pro)
1892 // VC6 without processor=Pro is generating multiple LEAs per multiply!
1893 static void YCbCr_to_RGB_row(uint8 *out, const uint8 *y, const uint8 *pcb, const uint8 *pcr, int count, int step)
1894 {
1895    int i;
1896    for (i=0; i < count; ++i) {
1897       int y_fixed = (y[i] << 16) + 32768; // rounding
1898       int r,g,b;
1899       int cr = pcr[i] - 128;
1900       int cb = pcb[i] - 128;
1901       r = y_fixed + cr*float2fixed(1.40200f);
1902       g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
1903       b = y_fixed                            + cb*float2fixed(1.77200f);
1904       r >>= 16;
1905       g >>= 16;
1906       b >>= 16;
1907       if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
1908       if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
1909       if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
1910       out[0] = (uint8)r;
1911       out[1] = (uint8)g;
1912       out[2] = (uint8)b;
1913       out[3] = 255;
1914       out += step;
1915    }
1916 }
1917 
1918 #ifdef STBI_SIMD
1919 static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row;
1920 
1921 void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func)
1922 {
1923    stbi_YCbCr_installed = func;
1924 }
1925 #endif
1926 
1927 
1928 // clean up the temporary component buffers
1929 static void cleanup_jpeg(jpeg *j)
1930 {
1931    int i;
1932    for (i=0; i < j->s.img_n; ++i) {
1933       if (j->img_comp[i].data) {
1934          FREE(j->img_comp[i].raw_data);
1935          j->img_comp[i].data = NULL;
1936       }
1937       if (j->img_comp[i].linebuf) {
1938          FREE(j->img_comp[i].linebuf);
1939          j->img_comp[i].linebuf = NULL;
1940       }
1941    }
1942 }
1943 
1944 typedef struct
1945 {
1946    resample_row_func resample;
1947    uint8 *line0,*line1;
1948    int hs,vs;   // expansion factor in each axis
1949    int w_lores; // horizontal pixels pre-expansion
1950    int ystep;   // how far through vertical expansion we are
1951    int ypos;    // which pre-expansion row we're on
1952 } stbi_resample;
1953 
1954 static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
1955 {
1956    int n, decode_n;
1957    // validate req_comp
1958    if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error");
1959    z->s.img_n = 0;
1960 
1961    // load a jpeg image from whichever source
1962    if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; }
1963 
1964    // determine actual number of components to generate
1965    n = req_comp ? req_comp : z->s.img_n;
1966 
1967    if (z->s.img_n == 3 && n < 3)
1968       decode_n = 1;
1969    else
1970       decode_n = z->s.img_n;
1971 
1972    // resample and color-convert
1973    {
1974       int k;
1975       uint i,j;
1976       uint8 *output;
1977       uint8 *coutput[4];
1978 
1979       stbi_resample res_comp[4];
1980 
1981       for (k=0; k < decode_n; ++k) {
1982          stbi_resample *r = &res_comp[k];
1983 
1984          // allocate line buffer big enough for upsampling off the edges
1985          // with upsample factor of 4
1986          z->img_comp[k].linebuf = (uint8 *) MALLOC(z->s.img_x + 3);
1987          if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); }
1988 
1989          r->hs      = z->img_h_max / z->img_comp[k].h;
1990          r->vs      = z->img_v_max / z->img_comp[k].v;
1991          r->ystep   = r->vs >> 1;
1992          r->w_lores = (z->s.img_x + r->hs-1) / r->hs;
1993          r->ypos    = 0;
1994          r->line0   = r->line1 = z->img_comp[k].data;
1995 
1996          if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
1997          else if (r->hs == 1 && r->vs == 2) r->resample = resample_row_v_2;
1998          else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2;
1999          else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2;
2000          else                               r->resample = resample_row_generic;
2001       }
2002 
2003       // can't error after this so, this is safe
2004       output = (uint8 *) MALLOC(n * z->s.img_x * z->s.img_y + 1);
2005       if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); }
2006 
2007       // now go ahead and resample
2008       for (j=0; j < z->s.img_y; ++j) {
2009          uint8 *out = output + n * z->s.img_x * j;
2010          for (k=0; k < decode_n; ++k) {
2011             stbi_resample *r = &res_comp[k];
2012             int y_bot = r->ystep >= (r->vs >> 1);
2013             coutput[k] = r->resample(z->img_comp[k].linebuf,
2014                                      y_bot ? r->line1 : r->line0,
2015                                      y_bot ? r->line0 : r->line1,
2016                                      r->w_lores, r->hs);
2017             if (++r->ystep >= r->vs) {
2018                r->ystep = 0;
2019                r->line0 = r->line1;
2020                if (++r->ypos < z->img_comp[k].y)
2021                   r->line1 += z->img_comp[k].w2;
2022             }
2023          }
2024          if (n >= 3) {
2025             uint8 *y = coutput[0];
2026             if (z->s.img_n == 3) {
2027                #ifdef STBI_SIMD
2028                stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n);
2029                #else
2030                YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s.img_x, n);
2031                #endif
2032             } else
2033                for (i=0; i < z->s.img_x; ++i) {
2034                   out[0] = out[1] = out[2] = y[i];
2035                   out[3] = 255; // not used if n==3
2036                   out += n;
2037                }
2038          } else {
2039             uint8 *y = coutput[0];
2040             if (n == 1)
2041                for (i=0; i < z->s.img_x; ++i) out[i] = y[i];
2042             else
2043                for (i=0; i < z->s.img_x; ++i) *out++ = y[i], *out++ = 255;
2044          }
2045       }
2046       cleanup_jpeg(z);
2047       *out_x = z->s.img_x;
2048       *out_y = z->s.img_y;
2049       if (comp) *comp  = z->s.img_n; // report original components, not output
2050       return output;
2051    }
2052 }
2053 
2054 #ifndef STBI_NO_STDIO
2055 unsigned char *stbi_jpeg_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
2056 {
2057    jpeg j;
2058    start_file(&j.s, f);
2059    return load_jpeg_image(&j, x,y,comp,req_comp);
2060 }
2061 
2062 unsigned char *stbi_jpeg_load(char const *filename, int *x, int *y, int *comp, int req_comp)
2063 {
2064    unsigned char *data;
2065    FILE *f = fopen(filename, "rb");
2066    if (!f) return NULL;
2067    data = stbi_jpeg_load_from_file(f,x,y,comp,req_comp);
2068    fclose(f);
2069    return data;
2070 }
2071 #endif
2072 
2073 unsigned char *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
2074 {
2075    #ifdef STBI_SMALL_STACK
2076    unsigned char *result;
2077    jpeg *j = (jpeg *) MALLOC(sizeof(*j));
2078    start_mem(&j->s, buffer, len);
2079    result = load_jpeg_image(j,x,y,comp,req_comp);
2080    FREE(j);
2081    return result;
2082    #else
2083    jpeg j;
2084    start_mem(&j.s, buffer,len);
2085    return load_jpeg_image(&j, x,y,comp,req_comp);
2086    #endif
2087 }
2088 
2089 static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp)
2090 {
2091    if (!decode_jpeg_header(j, SCAN_header))
2092       return 0;
2093    if (x) *x = j->s.img_x;
2094    if (y) *y = j->s.img_y;
2095    if (comp) *comp = j->s.img_n;
2096    return 1;
2097 }
2098 
2099 #ifndef STBI_NO_STDIO
2100 int stbi_jpeg_test_file(FILE *f)
2101 {
2102    int n,r;
2103    jpeg j;
2104    n = ftell(f);
2105    start_file(&j.s, f);
2106    r = decode_jpeg_header(&j, SCAN_type);
2107    fseek(f,n,SEEK_SET);
2108    return r;
2109 }
2110 
2111 int stbi_jpeg_info_from_file(FILE *f, int *x, int *y, int *comp)
2112 {
2113     jpeg j;
2114     long n = ftell(f);
2115     int res;
2116     start_file(&j.s, f);
2117     res = stbi_jpeg_info_raw(&j, x, y, comp);
2118     fseek(f, n, SEEK_SET);
2119     return res;
2120 }
2121 
2122 int stbi_jpeg_info(char const *filename, int *x, int *y, int *comp)
2123 {
2124     FILE *f = fopen(filename, "rb");
2125     int result;
2126     if (!f) return e("can't fopen", "Unable to open file");
2127     result = stbi_jpeg_info_from_file(f, x, y, comp);
2128     fclose(f);
2129     return result;
2130 }
2131 #endif
2132 
2133 int stbi_jpeg_test_memory(stbi_uc const *buffer, int len)
2134 {
2135    jpeg j;
2136    start_mem(&j.s, buffer,len);
2137    return decode_jpeg_header(&j, SCAN_type);
2138 }
2139 
2140 int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
2141 {
2142     jpeg j;
2143     start_mem(&j.s, buffer, len);
2144     return stbi_jpeg_info_raw(&j, x, y, comp);
2145 }
2146 
2147 #ifndef STBI_NO_STDIO
2148 extern int      stbi_jpeg_info            (char const *filename,           int *x, int *y, int *comp);
2149 extern int      stbi_jpeg_info_from_file  (FILE *f,                  int *x, int *y, int *comp);
2150 #endif
2151 extern int      stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
2152 
2153 // public domain zlib decode    v0.2  Sean Barrett 2006-11-18
2154 //    simple implementation
2155 //      - all input must be provided in an upfront buffer
2156 //      - all output is written to a single output buffer (can malloc/realloc)
2157 //    performance
2158 //      - fast huffman
2159 
2160 // fast-way is faster to check than jpeg huffman, but slow way is slower
2161 #define ZFAST_BITS  9 // accelerate all cases in default tables
2162 #define ZFAST_MASK  ((1 << ZFAST_BITS) - 1)
2163 
2164 // zlib-style huffman encoding
2165 // (jpegs packs from left, zlib from right, so can't share code)
2166 typedef struct
2167 {
2168    uint16 fast[1 << ZFAST_BITS];
2169    uint16 firstcode[16];
2170    int maxcode[17];
2171    uint16 firstsymbol[16];
2172    uint8  size[288];
2173    uint16 value[288];
2174 } zhuffman;
2175 
2176 __forceinline static int bitreverse16(int n)
2177 {
2178   n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);
2179   n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);
2180   n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);
2181   n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);
2182   return n;
2183 }
2184 
2185 __forceinline static int bit_reverse(int v, int bits)
2186 {
2187    assert(bits <= 16);
2188    // to bit reverse n bits, reverse 16 and shift
2189    // e.g. 11 bits, bit reverse and shift away 5
2190    return bitreverse16(v) >> (16-bits);
2191 }
2192 
2193 static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num)
2194 {
2195    int i,k=0;
2196    int code, next_code[16], sizes[17];
2197 
2198    // DEFLATE spec for generating codes
2199    memset(sizes, 0, sizeof(sizes));
2200    memset(z->fast, 255, sizeof(z->fast));
2201    for (i=0; i < num; ++i)
2202       ++sizes[sizelist[i]];
2203    sizes[0] = 0;
2204    for (i=1; i < 16; ++i)
2205       assert(sizes[i] <= (1 << i));
2206    code = 0;
2207    for (i=1; i < 16; ++i) {
2208       next_code[i] = code;
2209       z->firstcode[i] = (uint16) code;
2210       z->firstsymbol[i] = (uint16) k;
2211       code = (code + sizes[i]);
2212       if (sizes[i])
2213          if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG");
2214       z->maxcode[i] = code << (16-i); // preshift for inner loop
2215       code <<= 1;
2216       k += sizes[i];
2217    }
2218    z->maxcode[16] = 0x10000; // sentinel
2219    for (i=0; i < num; ++i) {
2220       int s = sizelist[i];
2221       if (s) {
2222          int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
2223          z->size[c] = (uint8)s;
2224          z->value[c] = (uint16)i;
2225          if (s <= ZFAST_BITS) {
2226             int m = bit_reverse(next_code[s],s);
2227             while (m < (1 << ZFAST_BITS)) {
2228                z->fast[m] = (uint16) c;
2229                m += (1 << s);
2230             }
2231          }
2232          ++next_code[s];
2233       }
2234    }
2235    return 1;
2236 }
2237 
2238 // zlib-from-memory implementation for PNG reading
2239 //    because PNG allows splitting the zlib stream arbitrarily,
2240 //    and it's annoying structurally to have PNG call ZLIB call PNG,
2241 //    we require PNG read all the IDATs and combine them into a single
2242 //    memory buffer
2243 
2244 typedef struct
2245 {
2246    uint8 const *zbuffer, *zbuffer_end;
2247    int num_bits;
2248    uint32 code_buffer;
2249 
2250    char *zout;
2251    char *zout_start;
2252    char *zout_end;
2253    int   z_expandable;
2254 
2255    zhuffman z_length, z_distance;
2256 } zbuf;
2257 
2258 __forceinline static int zget8(zbuf *z)
2259 {
2260    if (z->zbuffer >= z->zbuffer_end) return 0;
2261    return *z->zbuffer++;
2262 }
2263 
2264 static void fill_bits(zbuf *z)
2265 {
2266    do {
2267       assert(z->code_buffer < (1U << z->num_bits));
2268       z->code_buffer |= zget8(z) << z->num_bits;
2269       z->num_bits += 8;
2270    } while (z->num_bits <= 24);
2271 }
2272 
2273 __forceinline static unsigned int zreceive(zbuf *z, int n)
2274 {
2275    unsigned int k;
2276    if (z->num_bits < n) fill_bits(z);
2277    k = z->code_buffer & ((1 << n) - 1);
2278    z->code_buffer >>= n;
2279    z->num_bits -= n;
2280    return k;
2281 }
2282 
2283 __forceinline static int zhuffman_decode(zbuf *a, zhuffman *z)
2284 {
2285    int b,s,k;
2286    if (a->num_bits < 16) fill_bits(a);
2287    b = z->fast[a->code_buffer & ZFAST_MASK];
2288    if (b < 0xffff) {
2289       s = z->size[b];
2290       a->code_buffer >>= s;
2291       a->num_bits -= s;
2292       return z->value[b];
2293    }
2294 
2295    // not resolved by fast table, so compute it the slow way
2296    // use jpeg approach, which requires MSbits at top
2297    k = bit_reverse(a->code_buffer, 16);
2298    for (s=ZFAST_BITS+1; ; ++s)
2299       if (k < z->maxcode[s])
2300          break;
2301    if (s == 16) return -1; // invalid code!
2302    // code size is s, so:
2303    b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
2304    assert(z->size[b] == s);
2305    a->code_buffer >>= s;
2306    a->num_bits -= s;
2307    return z->value[b];
2308 }
2309 
2310 static int expand(zbuf *z, int n)  // need to make room for n bytes
2311 {
2312    char *q;
2313    int cur, limit;
2314    if (!z->z_expandable) return e("output buffer limit","Corrupt PNG");
2315    cur   = (int) (z->zout     - z->zout_start);
2316    limit = (int) (z->zout_end - z->zout_start);
2317    while (cur + n > limit)
2318       limit *= 2;
2319    q = (char *) REALLOC(z->zout_start, limit);
2320    if (q == NULL) return e("outofmem", "Out of memory");
2321    z->zout_start = q;
2322    z->zout       = q + cur;
2323    z->zout_end   = q + limit;
2324    return 1;
2325 }
2326 
2327 static int length_base[31] = {
2328    3,4,5,6,7,8,9,10,11,13,
2329    15,17,19,23,27,31,35,43,51,59,
2330    67,83,99,115,131,163,195,227,258,0,0 };
2331 
2332 static int length_extra[31]=
2333 { 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 };
2334 
2335 static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
2336 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
2337 
2338 static int dist_extra[32] =
2339 { 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};
2340 
2341 static int parse_huffman_block(zbuf *a)
2342 {
2343    for(;;) {
2344       int z = zhuffman_decode(a, &a->z_length);
2345       if (z < 256) {
2346          if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes
2347          if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0;
2348          *a->zout++ = (char) z;
2349       } else {
2350          uint8 *p;
2351          int len,dist;
2352          if (z == 256) return 1;
2353          z -= 257;
2354          len = length_base[z];
2355          if (length_extra[z]) len += zreceive(a, length_extra[z]);
2356          z = zhuffman_decode(a, &a->z_distance);
2357          if (z < 0) return e("bad huffman code","Corrupt PNG");
2358          dist = dist_base[z];
2359          if (dist_extra[z]) dist += zreceive(a, dist_extra[z]);
2360          if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG");
2361          if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0;
2362          p = (uint8 *) (a->zout - dist);
2363          while (len--)
2364             *a->zout++ = *p++;
2365       }
2366    }
2367 }
2368 
2369 static int compute_huffman_codes(zbuf *a)
2370 {
2371    static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
2372    zhuffman z_codelength;
2373    uint8 lencodes[286+32+137];//padding for maximum single op
2374    uint8 codelength_sizes[19];
2375    int i,n;
2376 
2377    int hlit  = zreceive(a,5) + 257;
2378    int hdist = zreceive(a,5) + 1;
2379    int hclen = zreceive(a,4) + 4;
2380 
2381    memset(codelength_sizes, 0, sizeof(codelength_sizes));
2382    for (i=0; i < hclen; ++i) {
2383       int s = zreceive(a,3);
2384       codelength_sizes[length_dezigzag[i]] = (uint8) s;
2385    }
2386    if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
2387 
2388    n = 0;
2389    while (n < hlit + hdist) {
2390       int c = zhuffman_decode(a, &z_codelength);
2391       assert(c >= 0 && c < 19);
2392       if (c < 16)
2393          lencodes[n++] = (uint8) c;
2394       else if (c == 16) {
2395          c = zreceive(a,2)+3;
2396          memset(lencodes+n, lencodes[n-1], c);
2397          n += c;
2398       } else if (c == 17) {
2399          c = zreceive(a,3)+3;
2400          memset(lencodes+n, 0, c);
2401          n += c;
2402       } else {
2403          assert(c == 18);
2404          c = zreceive(a,7)+11;
2405          memset(lencodes+n, 0, c);
2406          n += c;
2407       }
2408    }
2409    if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG");
2410    if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
2411    if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
2412    return 1;
2413 }
2414 
2415 static int parse_uncompressed_block(zbuf *a)
2416 {
2417    uint8 header[4];
2418    int len,nlen,k;
2419    if (a->num_bits & 7)
2420       zreceive(a, a->num_bits & 7); // discard
2421    // drain the bit-packed data into header
2422    k = 0;
2423    while (a->num_bits > 0) {
2424       header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns?
2425       a->code_buffer >>= 8;
2426       a->num_bits -= 8;
2427    }
2428    assert(a->num_bits == 0);
2429    // now fill header the normal way
2430    while (k < 4)
2431       header[k++] = (uint8) zget8(a);
2432    len  = header[1] * 256 + header[0];
2433    nlen = header[3] * 256 + header[2];
2434    if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG");
2435    if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG");
2436    if (a->zout + len > a->zout_end)
2437       if (!expand(a, len)) return 0;
2438    memcpy(a->zout, a->zbuffer, len);
2439    a->zbuffer += len;
2440    a->zout += len;
2441    return 1;
2442 }
2443 
2444 static int parse_zlib_header(zbuf *a)
2445 {
2446    int cmf   = zget8(a);
2447    int cm    = cmf & 15;
2448    /* int cinfo = cmf >> 4; */
2449    int flg   = zget8(a);
2450    if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec
2451    if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
2452    if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png
2453    // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
2454    return 1;
2455 }
2456 
2457 // @TODO: should statically initialize these for optimal thread safety
2458 static uint8 default_length[288], default_distance[32];
2459 static void init_defaults(void)
2460 {
2461    int i;   // use <= to match clearly with spec
2462    for (i=0; i <= 143; ++i)     default_length[i]   = 8;
2463    for (   ; i <= 255; ++i)     default_length[i]   = 9;
2464    for (   ; i <= 279; ++i)     default_length[i]   = 7;
2465    for (   ; i <= 287; ++i)     default_length[i]   = 8;
2466 
2467    for (i=0; i <=  31; ++i)     default_distance[i] = 5;
2468 }
2469 
2470 int stbi_png_partial; // a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead
2471 static int parse_zlib(zbuf *a, int parse_header)
2472 {
2473    int final, type;
2474    if (parse_header)
2475       if (!parse_zlib_header(a)) return 0;
2476    a->num_bits = 0;
2477    a->code_buffer = 0;
2478    do {
2479       final = zreceive(a,1);
2480       type = zreceive(a,2);
2481       if (type == 0) {
2482          if (!parse_uncompressed_block(a)) return 0;
2483       } else if (type == 3) {
2484          return 0;
2485       } else {
2486          if (type == 1) {
2487             // use fixed code lengths
2488             if (!default_distance[31]) init_defaults();
2489             if (!zbuild_huffman(&a->z_length  , default_length  , 288)) return 0;
2490             if (!zbuild_huffman(&a->z_distance, default_distance,  32)) return 0;
2491          } else {
2492             if (!compute_huffman_codes(a)) return 0;
2493          }
2494          if (!parse_huffman_block(a)) return 0;
2495       }
2496       if (stbi_png_partial && a->zout - a->zout_start > 65536)
2497          break;
2498    } while (!final);
2499    return 1;
2500 }
2501 
2502 static int do_zlib(zbuf *a, char *obuf, int olen, int exp, int parse_header)
2503 {
2504    a->zout_start = obuf;
2505    a->zout       = obuf;
2506    a->zout_end   = obuf + olen;
2507    a->z_expandable = exp;
2508 
2509    return parse_zlib(a, parse_header);
2510 }
2511 
2512 char *stbi_zlib_decode_malloc_guesssize(const char * buffer, int len, int initial_size, int *outlen)
2513 {
2514    zbuf a;
2515    char *p = (char *) MALLOC(initial_size);
2516    if (p == NULL) return NULL;
2517    a.zbuffer = (uint8 const *) buffer;
2518    a.zbuffer_end = (uint8 const *) buffer + len;
2519    if (do_zlib(&a, p, initial_size, 1, 1)) {
2520       if (outlen) *outlen = (int) (a.zout - a.zout_start);
2521       return a.zout_start;
2522    } else {
2523       FREE(a.zout_start);
2524       return NULL;
2525    }
2526 }
2527 
2528 char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
2529 {
2530    return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
2531 }
2532 
2533 char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
2534 {
2535    zbuf a;
2536    char *p = (char *) MALLOC(initial_size);
2537    if (p == NULL) return NULL;
2538    a.zbuffer = (uint8 const *) buffer;
2539    a.zbuffer_end = (uint8 const *) buffer + len;
2540    if (do_zlib(&a, p, initial_size, 1, parse_header)) {
2541       if (outlen) *outlen = (int) (a.zout - a.zout_start);
2542       return a.zout_start;
2543    } else {
2544       FREE(a.zout_start);
2545       return NULL;
2546    }
2547 }
2548 
2549 int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
2550 {
2551    zbuf a;
2552    a.zbuffer = (uint8 const *) ibuffer;
2553    a.zbuffer_end = (uint8 const *) ibuffer + ilen;
2554    if (do_zlib(&a, obuffer, olen, 0, 1))
2555       return (int) (a.zout - a.zout_start);
2556    else
2557       return -1;
2558 }
2559 
2560 char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
2561 {
2562    zbuf a;
2563    char *p = (char *) MALLOC(16384);
2564    if (p == NULL) return NULL;
2565    a.zbuffer = (uint8 const *) buffer;
2566    a.zbuffer_end = (uint8 const *) buffer+len;
2567    if (do_zlib(&a, p, 16384, 1, 0)) {
2568       if (outlen) *outlen = (int) (a.zout - a.zout_start);
2569       return a.zout_start;
2570    } else {
2571       FREE(a.zout_start);
2572       return NULL;
2573    }
2574 }
2575 
2576 int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
2577 {
2578    zbuf a;
2579    a.zbuffer = (uint8 const *) ibuffer;
2580    a.zbuffer_end = (uint8 const *) ibuffer + ilen;
2581    if (do_zlib(&a, obuffer, olen, 0, 0))
2582       return (int) (a.zout - a.zout_start);
2583    else
2584       return -1;
2585 }
2586 
2587 // public domain "baseline" PNG decoder   v0.10  Sean Barrett 2006-11-18
2588 //    simple implementation
2589 //      - only 8-bit samples
2590 //      - no CRC checking
2591 //      - allocates lots of intermediate memory
2592 //        - avoids problem of streaming data between subsystems
2593 //        - avoids explicit window management
2594 //    performance
2595 //      - uses stb_zlib, a PD zlib implementation with fast huffman decoding
2596 
2597 
2598 typedef struct
2599 {
2600    uint32 length;
2601    uint32 type;
2602 } chunk;
2603 
2604 #define PNG_TYPE(a,b,c,d)  (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
2605 
2606 static chunk get_chunk_header(stbi *s)
2607 {
2608    chunk c;
2609    c.length = get32(s);
2610    c.type   = get32(s);
2611    return c;
2612 }
2613 
2614 static int check_png_header(stbi *s)
2615 {
2616    static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 };
2617    int i;
2618    for (i=0; i < 8; ++i)
2619       if (get8(s) != png_sig[i]) return e("bad png sig","Not a PNG");
2620    return 1;
2621 }
2622 
2623 typedef struct
2624 {
2625    stbi s;
2626    uint8 *idata, *expanded, *out;
2627 } png;
2628 
2629 
2630 enum {
2631    F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4,
2632    F_avg_first, F_paeth_first
2633 };
2634 
2635 static uint8 first_row_filter[5] =
2636 {
2637    F_none, F_sub, F_none, F_avg_first, F_paeth_first
2638 };
2639 
2640 static int paeth(int a, int b, int c)
2641 {
2642    int p = a + b - c;
2643    int pa = abs(p-a);
2644    int pb = abs(p-b);
2645    int pc = abs(p-c);
2646    if (pa <= pb && pa <= pc) return a;
2647    if (pb <= pc) return b;
2648    return c;
2649 }
2650 
2651 // create the png data from post-deflated data
2652 static int create_png_image_raw(png *a, uint8 *raw, uint32 raw_len, int out_n, uint32 x, uint32 y)
2653 {
2654    stbi *s = &a->s;
2655    uint32 i,j,stride = x*out_n;
2656    int k;
2657    int img_n = s->img_n; // copy it into a local for later
2658    assert(out_n == s->img_n || out_n == s->img_n+1);
2659    if (stbi_png_partial) y = 1;
2660    a->out = (uint8 *) MALLOC(x * y * out_n);
2661    if (!a->out) return e("outofmem", "Out of memory");
2662    if (!stbi_png_partial) {
2663       if (s->img_x == x && s->img_y == y) {
2664          if (raw_len != (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG");
2665       } else { // interlaced:
2666          if (raw_len < (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG");
2667       }
2668    }
2669    for (j=0; j < y; ++j) {
2670       uint8 *cur = a->out + stride*j;
2671       uint8 *prior = cur - stride;
2672       int filter = *raw++;
2673       if (filter > 4) return e("invalid filter","Corrupt PNG");
2674       // if first row, use special filter that doesn't sample previous row
2675       if (j == 0) filter = first_row_filter[filter];
2676       // handle first pixel explicitly
2677       for (k=0; k < img_n; ++k) {
2678          switch (filter) {
2679             case F_none       : cur[k] = raw[k]; break;
2680             case F_sub        : cur[k] = raw[k]; break;
2681             case F_up         : cur[k] = raw[k] + prior[k]; break;
2682             case F_avg        : cur[k] = raw[k] + (prior[k]>>1); break;
2683             case F_paeth      : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break;
2684             case F_avg_first  : cur[k] = raw[k]; break;
2685             case F_paeth_first: cur[k] = raw[k]; break;
2686          }
2687       }
2688       if (img_n != out_n) cur[img_n] = 255;
2689       raw += img_n;
2690       cur += out_n;
2691       prior += out_n;
2692       // this is a little gross, so that we don't switch per-pixel or per-component
2693       if (img_n == out_n) {
2694          #define CASE(f) \
2695              case f:     \
2696                 for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \
2697                    for (k=0; k < img_n; ++k)
2698          switch (filter) {
2699             CASE(F_none)  cur[k] = raw[k]; break;
2700             CASE(F_sub)   cur[k] = raw[k] + cur[k-img_n]; break;
2701             CASE(F_up)    cur[k] = raw[k] + prior[k]; break;
2702             CASE(F_avg)   cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1); break;
2703             CASE(F_paeth)  cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n])); break;
2704             CASE(F_avg_first)    cur[k] = raw[k] + (cur[k-img_n] >> 1); break;
2705             CASE(F_paeth_first)  cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0)); break;
2706          }
2707          #undef CASE
2708       } else {
2709          assert(img_n+1 == out_n);
2710          #define CASE(f) \
2711              case f:     \
2712                 for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
2713                    for (k=0; k < img_n; ++k)
2714          switch (filter) {
2715             CASE(F_none)  cur[k] = raw[k]; break;
2716             CASE(F_sub)   cur[k] = raw[k] + cur[k-out_n]; break;
2717             CASE(F_up)    cur[k] = raw[k] + prior[k]; break;
2718             CASE(F_avg)   cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1); break;
2719             CASE(F_paeth)  cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;
2720             CASE(F_avg_first)    cur[k] = raw[k] + (cur[k-out_n] >> 1); break;
2721             CASE(F_paeth_first)  cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0)); break;
2722          }
2723          #undef CASE
2724       }
2725    }
2726    return 1;
2727 }
2728 
2729 static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n, int interlaced)
2730 {
2731    uint8 *final;
2732    int p;
2733    int save;
2734    if (!interlaced)
2735       return create_png_image_raw(a, raw, raw_len, out_n, a->s.img_x, a->s.img_y);
2736    save = stbi_png_partial;
2737    stbi_png_partial = 0;
2738 
2739    // de-interlacing
2740    final = (uint8 *) MALLOC(a->s.img_x * a->s.img_y * out_n);
2741    for (p=0; p < 7; ++p) {
2742       int xorig[] = { 0,4,0,2,0,1,0 };
2743       int yorig[] = { 0,0,4,0,2,0,1 };
2744       int xspc[]  = { 8,8,4,4,2,2,1 };
2745       int yspc[]  = { 8,8,8,4,4,2,2 };
2746       int i,j,x,y;
2747       // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
2748       x = (a->s.img_x - xorig[p] + xspc[p]-1) / xspc[p];
2749       y = (a->s.img_y - yorig[p] + yspc[p]-1) / yspc[p];
2750       if (x && y) {
2751          if (!create_png_image_raw(a, raw, raw_len, out_n, x, y)) {
2752             FREE(final);
2753             return 0;
2754          }
2755          for (j=0; j < y; ++j)
2756             for (i=0; i < x; ++i)
2757                memcpy(final + (j*yspc[p]+yorig[p])*a->s.img_x*out_n + (i*xspc[p]+xorig[p])*out_n,
2758                       a->out + (j*x+i)*out_n, out_n);
2759          FREE(a->out);
2760          raw += (x*out_n+1)*y;
2761          raw_len -= (x*out_n+1)*y;
2762       }
2763    }
2764    a->out = final;
2765 
2766    stbi_png_partial = save;
2767    return 1;
2768 }
2769 
2770 static int compute_transparency(png *z, uint8 tc[3], int out_n)
2771 {
2772    stbi *s = &z->s;
2773    uint32 i, pixel_count = s->img_x * s->img_y;
2774    uint8 *p = z->out;
2775 
2776    // compute color-based transparency, assuming we've
2777    // already got 255 as the alpha value in the output
2778    assert(out_n == 2 || out_n == 4);
2779 
2780    if (out_n == 2) {
2781       for (i=0; i < pixel_count; ++i) {
2782          p[1] = (p[0] == tc[0] ? 0 : 255);
2783          p += 2;
2784       }
2785    } else {
2786       for (i=0; i < pixel_count; ++i) {
2787          if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
2788             p[3] = 0;
2789          p += 4;
2790       }
2791    }
2792    return 1;
2793 }
2794 
2795 static int expand_palette(png *a, uint8 *palette, int len, int pal_img_n)
2796 {
2797    uint32 i, pixel_count = a->s.img_x * a->s.img_y;
2798    uint8 *p, *temp_out, *orig = a->out;
2799 
2800    p = (uint8 *) MALLOC(pixel_count * pal_img_n);
2801    if (p == NULL) return e("outofmem", "Out of memory");
2802 
2803    // between here and FREE(out) below, exiting would leak
2804    temp_out = p;
2805 
2806    if (pal_img_n == 3) {
2807       for (i=0; i < pixel_count; ++i) {
2808          int n = orig[i]*4;
2809          p[0] = palette[n  ];
2810          p[1] = palette[n+1];
2811          p[2] = palette[n+2];
2812          p += 3;
2813       }
2814    } else {
2815       for (i=0; i < pixel_count; ++i) {
2816          int n = orig[i]*4;
2817          p[0] = palette[n  ];
2818          p[1] = palette[n+1];
2819          p[2] = palette[n+2];
2820          p[3] = palette[n+3];
2821          p += 4;
2822       }
2823    }
2824    FREE(a->out);
2825    a->out = temp_out;
2826 
2827    STBI_NOTUSED(len);
2828 
2829    return 1;
2830 }
2831 
2832 static int stbi_unpremultiply_on_load = 0;
2833 static int stbi_de_iphone_flag = 0;
2834 
2835 void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
2836 {
2837    stbi_unpremultiply_on_load = flag_true_if_should_unpremultiply;
2838 }
2839 void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
2840 {
2841    stbi_de_iphone_flag = flag_true_if_should_convert;
2842 }
2843 
2844 static void stbi_de_iphone(png *z)
2845 {
2846    stbi *s = &z->s;
2847    uint32 i, pixel_count = s->img_x * s->img_y;
2848    uint8 *p = z->out;
2849 
2850    if (s->img_out_n == 3) {  // convert bgr to rgb
2851       for (i=0; i < pixel_count; ++i) {
2852          uint8 t = p[0];
2853          p[0] = p[2];
2854          p[2] = t;
2855          p += 3;
2856       }
2857    } else {
2858       assert(s->img_out_n == 4);
2859       if (stbi_unpremultiply_on_load) {
2860          // convert bgr to rgb and unpremultiply
2861          for (i=0; i < pixel_count; ++i) {
2862             uint8 a = p[3];
2863             uint8 t = p[0];
2864             if (a) {
2865                p[0] = p[2] * 255 / a;
2866                p[1] = p[1] * 255 / a;
2867                p[2] =  t   * 255 / a;
2868             } else {
2869                p[0] = p[2];
2870                p[2] = t;
2871             }
2872             p += 4;
2873          }
2874       } else {
2875          // convert bgr to rgb
2876          for (i=0; i < pixel_count; ++i) {
2877             uint8 t = p[0];
2878             p[0] = p[2];
2879             p[2] = t;
2880             p += 4;
2881          }
2882       }
2883    }
2884 }
2885 
2886 static int parse_png_file(png *z, int scan, int req_comp)
2887 {
2888    uint8 palette[1024], pal_img_n=0;
2889    uint8 has_trans=0, tc[3];
2890    uint32 ioff=0, idata_limit=0, i, pal_len=0;
2891    int first=1,k,interlace=0, iphone=0;
2892    stbi *s = &z->s;
2893 
2894    if (!check_png_header(s)) return 0;
2895 
2896    if (scan == SCAN_type) return 1;
2897 
2898    for (;;) {
2899       chunk c = get_chunk_header(s);
2900       switch (c.type) {
2901          case PNG_TYPE('C','g','B','I'):
2902             iphone = stbi_de_iphone_flag;
2903             skip(s, c.length);
2904             break;
2905          case PNG_TYPE('I','H','D','R'): {
2906             int depth,color,comp,filter;
2907             if (!first) return e("multiple IHDR","Corrupt PNG");
2908             first = 0;
2909             if (c.length != 13) return e("bad IHDR len","Corrupt PNG");
2910             s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)");
2911             s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)");
2912             depth = get8(s);  if (depth != 8)        return e("8bit only","PNG not supported: 8-bit only");
2913             color = get8(s);  if (color > 6)         return e("bad ctype","Corrupt PNG");
2914             if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG");
2915             comp  = get8(s);  if (comp) return e("bad comp method","Corrupt PNG");
2916             filter= get8(s);  if (filter) return e("bad filter method","Corrupt PNG");
2917             interlace = get8(s); if (interlace>1) return e("bad interlace method","Corrupt PNG");
2918             if (!s->img_x || !s->img_y) return e("0-pixel image","Corrupt PNG");
2919             if (!pal_img_n) {
2920                s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
2921                if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode");
2922                if (scan == SCAN_header) return 1;
2923             } else {
2924                // if paletted, then pal_n is our final components, and
2925                // img_n is # components to decompress/filter.
2926                s->img_n = 1;
2927                if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG");
2928                // if SCAN_header, have to scan to see if we have a tRNS
2929             }
2930             break;
2931          }
2932 
2933          case PNG_TYPE('P','L','T','E'):  {
2934             if (first) return e("first not IHDR", "Corrupt PNG");
2935             if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG");
2936             pal_len = c.length / 3;
2937             if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG");
2938             for (i=0; i < pal_len; ++i) {
2939                palette[i*4+0] = get8u(s);
2940                palette[i*4+1] = get8u(s);
2941                palette[i*4+2] = get8u(s);
2942                palette[i*4+3] = 255;
2943             }
2944             break;
2945          }
2946 
2947          case PNG_TYPE('t','R','N','S'): {
2948             if (first) return e("first not IHDR", "Corrupt PNG");
2949             if (z->idata) return e("tRNS after IDAT","Corrupt PNG");
2950             if (pal_img_n) {
2951                if (scan == SCAN_header) { s->img_n = 4; return 1; }
2952                if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG");
2953                if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG");
2954                pal_img_n = 4;
2955                for (i=0; i < c.length; ++i)
2956                   palette[i*4+3] = get8u(s);
2957             } else {
2958                if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG");
2959                if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG");
2960                has_trans = 1;
2961                for (k=0; k < s->img_n; ++k)
2962                   tc[k] = (uint8) get16(s); // non 8-bit images will be larger
2963             }
2964             break;
2965          }
2966 
2967          case PNG_TYPE('I','D','A','T'): {
2968             if (first) return e("first not IHDR", "Corrupt PNG");
2969             if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG");
2970             if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; }
2971             if (ioff + c.length > idata_limit) {
2972                uint8 *p;
2973                if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
2974                while (ioff + c.length > idata_limit)
2975                   idata_limit *= 2;
2976                p = (uint8 *) REALLOC(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory");
2977                z->idata = p;
2978             }
2979             if (!getn(s, z->idata+ioff,c.length)) return e("outofdata","Corrupt PNG");
2980             ioff += c.length;
2981             break;
2982          }
2983 
2984          case PNG_TYPE('I','E','N','D'): {
2985             uint32 raw_len;
2986             if (first) return e("first not IHDR", "Corrupt PNG");
2987             if (scan != SCAN_load) return 1;
2988             if (z->idata == NULL) return e("no IDAT","Corrupt PNG");
2989             z->expanded = (uint8 *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !iphone);
2990             if (z->expanded == NULL) return 0; // zlib should set error
2991             FREE(z->idata); z->idata = NULL;
2992             if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
2993                s->img_out_n = s->img_n+1;
2994             else
2995                s->img_out_n = s->img_n;
2996             if (!create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0;
2997             if (has_trans)
2998                if (!compute_transparency(z, tc, s->img_out_n)) return 0;
2999             if (iphone && s->img_out_n > 2)
3000                stbi_de_iphone(z);
3001             if (pal_img_n) {
3002                // pal_img_n == 3 or 4
3003                s->img_n = pal_img_n; // record the actual colors we had
3004                s->img_out_n = pal_img_n;
3005                if (req_comp >= 3) s->img_out_n = req_comp;
3006                if (!expand_palette(z, palette, pal_len, s->img_out_n))
3007                   return 0;
3008             }
3009             FREE(z->expanded); z->expanded = NULL;
3010             return 1;
3011          }
3012 
3013          default:
3014             // if critical, fail
3015             if (first) return e("first not IHDR", "Corrupt PNG");
3016             if ((c.type & (1 << 29)) == 0) {
3017                #ifndef STBI_NO_FAILURE_STRINGS
3018                // not threadsafe
3019                static char invalid_chunk[] = "XXXX chunk not known";
3020                invalid_chunk[0] = (uint8) (c.type >> 24);
3021                invalid_chunk[1] = (uint8) (c.type >> 16);
3022                invalid_chunk[2] = (uint8) (c.type >>  8);
3023                invalid_chunk[3] = (uint8) (c.type >>  0);
3024                #endif
3025                return e(invalid_chunk, "PNG not supported: unknown chunk type");
3026             }
3027             skip(s, c.length);
3028             break;
3029       }
3030       // end of chunk, read and skip CRC
3031       get32(s);
3032    }
3033 }
3034 
3035 static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp)
3036 {
3037    unsigned char *result=NULL;
3038    p->expanded = NULL;
3039    p->idata = NULL;
3040    p->out = NULL;
3041    if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error");
3042    if (parse_png_file(p, SCAN_load, req_comp)) {
3043       result = p->out;
3044       p->out = NULL;
3045       if (req_comp && req_comp != p->s.img_out_n) {
3046          result = convert_format(result, p->s.img_out_n, req_comp, p->s.img_x, p->s.img_y);
3047          p->s.img_out_n = req_comp;
3048          if (result == NULL) return result;
3049       }
3050       *x = p->s.img_x;
3051       *y = p->s.img_y;
3052       if (n) *n = p->s.img_n;
3053    }
3054    FREE(p->expanded); p->expanded = NULL;
3055    FREE(p->idata);    p->idata    = NULL;
3056 
3057    return result;
3058 }
3059 
3060 #ifndef STBI_NO_STDIO
3061 unsigned char *stbi_png_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
3062 {
3063    png p;
3064    start_file(&p.s, f);
3065    return do_png(&p, x,y,comp,req_comp);
3066 }
3067 
3068 unsigned char *stbi_png_load(char const *filename, int *x, int *y, int *comp, int req_comp)
3069 {
3070    unsigned char *data;
3071    FILE *f = fopen(filename, "rb");
3072    if (!f) return NULL;
3073    data = stbi_png_load_from_file(f,x,y,comp,req_comp);
3074    fclose(f);
3075    return data;
3076 }
3077 #endif
3078 
3079 unsigned char *stbi_png_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
3080 {
3081    png p;
3082    start_mem(&p.s, buffer,len);
3083    return do_png(&p, x,y,comp,req_comp);
3084 }
3085 
3086 #ifndef STBI_NO_STDIO
3087 int stbi_png_test_file(FILE *f)
3088 {
3089    png p;
3090    int n,r;
3091    n = ftell(f);
3092    start_file(&p.s, f);
3093    r = parse_png_file(&p, SCAN_type,STBI_default);
3094    fseek(f,n,SEEK_SET);
3095    return r;
3096 }
3097 #endif
3098 
3099 int stbi_png_test_memory(stbi_uc const *buffer, int len)
3100 {
3101    png p;
3102    start_mem(&p.s, buffer, len);
3103    return parse_png_file(&p, SCAN_type,STBI_default);
3104 }
3105 
3106 static int stbi_png_info_raw(png *p, int *x, int *y, int *comp)
3107 {
3108    if (!parse_png_file(p, SCAN_header, 0))
3109       return 0;
3110    if (x) *x = p->s.img_x;
3111    if (y) *y = p->s.img_y;
3112    if (comp) *comp = p->s.img_n;
3113    return 1;
3114 }
3115 
3116 #ifndef STBI_NO_STDIO
3117 int      stbi_png_info             (char const *filename,           int *x, int *y, int *comp)
3118 {
3119    int res;
3120    FILE *f = fopen(filename, "rb");
3121    if (!f) return 0;
3122    res = stbi_png_info_from_file(f, x, y, comp);
3123    fclose(f);
3124    return res;
3125 }
3126 
3127 int stbi_png_info_from_file(FILE *f, int *x, int *y, int *comp)
3128 {
3129    png p;
3130    int res;
3131    long n = ftell(f);
3132    start_file(&p.s, f);
3133    res = stbi_png_info_raw(&p, x, y, comp);
3134    fseek(f, n, SEEK_SET);
3135    return res;
3136 }
3137 #endif // !STBI_NO_STDIO
3138 
3139 int stbi_png_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
3140 {
3141    png p;
3142    start_mem(&p.s, buffer, len);
3143    return stbi_png_info_raw(&p, x, y, comp);
3144 }
3145 
3146 // Microsoft/Windows BMP image
3147 
3148 static int bmp_test(stbi *s)
3149 {
3150    int sz;
3151    if (get8(s) != 'B') return 0;
3152    if (get8(s) != 'M') return 0;
3153    get32le(s); // discard filesize
3154    get16le(s); // discard reserved
3155    get16le(s); // discard reserved
3156    get32le(s); // discard data offset
3157    sz = get32le(s);
3158    if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1;
3159    return 0;
3160 }
3161 
3162 #ifndef STBI_NO_STDIO
3163 int      stbi_bmp_test_file        (FILE *f)
3164 {
3165    stbi s;
3166    int r,n = ftell(f);
3167    start_file(&s,f);
3168    r = bmp_test(&s);
3169    fseek(f,n,SEEK_SET);
3170    return r;
3171 }
3172 #endif
3173 
3174 int      stbi_bmp_test_memory      (stbi_uc const *buffer, int len)
3175 {
3176    stbi s;
3177    start_mem(&s, buffer, len);
3178    return bmp_test(&s);
3179 }
3180 
3181 // returns 0..31 for the highest set bit
3182 static int high_bit(unsigned int z)
3183 {
3184    int n=0;
3185    if (z == 0) return -1;
3186    if (z >= 0x10000) n += 16, z >>= 16;
3187    if (z >= 0x00100) n +=  8, z >>=  8;
3188    if (z >= 0x00010) n +=  4, z >>=  4;
3189    if (z >= 0x00004) n +=  2, z >>=  2;
3190    if (z >= 0x00002) n +=  1, z >>=  1;
3191    return n;
3192 }
3193 
3194 static int bitcount(unsigned int a)
3195 {
3196    a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2
3197    a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4
3198    a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
3199    a = (a + (a >> 8)); // max 16 per 8 bits
3200    a = (a + (a >> 16)); // max 32 per 8 bits
3201    return a & 0xff;
3202 }
3203 
3204 static int shiftsigned(int v, int shift, int bits)
3205 {
3206    int result;
3207    int z=0;
3208 
3209    if (shift < 0) v <<= -shift;
3210    else v >>= shift;
3211    result = v;
3212 
3213    z = bits;
3214    while (z < 8) {
3215       result += v >> z;
3216       z += bits;
3217    }
3218    return result;
3219 }
3220 
3221 static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3222 {
3223    uint8 *out;
3224    unsigned int mr=0,mg=0,mb=0,ma=0;
3225    stbi_uc pal[256][4];
3226    int psize=0,i,j,compress=0,width;
3227    int bpp, flip_vertically, pad, target, offset, hsz;
3228    if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP");
3229    get32le(s); // discard filesize
3230    get16le(s); // discard reserved
3231    get16le(s); // discard reserved
3232    offset = get32le(s);
3233    hsz = get32le(s);
3234    if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown");
3235    if (hsz == 12) {
3236       s->img_x = get16le(s);
3237       s->img_y = get16le(s);
3238    } else {
3239       s->img_x = get32le(s);
3240       s->img_y = get32le(s);
3241    }
3242    if (get16le(s) != 1) return epuc("bad BMP", "bad BMP");
3243    bpp = get16le(s);
3244    if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit");
3245    flip_vertically = ((int) s->img_y) > 0;
3246    s->img_y = abs((int) s->img_y);
3247    if (hsz == 12) {
3248       if (bpp < 24)
3249          psize = (offset - 14 - 24) / 3;
3250    } else {
3251       compress = get32le(s);
3252       if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE");
3253       get32le(s); // discard sizeof
3254       get32le(s); // discard hres
3255       get32le(s); // discard vres
3256       get32le(s); // discard colorsused
3257       get32le(s); // discard max important
3258       if (hsz == 40 || hsz == 56) {
3259          if (hsz == 56) {
3260             get32le(s);
3261             get32le(s);
3262             get32le(s);
3263             get32le(s);
3264          }
3265          if (bpp == 16 || bpp == 32) {
3266             mr = mg = mb = 0;
3267             if (compress == 0) {
3268                if (bpp == 32) {
3269                   mr = 0xffu << 16;
3270                   mg = 0xffu <<  8;
3271                   mb = 0xffu <<  0;
3272                   ma = 0xffu << 24;
3273                } else {
3274                   mr = 31u << 10;
3275                   mg = 31u <<  5;
3276                   mb = 31u <<  0;
3277                }
3278             } else if (compress == 3) {
3279                mr = get32le(s);
3280                mg = get32le(s);
3281                mb = get32le(s);
3282                // not documented, but generated by photoshop and handled by mspaint
3283                if (mr == mg && mg == mb) {
3284                   // ?!?!?
3285                   return epuc("bad BMP", "bad BMP");
3286                }
3287             } else
3288                return epuc("bad BMP", "bad BMP");
3289          }
3290       } else {
3291          assert(hsz == 108);
3292          mr = get32le(s);
3293          mg = get32le(s);
3294          mb = get32le(s);
3295          ma = get32le(s);
3296          get32le(s); // discard color space
3297          for (i=0; i < 12; ++i)
3298             get32le(s); // discard color space parameters
3299       }
3300       if (bpp < 16)
3301          psize = (offset - 14 - hsz) >> 2;
3302    }
3303    s->img_n = ma ? 4 : 3;
3304    if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
3305       target = req_comp;
3306    else
3307       target = s->img_n; // if they want monochrome, we'll post-convert
3308    out = (stbi_uc *) MALLOC(target * s->img_x * s->img_y);
3309    if (!out) return epuc("outofmem", "Out of memory");
3310    if (bpp < 16) {
3311       int z=0;
3312       if (psize == 0 || psize > 256) { FREE(out); return epuc("invalid", "Corrupt BMP"); }
3313       for (i=0; i < psize; ++i) {
3314          pal[i][2] = get8u(s);
3315          pal[i][1] = get8u(s);
3316          pal[i][0] = get8u(s);
3317          if (hsz != 12) get8(s);
3318          pal[i][3] = 255;
3319       }
3320       skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
3321       if (bpp == 4) width = (s->img_x + 1) >> 1;
3322       else if (bpp == 8) width = s->img_x;
3323       else { FREE(out); return epuc("bad bpp", "Corrupt BMP"); }
3324       pad = (-width)&3;
3325       for (j=0; j < (int) s->img_y; ++j) {
3326          for (i=0; i < (int) s->img_x; i += 2) {
3327             int v=get8(s),v2=0;
3328             if (bpp == 4) {
3329                v2 = v & 15;
3330                v >>= 4;
3331             }
3332             out[z++] = pal[v][0];
3333             out[z++] = pal[v][1];
3334             out[z++] = pal[v][2];
3335             if (target == 4) out[z++] = 255;
3336             if (i+1 == (int) s->img_x) break;
3337             v = (bpp == 8) ? get8(s) : v2;
3338             out[z++] = pal[v][0];
3339             out[z++] = pal[v][1];
3340             out[z++] = pal[v][2];
3341             if (target == 4) out[z++] = 255;
3342          }
3343          skip(s, pad);
3344       }
3345    } else {
3346       int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
3347       int z = 0;
3348       int easy=0;
3349       skip(s, offset - 14 - hsz);
3350       if (bpp == 24) width = 3 * s->img_x;
3351       else if (bpp == 16) width = 2*s->img_x;
3352       else /* bpp = 32 and pad = 0 */ width=0;
3353       pad = (-width) & 3;
3354       if (bpp == 24) {
3355          easy = 1;
3356       } else if (bpp == 32) {
3357          if (mb == 0xff && mg == 0xff00 && mr == 0xff000000 && ma == 0xff000000)
3358             easy = 2;
3359       }
3360       if (!easy) {
3361          if (!mr || !mg || !mb) return epuc("bad masks", "Corrupt BMP");
3362          // right shift amt to put high bit in position #7
3363          rshift = high_bit(mr)-7; rcount = bitcount(mr);
3364          gshift = high_bit(mg)-7; gcount = bitcount(mr);
3365          bshift = high_bit(mb)-7; bcount = bitcount(mr);
3366          ashift = high_bit(ma)-7; acount = bitcount(mr);
3367       }
3368       for (j=0; j < (int) s->img_y; ++j) {
3369          if (easy) {
3370             for (i=0; i < (int) s->img_x; ++i) {
3371                int a;
3372                out[z+2] = get8u(s);
3373                out[z+1] = get8u(s);
3374                out[z+0] = get8u(s);
3375                z += 3;
3376                a = (easy == 2 ? get8(s) : 255);
3377                if (target == 4) out[z++] = (uint8) a;
3378             }
3379          } else {
3380             for (i=0; i < (int) s->img_x; ++i) {
3381                uint32 v = (bpp == 16 ? get16le(s) : get32le(s));
3382                int a;
3383                out[z++] = (uint8) shiftsigned(v & mr, rshift, rcount);
3384                out[z++] = (uint8) shiftsigned(v & mg, gshift, gcount);
3385                out[z++] = (uint8) shiftsigned(v & mb, bshift, bcount);
3386                a = (ma ? shiftsigned(v & ma, ashift, acount) : 255);
3387                if (target == 4) out[z++] = (uint8) a;
3388             }
3389          }
3390          skip(s, pad);
3391       }
3392    }
3393    if (flip_vertically) {
3394       stbi_uc t;
3395       for (j=0; j < (int) s->img_y>>1; ++j) {
3396          stbi_uc *p1 = out +      j     *s->img_x*target;
3397          stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
3398          for (i=0; i < (int) s->img_x*target; ++i) {
3399             t = p1[i], p1[i] = p2[i], p2[i] = t;
3400          }
3401       }
3402    }
3403 
3404    if (req_comp && req_comp != target) {
3405       out = convert_format(out, target, req_comp, s->img_x, s->img_y);
3406       if (out == NULL) return out; // convert_format frees input on failure
3407    }
3408 
3409    *x = s->img_x;
3410    *y = s->img_y;
3411    if (comp) *comp = target;
3412    return out;
3413 }
3414 
3415 #ifndef STBI_NO_STDIO
3416 stbi_uc *stbi_bmp_load             (char const *filename,           int *x, int *y, int *comp, int req_comp)
3417 {
3418    stbi_uc *data;
3419    FILE *f = fopen(filename, "rb");
3420    if (!f) return NULL;
3421    data = stbi_bmp_load_from_file(f, x,y,comp,req_comp);
3422    fclose(f);
3423    return data;
3424 }
3425 
3426 stbi_uc *stbi_bmp_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp)
3427 {
3428    stbi s;
3429    start_file(&s, f);
3430    return bmp_load(&s, x,y,comp,req_comp);
3431 }
3432 #endif
3433 
3434 stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
3435 {
3436    stbi s;
3437    start_mem(&s, buffer, len);
3438    return bmp_load(&s, x,y,comp,req_comp);
3439 }
3440 
3441 // Targa Truevision - TGA
3442 // by Jonathan Dummer
3443 
3444 static int tga_info(stbi *s, int *x, int *y, int *comp)
3445 {
3446     int tga_w, tga_h, tga_comp;
3447     int sz;
3448     get8u(s);                   // discard Offset
3449     sz = get8u(s);              // color type
3450     if( sz > 1 ) return 0;      // only RGB or indexed allowed
3451     sz = get8u(s);              // image type
3452     // only RGB or grey allowed, +/- RLE
3453     if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;
3454     get16le(s);                 // discard palette start
3455     get16le(s);                 // discard palette length
3456     get8(s);                    // discard bits per palette color entry
3457     get16le(s);                 // discard x origin
3458     get16le(s);                 // discard y origin
3459     tga_w = get16le(s);
3460     if( tga_w < 1 ) return 0;   // test width
3461     tga_h = get16le(s);
3462     if( tga_h < 1 ) return 0;   // test height
3463     sz = get8(s);               // bits per pixel
3464     // only RGB or RGBA or grey allowed
3465     if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) return 0;
3466     tga_comp = sz;
3467     if (x) *x = tga_w;
3468     if (y) *y = tga_h;
3469     if (comp) *comp = tga_comp / 8;
3470     return 1;                   // seems to have passed everything
3471 }
3472 
3473 #ifndef STBI_NO_STDIO
3474 int stbi_tga_info_from_file(FILE *f, int *x, int *y, int *comp)
3475 {
3476     stbi s;
3477     int r;
3478     long n = ftell(f);
3479     start_file(&s, f);
3480     r = tga_info(&s, x, y, comp);
3481     fseek(f, n, SEEK_SET);
3482     return r;
3483 }
3484 #endif
3485 
3486 int stbi_tga_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
3487 {
3488     stbi s;
3489     start_mem(&s, buffer, len);
3490     return tga_info(&s, x, y, comp);
3491 }
3492 
3493 static int tga_test(stbi *s)
3494 {
3495    int sz;
3496    get8u(s);      //   discard Offset
3497    sz = get8u(s);   //   color type
3498    if ( sz > 1 ) return 0;   //   only RGB or indexed allowed
3499    sz = get8u(s);   //   image type
3500    if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0;   //   only RGB or grey allowed, +/- RLE
3501    get16(s);      //   discard palette start
3502    get16(s);      //   discard palette length
3503    get8(s);         //   discard bits per palette color entry
3504    get16(s);      //   discard x origin
3505    get16(s);      //   discard y origin
3506    if ( get16(s) < 1 ) return 0;      //   test width
3507    if ( get16(s) < 1 ) return 0;      //   test height
3508    sz = get8(s);   //   bits per pixel
3509    if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0;   //   only RGB or RGBA or grey allowed
3510    return 1;      //   seems to have passed everything
3511 }
3512 
3513 #ifndef STBI_NO_STDIO
3514 int      stbi_tga_test_file        (FILE *f)
3515 {
3516    stbi s;
3517    int r,n = ftell(f);
3518    start_file(&s, f);
3519    r = tga_test(&s);
3520    fseek(f,n,SEEK_SET);
3521    return r;
3522 }
3523 #endif
3524 
3525 int      stbi_tga_test_memory      (stbi_uc const *buffer, int len)
3526 {
3527    stbi s;
3528    start_mem(&s, buffer, len);
3529    return tga_test(&s);
3530 }
3531 
3532 static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3533 {
3534    //   read in the TGA header stuff
3535    int tga_offset = get8u(s);
3536    int tga_indexed = get8u(s);
3537    int tga_image_type = get8u(s);
3538    int tga_is_RLE = 0;
3539    int tga_palette_start = get16le(s);
3540    int tga_palette_len = get16le(s);
3541    int tga_palette_bits = get8u(s);
3542    int tga_x_origin = get16le(s);
3543    int tga_y_origin = get16le(s);
3544    int tga_width = get16le(s);
3545    int tga_height = get16le(s);
3546    int tga_bits_per_pixel = get8u(s);
3547    int tga_inverted = get8u(s);
3548    //   image data
3549    unsigned char *tga_data;
3550    unsigned char *tga_palette = NULL;
3551    int i, j;
3552    unsigned char raw_data[4];
3553    unsigned char trans_data[4];
3554    int RLE_count = 0;
3555    int RLE_repeating = 0;
3556    int read_next_pixel = 1;
3557 
3558    //   do a tiny bit of precessing
3559    if ( tga_image_type >= 8 )
3560    {
3561       tga_image_type -= 8;
3562       tga_is_RLE = 1;
3563    }
3564    /* int tga_alpha_bits = tga_inverted & 15; */
3565    tga_inverted = 1 - ((tga_inverted >> 5) & 1);
3566 
3567    //   error check
3568    if ( //(tga_indexed) ||
3569       (tga_width < 1) || (tga_height < 1) ||
3570       (tga_image_type < 1) || (tga_image_type > 3) ||
3571       ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
3572       (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
3573       )
3574    {
3575       return NULL;
3576    }
3577 
3578    //   If I'm paletted, then I'll use the number of bits from the palette
3579    if ( tga_indexed )
3580    {
3581       tga_bits_per_pixel = tga_palette_bits;
3582    }
3583 
3584    //   tga info
3585    *x = tga_width;
3586    *y = tga_height;
3587    if ( (req_comp < 1) || (req_comp > 4) )
3588    {
3589       //   just use whatever the file was
3590       req_comp = tga_bits_per_pixel / 8;
3591       *comp = req_comp;
3592    } else
3593    {
3594       //   force a new number of components
3595       *comp = tga_bits_per_pixel/8;
3596    }
3597    tga_data = (unsigned char*)MALLOC( tga_width * tga_height * req_comp );
3598 
3599    //   skip to the data's starting position (offset usually = 0)
3600    skip(s, tga_offset );
3601    //   do I need to load a palette?
3602    if ( tga_indexed )
3603    {
3604       //   any data to skip? (offset usually = 0)
3605       skip(s, tga_palette_start );
3606       //   load the palette
3607       tga_palette = (unsigned char*)MALLOC( tga_palette_len * tga_palette_bits / 8 );
3608       if (!getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 ))
3609          return NULL;
3610    }
3611    //   load the data
3612    trans_data[0] = trans_data[1] = trans_data[2] = trans_data[3] = 0;
3613    for (i=0; i < tga_width * tga_height; ++i)
3614    {
3615       //   if I'm in RLE mode, do I need to get a RLE chunk?
3616       if ( tga_is_RLE )
3617       {
3618          if ( RLE_count == 0 )
3619          {
3620             //   yep, get the next byte as a RLE command
3621             int RLE_cmd = get8u(s);
3622             RLE_count = 1 + (RLE_cmd & 127);
3623             RLE_repeating = RLE_cmd >> 7;
3624             read_next_pixel = 1;
3625          } else if ( !RLE_repeating )
3626          {
3627             read_next_pixel = 1;
3628          }
3629       } else
3630       {
3631          read_next_pixel = 1;
3632       }
3633       //   OK, if I need to read a pixel, do it now
3634       if ( read_next_pixel )
3635       {
3636          //   load however much data we did have
3637          if ( tga_indexed )
3638          {
3639             //   read in 1 byte, then perform the lookup
3640             int pal_idx = get8u(s);
3641             if ( pal_idx >= tga_palette_len )
3642             {
3643                //   invalid index
3644                pal_idx = 0;
3645             }
3646             pal_idx *= tga_bits_per_pixel / 8;
3647             for (j = 0; j*8 < tga_bits_per_pixel; ++j)
3648             {
3649                raw_data[j] = tga_palette[pal_idx+j];
3650             }
3651          } else
3652          {
3653             //   read in the data raw
3654             for (j = 0; j*8 < tga_bits_per_pixel; ++j)
3655             {
3656                raw_data[j] = get8u(s);
3657             }
3658          }
3659          //   convert raw to the intermediate format
3660          switch (tga_bits_per_pixel)
3661          {
3662          case 8:
3663             //   Luminous => RGBA
3664             trans_data[0] = raw_data[0];
3665             trans_data[1] = raw_data[0];
3666             trans_data[2] = raw_data[0];
3667             trans_data[3] = 255;
3668             break;
3669          case 16:
3670             //   Luminous,Alpha => RGBA
3671             trans_data[0] = raw_data[0];
3672             trans_data[1] = raw_data[0];
3673             trans_data[2] = raw_data[0];
3674             trans_data[3] = raw_data[1];
3675             break;
3676          case 24:
3677             //   BGR => RGBA
3678             trans_data[0] = raw_data[2];
3679             trans_data[1] = raw_data[1];
3680             trans_data[2] = raw_data[0];
3681             trans_data[3] = 255;
3682             break;
3683          case 32:
3684             //   BGRA => RGBA
3685             trans_data[0] = raw_data[2];
3686             trans_data[1] = raw_data[1];
3687             trans_data[2] = raw_data[0];
3688             trans_data[3] = raw_data[3];
3689             break;
3690          }
3691          //   clear the reading flag for the next pixel
3692          read_next_pixel = 0;
3693       } // end of reading a pixel
3694       //   convert to final format
3695       switch (req_comp)
3696       {
3697       case 1:
3698          //   RGBA => Luminance
3699          tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]);
3700          break;
3701       case 2:
3702          //   RGBA => Luminance,Alpha
3703          tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]);
3704          tga_data[i*req_comp+1] = trans_data[3];
3705          break;
3706       case 3:
3707          //   RGBA => RGB
3708          tga_data[i*req_comp+0] = trans_data[0];
3709          tga_data[i*req_comp+1] = trans_data[1];
3710          tga_data[i*req_comp+2] = trans_data[2];
3711          break;
3712       case 4:
3713          //   RGBA => RGBA
3714          tga_data[i*req_comp+0] = trans_data[0];
3715          tga_data[i*req_comp+1] = trans_data[1];
3716          tga_data[i*req_comp+2] = trans_data[2];
3717          tga_data[i*req_comp+3] = trans_data[3];
3718          break;
3719       }
3720       //   in case we're in RLE mode, keep counting down
3721       --RLE_count;
3722    }
3723    //   do I need to invert the image?
3724    if ( tga_inverted )
3725    {
3726       for (j = 0; j*2 < tga_height; ++j)
3727       {
3728          int index1 = j * tga_width * req_comp;
3729          int index2 = (tga_height - 1 - j) * tga_width * req_comp;
3730          for (i = tga_width * req_comp; i > 0; --i)
3731          {
3732             unsigned char temp = tga_data[index1];
3733             tga_data[index1] = tga_data[index2];
3734             tga_data[index2] = temp;
3735             ++index1;
3736             ++index2;
3737          }
3738       }
3739    }
3740    //   clear my palette, if I had one
3741    if ( tga_palette != NULL )
3742    {
3743       FREE( tga_palette );
3744    }
3745    //   the things I do to get rid of an error message, and yet keep
3746    //   Microsoft's C compilers happy... [8^(
3747    tga_palette_start = tga_palette_len = tga_palette_bits =
3748          tga_x_origin = tga_y_origin = 0;
3749    //   OK, done
3750    return tga_data;
3751 }
3752 
3753 #ifndef STBI_NO_STDIO
3754 stbi_uc *stbi_tga_load             (char const *filename,           int *x, int *y, int *comp, int req_comp)
3755 {
3756    stbi_uc *data;
3757    FILE *f = fopen(filename, "rb");
3758    if (!f) return NULL;
3759    data = stbi_tga_load_from_file(f, x,y,comp,req_comp);
3760    fclose(f);
3761    return data;
3762 }
3763 
3764 stbi_uc *stbi_tga_load_from_file   (FILE *f,                  int *x, int *y, int *comp, int req_comp)
3765 {
3766    stbi s;
3767    start_file(&s, f);
3768    return tga_load(&s, x,y,comp,req_comp);
3769 }
3770 #endif
3771 
3772 stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
3773 {
3774    stbi s;
3775    start_mem(&s, buffer, len);
3776    return tga_load(&s, x,y,comp,req_comp);
3777 }
3778 
3779 
3780 // *************************************************************************************************
3781 // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
3782 
3783 static int psd_test(stbi *s)
3784 {
3785    if (get32(s) != 0x38425053) return 0;   // "8BPS"
3786    else return 1;
3787 }
3788 
3789 #ifndef STBI_NO_STDIO
3790 int stbi_psd_test_file(FILE *f)
3791 {
3792    stbi s;
3793    int r,n = ftell(f);
3794    start_file(&s, f);
3795    r = psd_test(&s);
3796    fseek(f,n,SEEK_SET);
3797    return r;
3798 }
3799 #endif
3800 
3801 int stbi_psd_test_memory(stbi_uc const *buffer, int len)
3802 {
3803    stbi s;
3804    start_mem(&s, buffer, len);
3805    return psd_test(&s);
3806 }
3807 
3808 static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3809 {
3810    int   pixelCount;
3811    int channelCount, compression;
3812    int channel, i, count, len;
3813    int w,h;
3814    uint8 *out;
3815 
3816    // Check identifier
3817    if (get32(s) != 0x38425053)   // "8BPS"
3818       return epuc("not PSD", "Corrupt PSD image");
3819 
3820    // Check file type version.
3821    if (get16(s) != 1)
3822       return epuc("wrong version", "Unsupported version of PSD image");
3823 
3824    // Skip 6 reserved bytes.
3825    skip(s, 6 );
3826 
3827    // Read the number of channels (R, G, B, A, etc).
3828    channelCount = get16(s);
3829    if (channelCount < 0 || channelCount > 16)
3830       return epuc("wrong channel count", "Unsupported number of channels in PSD image");
3831 
3832    // Read the rows and columns of the image.
3833    h = get32(s);
3834    w = get32(s);
3835 
3836    // Make sure the depth is 8 bits.
3837    if (get16(s) != 8)
3838       return epuc("unsupported bit depth", "PSD bit depth is not 8 bit");
3839 
3840    // Make sure the color mode is RGB.
3841    // Valid options are:
3842    //   0: Bitmap
3843    //   1: Grayscale
3844    //   2: Indexed color
3845    //   3: RGB color
3846    //   4: CMYK color
3847    //   7: Multichannel
3848    //   8: Duotone
3849    //   9: Lab color
3850    if (get16(s) != 3)
3851       return epuc("wrong color format", "PSD is not in RGB color format");
3852 
3853    // Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)
3854    skip(s,get32(s) );
3855 
3856    // Skip the image resources.  (resolution, pen tool paths, etc)
3857    skip(s, get32(s) );
3858 
3859    // Skip the reserved data.
3860    skip(s, get32(s) );
3861 
3862    // Find out if the data is compressed.
3863    // Known values:
3864    //   0: no compression
3865    //   1: RLE compressed
3866    compression = get16(s);
3867    if (compression > 1)
3868       return epuc("bad compression", "PSD has an unknown compression format");
3869 
3870    // Create the destination image.
3871    out = (stbi_uc *) MALLOC(4 * w*h);
3872    if (!out) return epuc("outofmem", "Out of memory");
3873    pixelCount = w*h;
3874 
3875    // Initialize the data to zero.
3876    //memset( out, 0, pixelCount * 4 );
3877 
3878    // Finally, the image data.
3879    if (compression) {
3880       // RLE as used by .PSD and .TIFF
3881       // Loop until you get the number of unpacked bytes you are expecting:
3882       //     Read the next source byte into n.
3883       //     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
3884       //     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
3885       //     Else if n is 128, noop.
3886       // Endloop
3887 
3888       // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,
3889       // which we're going to just skip.
3890       skip(s, h * channelCount * 2 );
3891 
3892       // Read the RLE data by channel.
3893       for (channel = 0; channel < 4; channel++) {
3894          uint8 *p;
3895 
3896          p = out+channel;
3897          if (channel >= channelCount) {
3898             // Fill this channel with default data.
3899             for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;
3900          } else {
3901             // Read the RLE data.
3902             count = 0;
3903             while (count < pixelCount) {
3904                len = get8(s);
3905                if (len == 128) {
3906                   // No-op.
3907                } else if (len < 128) {
3908                   // Copy next len+1 bytes literally.
3909                   len++;
3910                   count += len;
3911                   while (len) {
3912                      *p = get8u(s);
3913                      p += 4;
3914                      len--;
3915                   }
3916                } else if (len > 128) {
3917                   uint8   val;
3918                   // Next -len+1 bytes in the dest are replicated from next source byte.
3919                   // (Interpret len as a negative 8-bit int.)
3920                   len ^= 0x0FF;
3921                   len += 2;
3922                   val = get8u(s);
3923                   count += len;
3924                   while (len) {
3925                      *p = val;
3926                      p += 4;
3927                      len--;
3928                   }
3929                }
3930             }
3931          }
3932       }
3933 
3934    } else {
3935       // We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)
3936       // where each channel consists of an 8-bit value for each pixel in the image.
3937 
3938       // Read the data by channel.
3939       for (channel = 0; channel < 4; channel++) {
3940          uint8 *p;
3941 
3942          p = out + channel;
3943          if (channel > channelCount) {
3944             // Fill this channel with default data.
3945             for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;
3946          } else {
3947             // Read the data.
3948             for (i = 0; i < pixelCount; i++)
3949                *p = get8u(s), p += 4;
3950          }
3951       }
3952    }
3953 
3954    if (req_comp && req_comp != 4) {
3955       out = convert_format(out, 4, req_comp, w, h);
3956       if (out == NULL) return out; // convert_format frees input on failure
3957    }
3958 
3959    if (comp) *comp = channelCount;
3960    *y = h;
3961    *x = w;
3962 
3963    return out;
3964 }
3965 
3966 #ifndef STBI_NO_STDIO
3967 stbi_uc *stbi_psd_load(char const *filename, int *x, int *y, int *comp, int req_comp)
3968 {
3969    stbi_uc *data;
3970    FILE *f = fopen(filename, "rb");
3971    if (!f) return NULL;
3972    data = stbi_psd_load_from_file(f, x,y,comp,req_comp);
3973    fclose(f);
3974    return data;
3975 }
3976 
3977 stbi_uc *stbi_psd_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
3978 {
3979    stbi s;
3980    start_file(&s, f);
3981    return psd_load(&s, x,y,comp,req_comp);
3982 }
3983 #endif
3984 
3985 stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
3986 {
3987    stbi s;
3988    start_mem(&s, buffer, len);
3989    return psd_load(&s, x,y,comp,req_comp);
3990 }
3991 
3992 // *************************************************************************************************
3993 // Softimage PIC loader
3994 // by Tom Seddon
3995 //
3996 // See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
3997 // See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
3998 
3999 static int pic_is4(stbi *s,const char *str)
4000 {
4001    int i;
4002    for (i=0; i<4; ++i)
4003       if (get8(s) != (stbi_uc)str[i])
4004          return 0;
4005 
4006    return 1;
4007 }
4008 
4009 static int pic_test(stbi *s)
4010 {
4011    int i;
4012 
4013    if (!pic_is4(s,"\x53\x80\xF6\x34"))
4014       return 0;
4015 
4016    for(i=0;i<84;++i)
4017       get8(s);
4018 
4019    if (!pic_is4(s,"PICT"))
4020       return 0;
4021 
4022    return 1;
4023 }
4024 
4025 typedef struct
4026 {
4027    stbi_uc size,type,channel;
4028 } pic_packet_t;
4029 
4030 static stbi_uc *pic_readval(stbi *s, int channel, stbi_uc *dest)
4031 {
4032    int mask=0x80, i;
4033 
4034    for (i=0; i<4; ++i, mask>>=1) {
4035       if (channel & mask) {
4036          if (at_eof(s)) return epuc("bad file","PIC file too short");
4037          dest[i]=get8u(s);
4038       }
4039    }
4040 
4041    return dest;
4042 }
4043 
4044 static void pic_copyval(int channel,stbi_uc *dest,const stbi_uc *src)
4045 {
4046    int mask=0x80,i;
4047 
4048    for (i=0;i<4; ++i, mask>>=1)
4049       if (channel&mask)
4050          dest[i]=src[i];
4051 }
4052 
4053 static stbi_uc *pic_load2(stbi *s,int width,int height,int *comp, stbi_uc *result)
4054 {
4055    int act_comp=0,num_packets=0,y,chained;
4056    pic_packet_t packets[10];
4057 
4058    // this will (should...) cater for even some bizarre stuff like having data
4059     // for the same channel in multiple packets.
4060    do {
4061       pic_packet_t *packet;
4062 
4063       if (num_packets==sizeof(packets)/sizeof(packets[0]))
4064          return epuc("bad format","too many packets");
4065 
4066       packet = &packets[num_packets++];
4067 
4068       chained = get8(s);
4069       packet->size    = get8u(s);
4070       packet->type    = get8u(s);
4071       packet->channel = get8u(s);
4072 
4073       act_comp |= packet->channel;
4074 
4075       if (at_eof(s))          return epuc("bad file","file too short (reading packets)");
4076       if (packet->size != 8)  return epuc("bad format","packet isn't 8bpp");
4077    } while (chained);
4078 
4079    *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
4080 
4081    for(y=0; y<height; ++y) {
4082       int packet_idx;
4083 
4084       for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
4085          pic_packet_t *packet = &packets[packet_idx];
4086          stbi_uc *dest = result+y*width*4;
4087 
4088          switch (packet->type) {
4089             default:
4090                return epuc("bad format","packet has bad compression type");
4091 
4092             case 0: {//uncompressed
4093                int x;
4094 
4095                for(x=0;x<width;++x, dest+=4)
4096                   if (!pic_readval(s,packet->channel,dest))
4097                      return 0;
4098                break;
4099             }
4100 
4101             case 1://Pure RLE
4102                {
4103                   int left=width, i;
4104 
4105                   while (left>0) {
4106                      stbi_uc count,value[4];
4107 
4108                      count=get8u(s);
4109                      if (at_eof(s))   return epuc("bad file","file too short (pure read count)");
4110 
4111                      if (count > left)
4112                         count = (uint8) left;
4113 
4114                      if (!pic_readval(s,packet->channel,value))  return 0;
4115 
4116                      for(i=0; i<count; ++i,dest+=4)
4117                         pic_copyval(packet->channel,dest,value);
4118                      left -= count;
4119                   }
4120                }
4121                break;
4122 
4123             case 2: {//Mixed RLE
4124                int left=width;
4125                while (left>0) {
4126                   int count = get8(s), i;
4127                   if (at_eof(s))  return epuc("bad file","file too short (mixed read count)");
4128 
4129                   if (count >= 128) { // Repeated
4130                      stbi_uc value[4];
4131 
4132                      if (count==128)
4133                         count = get16(s);
4134                      else
4135                         count -= 127;
4136                      if (count > left)
4137                         return epuc("bad file","scanline overrun");
4138 
4139                      if (!pic_readval(s,packet->channel,value))
4140                         return 0;
4141 
4142                      for(i=0;i<count;++i, dest += 4)
4143                         pic_copyval(packet->channel,dest,value);
4144                   } else { // Raw
4145                      ++count;
4146                      if (count>left) return epuc("bad file","scanline overrun");
4147 
4148                      for(i=0;i<count;++i, dest+=4)
4149                         if (!pic_readval(s,packet->channel,dest))
4150                            return 0;
4151                   }
4152                   left-=count;
4153                }
4154                break;
4155             }
4156          }
4157       }
4158    }
4159 
4160    return result;
4161 }
4162 
4163 static stbi_uc *pic_load(stbi *s,int *px,int *py,int *comp,int req_comp)
4164 {
4165    stbi_uc *result;
4166    int i, x,y;
4167 
4168    for (i=0; i<92; ++i)
4169       get8(s);
4170 
4171    x = get16(s);
4172    y = get16(s);
4173    if (at_eof(s))  return epuc("bad file","file too short (pic header)");
4174    if ((1 << 28) / x < y) return epuc("too large", "Image too large to decode");
4175 
4176    get32(s); //skip `ratio'
4177    get16(s); //skip `fields'
4178    get16(s); //skip `pad'
4179 
4180    // intermediate buffer is RGBA
4181    result = (stbi_uc *) MALLOC(x*y*4);
4182    memset(result, 0xff, x*y*4);
4183 
4184    if (!pic_load2(s,x,y,comp, result)) {
4185       FREE(result);
4186       result=0;
4187    }
4188    *px = x;
4189    *py = y;
4190    if (req_comp == 0) req_comp = *comp;
4191    result=convert_format(result,4,req_comp,x,y);
4192 
4193    return result;
4194 }
4195 
4196 int stbi_pic_test_memory(stbi_uc const *buffer, int len)
4197 {
4198    stbi s;
4199    start_mem(&s,buffer,len);
4200    return pic_test(&s);
4201 }
4202 
4203 stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
4204 {
4205    stbi s;
4206    start_mem(&s,buffer,len);
4207    return pic_load(&s,x,y,comp,req_comp);
4208 }
4209 
4210 #ifndef STBI_NO_STDIO
4211 int stbi_pic_test_file(FILE *f)
4212 {
4213    int result;
4214    long l = ftell(f);
4215    stbi s;
4216    start_file(&s,f);
4217    result = pic_test(&s);
4218    fseek(f,l,SEEK_SET);
4219    return result;
4220 }
4221 
4222 stbi_uc *stbi_pic_load(char const *filename,int *x, int *y, int *comp, int req_comp)
4223 {
4224    stbi_uc *result;
4225    FILE *f=fopen(filename,"rb");
4226    if (!f) return 0;
4227    result = stbi_pic_load_from_file(f,x,y,comp,req_comp);
4228    fclose(f);
4229    return result;
4230 }
4231 
4232 stbi_uc *stbi_pic_load_from_file(FILE *f,int *x, int *y, int *comp, int req_comp)
4233 {
4234    stbi s;
4235    start_file(&s,f);
4236    return pic_load(&s,x,y,comp,req_comp);
4237 }
4238 #endif
4239 
4240 // *************************************************************************************************
4241 // GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
4242 typedef struct stbi_gif_lzw_struct {
4243    int16 prefix;
4244    uint8 first;
4245    uint8 suffix;
4246 } stbi_gif_lzw;
4247 
4248 typedef struct stbi_gif_struct
4249 {
4250    int w,h;
4251    stbi_uc *out;                 // output buffer (always 4 components)
4252    int flags, bgindex, ratio, transparent, eflags;
4253    uint8  pal[256][4];
4254    uint8 lpal[256][4];
4255    stbi_gif_lzw codes[4096];
4256    uint8 *color_table;
4257    int parse, step;
4258    int lflags;
4259    int start_x, start_y;
4260    int max_x, max_y;
4261    int cur_x, cur_y;
4262    int line_size;
4263 } stbi_gif;
4264 
4265 static int gif_test(stbi *s)
4266 {
4267    int sz;
4268    if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') return 0;
4269    sz = get8(s);
4270    if (sz != '9' && sz != '7') return 0;
4271    if (get8(s) != 'a') return 0;
4272    return 1;
4273 }
4274 
4275 #ifndef STBI_NO_STDIO
4276 int      stbi_gif_test_file        (FILE *f)
4277 {
4278    stbi s;
4279    int r,n = ftell(f);
4280    start_file(&s,f);
4281    r = gif_test(&s);
4282    fseek(f,n,SEEK_SET);
4283    return r;
4284 }
4285 #endif
4286 
4287 int      stbi_gif_test_memory      (stbi_uc const *buffer, int len)
4288 {
4289    stbi s;
4290    start_mem(&s, buffer, len);
4291    return gif_test(&s);
4292 }
4293 
4294 static void stbi_gif_parse_colortable(stbi *s, uint8 pal[256][4], int num_entries, int transp)
4295 {
4296    int i;
4297    for (i=0; i < num_entries; ++i) {
4298       pal[i][2] = get8u(s);
4299       pal[i][1] = get8u(s);
4300       pal[i][0] = get8u(s);
4301       pal[i][3] = transp ? 0 : 255;
4302    }
4303 }
4304 
4305 static int stbi_gif_header(stbi *s, stbi_gif *g, int *comp, int is_info)
4306 {
4307    uint8 ver;
4308    if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8')
4309       return e("not GIF", "Corrupt GIF");
4310 
4311    ver = get8u(s);
4312    if (ver != '7' && ver != '9')    return e("not GIF", "Corrupt GIF");
4313    if (get8(s) != 'a')                      return e("not GIF", "Corrupt GIF");
4314 
4315    failure_reason = "";
4316    g->w = get16le(s);
4317    g->h = get16le(s);
4318    g->flags = get8(s);
4319    g->bgindex = get8(s);
4320    g->ratio = get8(s);
4321    g->transparent = -1;
4322 
4323    if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments
4324 
4325    if (is_info) return 1;
4326 
4327    if (g->flags & 0x80)
4328       stbi_gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
4329 
4330    return 1;
4331 }
4332 
4333 static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp)
4334 {
4335    stbi_gif g;
4336    if (!stbi_gif_header(s, &g, comp, 1)) return 0;
4337    if (x) *x = g.w;
4338    if (y) *y = g.h;
4339    return 1;
4340 }
4341 
4342 static void stbi_out_gif_code(stbi_gif *g, uint16 code)
4343 {
4344    uint8 *p, *c;
4345 
4346    // recurse to decode the prefixes, since the linked-list is backwards,
4347    // and working backwards through an interleaved image would be nasty
4348    if (g->codes[code].prefix >= 0)
4349       stbi_out_gif_code(g, g->codes[code].prefix);
4350 
4351    if (g->cur_y >= g->max_y) return;
4352 
4353    p = &g->out[g->cur_x + g->cur_y];
4354    c = &g->color_table[g->codes[code].suffix * 4];
4355 
4356    if (c[3] >= 128) {
4357       p[0] = c[2];
4358       p[1] = c[1];
4359       p[2] = c[0];
4360       p[3] = c[3];
4361    }
4362    g->cur_x += 4;
4363 
4364    if (g->cur_x >= g->max_x) {
4365       g->cur_x = g->start_x;
4366       g->cur_y += g->step;
4367 
4368       while (g->cur_y >= g->max_y && g->parse > 0) {
4369          g->step = (1 << g->parse) * g->line_size;
4370          g->cur_y = g->start_y + (g->step >> 1);
4371          --g->parse;
4372       }
4373    }
4374 }
4375 
4376 static uint8 *stbi_process_gif_raster(stbi *s, stbi_gif *g)
4377 {
4378    uint8 lzw_cs;
4379    int32 len, code;
4380    uint32 first;
4381    int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
4382    stbi_gif_lzw *p;
4383 
4384    lzw_cs = get8u(s);
4385    clear = 1 << lzw_cs;
4386    first = 1;
4387    codesize = lzw_cs + 1;
4388    codemask = (1 << codesize) - 1;
4389    bits = 0;
4390    valid_bits = 0;
4391    for (code = 0; code < clear; code++) {
4392       g->codes[code].prefix = -1;
4393       g->codes[code].first = (uint8) code;
4394       g->codes[code].suffix = (uint8) code;
4395    }
4396 
4397    // support no starting clear code
4398    avail = clear+2;
4399    oldcode = -1;
4400 
4401    len = 0;
4402    for(;;) {
4403       if (valid_bits < codesize) {
4404          if (len == 0) {
4405             len = get8(s); // start new block
4406             if (len == 0)
4407                return g->out;
4408          }
4409          --len;
4410          bits |= (int32) get8(s) << valid_bits;
4411          valid_bits += 8;
4412       } else {
4413          code = bits & codemask;
4414          bits >>= codesize;
4415          valid_bits -= codesize;
4416          // @OPTIMIZE: is there some way we can accelerate the non-clear path?
4417          if (code == clear) {  // clear code
4418             codesize = lzw_cs + 1;
4419             codemask = (1 << codesize) - 1;
4420             avail = clear + 2;
4421             oldcode = -1;
4422             first = 0;
4423          } else if (code == clear + 1) { // end of stream code
4424             skip(s, len);
4425             while ((len = get8(s)) > 0)
4426                skip(s,len);
4427             return g->out;
4428          } else if (code <= avail) {
4429             if (first) return epuc("no clear code", "Corrupt GIF");
4430 
4431             if (oldcode >= 0) {
4432                p = &g->codes[avail++];
4433                if (avail > 4096)        return epuc("too many codes", "Corrupt GIF");
4434                p->prefix = (int16) oldcode;
4435                p->first = g->codes[oldcode].first;
4436                p->suffix = (code == avail) ? p->first : g->codes[code].first;
4437             } else if (code == avail)
4438                return epuc("illegal code in raster", "Corrupt GIF");
4439 
4440             stbi_out_gif_code(g, (uint16) code);
4441 
4442             if ((avail & codemask) == 0 && avail <= 0x0FFF) {
4443                codesize++;
4444                codemask = (1 << codesize) - 1;
4445             }
4446 
4447             oldcode = code;
4448          } else {
4449             return epuc("illegal code in raster", "Corrupt GIF");
4450          }
4451       }
4452    }
4453 }
4454 
4455 static void stbi_fill_gif_background(stbi_gif *g)
4456 {
4457    int i;
4458    uint8 *c = g->pal[g->bgindex];
4459    // @OPTIMIZE: write a dword at a time
4460    for (i = 0; i < g->w * g->h * 4; i += 4) {
4461       uint8 *p  = &g->out[i];
4462       p[0] = c[2];
4463       p[1] = c[1];
4464       p[2] = c[0];
4465       p[3] = c[3];
4466    }
4467 }
4468 
4469 // this function is designed to support animated gifs, although stb_image doesn't support it
4470 static uint8 *stbi_gif_load_next(stbi *s, stbi_gif *g, int *comp, int req_comp)
4471 {
4472    int i;
4473    uint8 *old_out = 0;
4474 
4475    if (g->out == 0) {
4476       if (!stbi_gif_header(s, g, comp,0))     return 0; // failure_reason set by stbi_gif_header
4477       g->out = (uint8 *) MALLOC(4 * g->w * g->h);
4478       if (g->out == 0)                      return epuc("outofmem", "Out of memory");
4479       stbi_fill_gif_background(g);
4480    } else {
4481       // animated-gif-only path
4482       if (((g->eflags & 0x1C) >> 2) == 3) {
4483          old_out = g->out;
4484          g->out = (uint8 *) MALLOC(4 * g->w * g->h);
4485          if (g->out == 0)                   return epuc("outofmem", "Out of memory");
4486          memcpy(g->out, old_out, g->w*g->h*4);
4487       }
4488    }
4489 
4490    for (;;) {
4491       switch (get8(s)) {
4492          case 0x2C: /* Image Descriptor */
4493          {
4494             int32 x, y, w, h;
4495             uint8 *o;
4496 
4497             x = get16le(s);
4498             y = get16le(s);
4499             w = get16le(s);
4500             h = get16le(s);
4501             if (((x + w) > (g->w)) || ((y + h) > (g->h)))
4502                return epuc("bad Image Descriptor", "Corrupt GIF");
4503 
4504             g->line_size = g->w * 4;
4505             g->start_x = x * 4;
4506             g->start_y = y * g->line_size;
4507             g->max_x   = g->start_x + w * 4;
4508             g->max_y   = g->start_y + h * g->line_size;
4509             g->cur_x   = g->start_x;
4510             g->cur_y   = g->start_y;
4511 
4512             g->lflags = get8(s);
4513 
4514             if (g->lflags & 0x40) {
4515                g->step = 8 * g->line_size; // first interlaced spacing
4516                g->parse = 3;
4517             } else {
4518                g->step = g->line_size;
4519                g->parse = 0;
4520             }
4521 
4522             if (g->lflags & 0x80) {
4523                stbi_gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
4524                g->color_table = (uint8 *) g->lpal;
4525             } else if (g->flags & 0x80) {
4526                for (i=0; i < 256; ++i)  // @OPTIMIZE: reset only the previous transparent
4527                   g->pal[i][3] = 255;
4528                if (g->transparent >= 0 && (g->eflags & 0x01))
4529                   g->pal[g->transparent][3] = 0;
4530                g->color_table = (uint8 *) g->pal;
4531             } else
4532                return epuc("missing color table", "Corrupt GIF");
4533 
4534             o = stbi_process_gif_raster(s, g);
4535             if (o == NULL) return NULL;
4536 
4537             if (req_comp && req_comp != 4)
4538                o = convert_format(o, 4, req_comp, g->w, g->h);
4539             return o;
4540          }
4541 
4542          case 0x21: // Comment Extension.
4543          {
4544             int len;
4545             if (get8(s) == 0xF9) { // Graphic Control Extension.
4546                len = get8(s);
4547                if (len == 4) {
4548                   g->eflags = get8(s);
4549                   get16le(s); // delay
4550                   g->transparent = get8(s);
4551                } else {
4552                   skip(s, len);
4553                   break;
4554                }
4555             }
4556             while ((len = get8(s)) != 0)
4557                skip(s, len);
4558             break;
4559          }
4560 
4561          case 0x3B: // gif stream termination code
4562             return (uint8 *) 1;
4563 
4564          default:
4565             return epuc("unknown code", "Corrupt GIF");
4566       }
4567    }
4568 }
4569 
4570 #ifndef STBI_NO_STDIO
4571 stbi_uc *stbi_gif_load             (char const *filename,           int *x, int *y, int *comp, int req_comp)
4572 {
4573    uint8 *data;
4574    FILE *f = fopen(filename, "rb");
4575    if (!f) return NULL;
4576    data = stbi_gif_load_from_file(f, x,y,comp,req_comp);
4577    fclose(f);
4578    return data;
4579 }
4580 
4581 stbi_uc *stbi_gif_load_from_file   (FILE *f, int *x, int *y, int *comp, int req_comp)
4582 {
4583    uint8 *u = 0;
4584    stbi s;
4585    stbi_gif g={0};
4586    start_file(&s, f);
4587 
4588    u = stbi_gif_load_next(&s, &g, comp, req_comp);
4589    if (u == (void *) 1) u = 0;  // end of animated gif marker
4590    if (u) {
4591       *x = g.w;
4592       *y = g.h;
4593    }
4594 
4595    return u;
4596 }
4597 #endif
4598 
4599 stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
4600 {
4601    uint8 *u = 0;
4602    stbi s;
4603    stbi_gif *pg;
4604 
4605    #ifdef STBI_SMALL_STACK
4606    pg = (stbi_gif *) MALLOC(sizeof(*pg));
4607    if (pg == NULL)
4608       return NULL;
4609    #else
4610    stbi_gif g;
4611    pg = &g;
4612    #endif
4613 
4614    memset(pg, 0, sizeof(*pg));
4615    start_mem(&s, buffer, len);
4616    u = stbi_gif_load_next(&s, pg, comp, req_comp);
4617    if (u == (void *) 1) u = 0;  // end of animated gif marker
4618    if (u) {
4619       *x = pg->w;
4620       *y = pg->h;
4621    }
4622 
4623    #ifdef STBI_SMALL_STACK
4624    FREE(pg);
4625    #endif
4626 
4627    return u;
4628 }
4629 
4630 #ifndef STBI_NO_STDIO
4631 int      stbi_gif_info             (char const *filename,           int *x, int *y, int *comp)
4632 {
4633    int res;
4634    FILE *f = fopen(filename, "rb");
4635    if (!f) return 0;
4636    res = stbi_gif_info_from_file(f, x, y, comp);
4637    fclose(f);
4638    return res;
4639 }
4640 
4641 int stbi_gif_info_from_file(FILE *f, int *x, int *y, int *comp)
4642 {
4643    stbi s;
4644    int res;
4645    long n = ftell(f);
4646    start_file(&s, f);
4647    res = stbi_gif_info_raw(&s, x, y, comp);
4648    fseek(f, n, SEEK_SET);
4649    return res;
4650 }
4651 #endif // !STBI_NO_STDIO
4652 
4653 int stbi_gif_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
4654 {
4655    stbi s;
4656    start_mem(&s, buffer, len);
4657    return stbi_gif_info_raw(&s, x, y, comp);
4658 }
4659 
4660 
4661 
4662 
4663 // *************************************************************************************************
4664 // Radiance RGBE HDR loader
4665 // originally by Nicolas Schulz
4666 #ifndef STBI_NO_HDR
4667 static int hdr_test(stbi *s)
4668 {
4669    const char *signature = "#?RADIANCE\n";
4670    int i;
4671    for (i=0; signature[i]; ++i)
4672       if (get8(s) != signature[i])
4673          return 0;
4674    return 1;
4675 }
4676 
4677 int stbi_hdr_test_memory(stbi_uc const *buffer, int len)
4678 {
4679    stbi s;
4680    start_mem(&s, buffer, len);
4681    return hdr_test(&s);
4682 }
4683 
4684 #ifndef STBI_NO_STDIO
4685 int stbi_hdr_test_file(FILE *f)
4686 {
4687    stbi s;
4688    int r,n = ftell(f);
4689    start_file(&s, f);
4690    r = hdr_test(&s);
4691    fseek(f,n,SEEK_SET);
4692    return r;
4693 }
4694 #endif
4695 
4696 #define HDR_BUFLEN  1024
4697 static char *hdr_gettoken(stbi *z, char *buffer)
4698 {
4699    int len=0;
4700    char c = '\0';
4701 
4702    c = (char) get8(z);
4703 
4704    while (!at_eof(z) && c != '\n') {
4705       buffer[len++] = c;
4706       if (len == HDR_BUFLEN-1) {
4707          // flush to end of line
4708          while (!at_eof(z) && get8(z) != '\n')
4709             ;
4710          break;
4711       }
4712       c = (char) get8(z);
4713    }
4714 
4715    buffer[len] = 0;
4716    return buffer;
4717 }
4718 
4719 static void hdr_convert(float *output, stbi_uc *input, int req_comp)
4720 {
4721    if ( input[3] != 0 ) {
4722       float f1;
4723       // Exponent
4724       f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
4725       if (req_comp <= 2)
4726          output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
4727       else {
4728          output[0] = input[0] * f1;
4729          output[1] = input[1] * f1;
4730          output[2] = input[2] * f1;
4731       }
4732       if (req_comp == 2) output[1] = 1;
4733       if (req_comp == 4) output[3] = 1;
4734    } else {
4735       switch (req_comp) {
4736          case 4: output[3] = 1; /* fallthrough */
4737          case 3: output[0] = output[1] = output[2] = 0;
4738                  break;
4739          case 2: output[1] = 1; /* fallthrough */
4740          case 1: output[0] = 0;
4741                  break;
4742       }
4743    }
4744 }
4745 
4746 
4747 static float *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp)
4748 {
4749    char buffer[HDR_BUFLEN];
4750    char *token;
4751    int valid = 0;
4752    int width, height;
4753    stbi_uc *scanline;
4754    float *hdr_data;
4755    int len;
4756    unsigned char count, value;
4757    int i, j, k, c1,c2, z;
4758 
4759 
4760    // Check identifier
4761    if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0)
4762       return epf("not HDR", "Corrupt HDR image");
4763 
4764    // Parse header
4765    for(;;) {
4766       token = hdr_gettoken(s,buffer);
4767       if (token[0] == 0) break;
4768       if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
4769    }
4770 
4771    if (!valid)    return epf("unsupported format", "Unsupported HDR format");
4772 
4773    // Parse width and height
4774    // can't use sscanf() if we're not using stdio!
4775    token = hdr_gettoken(s,buffer);
4776    if (strncmp(token, "-Y ", 3))  return epf("unsupported data layout", "Unsupported HDR format");
4777    token += 3;
4778    height = strtol(token, &token, 10);
4779    while (*token == ' ') ++token;
4780    if (strncmp(token, "+X ", 3))  return epf("unsupported data layout", "Unsupported HDR format");
4781    token += 3;
4782    width = strtol(token, NULL, 10);
4783 
4784    *x = width;
4785    *y = height;
4786 
4787    *comp = 3;
4788    if (req_comp == 0) req_comp = 3;
4789 
4790    // Read data
4791    hdr_data = (float *) MALLOC(height * width * req_comp * sizeof(float));
4792 
4793    // Load image data
4794    // image data is stored as some number of sca
4795    if ( width < 8 || width >= 32768) {
4796       // Read flat data
4797       for (j=0; j < height; ++j) {
4798          for (i=0; i < width; ++i) {
4799             stbi_uc rgbe[4];
4800            main_decode_loop:
4801             getn(s, rgbe, 4);
4802             hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
4803          }
4804       }
4805    } else {
4806       // Read RLE-encoded data
4807       scanline = NULL;
4808 
4809       for (j = 0; j < height; ++j) {
4810          c1 = get8(s);
4811          c2 = get8(s);
4812          len = get8(s);
4813          if (c1 != 2 || c2 != 2 || (len & 0x80)) {
4814             // not run-length encoded, so we have to actually use THIS data as a decoded
4815             // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
4816             uint8 rgbe[4];
4817             rgbe[0] = (uint8) c1;
4818             rgbe[1] = (uint8) c2;
4819             rgbe[2] = (uint8) len;
4820             rgbe[3] = (uint8) get8u(s);
4821             hdr_convert(hdr_data, rgbe, req_comp);
4822             i = 1;
4823             j = 0;
4824             FREE(scanline);
4825             goto main_decode_loop; // yes, this makes no sense
4826          }
4827          len <<= 8;
4828          len |= get8(s);
4829          if (len != width) { FREE(hdr_data); FREE(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); }
4830          if (scanline == NULL) scanline = (stbi_uc *) MALLOC(width * 4);
4831 
4832          for (k = 0; k < 4; ++k) {
4833             i = 0;
4834             while (i < width) {
4835                count = get8u(s);
4836                if (count > 128) {
4837                   // Run
4838                   value = get8u(s);
4839                   count -= 128;
4840                   for (z = 0; z < count; ++z)
4841                      scanline[i++ * 4 + k] = value;
4842                } else {
4843                   // Dump
4844                   for (z = 0; z < count; ++z)
4845                      scanline[i++ * 4 + k] = get8u(s);
4846                }
4847             }
4848          }
4849          for (i=0; i < width; ++i)
4850             hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
4851       }
4852       FREE(scanline);
4853    }
4854 
4855    return hdr_data;
4856 }
4857 
4858 #ifndef STBI_NO_STDIO
4859 float *stbi_hdr_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
4860 {
4861    stbi s;
4862    start_file(&s,f);
4863    return hdr_load(&s,x,y,comp,req_comp);
4864 }
4865 #endif
4866 
4867 float *stbi_hdr_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
4868 {
4869    stbi s;
4870    start_mem(&s,buffer, len);
4871    return hdr_load(&s,x,y,comp,req_comp);
4872 }
4873 
4874 #endif // STBI_NO_HDR
4875 
4876 
4877 #ifndef STBI_NO_STDIO
4878 int stbi_info(char const *filename, int *x, int *y, int *comp)
4879 {
4880     FILE *f = fopen(filename, "rb");
4881     int result;
4882     if (!f) return e("can't fopen", "Unable to open file");
4883     result = stbi_info_from_file(f, x, y, comp);
4884     fclose(f);
4885     return result;
4886 }
4887 
4888 int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
4889 {
4890    if (stbi_jpeg_info_from_file(f, x, y, comp))
4891        return 1;
4892    if (stbi_png_info_from_file(f, x, y, comp))
4893        return 1;
4894    if (stbi_gif_info_from_file(f, x, y, comp))
4895        return 1;
4896    // @TODO: stbi_bmp_info_from_file
4897    // @TODO: stbi_psd_info_from_file
4898    #ifndef STBI_NO_HDR
4899    // @TODO: stbi_hdr_info_from_file
4900    #endif
4901    // test tga last because it's a crappy test!
4902    if (stbi_tga_info_from_file(f, x, y, comp))
4903        return 1;
4904    return e("unknown image type", "Image not of any known type, or corrupt");
4905 }
4906 #endif // !STBI_NO_STDIO
4907 
4908 int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
4909 {
4910    if (stbi_jpeg_info_from_memory(buffer, len, x, y, comp))
4911        return 1;
4912    if (stbi_png_info_from_memory(buffer, len, x, y, comp))
4913        return 1;
4914    if (stbi_gif_info_from_memory(buffer, len, x, y, comp))
4915        return 1;
4916    // @TODO: stbi_bmp_info_from_memory
4917    // @TODO: stbi_psd_info_from_memory
4918    #ifndef STBI_NO_HDR
4919    // @TODO: stbi_hdr_info_from_memory
4920    #endif
4921    // test tga last because it's a crappy test!
4922    if (stbi_tga_info_from_memory(buffer, len, x, y, comp))
4923        return 1;
4924    return e("unknown image type", "Image not of any known type, or corrupt");
4925 }
4926 
4927 #endif // STBI_HEADER_FILE_ONLY
4928 
4929 /*
4930    revision history:
4931       1.29 (2010-08-16) various warning fixes from Aurelien Pocheville
4932       1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ)
4933       1.27 (2010-08-01)
4934              cast-to-uint8 to fix warnings
4935       1.26 (2010-07-24)
4936              fix bug in file buffering for PNG reported by SpartanJ
4937       1.25 (2010-07-17)
4938              refix trans_data warning (Won Chun)
4939       1.24 (2010-07-12)
4940              perf improvements reading from files on platforms with lock-heavy fgetc()
4941              minor perf improvements for jpeg
4942              deprecated type-specific functions so we'll get feedback if they're needed
4943              attempt to fix trans_data warning (Won Chun)
4944       1.23   fixed bug in iPhone support
4945       1.22 (2010-07-10)
4946              removed image *writing* support
4947              removed image *writing* support
4948              stbi_info support from Jetro Lauha
4949              GIF support from Jean-Marc Lienher
4950              iPhone PNG-extensions from James Brown
4951              warning-fixes from Nicolas Schulz and Janez Zemva (i.e. Janez (U+017D)emva)
4952       1.21   fix use of 'uint8' in header (reported by jon blow)
4953       1.20   added support for Softimage PIC, by Tom Seddon
4954       1.19   bug in interlaced PNG corruption check (found by ryg)
4955       1.18 2008-08-02
4956              fix a threading bug (local mutable static)
4957       1.17   support interlaced PNG
4958       1.16   major bugfix - convert_format converted one too many pixels
4959       1.15   initialize some fields for thread safety
4960       1.14   fix threadsafe conversion bug
4961              header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
4962       1.13   threadsafe
4963       1.12   const qualifiers in the API
4964       1.11   Support installable IDCT, colorspace conversion routines
4965       1.10   Fixes for 64-bit (don't use "unsigned long")
4966              optimized upsampling by Fabian "ryg" Giesen
4967       1.09   Fix format-conversion for PSD code (bad global variables!)
4968       1.08   Thatcher Ulrich's PSD code integrated by Nicolas Schulz
4969       1.07   attempt to fix C++ warning/errors again
4970       1.06   attempt to fix C++ warning/errors again
4971       1.05   fix TGA loading to return correct *comp and use good luminance calc
4972       1.04   default float alpha is 1, not 255; use 'void *' for stbi_image_free
4973       1.03   bugfixes to STBI_NO_STDIO, STBI_NO_HDR
4974       1.02   support for (subset of) HDR files, float interface for preferred access to them
4975       1.01   fix bug: possible bug in handling right-side up bmps... not sure
4976              fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all
4977       1.00   interface to zlib that skips zlib header
4978       0.99   correct handling of alpha in palette
4979       0.98   TGA loader by lonesock; dynamically add loaders (untested)
4980       0.97   jpeg errors on too large a file; also catch another malloc failure
4981       0.96   fix detection of invalid v value - particleman@mollyrocket forum
4982       0.95   during header scan, seek to markers in case of padding
4983       0.94   STBI_NO_STDIO to disable stdio usage; rename all #defines the same
4984       0.93   handle jpegtran output; verbose errors
4985       0.92   read 4,8,16,24,32-bit BMP files of several formats
4986       0.91   output 24-bit Windows 3.0 BMP files
4987       0.90   fix a few more warnings; bump version number to approach 1.0
4988       0.61   bugfixes due to Marc LeBlanc, Christopher Lloyd
4989       0.60   fix compiling as c++
4990       0.59   fix warnings: merge Dave Moore's -Wall fixes
4991       0.58   fix bug: zlib uncompressed mode len/nlen was wrong endian
4992       0.57   fix bug: jpg last huffman symbol before marker was >9 bits but less
4993                       than 16 available
4994       0.56   fix bug: zlib uncompressed mode len vs. nlen
4995       0.55   fix bug: restart_interval not initialized to 0
4996       0.54   allow NULL for 'int *comp'
4997       0.53   fix bug in png 3->4; speedup png decoding
4998       0.52   png handles req_comp=3,4 directly; minor cleanup; jpeg comments
4999       0.51   obey req_comp requests, 1-component jpegs return as 1-component,
5000              on 'test' only check type, not whether we support this variant
5001 */
5002