Coverage Report

Created: 2026-02-12 07:06

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