Coverage Report

Created: 2025-10-10 07:21

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
2.68G
#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
25.5M
#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
91.7k
#define STBI_MALLOC(sz)           malloc(sz)
681
0
#define STBI_REALLOC(p,newsz)     realloc(p,newsz)
682
91.7k
#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
15.2k
{
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
15.2k
   return 1;
769
15.2k
}
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
32.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
33.2k
{
826
33.2k
   s->io.read = NULL;
827
33.2k
   s->read_from_callbacks = 0;
828
33.2k
   s->callback_already_read = 0;
829
33.2k
   s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
830
33.2k
   s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
831
33.2k
}
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
154k
{
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
154k
   s->img_buffer = s->img_buffer_original;
890
154k
   s->img_buffer_end = s->img_buffer_original_end;
891
154k
}
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
54.9k
{
978
54.9k
   stbi__g_failure_reason = str;
979
54.9k
   return 0;
980
54.9k
}
981
#endif
982
983
static void *stbi__malloc(size_t size)
984
91.7k
{
985
91.7k
    return STBI_MALLOC(size);
986
91.7k
}
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
49.2k
{
1002
49.2k
   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
49.2k
   return a <= INT_MAX - b;
1008
49.2k
}
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
86.0k
{
1014
86.0k
   if (a < 0 || b < 0) return 0;
1015
86.0k
   if (b == 0) return 1; // mul-by-0 is always safe
1016
   // portable way to check for no overflows in a*b
1017
86.0k
   return a <= INT_MAX/b;
1018
86.0k
}
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
20.8k
{
1024
20.8k
   return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
1025
20.8k
}
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
20.0k
{
1031
20.0k
   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
1032
20.0k
      stbi__addsizes_valid(a*b*c, add);
1033
20.0k
}
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
8.33k
{
1039
8.33k
   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
1040
8.33k
      stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
1041
8.33k
}
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
20.8k
{
1048
20.8k
   if (!stbi__mad2sizes_valid(a, b, add)) return NULL;
1049
20.8k
   return stbi__malloc(a*b + add);
1050
20.8k
}
1051
#endif
1052
1053
static void *stbi__malloc_mad3(int a, int b, int c, int add)
1054
13.2k
{
1055
13.2k
   if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;
1056
13.2k
   return stbi__malloc(a*b*c + add);
1057
13.2k
}
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
4.16k
{
1062
4.16k
   if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;
1063
4.16k
   return stbi__malloc(a*b*c*d + add);
1064
4.16k
}
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
54.9k
   #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
5.23k
#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
11.0k
{
1101
11.0k
   STBI_FREE(retval_from_stbi_load);
1102
11.0k
}
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
11.0k
#define stbi__vertically_flip_on_load  (stbi__vertically_flip_on_load_set       \
1131
11.0k
                                         ? stbi__vertically_flip_on_load_local  \
1132
11.0k
                                         : 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
11.0k
{
1137
11.0k
   memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
1138
11.0k
   ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed
1139
11.0k
   ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order
1140
11.0k
   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
11.0k
   #ifndef STBI_NO_PNG
1145
11.0k
   if (stbi__png_test(s))  return stbi__png_load(s,x,y,comp,req_comp, ri);
1146
11.0k
   #endif
1147
11.0k
   #ifndef STBI_NO_BMP
1148
11.0k
   if (stbi__bmp_test(s))  return stbi__bmp_load(s,x,y,comp,req_comp, ri);
1149
10.1k
   #endif
1150
10.1k
   #ifndef STBI_NO_GIF
1151
10.1k
   if (stbi__gif_test(s))  return stbi__gif_load(s,x,y,comp,req_comp, ri);
1152
10.1k
   #endif
1153
10.1k
   #ifndef STBI_NO_PSD
1154
10.1k
   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
10.1k
   #ifndef STBI_NO_PIC
1159
10.1k
   if (stbi__pic_test(s))  return stbi__pic_load(s,x,y,comp,req_comp, ri);
1160
10.1k
   #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
10.1k
   #ifndef STBI_NO_JPEG
1166
10.1k
   if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
1167
5.09k
   #endif
1168
5.09k
   #ifndef STBI_NO_PNM
1169
5.09k
   if (stbi__pnm_test(s))  return stbi__pnm_load(s,x,y,comp,req_comp, ri);
1170
929
   #endif
1171
1172
929
   #ifndef STBI_NO_HDR
1173
929
   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
929
   #endif
1178
1179
929
   #ifndef STBI_NO_TGA
1180
   // test tga last because it's a crappy test!
1181
929
   if (stbi__tga_test(s))
1182
929
      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
929
}
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
10.3k
{
1260
10.3k
   stbi__result_info ri;
1261
10.3k
   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1262
1263
10.3k
   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
10.3k
   STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1268
1269
10.3k
   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
10.3k
   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
10.3k
   return (unsigned char *) result;
1282
10.3k
}
1283
1284
static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1285
695
{
1286
695
   stbi__result_info ri;
1287
695
   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1288
1289
695
   if (result == NULL)
1290
2
      return NULL;
1291
1292
   // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
1293
693
   STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1294
1295
693
   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
693
   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
693
   return (stbi__uint16 *) result;
1309
693
}
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
695
{
1415
695
   stbi__context s;
1416
695
   stbi__start_mem(&s,buffer,len);
1417
695
   return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1418
695
}
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
10.3k
{
1429
10.3k
   stbi__context s;
1430
10.3k
   stbi__start_mem(&s,buffer,len);
1431
10.3k
   return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1432
10.3k
}
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
2.10G
{
1614
2.10G
   if (s->img_buffer < s->img_buffer_end)
1615
1.15M
      return *s->img_buffer++;
1616
2.10G
   if (s->read_from_callbacks) {
1617
0
      stbi__refill_buffer(s);
1618
0
      return *s->img_buffer++;
1619
0
   }
1620
2.10G
   return 0;
1621
2.10G
}
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
203k
{
1628
203k
   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
203k
   return s->img_buffer >= s->img_buffer_end;
1636
203k
}
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
15.7M
{
1644
15.7M
   if (n == 0) return;  // already there!
1645
7.19k
   if (n < 0) {
1646
0
      s->img_buffer = s->img_buffer_end;
1647
0
      return;
1648
0
   }
1649
7.19k
   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
7.19k
   s->img_buffer += n;
1658
7.19k
}
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
616k
{
1666
616k
   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
616k
   if (s->img_buffer+n <= s->img_buffer_end) {
1681
4.29k
      memcpy(buffer, s->img_buffer, n);
1682
4.29k
      s->img_buffer += n;
1683
4.29k
      return 1;
1684
4.29k
   } else
1685
612k
      return 0;
1686
616k
}
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
103k
{
1694
103k
   int z = stbi__get8(s);
1695
103k
   return (z << 8) + stbi__get8(s);
1696
103k
}
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
26.4k
{
1704
26.4k
   stbi__uint32 z = stbi__get16be(s);
1705
26.4k
   return (z << 16) + stbi__get16be(s);
1706
26.4k
}
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
942M
{
1714
942M
   int z = stbi__get8(s);
1715
942M
   return z + (stbi__get8(s) << 8);
1716
942M
}
1717
#endif
1718
1719
#ifndef STBI_NO_BMP
1720
static stbi__uint32 stbi__get32le(stbi__context *s)
1721
428M
{
1722
428M
   stbi__uint32 z = stbi__get16le(s);
1723
428M
   z += (stbi__uint32)stbi__get16le(s) << 16;
1724
428M
   return z;
1725
428M
}
1726
#endif
1727
1728
1.71G
#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
4.39k
{
1755
4.39k
   int i,j;
1756
4.39k
   unsigned char *good;
1757
1758
4.39k
   if (req_comp == img_n) return data;
1759
4.39k
   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1760
1761
4.39k
   good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
1762
4.39k
   if (good == NULL) {
1763
0
      STBI_FREE(data);
1764
0
      return stbi__errpuc("outofmem", "Out of memory");
1765
0
   }
1766
1767
1.14M
   for (j=0; j < (int) y; ++j) {
1768
1.13M
      unsigned char *src  = data + j * x * img_n   ;
1769
1.13M
      unsigned char *dest = good + j * x * req_comp;
1770
1771
2.27M
      #define STBI__COMBO(a,b)  ((a)*8+(b))
1772
783M
      #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
1.13M
      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
12.2k
         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
675M
         STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                  } break;
1782
107M
         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
1.13M
      }
1790
1.13M
      #undef STBI__CASE
1791
1.13M
   }
1792
1793
4.39k
   STBI_FREE(data);
1794
4.39k
   return good;
1795
4.39k
}
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
693
{
1812
693
   int i,j;
1813
693
   stbi__uint16 *good;
1814
1815
693
   if (req_comp == img_n) return data;
1816
693
   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1817
1818
693
   good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
1819
693
   if (good == NULL) {
1820
0
      STBI_FREE(data);
1821
0
      return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
1822
0
   }
1823
1824
1.54k
   for (j=0; j < (int) y; ++j) {
1825
848
      stbi__uint16 *src  = data + j * x * img_n   ;
1826
848
      stbi__uint16 *dest = good + j * x * req_comp;
1827
1828
1.69k
      #define STBI__COMBO(a,b)  ((a)*8+(b))
1829
2.58k
      #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
848
      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
1.20k
         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
528
         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
848
      }
1847
848
      #undef STBI__CASE
1848
848
   }
1849
1850
693
   STBI_FREE(data);
1851
693
   return good;
1852
693
}
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.57M
#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
1.00M
{
2003
1.00M
   int i,j,k=0;
2004
1.00M
   unsigned int code;
2005
   // build size list for each symbol (from JPEG spec)
2006
17.0M
   for (i=0; i < 16; ++i) {
2007
16.2M
      for (j=0; j < count[i]; ++j) {
2008
267k
         h->size[k++] = (stbi_uc) (i+1);
2009
267k
         if(k >= 257) return stbi__err("bad size list","Corrupt JPEG");
2010
267k
      }
2011
16.0M
   }
2012
1.00M
   h->size[k] = 0;
2013
2014
   // compute actual symbols (from jpeg spec)
2015
1.00M
   code = 0;
2016
1.00M
   k = 0;
2017
17.0M
   for(j=1; j <= 16; ++j) {
2018
      // compute delta to add to code to compute symbol id
2019
16.0M
      h->delta[j] = k - code;
2020
16.0M
      if (h->size[k] == j) {
2021
272k
         while (h->size[k] == j)
2022
258k
            h->code[k++] = (stbi__uint16) (code++);
2023
14.6k
         if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG");
2024
14.6k
      }
2025
      // compute largest code + 1 for this size, preshifted as needed later
2026
16.0M
      h->maxcode[j] = code << (16-j);
2027
16.0M
      code <<= 1;
2028
16.0M
   }
2029
1.00M
   h->maxcode[j] = 0xffffffff;
2030
2031
   // build non-spec acceleration table; 255 is flag for not-accelerated
2032
1.00M
   memset(h->fast, 255, 1 << FAST_BITS);
2033
1.22M
   for (i=0; i < k; ++i) {
2034
223k
      int s = h->size[i];
2035
223k
      if (s <= FAST_BITS) {
2036
62.1k
         int c = h->code[i] << (FAST_BITS-s);
2037
62.1k
         int m = 1 << (FAST_BITS-s);
2038
629k
         for (j=0; j < m; ++j) {
2039
567k
            h->fast[c+j] = (stbi_uc) i;
2040
567k
         }
2041
62.1k
      }
2042
223k
   }
2043
1.00M
   return 1;
2044
1.00M
}
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.01k
{
2050
1.01k
   int i;
2051
522k
   for (i=0; i < (1 << FAST_BITS); ++i) {
2052
521k
      stbi_uc fast = h->fast[i];
2053
521k
      fast_ac[i] = 0;
2054
521k
      if (fast < 255) {
2055
249k
         int rs = h->values[fast];
2056
249k
         int run = (rs >> 4) & 15;
2057
249k
         int magbits = rs & 15;
2058
249k
         int len = h->size[fast];
2059
2060
249k
         if (magbits && len + magbits <= FAST_BITS) {
2061
            // magnitude code followed by receive_extend code
2062
234k
            int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
2063
234k
            int m = 1 << (magbits - 1);
2064
234k
            if (k < m) k += (~0U << magbits) + 1;
2065
            // if the result is small enough, we can fit it in fast_ac table
2066
234k
            if (k >= -128 && k <= 127)
2067
931
               fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
2068
234k
         }
2069
249k
      }
2070
521k
   }
2071
1.01k
}
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
985k
{
2530
   // This is constructed to match our regular (generic) integer IDCT exactly.
2531
985k
   __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2532
985k
   __m128i tmp;
2533
2534
   // dot product constant: even elems=x, odd elems=y
2535
7.88M
   #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
985k
   #define dct_rot(out0,out1, x,y,c0,c1) \
2540
7.88M
      __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2541
7.88M
      __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2542
7.88M
      __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2543
7.88M
      __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2544
7.88M
      __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2545
7.88M
      __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2546
2547
   // out = in << 12  (in 16-bit, out 32-bit)
2548
985k
   #define dct_widen(out, in) \
2549
3.94M
      __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2550
3.94M
      __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2551
2552
   // wide add
2553
985k
   #define dct_wadd(out, a, b) \
2554
19.7M
      __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2555
19.7M
      __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2556
2557
   // wide sub
2558
985k
   #define dct_wsub(out, a, b) \
2559
11.8M
      __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2560
11.8M
      __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2561
2562
   // butterfly a/b, add bias, then shift by "s" and pack
2563
985k
   #define dct_bfly32o(out0, out1, a,b,bias,s) \
2564
7.88M
      { \
2565
7.88M
         __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2566
7.88M
         __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2567
7.88M
         dct_wadd(sum, abiased, b); \
2568
7.88M
         dct_wsub(dif, abiased, b); \
2569
7.88M
         out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2570
7.88M
         out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2571
7.88M
      }
2572
2573
   // 8-bit interleave step (for transposes)
2574
985k
   #define dct_interleave8(a, b) \
2575
5.91M
      tmp = a; \
2576
5.91M
      a = _mm_unpacklo_epi8(a, b); \
2577
5.91M
      b = _mm_unpackhi_epi8(tmp, b)
2578
2579
   // 16-bit interleave step (for transposes)
2580
985k
   #define dct_interleave16(a, b) \
2581
11.8M
      tmp = a; \
2582
11.8M
      a = _mm_unpacklo_epi16(a, b); \
2583
11.8M
      b = _mm_unpackhi_epi16(tmp, b)
2584
2585
985k
   #define dct_pass(bias,shift) \
2586
1.97M
      { \
2587
         /* even part */ \
2588
1.97M
         dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2589
1.97M
         __m128i sum04 = _mm_add_epi16(row0, row4); \
2590
1.97M
         __m128i dif04 = _mm_sub_epi16(row0, row4); \
2591
1.97M
         dct_widen(t0e, sum04); \
2592
1.97M
         dct_widen(t1e, dif04); \
2593
1.97M
         dct_wadd(x0, t0e, t3e); \
2594
1.97M
         dct_wsub(x3, t0e, t3e); \
2595
1.97M
         dct_wadd(x1, t1e, t2e); \
2596
1.97M
         dct_wsub(x2, t1e, t2e); \
2597
         /* odd part */ \
2598
1.97M
         dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2599
1.97M
         dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2600
1.97M
         __m128i sum17 = _mm_add_epi16(row1, row7); \
2601
1.97M
         __m128i sum35 = _mm_add_epi16(row3, row5); \
2602
1.97M
         dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2603
1.97M
         dct_wadd(x4, y0o, y4o); \
2604
1.97M
         dct_wadd(x5, y1o, y5o); \
2605
1.97M
         dct_wadd(x6, y2o, y5o); \
2606
1.97M
         dct_wadd(x7, y3o, y4o); \
2607
1.97M
         dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2608
1.97M
         dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2609
1.97M
         dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2610
1.97M
         dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2611
1.97M
      }
2612
2613
985k
   __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2614
985k
   __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2615
985k
   __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2616
985k
   __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2617
985k
   __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2618
985k
   __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2619
985k
   __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2620
985k
   __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
985k
   __m128i bias_0 = _mm_set1_epi32(512);
2624
985k
   __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2625
2626
   // load
2627
985k
   row0 = _mm_load_si128((const __m128i *) (data + 0*8));
2628
985k
   row1 = _mm_load_si128((const __m128i *) (data + 1*8));
2629
985k
   row2 = _mm_load_si128((const __m128i *) (data + 2*8));
2630
985k
   row3 = _mm_load_si128((const __m128i *) (data + 3*8));
2631
985k
   row4 = _mm_load_si128((const __m128i *) (data + 4*8));
2632
985k
   row5 = _mm_load_si128((const __m128i *) (data + 5*8));
2633
985k
   row6 = _mm_load_si128((const __m128i *) (data + 6*8));
2634
985k
   row7 = _mm_load_si128((const __m128i *) (data + 7*8));
2635
2636
   // column pass
2637
985k
   dct_pass(bias_0, 10);
2638
2639
985k
   {
2640
      // 16bit 8x8 transpose pass 1
2641
985k
      dct_interleave16(row0, row4);
2642
985k
      dct_interleave16(row1, row5);
2643
985k
      dct_interleave16(row2, row6);
2644
985k
      dct_interleave16(row3, row7);
2645
2646
      // transpose pass 2
2647
985k
      dct_interleave16(row0, row2);
2648
985k
      dct_interleave16(row1, row3);
2649
985k
      dct_interleave16(row4, row6);
2650
985k
      dct_interleave16(row5, row7);
2651
2652
      // transpose pass 3
2653
985k
      dct_interleave16(row0, row1);
2654
985k
      dct_interleave16(row2, row3);
2655
985k
      dct_interleave16(row4, row5);
2656
985k
      dct_interleave16(row6, row7);
2657
985k
   }
2658
2659
   // row pass
2660
985k
   dct_pass(bias_1, 17);
2661
2662
985k
   {
2663
      // pack
2664
985k
      __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7
2665
985k
      __m128i p1 = _mm_packus_epi16(row2, row3);
2666
985k
      __m128i p2 = _mm_packus_epi16(row4, row5);
2667
985k
      __m128i p3 = _mm_packus_epi16(row6, row7);
2668
2669
      // 8bit 8x8 transpose pass 1
2670
985k
      dct_interleave8(p0, p2); // a0e0a1e1...
2671
985k
      dct_interleave8(p1, p3); // c0g0c1g1...
2672
2673
      // transpose pass 2
2674
985k
      dct_interleave8(p0, p1); // a0c0e0g0...
2675
985k
      dct_interleave8(p2, p3); // b0d0f0h0...
2676
2677
      // transpose pass 3
2678
985k
      dct_interleave8(p0, p2); // a0b0c0d0...
2679
985k
      dct_interleave8(p1, p3); // a4b4c4d4...
2680
2681
      // store
2682
985k
      _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2683
985k
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2684
985k
      _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2685
985k
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2686
985k
      _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2687
985k
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2688
985k
      _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2689
985k
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2690
985k
   }
2691
2692
985k
#undef dct_const
2693
985k
#undef dct_rot
2694
985k
#undef dct_widen
2695
985k
#undef dct_wadd
2696
985k
#undef dct_wsub
2697
985k
#undef dct_bfly32o
2698
985k
#undef dct_interleave8
2699
985k
#undef dct_interleave16
2700
985k
#undef dct_pass
2701
985k
}
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
83.1k
#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
43.2k
{
2919
43.2k
   stbi_uc x;
2920
43.2k
   if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
2921
43.2k
   x = stbi__get8(j->s);
2922
43.2k
   if (x != 0xff) return STBI__MARKER_none;
2923
89.1k
   while (x == 0xff)
2924
58.2k
      x = stbi__get8(j->s); // consume repeated 0xff fill bytes
2925
30.9k
   return x;
2926
43.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
985k
{
3073
985k
   int i;
3074
64.0M
   for (i=0; i < 64; ++i)
3075
63.0M
      data[i] *= dequant[i];
3076
985k
}
3077
3078
static void stbi__jpeg_finish(stbi__jpeg *z)
3079
445
{
3080
445
   if (z->progressive) {
3081
      // dequantize and idct the data
3082
445
      int i,j,n;
3083
2.22k
      for (n=0; n < z->s->img_n; ++n) {
3084
1.78k
         int w = (z->img_comp[n].x+7) >> 3;
3085
1.78k
         int h = (z->img_comp[n].y+7) >> 3;
3086
153k
         for (j=0; j < h; ++j) {
3087
1.13M
            for (i=0; i < w; ++i) {
3088
985k
               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
3089
985k
               stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
3090
985k
               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
985k
            }
3092
151k
         }
3093
1.78k
      }
3094
445
   }
3095
445
}
3096
3097
static int stbi__process_marker(stbi__jpeg *z, int m)
3098
5.64k
{
3099
5.64k
   int L;
3100
5.64k
   switch (m) {
3101
822
      case STBI__MARKER_none: // no marker found
3102
822
         return stbi__err("expected marker","Corrupt JPEG");
3103
3104
306
      case 0xDD: // DRI - specify restart interval
3105
306
         if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
3106
132
         z->restart_interval = stbi__get16be(z->s);
3107
132
         return 1;
3108
3109
548
      case 0xDB: // DQT - define quantization table
3110
548
         L = stbi__get16be(z->s)-2;
3111
151k
         while (L > 0) {
3112
150k
            int q = stbi__get8(z->s);
3113
150k
            int p = q >> 4, sixteen = (p != 0);
3114
150k
            int t = q & 15,i;
3115
150k
            if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG");
3116
150k
            if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
3117
3118
9.78M
            for (i=0; i < 64; ++i)
3119
9.63M
               z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
3120
150k
            L -= (sixteen ? 129 : 65);
3121
150k
         }
3122
271
         return L==0;
3123
3124
1.87k
      case 0xC4: // DHT - define huffman table
3125
1.87k
         L = stbi__get16be(z->s)-2;
3126
1.00M
         while (L > 0) {
3127
1.00M
            stbi_uc *v;
3128
1.00M
            int sizes[16],i,n=0;
3129
1.00M
            int q = stbi__get8(z->s);
3130
1.00M
            int tc = q >> 4;
3131
1.00M
            int th = q & 15;
3132
1.00M
            if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
3133
17.0M
            for (i=0; i < 16; ++i) {
3134
16.0M
               sizes[i] = stbi__get8(z->s);
3135
16.0M
               n += sizes[i];
3136
16.0M
            }
3137
1.00M
            if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values!
3138
1.00M
            L -= 17;
3139
1.00M
            if (tc == 0) {
3140
1.00M
               if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
3141
999k
               v = z->huff_dc[th].values;
3142
999k
            } else {
3143
1.14k
               if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
3144
1.01k
               v = z->huff_ac[th].values;
3145
1.01k
            }
3146
1.22M
            for (i=0; i < n; ++i)
3147
223k
               v[i] = stbi__get8(z->s);
3148
1.00M
            if (tc != 0)
3149
1.01k
               stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
3150
1.00M
            L -= n;
3151
1.00M
         }
3152
349
         return L==0;
3153
5.64k
   }
3154
3155
   // check for comment block or APP blocks
3156
2.08k
   if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
3157
1.31k
      L = stbi__get16be(z->s);
3158
1.31k
      if (L < 2) {
3159
247
         if (m == 0xFE)
3160
2
            return stbi__err("bad COM len","Corrupt JPEG");
3161
245
         else
3162
245
            return stbi__err("bad APP len","Corrupt JPEG");
3163
247
      }
3164
1.06k
      L -= 2;
3165
3166
1.06k
      if (m == 0xE0 && L >= 5) { // JFIF APP0 segment
3167
312
         static const unsigned char tag[5] = {'J','F','I','F','\0'};
3168
312
         int ok = 1;
3169
312
         int i;
3170
1.87k
         for (i=0; i < 5; ++i)
3171
1.56k
            if (stbi__get8(z->s) != tag[i])
3172
1.30k
               ok = 0;
3173
312
         L -= 5;
3174
312
         if (ok)
3175
0
            z->jfif = 1;
3176
752
      } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment
3177
0
         static const unsigned char tag[6] = {'A','d','o','b','e','\0'};
3178
0
         int ok = 1;
3179
0
         int i;
3180
0
         for (i=0; i < 6; ++i)
3181
0
            if (stbi__get8(z->s) != tag[i])
3182
0
               ok = 0;
3183
0
         L -= 6;
3184
0
         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
0
      }
3192
3193
1.06k
      stbi__skip(z->s, L);
3194
1.06k
      return 1;
3195
1.31k
   }
3196
3197
775
   return stbi__err("unknown marker","Corrupt JPEG");
3198
2.08k
}
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.07k
{
3242
5.07k
   int i;
3243
25.3k
   for (i=0; i < ncomp; ++i) {
3244
20.2k
      if (z->img_comp[i].raw_data) {
3245
20.2k
         STBI_FREE(z->img_comp[i].raw_data);
3246
20.2k
         z->img_comp[i].raw_data = NULL;
3247
20.2k
         z->img_comp[i].data = NULL;
3248
20.2k
      }
3249
20.2k
      if (z->img_comp[i].raw_coeff) {
3250
1.94k
         STBI_FREE(z->img_comp[i].raw_coeff);
3251
1.94k
         z->img_comp[i].raw_coeff = 0;
3252
1.94k
         z->img_comp[i].coeff = 0;
3253
1.94k
      }
3254
20.2k
      if (z->img_comp[i].linebuf) {
3255
20.2k
         STBI_FREE(z->img_comp[i].linebuf);
3256
20.2k
         z->img_comp[i].linebuf = NULL;
3257
20.2k
      }
3258
20.2k
   }
3259
5.07k
   return why;
3260
5.07k
}
3261
3262
static int stbi__process_frame_header(stbi__jpeg *z, int scan)
3263
10.1k
{
3264
10.1k
   stbi__context *s = z->s;
3265
10.1k
   int Lf,p,i,q, h_max=1,v_max=1,c;
3266
10.1k
   Lf = stbi__get16be(s);         if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG
3267
10.1k
   p  = stbi__get8(s);            if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
3268
10.1k
   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.1k
   s->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
3270
10.1k
   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
3271
10.1k
   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
3272
10.1k
   c = stbi__get8(s);
3273
10.1k
   if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG");
3274
10.1k
   s->img_n = c;
3275
50.7k
   for (i=0; i < c; ++i) {
3276
40.5k
      z->img_comp[i].data = NULL;
3277
40.5k
      z->img_comp[i].linebuf = NULL;
3278
40.5k
   }
3279
3280
10.1k
   if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
3281
3282
10.1k
   z->rgb = 0;
3283
50.7k
   for (i=0; i < s->img_n; ++i) {
3284
40.5k
      static const unsigned char rgb[3] = { 'R', 'G', 'B' };
3285
40.5k
      z->img_comp[i].id = stbi__get8(s);
3286
40.5k
      if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3287
0
         ++z->rgb;
3288
40.5k
      q = stbi__get8(s);
3289
40.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
40.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
40.5k
      z->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
3292
40.5k
   }
3293
3294
10.1k
   if (scan != STBI__SCAN_load) return 1;
3295
3296
5.07k
   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.3k
   for (i=0; i < s->img_n; ++i) {
3299
20.2k
      if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
3300
20.2k
      if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
3301
20.2k
   }
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.3k
   for (i=0; i < s->img_n; ++i) {
3306
20.2k
      if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG");
3307
20.2k
      if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG");
3308
20.2k
   }
3309
3310
   // compute interleaved mcu info
3311
5.07k
   z->img_h_max = h_max;
3312
5.07k
   z->img_v_max = v_max;
3313
5.07k
   z->img_mcu_w = h_max * 8;
3314
5.07k
   z->img_mcu_h = v_max * 8;
3315
   // these sizes can't be more than 17 bits
3316
5.07k
   z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
3317
5.07k
   z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
3318
3319
25.3k
   for (i=0; i < s->img_n; ++i) {
3320
      // number of effective pixels (e.g. for non-interleaved MCU)
3321
20.2k
      z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
3322
20.2k
      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.2k
      z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3331
20.2k
      z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3332
20.2k
      z->img_comp[i].coeff = 0;
3333
20.2k
      z->img_comp[i].raw_coeff = 0;
3334
20.2k
      z->img_comp[i].linebuf = NULL;
3335
20.2k
      z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3336
20.2k
      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.2k
      z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
3340
20.2k
      if (z->progressive) {
3341
         // w2, h2 are multiples of 8 (see above)
3342
1.94k
         z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3343
1.94k
         z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3344
1.94k
         z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);
3345
1.94k
         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.94k
         z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
3348
1.94k
      }
3349
20.2k
   }
3350
3351
5.07k
   return 1;
3352
5.07k
}
3353
3354
// use comparisons since in some cases we handle more than one case (e.g. SOF)
3355
5.54k
#define stbi__DNL(x)         ((x) == 0xdc)
3356
26.4k
#define stbi__SOI(x)         ((x) == 0xd8)
3357
6.22k
#define stbi__EOI(x)         ((x) == 0xd9)
3358
10.2k
#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3359
5.54k
#define stbi__SOS(x)         ((x) == 0xda)
3360
3361
10.1k
#define stbi__SOF_progressive(x)   ((x) == 0xc2)
3362
3363
static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
3364
26.4k
{
3365
26.4k
   int m;
3366
26.4k
   z->jfif = 0;
3367
26.4k
   z->app14_color_transform = -1; // valid values are 0,1,2
3368
26.4k
   z->marker = STBI__MARKER_none; // initialize cached marker to empty
3369
26.4k
   m = stbi__get_marker(z);
3370
26.4k
   if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
3371
15.2k
   if (scan == STBI__SCAN_type) return 1;
3372
10.1k
   m = stbi__get_marker(z);
3373
10.2k
   while (!stbi__SOF(m)) {
3374
132
      if (!stbi__process_marker(z,m)) return 0;
3375
117
      m = stbi__get_marker(z);
3376
401
      while (m == STBI__MARKER_none) {
3377
         // some files have extra padding after their blocks, so ok, we'll scan
3378
287
         if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");
3379
284
         m = stbi__get_marker(z);
3380
284
      }
3381
117
   }
3382
10.1k
   z->progressive = stbi__SOF_progressive(m);
3383
10.1k
   if (!stbi__process_frame_header(z, scan)) return 0;
3384
10.1k
   return 1;
3385
10.1k
}
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.07k
{
3412
5.07k
   int m;
3413
25.3k
   for (m = 0; m < 4; m++) {
3414
20.2k
      j->img_comp[m].raw_data = NULL;
3415
20.2k
      j->img_comp[m].raw_coeff = NULL;
3416
20.2k
   }
3417
5.07k
   j->restart_interval = 0;
3418
5.07k
   if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;
3419
5.07k
   m = stbi__get_marker(j);
3420
6.22k
   while (!stbi__EOI(m)) {
3421
5.54k
      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.54k
      } else if (stbi__DNL(m)) {
3432
33
         int Ld = stbi__get16be(j->s);
3433
33
         stbi__uint32 NL = stbi__get16be(j->s);
3434
33
         if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG");
3435
32
         if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG");
3436
32
         m = stbi__get_marker(j);
3437
5.50k
      } else {
3438
5.50k
         if (!stbi__process_marker(j, m)) return 1;
3439
1.11k
         m = stbi__get_marker(j);
3440
1.11k
      }
3441
5.54k
   }
3442
680
   if (j->progressive)
3443
445
      stbi__jpeg_finish(j);
3444
680
   return 1;
3445
5.07k
}
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.20G
#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.24M
{
3456
2.24M
   STBI_NOTUSED(out);
3457
2.24M
   STBI_NOTUSED(in_far);
3458
2.24M
   STBI_NOTUSED(w);
3459
2.24M
   STBI_NOTUSED(hs);
3460
2.24M
   return in_near;
3461
2.24M
}
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.19M
{
3465
   // need to generate two samples vertically for every one in input
3466
6.19M
   int i;
3467
6.19M
   STBI_NOTUSED(hs);
3468
953M
   for (i=0; i < w; ++i)
3469
947M
      out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
3470
6.19M
   return out;
3471
6.19M
}
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
2.80M
{
3475
   // need to generate two samples horizontally for every one in input
3476
2.80M
   int i;
3477
2.80M
   stbi_uc *input = in_near;
3478
3479
2.80M
   if (w == 1) {
3480
      // if only one sample, can't do any interpolation
3481
2.02M
      out[0] = out[1] = input[0];
3482
2.02M
      return out;
3483
2.02M
   }
3484
3485
780k
   out[0] = input[0];
3486
780k
   out[1] = stbi__div4(input[0]*3 + input[1] + 2);
3487
126M
   for (i=1; i < w-1; ++i) {
3488
126M
      int n = 3*input[i]+2;
3489
126M
      out[i*2+0] = stbi__div4(n+input[i-1]);
3490
126M
      out[i*2+1] = stbi__div4(n+input[i+1]);
3491
126M
   }
3492
780k
   out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
3493
780k
   out[i*2+1] = input[w-1];
3494
3495
780k
   STBI_NOTUSED(in_far);
3496
780k
   STBI_NOTUSED(hs);
3497
3498
780k
   return out;
3499
2.80M
}
3500
3501
1.19M
#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.48M
{
3530
   // need to generate 2x2 samples for every one in input
3531
1.48M
   int i=0,t0,t1;
3532
3533
1.48M
   if (w == 1) {
3534
1.01M
      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3535
1.01M
      return out;
3536
1.01M
   }
3537
3538
477k
   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.74M
   for (; i < ((w-1) & ~7); i += 8) {
3543
9.26M
#if defined(STBI_SSE2)
3544
      // load and perform the vertical filtering pass
3545
      // this uses 3*x + y = 4*x + (y - x)
3546
9.26M
      __m128i zero  = _mm_setzero_si128();
3547
9.26M
      __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));
3548
9.26M
      __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
3549
9.26M
      __m128i farw  = _mm_unpacklo_epi8(farb, zero);
3550
9.26M
      __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3551
9.26M
      __m128i diff  = _mm_sub_epi16(farw, nearw);
3552
9.26M
      __m128i nears = _mm_slli_epi16(nearw, 2);
3553
9.26M
      __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
9.26M
      __m128i prv0 = _mm_slli_si128(curr, 2);
3561
9.26M
      __m128i nxt0 = _mm_srli_si128(curr, 2);
3562
9.26M
      __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3563
9.26M
      __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
9.26M
      __m128i bias  = _mm_set1_epi16(8);
3570
9.26M
      __m128i curs = _mm_slli_epi16(curr, 2);
3571
9.26M
      __m128i prvd = _mm_sub_epi16(prev, curr);
3572
9.26M
      __m128i nxtd = _mm_sub_epi16(next, curr);
3573
9.26M
      __m128i curb = _mm_add_epi16(curs, bias);
3574
9.26M
      __m128i even = _mm_add_epi16(prvd, curb);
3575
9.26M
      __m128i odd  = _mm_add_epi16(nxtd, curb);
3576
3577
      // interleave even and odd pixels, then undo scaling.
3578
9.26M
      __m128i int0 = _mm_unpacklo_epi16(even, odd);
3579
9.26M
      __m128i int1 = _mm_unpackhi_epi16(even, odd);
3580
9.26M
      __m128i de0  = _mm_srli_epi16(int0, 4);
3581
9.26M
      __m128i de1  = _mm_srli_epi16(int1, 4);
3582
3583
      // pack and write output
3584
9.26M
      __m128i outv = _mm_packus_epi16(de0, de1);
3585
9.26M
      _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
9.26M
      t1 = 3*in_near[i+7] + in_far[i+7];
3624
9.26M
   }
3625
3626
477k
   t0 = t1;
3627
477k
   t1 = 3*in_near[i] + in_far[i];
3628
477k
   out[i*2] = stbi__div16(3*t1 + t0 + 8);
3629
3630
838k
   for (++i; i < w; ++i) {
3631
361k
      t0 = t1;
3632
361k
      t1 = 3*in_near[i]+in_far[i];
3633
361k
      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3634
361k
      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
3635
361k
   }
3636
477k
   out[w*2-1] = stbi__div4(t1+2);
3637
3638
477k
   STBI_NOTUSED(hs);
3639
3640
477k
   return out;
3641
1.48M
}
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.27M
{
3646
   // resample with nearest-neighbor
3647
8.27M
   int i,j;
3648
8.27M
   STBI_NOTUSED(in_far);
3649
253M
   for (i=0; i < w; ++i)
3650
968M
      for (j=0; j < hs; ++j)
3651
722M
         out[i*hs+j] = in_near[i];
3652
8.27M
   return out;
3653
8.27M
}
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
84.9M
#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.25M
{
3686
5.25M
   int i = 0;
3687
3688
5.25M
#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.25M
   if (step == 4) {
3693
      // this is a fairly straightforward implementation and not super-optimized.
3694
5.25M
      __m128i signflip  = _mm_set1_epi8(-0x80);
3695
5.25M
      __m128i cr_const0 = _mm_set1_epi16(   (short) ( 1.40200f*4096.0f+0.5f));
3696
5.25M
      __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
3697
5.25M
      __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
3698
5.25M
      __m128i cb_const1 = _mm_set1_epi16(   (short) ( 1.77200f*4096.0f+0.5f));
3699
5.25M
      __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
3700
5.25M
      __m128i xw = _mm_set1_epi16(255); // alpha channel
3701
3702
85.7M
      for (; i+7 < count; i += 8) {
3703
         // load
3704
80.4M
         __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3705
80.4M
         __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3706
80.4M
         __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3707
80.4M
         __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
3708
80.4M
         __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128
3709
3710
         // unpack to short (and left-shift cr, cb by 8)
3711
80.4M
         __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);
3712
80.4M
         __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3713
80.4M
         __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3714
3715
         // color transform
3716
80.4M
         __m128i yws = _mm_srli_epi16(yw, 4);
3717
80.4M
         __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3718
80.4M
         __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3719
80.4M
         __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3720
80.4M
         __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3721
80.4M
         __m128i rws = _mm_add_epi16(cr0, yws);
3722
80.4M
         __m128i gwt = _mm_add_epi16(cb0, yws);
3723
80.4M
         __m128i bws = _mm_add_epi16(yws, cb1);
3724
80.4M
         __m128i gws = _mm_add_epi16(gwt, cr1);
3725
3726
         // descale
3727
80.4M
         __m128i rw = _mm_srai_epi16(rws, 4);
3728
80.4M
         __m128i bw = _mm_srai_epi16(bws, 4);
3729
80.4M
         __m128i gw = _mm_srai_epi16(gws, 4);
3730
3731
         // back to byte, set up for transpose
3732
80.4M
         __m128i brb = _mm_packus_epi16(rw, bw);
3733
80.4M
         __m128i gxb = _mm_packus_epi16(gw, xw);
3734
3735
         // transpose to interleave channels
3736
80.4M
         __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3737
80.4M
         __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3738
80.4M
         __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3739
80.4M
         __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3740
3741
         // store
3742
80.4M
         _mm_storeu_si128((__m128i *) (out + 0), o0);
3743
80.4M
         _mm_storeu_si128((__m128i *) (out + 16), o1);
3744
80.4M
         out += 32;
3745
80.4M
      }
3746
5.25M
   }
3747
5.25M
#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
26.4M
   for (; i < count; ++i) {
3796
21.2M
      int y_fixed = (y[i] << 20) + (1<<19); // rounding
3797
21.2M
      int r,g,b;
3798
21.2M
      int cr = pcr[i] - 128;
3799
21.2M
      int cb = pcb[i] - 128;
3800
21.2M
      r = y_fixed + cr* stbi__float2fixed(1.40200f);
3801
21.2M
      g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3802
21.2M
      b = y_fixed                                   +   cb* stbi__float2fixed(1.77200f);
3803
21.2M
      r >>= 20;
3804
21.2M
      g >>= 20;
3805
21.2M
      b >>= 20;
3806
21.2M
      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
3807
21.2M
      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
3808
21.2M
      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
3809
21.2M
      out[0] = (stbi_uc)r;
3810
21.2M
      out[1] = (stbi_uc)g;
3811
21.2M
      out[2] = (stbi_uc)b;
3812
21.2M
      out[3] = 255;
3813
21.2M
      out += step;
3814
21.2M
   }
3815
5.25M
}
3816
#endif
3817
3818
// set up the kernels
3819
static void stbi__setup_jpeg(stbi__jpeg *j)
3820
15.2k
{
3821
15.2k
   j->idct_block_kernel = stbi__idct_block;
3822
15.2k
   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3823
15.2k
   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3824
3825
15.2k
#ifdef STBI_SSE2
3826
15.2k
   if (stbi__sse2_available()) {
3827
15.2k
      j->idct_block_kernel = stbi__idct_simd;
3828
15.2k
      j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3829
15.2k
      j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3830
15.2k
   }
3831
15.2k
#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
15.2k
}
3839
3840
// clean up the temporary component buffers
3841
static void stbi__cleanup_jpeg(stbi__jpeg *j)
3842
5.07k
{
3843
5.07k
   stbi__free_jpeg_components(j, j->s->img_n, 0);
3844
5.07k
}
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.07k
{
3865
5.07k
   int n, decode_n, is_rgb;
3866
5.07k
   z->s->img_n = 0; // make stbi__cleanup_jpeg safe
3867
3868
   // validate req_comp
3869
5.07k
   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.07k
   if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
3873
3874
   // determine actual number of components to generate
3875
5.06k
   n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3876
3877
5.06k
   is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3878
3879
5.06k
   if (z->s->img_n == 3 && n < 3 && !is_rgb)
3880
0
      decode_n = 1;
3881
5.06k
   else
3882
5.06k
      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.06k
   if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; }
3887
3888
   // resample and color-convert
3889
5.06k
   {
3890
5.06k
      int k;
3891
5.06k
      unsigned int i,j;
3892
5.06k
      stbi_uc *output;
3893
5.06k
      stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
3894
3895
5.06k
      stbi__resample res_comp[4];
3896
3897
25.3k
      for (k=0; k < decode_n; ++k) {
3898
20.2k
         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.2k
         z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
3903
20.2k
         if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
3904
3905
20.2k
         r->hs      = z->img_h_max / z->img_comp[k].h;
3906
20.2k
         r->vs      = z->img_v_max / z->img_comp[k].v;
3907
20.2k
         r->ystep   = r->vs >> 1;
3908
20.2k
         r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3909
20.2k
         r->ypos    = 0;
3910
20.2k
         r->line0   = r->line1 = z->img_comp[k].data;
3911
3912
20.2k
         if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3913
17.9k
         else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3914
11.9k
         else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3915
10.3k
         else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3916
9.49k
         else                               r->resample = stbi__resample_row_generic;
3917
20.2k
      }
3918
3919
      // can't error after this so, this is safe
3920
5.06k
      output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3921
5.06k
      if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
3922
3923
      // now go ahead and resample
3924
5.25M
      for (j=0; j < z->s->img_y; ++j) {
3925
5.25M
         stbi_uc *out = output + n * z->s->img_x * j;
3926
26.2M
         for (k=0; k < decode_n; ++k) {
3927
21.0M
            stbi__resample *r = &res_comp[k];
3928
21.0M
            int y_bot = r->ystep >= (r->vs >> 1);
3929
21.0M
            coutput[k] = r->resample(z->img_comp[k].linebuf,
3930
21.0M
                                     y_bot ? r->line1 : r->line0,
3931
21.0M
                                     y_bot ? r->line0 : r->line1,
3932
21.0M
                                     r->w_lores, r->hs);
3933
21.0M
            if (++r->ystep >= r->vs) {
3934
15.5M
               r->ystep = 0;
3935
15.5M
               r->line0 = r->line1;
3936
15.5M
               if (++r->ypos < z->img_comp[k].y)
3937
15.5M
                  r->line1 += z->img_comp[k].w2;
3938
15.5M
            }
3939
21.0M
         }
3940
5.25M
         if (n >= 3) {
3941
5.25M
            stbi_uc *y = coutput[0];
3942
5.25M
            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.25M
            } else if (z->s->img_n == 4) {
3955
5.25M
               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.25M
               } 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.25M
               } else { // YCbCr + alpha?  Ignore the fourth channel for now
3974
5.25M
                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3975
5.25M
               }
3976
5.25M
            } 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.25M
         } 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.25M
      }
4018
5.06k
      stbi__cleanup_jpeg(z);
4019
5.06k
      *out_x = z->s->img_x;
4020
5.06k
      *out_y = z->s->img_y;
4021
5.06k
      if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output
4022
5.06k
      return output;
4023
5.06k
   }
4024
5.06k
}
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.07k
{
4028
5.07k
   unsigned char* result;
4029
5.07k
   stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));
4030
5.07k
   if (!j) return stbi__errpuc("outofmem", "Out of memory");
4031
5.07k
   memset(j, 0, sizeof(stbi__jpeg));
4032
5.07k
   STBI_NOTUSED(ri);
4033
5.07k
   j->s = s;
4034
5.07k
   stbi__setup_jpeg(j);
4035
5.07k
   result = load_jpeg_image(j, x,y,comp,req_comp);
4036
5.07k
   STBI_FREE(j);
4037
5.07k
   return result;
4038
5.07k
}
4039
4040
static int stbi__jpeg_test(stbi__context *s)
4041
10.1k
{
4042
10.1k
   int r;
4043
10.1k
   stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));
4044
10.1k
   if (!j) return stbi__err("outofmem", "Out of memory");
4045
10.1k
   memset(j, 0, sizeof(stbi__jpeg));
4046
10.1k
   j->s = s;
4047
10.1k
   stbi__setup_jpeg(j);
4048
10.1k
   r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
4049
10.1k
   stbi__rewind(s);
4050
10.1k
   STBI_FREE(j);
4051
10.1k
   return r;
4052
10.1k
}
4053
4054
static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
4055
11.1k
{
4056
11.1k
   if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
4057
6.10k
      stbi__rewind( j->s );
4058
6.10k
      return 0;
4059
6.10k
   }
4060
5.07k
   if (x) *x = j->s->img_x;
4061
5.07k
   if (y) *y = j->s->img_y;
4062
5.07k
   if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
4063
5.07k
   return 1;
4064
11.1k
}
4065
4066
static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
4067
11.1k
{
4068
11.1k
   int result;
4069
11.1k
   stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));
4070
11.1k
   if (!j) return stbi__err("outofmem", "Out of memory");
4071
11.1k
   memset(j, 0, sizeof(stbi__jpeg));
4072
11.1k
   j->s = s;
4073
11.1k
   result = stbi__jpeg_info_raw(j, x, y, comp);
4074
11.1k
   STBI_FREE(j);
4075
11.1k
   return result;
4076
11.1k
}
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
28.1k
{
4621
28.1k
   static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4622
28.1k
   int i;
4623
28.7k
   for (i=0; i < 8; ++i)
4624
28.7k
      if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
4625
0
   return 1;
4626
28.1k
}
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
17.1k
{
5101
17.1k
   stbi_uc palette[1024], pal_img_n=0;
5102
17.1k
   stbi_uc has_trans=0, tc[3]={0};
5103
17.1k
   stbi__uint16 tc16[3];
5104
17.1k
   stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
5105
17.1k
   int first=1,k,interlace=0, color=0, is_iphone=0;
5106
17.1k
   stbi__context *s = z->s;
5107
5108
17.1k
   z->expanded = NULL;
5109
17.1k
   z->idata = NULL;
5110
17.1k
   z->out = NULL;
5111
5112
17.1k
   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
11.0k
{
5323
11.0k
   int r;
5324
11.0k
   r = stbi__check_png_header(s);
5325
11.0k
   stbi__rewind(s);
5326
11.0k
   return r;
5327
11.0k
}
5328
5329
static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
5330
17.1k
{
5331
17.1k
   if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
5332
17.1k
      stbi__rewind( p->s );
5333
17.1k
      return 0;
5334
17.1k
   }
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
17.1k
}
5340
5341
static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
5342
6.10k
{
5343
6.10k
   stbi__png p;
5344
6.10k
   p.s = s;
5345
6.10k
   return stbi__png_info_raw(&p, x, y, comp);
5346
6.10k
}
5347
5348
static int stbi__png_is16(stbi__context *s)
5349
11.0k
{
5350
11.0k
   stbi__png p;
5351
11.0k
   p.s = s;
5352
11.0k
   if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5353
11.0k
     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
11.0k
{
5367
11.0k
   int r;
5368
11.0k
   int sz;
5369
11.0k
   if (stbi__get8(s) != 'B') return 0;
5370
871
   if (stbi__get8(s) != 'M') return 0;
5371
871
   stbi__get32le(s); // discard filesize
5372
871
   stbi__get16le(s); // discard reserved
5373
871
   stbi__get16le(s); // discard reserved
5374
871
   stbi__get32le(s); // discard data offset
5375
871
   sz = stbi__get32le(s);
5376
871
   r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5377
871
   return r;
5378
871
}
5379
5380
static int stbi__bmp_test(stbi__context *s)
5381
11.0k
{
5382
11.0k
   int r = stbi__bmp_test_raw(s);
5383
11.0k
   stbi__rewind(s);
5384
11.0k
   return r;
5385
11.0k
}
5386
5387
5388
// returns 0..31 for the highest set bit
5389
static int stbi__high_bit(unsigned int z)
5390
1.93k
{
5391
1.93k
   int n=0;
5392
1.93k
   if (z == 0) return -1;
5393
1.47k
   if (z >= 0x10000) { n += 16; z >>= 16; }
5394
1.47k
   if (z >= 0x00100) { n +=  8; z >>=  8; }
5395
1.47k
   if (z >= 0x00010) { n +=  4; z >>=  4; }
5396
1.47k
   if (z >= 0x00004) { n +=  2; z >>=  2; }
5397
1.47k
   if (z >= 0x00002) { n +=  1;/* >>=  1;*/ }
5398
1.47k
   return n;
5399
1.93k
}
5400
5401
static int stbi__bitcount(unsigned int a)
5402
1.93k
{
5403
1.93k
   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2
5404
1.93k
   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4
5405
1.93k
   a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
5406
1.93k
   a = (a + (a >> 8)); // max 16 per 8 bits
5407
1.93k
   a = (a + (a >> 16)); // max 32 per 8 bits
5408
1.93k
   return a & 0xff;
5409
1.93k
}
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
1.34G
{
5416
1.34G
   static unsigned int mul_table[9] = {
5417
1.34G
      0,
5418
1.34G
      0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,
5419
1.34G
      0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,
5420
1.34G
   };
5421
1.34G
   static unsigned int shift_table[9] = {
5422
1.34G
      0, 0,0,1,0,2,4,6,0,
5423
1.34G
   };
5424
1.34G
   if (shift < 0)
5425
384M
      v <<= -shift;
5426
956M
   else
5427
956M
      v >>= shift;
5428
1.34G
   STBI_ASSERT(v < 256);
5429
1.34G
   v >>= (8-bits);
5430
1.34G
   STBI_ASSERT(bits >= 0 && bits <= 8);
5431
1.34G
   return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
5432
1.34G
}
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
968
{
5443
   // BI_BITFIELDS specifies masks explicitly, don't override
5444
968
   if (compress == 3)
5445
0
      return 1;
5446
5447
968
   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
968
   return 0; // error
5465
968
}
5466
5467
static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
5468
6.97k
{
5469
6.97k
   int hsz;
5470
6.97k
   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
5471
1.75k
   stbi__get32le(s); // discard filesize
5472
1.75k
   stbi__get16le(s); // discard reserved
5473
1.75k
   stbi__get16le(s); // discard reserved
5474
1.75k
   info->offset = stbi__get32le(s);
5475
1.75k
   info->hsz = hsz = stbi__get32le(s);
5476
1.75k
   info->mr = info->mg = info->mb = info->ma = 0;
5477
1.75k
   info->extra_read = 14;
5478
5479
1.75k
   if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP");
5480
5481
1.74k
   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
5482
1.74k
   if (hsz == 12) {
5483
774
      s->img_x = stbi__get16le(s);
5484
774
      s->img_y = stbi__get16le(s);
5485
970
   } else {
5486
970
      s->img_x = stbi__get32le(s);
5487
970
      s->img_y = stbi__get32le(s);
5488
970
   }
5489
1.74k
   if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
5490
1.74k
   info->bpp = stbi__get16le(s);
5491
1.74k
   if (hsz != 12) {
5492
968
      int compress = stbi__get32le(s);
5493
968
      if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
5494
968
      if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes
5495
968
      if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel
5496
968
      stbi__get32le(s); // discard sizeof
5497
968
      stbi__get32le(s); // discard hres
5498
968
      stbi__get32le(s); // discard vres
5499
968
      stbi__get32le(s); // discard colorsused
5500
968
      stbi__get32le(s); // discard max important
5501
968
      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
968
      } else {
5525
         // V4/V5 header
5526
968
         int i;
5527
968
         if (hsz != 108 && hsz != 124)
5528
0
            return stbi__errpuc("bad BMP", "bad BMP");
5529
968
         info->mr = stbi__get32le(s);
5530
968
         info->mg = stbi__get32le(s);
5531
968
         info->mb = stbi__get32le(s);
5532
968
         info->ma = stbi__get32le(s);
5533
968
         if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs
5534
968
            stbi__bmp_set_mask_defaults(info, compress);
5535
968
         stbi__get32le(s); // discard color space
5536
12.5k
         for (i=0; i < 12; ++i)
5537
11.6k
            stbi__get32le(s); // discard color space parameters
5538
968
         if (hsz == 124) {
5539
968
            stbi__get32le(s); // discard rendering intent
5540
968
            stbi__get32le(s); // discard offset of profile data
5541
968
            stbi__get32le(s); // discard size of profile data
5542
968
            stbi__get32le(s); // discard reserved
5543
968
         }
5544
968
      }
5545
968
   }
5546
1.74k
   return (void *) 1;
5547
1.74k
}
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
871
{
5552
871
   stbi_uc *out;
5553
871
   unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
5554
871
   stbi_uc pal[256][4];
5555
871
   int psize=0,i,j,width;
5556
871
   int flip_vertically, pad, target;
5557
871
   stbi__bmp_data info;
5558
871
   STBI_NOTUSED(ri);
5559
5560
871
   info.all_a = 255;
5561
871
   if (stbi__bmp_parse_header(s, &info) == NULL)
5562
0
      return NULL; // error code already set
5563
5564
871
   flip_vertically = ((int) s->img_y) > 0;
5565
871
   s->img_y = abs((int) s->img_y);
5566
5567
871
   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5568
871
   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5569
5570
871
   mr = info.mr;
5571
871
   mg = info.mg;
5572
871
   mb = info.mb;
5573
871
   ma = info.ma;
5574
871
   all_a = info.all_a;
5575
5576
871
   if (info.hsz == 12) {
5577
387
      if (info.bpp < 24)
5578
258
         psize = (info.offset - info.extra_read - 24) / 3;
5579
484
   } else {
5580
484
      if (info.bpp < 16)
5581
0
         psize = (info.offset - info.extra_read - info.hsz) >> 2;
5582
484
   }
5583
871
   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
613
      int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original);
5587
613
      int header_limit = 1024; // max we actually read is below 256 bytes currently.
5588
613
      int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size.
5589
613
      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
613
      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
613
      } else {
5599
613
         stbi__skip(s, info.offset - bytes_read_so_far);
5600
613
      }
5601
613
   }
5602
5603
871
   if (info.bpp == 24 && ma == 0xff000000)
5604
0
      s->img_n = 3;
5605
871
   else
5606
871
      s->img_n = ma ? 4 : 3;
5607
871
   if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
5608
871
      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
871
   if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5614
0
      return stbi__errpuc("too large", "Corrupt BMP");
5615
5616
871
   out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5617
871
   if (!out) return stbi__errpuc("outofmem", "Out of memory");
5618
871
   if (info.bpp < 16) {
5619
258
      int z=0;
5620
258
      if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
5621
26.0k
      for (i=0; i < psize; ++i) {
5622
25.8k
         pal[i][2] = stbi__get8(s);
5623
25.8k
         pal[i][1] = stbi__get8(s);
5624
25.8k
         pal[i][0] = stbi__get8(s);
5625
25.8k
         if (info.hsz != 12) stbi__get8(s);
5626
25.8k
         pal[i][3] = 255;
5627
25.8k
      }
5628
258
      stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5629
258
      if (info.bpp == 1) width = (s->img_x + 7) >> 3;
5630
256
      else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5631
0
      else if (info.bpp == 8) width = s->img_x;
5632
0
      else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
5633
258
      pad = (-width)&3;
5634
258
      if (info.bpp == 1) {
5635
4
         for (j=0; j < (int) s->img_y; ++j) {
5636
2
            int bit_offset = 7, v = stbi__get8(s);
5637
35.0k
            for (i=0; i < (int) s->img_x; ++i) {
5638
35.0k
               int color = (v>>bit_offset)&0x1;
5639
35.0k
               out[z++] = pal[color][0];
5640
35.0k
               out[z++] = pal[color][1];
5641
35.0k
               out[z++] = pal[color][2];
5642
35.0k
               if (target == 4) out[z++] = 255;
5643
35.0k
               if (i+1 == (int) s->img_x) break;
5644
35.0k
               if((--bit_offset) < 0) {
5645
4.38k
                  bit_offset = 7;
5646
4.38k
                  v = stbi__get8(s);
5647
4.38k
               }
5648
35.0k
            }
5649
2
            stbi__skip(s, pad);
5650
2
         }
5651
256
      } else {
5652
584
         for (j=0; j < (int) s->img_y; ++j) {
5653
881k
            for (i=0; i < (int) s->img_x; i += 2) {
5654
880k
               int v=stbi__get8(s),v2=0;
5655
880k
               if (info.bpp == 4) {
5656
880k
                  v2 = v & 15;
5657
880k
                  v >>= 4;
5658
880k
               }
5659
880k
               out[z++] = pal[v][0];
5660
880k
               out[z++] = pal[v][1];
5661
880k
               out[z++] = pal[v][2];
5662
880k
               if (target == 4) out[z++] = 255;
5663
880k
               if (i+1 == (int) s->img_x) break;
5664
880k
               v = (info.bpp == 8) ? stbi__get8(s) : v2;
5665
880k
               out[z++] = pal[v][0];
5666
880k
               out[z++] = pal[v][1];
5667
880k
               out[z++] = pal[v][2];
5668
880k
               if (target == 4) out[z++] = 255;
5669
880k
            }
5670
328
            stbi__skip(s, pad);
5671
328
         }
5672
256
      }
5673
613
   } else {
5674
613
      int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
5675
613
      int z = 0;
5676
613
      int easy=0;
5677
613
      stbi__skip(s, info.offset - info.extra_read - info.hsz);
5678
613
      if (info.bpp == 24) width = 3 * s->img_x;
5679
484
      else if (info.bpp == 16) width = 2*s->img_x;
5680
484
      else /* bpp = 32 and pad = 0 */ width=0;
5681
613
      pad = (-width) & 3;
5682
613
      if (info.bpp == 24) {
5683
129
         easy = 1;
5684
484
      } else if (info.bpp == 32) {
5685
0
         if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5686
0
            easy = 2;
5687
0
      }
5688
613
      if (!easy) {
5689
484
         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
484
         rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
5692
484
         gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
5693
484
         bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
5694
484
         ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
5695
484
         if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
5696
484
      }
5697
15.7M
      for (j=0; j < (int) s->img_y; ++j) {
5698
15.7M
         if (easy) {
5699
2.66M
            for (i=0; i < (int) s->img_x; ++i) {
5700
2.66M
               unsigned char a;
5701
2.66M
               out[z+2] = stbi__get8(s);
5702
2.66M
               out[z+1] = stbi__get8(s);
5703
2.66M
               out[z+0] = stbi__get8(s);
5704
2.66M
               z += 3;
5705
2.66M
               a = (easy == 2 ? stbi__get8(s) : 255);
5706
2.66M
               all_a |= a;
5707
2.66M
               if (target == 4) out[z++] = a;
5708
2.66M
            }
5709
15.7M
         } else {
5710
15.7M
            int bpp = info.bpp;
5711
444M
            for (i=0; i < (int) s->img_x; ++i) {
5712
428M
               stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
5713
428M
               unsigned int a;
5714
428M
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5715
428M
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5716
428M
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5717
428M
               a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5718
428M
               all_a |= a;
5719
428M
               if (target == 4) out[z++] = STBI__BYTECAST(a);
5720
428M
            }
5721
15.7M
         }
5722
15.7M
         stbi__skip(s, pad);
5723
15.7M
      }
5724
613
   }
5725
5726
   // if alpha channel is all 0s, replace with all 255s
5727
871
   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
871
   if (flip_vertically) {
5732
871
      stbi_uc t;
5733
7.86M
      for (j=0; j < (int) s->img_y>>1; ++j) {
5734
7.86M
         stbi_uc *p1 = out +      j     *s->img_x*target;
5735
7.86M
         stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
5736
866M
         for (i=0; i < (int) s->img_x*target; ++i) {
5737
858M
            t = p1[i]; p1[i] = p2[i]; p2[i] = t;
5738
858M
         }
5739
7.86M
      }
5740
871
   }
5741
5742
871
   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
871
   *x = s->img_x;
5748
871
   *y = s->img_y;
5749
871
   if (comp) *comp = s->img_n;
5750
871
   return out;
5751
871
}
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.85k
{
5760
   // only RGB or RGBA (incl. 16bit) or grey allowed
5761
1.85k
   if (is_rgb16) *is_rgb16 = 0;
5762
1.85k
   switch(bits_per_pixel) {
5763
0
      case 8:  return STBI_grey;
5764
812
      case 16: if(is_grey) return STBI_grey_alpha;
5765
               // fallthrough
5766
898
      case 15: if(is_rgb16) *is_rgb16 = 1;
5767
898
               return STBI_rgb;
5768
532
      case 24: // fallthrough
5769
532
      case 32: return bits_per_pixel/8;
5770
0
      default: return 0;
5771
1.85k
   }
5772
1.85k
}
5773
5774
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
5775
1.06k
{
5776
1.06k
    int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5777
1.06k
    int sz, tga_colormap_type;
5778
1.06k
    stbi__get8(s);                   // discard Offset
5779
1.06k
    tga_colormap_type = stbi__get8(s); // colormap type
5780
1.06k
    if( tga_colormap_type > 1 ) {
5781
115
        stbi__rewind(s);
5782
115
        return 0;      // only RGB or indexed allowed
5783
115
    }
5784
949
    tga_image_type = stbi__get8(s); // image type
5785
949
    if ( tga_colormap_type == 1 ) { // colormapped (paletted) image
5786
578
        if (tga_image_type != 1 && tga_image_type != 9) {
5787
0
            stbi__rewind(s);
5788
0
            return 0;
5789
0
        }
5790
578
        stbi__skip(s,4);       // skip index of first colormap entry and number of entries
5791
578
        sz = stbi__get8(s);    //   check bits per palette color entry
5792
578
        if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5793
0
            stbi__rewind(s);
5794
0
            return 0;
5795
0
        }
5796
578
        stbi__skip(s,4);       // skip image x and y origin
5797
578
        tga_colormap_bpp = sz;
5798
578
    } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE
5799
371
        if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5800
19
            stbi__rewind(s);
5801
19
            return 0; // only RGB or grey allowed, +/- RLE
5802
19
        }
5803
352
        stbi__skip(s,9); // skip colormap specification and image x/y origin
5804
352
        tga_colormap_bpp = 0;
5805
352
    }
5806
930
    tga_w = stbi__get16le(s);
5807
930
    if( tga_w < 1 ) {
5808
1
        stbi__rewind(s);
5809
1
        return 0;   // test width
5810
1
    }
5811
929
    tga_h = stbi__get16le(s);
5812
929
    if( tga_h < 1 ) {
5813
0
        stbi__rewind(s);
5814
0
        return 0;   // test height
5815
0
    }
5816
929
    tga_bits_per_pixel = stbi__get8(s); // bits per pixel
5817
929
    stbi__get8(s); // ignore alpha bits
5818
929
    if (tga_colormap_bpp != 0) {
5819
578
        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
0
            stbi__rewind(s);
5823
0
            return 0;
5824
0
        }
5825
578
        tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5826
578
    } else {
5827
351
        tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5828
351
    }
5829
929
    if(!tga_comp) {
5830
0
      stbi__rewind(s);
5831
0
      return 0;
5832
0
    }
5833
929
    if (x) *x = tga_w;
5834
929
    if (y) *y = tga_h;
5835
929
    if (comp) *comp = tga_comp;
5836
929
    return 1;                   // seems to have passed everything
5837
929
}
5838
5839
static int stbi__tga_test(stbi__context *s)
5840
929
{
5841
929
   int res = 0;
5842
929
   int sz, tga_color_type;
5843
929
   stbi__get8(s);      //   discard Offset
5844
929
   tga_color_type = stbi__get8(s);   //   color type
5845
929
   if ( tga_color_type > 1 ) goto errorEnd;   //   only RGB or indexed allowed
5846
929
   sz = stbi__get8(s);   //   image type
5847
929
   if ( tga_color_type == 1 ) { // colormapped (paletted) image
5848
578
      if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9
5849
578
      stbi__skip(s,4);       // skip index of first colormap entry and number of entries
5850
578
      sz = stbi__get8(s);    //   check bits per palette color entry
5851
578
      if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
5852
578
      stbi__skip(s,4);       // skip image x and y origin
5853
578
   } else { // "normal" image w/o colormap
5854
351
      if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE
5855
351
      stbi__skip(s,9); // skip colormap specification and image x/y origin
5856
351
   }
5857
929
   if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test width
5858
929
   if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test height
5859
929
   sz = stbi__get8(s);   //   bits per pixel
5860
929
   if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index
5861
929
   if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
5862
5863
929
   res = 1; // if we got this far, everything's good and we can return 1 instead of 0
5864
5865
929
errorEnd:
5866
929
   stbi__rewind(s);
5867
929
   return res;
5868
929
}
5869
5870
// read 16bit value and convert to 24bit RGB
5871
static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
5872
4.83M
{
5873
4.83M
   stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5874
4.83M
   stbi__uint16 fiveBitMask = 31;
5875
   // we have 3 channels with 5bits each
5876
4.83M
   int r = (px >> 10) & fiveBitMask;
5877
4.83M
   int g = (px >> 5) & fiveBitMask;
5878
4.83M
   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
4.83M
   out[0] = (stbi_uc)((r * 255)/31);
5881
4.83M
   out[1] = (stbi_uc)((g * 255)/31);
5882
4.83M
   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
4.83M
}
5889
5890
static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
5891
929
{
5892
   //   read in the TGA header stuff
5893
929
   int tga_offset = stbi__get8(s);
5894
929
   int tga_indexed = stbi__get8(s);
5895
929
   int tga_image_type = stbi__get8(s);
5896
929
   int tga_is_RLE = 0;
5897
929
   int tga_palette_start = stbi__get16le(s);
5898
929
   int tga_palette_len = stbi__get16le(s);
5899
929
   int tga_palette_bits = stbi__get8(s);
5900
929
   int tga_x_origin = stbi__get16le(s);
5901
929
   int tga_y_origin = stbi__get16le(s);
5902
929
   int tga_width = stbi__get16le(s);
5903
929
   int tga_height = stbi__get16le(s);
5904
929
   int tga_bits_per_pixel = stbi__get8(s);
5905
929
   int tga_comp, tga_rgb16=0;
5906
929
   int tga_inverted = stbi__get8(s);
5907
   // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)
5908
   //   image data
5909
929
   unsigned char *tga_data;
5910
929
   unsigned char *tga_palette = NULL;
5911
929
   int i, j;
5912
929
   unsigned char raw_data[4] = {0};
5913
929
   int RLE_count = 0;
5914
929
   int RLE_repeating = 0;
5915
929
   int read_next_pixel = 1;
5916
929
   STBI_NOTUSED(ri);
5917
929
   STBI_NOTUSED(tga_x_origin); // @TODO
5918
929
   STBI_NOTUSED(tga_y_origin); // @TODO
5919
5920
929
   if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5921
929
   if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5922
5923
   //   do a tiny bit of precessing
5924
929
   if ( tga_image_type >= 8 )
5925
394
   {
5926
394
      tga_image_type -= 8;
5927
394
      tga_is_RLE = 1;
5928
394
   }
5929
929
   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
929
   if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5933
351
   else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5934
5935
929
   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
929
   *x = tga_width;
5940
929
   *y = tga_height;
5941
929
   if (comp) *comp = tga_comp;
5942
5943
929
   if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5944
0
      return stbi__errpuc("too large", "Corrupt TGA");
5945
5946
929
   tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5947
929
   if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
5948
5949
   // skip to the data's starting position (offset usually = 0)
5950
929
   stbi__skip(s, tga_offset );
5951
5952
929
   if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
5953
612k
      for (i=0; i < tga_height; ++i) {
5954
612k
         int row = tga_inverted ? tga_height -i - 1 : i;
5955
612k
         stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5956
612k
         stbi__getn(s, tga_row, tga_width * tga_comp);
5957
612k
      }
5958
715
   } else  {
5959
      //   do I need to load a palette?
5960
715
      if ( tga_indexed)
5961
578
      {
5962
578
         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
578
         stbi__skip(s, tga_palette_start );
5969
         //   load the palette
5970
578
         tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5971
578
         if (!tga_palette) {
5972
0
            STBI_FREE(tga_data);
5973
0
            return stbi__errpuc("outofmem", "Out of memory");
5974
0
         }
5975
578
         if (tga_rgb16) {
5976
449
            stbi_uc *pal_entry = tga_palette;
5977
449
            STBI_ASSERT(tga_comp == STBI_rgb);
5978
4.83M
            for (i=0; i < tga_palette_len; ++i) {
5979
4.83M
               stbi__tga_read_rgb16(s, pal_entry);
5980
4.83M
               pal_entry += tga_comp;
5981
4.83M
            }
5982
449
         } 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
578
      }
5988
      //   load the data
5989
107M
      for (i=0; i < tga_width * tga_height; ++i)
5990
107M
      {
5991
         //   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
5992
107M
         if ( tga_is_RLE )
5993
105M
         {
5994
105M
            if ( RLE_count == 0 )
5995
105M
            {
5996
               //   yep, get the next byte as a RLE command
5997
105M
               int RLE_cmd = stbi__get8(s);
5998
105M
               RLE_count = 1 + (RLE_cmd & 127);
5999
105M
               RLE_repeating = RLE_cmd >> 7;
6000
105M
               read_next_pixel = 1;
6001
105M
            } else if ( !RLE_repeating )
6002
11.3k
            {
6003
11.3k
               read_next_pixel = 1;
6004
11.3k
            }
6005
105M
         } else
6006
1.36M
         {
6007
1.36M
            read_next_pixel = 1;
6008
1.36M
         }
6009
         //   OK, if I need to read a pixel, do it now
6010
107M
         if ( read_next_pixel )
6011
107M
         {
6012
            //   load however much data we did have
6013
107M
            if ( tga_indexed )
6014
80.2M
            {
6015
               // read in index, then perform the lookup
6016
80.2M
               int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
6017
80.2M
               if ( pal_idx >= tga_palette_len ) {
6018
                  // invalid index
6019
1.99k
                  pal_idx = 0;
6020
1.99k
               }
6021
80.2M
               pal_idx *= tga_comp;
6022
321M
               for (j = 0; j < tga_comp; ++j) {
6023
240M
                  raw_data[j] = tga_palette[pal_idx+j];
6024
240M
               }
6025
80.2M
            } else if(tga_rgb16) {
6026
0
               STBI_ASSERT(tga_comp == STBI_rgb);
6027
0
               stbi__tga_read_rgb16(s, raw_data);
6028
26.8M
            } else {
6029
               //   read in the data raw
6030
107M
               for (j = 0; j < tga_comp; ++j) {
6031
80.4M
                  raw_data[j] = stbi__get8(s);
6032
80.4M
               }
6033
26.8M
            }
6034
            //   clear the reading flag for the next pixel
6035
107M
            read_next_pixel = 0;
6036
107M
         } // end of reading a pixel
6037
6038
         // copy data
6039
428M
         for (j = 0; j < tga_comp; ++j)
6040
321M
           tga_data[i*tga_comp+j] = raw_data[j];
6041
6042
         //   in case we're in RLE mode, keep counting down
6043
107M
         --RLE_count;
6044
107M
      }
6045
      //   do I need to invert the image?
6046
714
      if ( tga_inverted )
6047
357
      {
6048
248k
         for (j = 0; j*2 < tga_height; ++j)
6049
248k
         {
6050
248k
            int index1 = j * tga_width * tga_comp;
6051
248k
            int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
6052
155M
            for (i = tga_width * tga_comp; i > 0; --i)
6053
155M
            {
6054
155M
               unsigned char temp = tga_data[index1];
6055
155M
               tga_data[index1] = tga_data[index2];
6056
155M
               tga_data[index2] = temp;
6057
155M
               ++index1;
6058
155M
               ++index2;
6059
155M
            }
6060
248k
         }
6061
357
      }
6062
      //   clear my palette, if I had one
6063
714
      if ( tga_palette != NULL )
6064
577
      {
6065
577
         STBI_FREE( tga_palette );
6066
577
      }
6067
714
   }
6068
6069
   // swap RGB - if the source data was RGB16, it already is in the right order
6070
928
   if (tga_comp >= 3 && !tga_rgb16)
6071
265
   {
6072
265
      unsigned char* tga_pixel = tga_data;
6073
28.0M
      for (i=0; i < tga_width * tga_height; ++i)
6074
28.0M
      {
6075
28.0M
         unsigned char temp = tga_pixel[0];
6076
28.0M
         tga_pixel[0] = tga_pixel[2];
6077
28.0M
         tga_pixel[2] = temp;
6078
28.0M
         tga_pixel += tga_comp;
6079
28.0M
      }
6080
265
   }
6081
6082
   // convert to target component count
6083
928
   if (req_comp && req_comp != tga_comp)
6084
928
      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
928
   tga_palette_start = tga_palette_len = tga_palette_bits =
6089
928
         tga_x_origin = tga_y_origin = 0;
6090
928
   STBI_NOTUSED(tga_palette_start);
6091
   //   OK, done
6092
928
   return tga_data;
6093
929
}
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
10.1k
{
6102
10.1k
   int r = (stbi__get32be(s) == 0x38425053);
6103
10.1k
   stbi__rewind(s);
6104
10.1k
   return r;
6105
10.1k
}
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
15.3k
{
6357
15.3k
   int i;
6358
15.4k
   for (i=0; i<4; ++i)
6359
15.4k
      if (stbi__get8(s) != (stbi_uc)str[i])
6360
15.3k
         return 0;
6361
6362
3
   return 1;
6363
15.3k
}
6364
6365
static int stbi__pic_test_core(stbi__context *s)
6366
10.1k
{
6367
10.1k
   int i;
6368
6369
10.1k
   if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
6370
10.1k
      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
10.1k
{
6562
10.1k
   int r = stbi__pic_test_core(s);
6563
10.1k
   stbi__rewind(s);
6564
10.1k
   return r;
6565
10.1k
}
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
10.1k
{
6601
10.1k
   int sz;
6602
10.1k
   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
6603
5
   sz = stbi__get8(s);
6604
5
   if (sz != '9' && sz != '7') return 0;
6605
5
   if (stbi__get8(s) != 'a') return 0;
6606
5
   return 1;
6607
5
}
6608
6609
static int stbi__gif_test(stbi__context *s)
6610
10.1k
{
6611
10.1k
   int r = stbi__gif_test_raw(s);
6612
10.1k
   stbi__rewind(s);
6613
10.1k
   return r;
6614
10.1k
}
6615
6616
static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
6617
5
{
6618
5
   int i;
6619
15
   for (i=0; i < num_entries; ++i) {
6620
10
      pal[i][2] = stbi__get8(s);
6621
10
      pal[i][1] = stbi__get8(s);
6622
10
      pal[i][0] = stbi__get8(s);
6623
10
      pal[i][3] = transp == i ? 0 : 255;
6624
10
   }
6625
5
}
6626
6627
static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
6628
6.10k
{
6629
6.10k
   stbi_uc version;
6630
6.10k
   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
6631
6.09k
      return stbi__err("not GIF", "Corrupt GIF");
6632
6633
10
   version = stbi__get8(s);
6634
10
   if (version != '7' && version != '9')    return stbi__err("not GIF", "Corrupt GIF");
6635
10
   if (stbi__get8(s) != 'a')                return stbi__err("not GIF", "Corrupt GIF");
6636
6637
10
   stbi__g_failure_reason = "";
6638
10
   g->w = stbi__get16le(s);
6639
10
   g->h = stbi__get16le(s);
6640
10
   g->flags = stbi__get8(s);
6641
10
   g->bgindex = stbi__get8(s);
6642
10
   g->ratio = stbi__get8(s);
6643
10
   g->transparent = -1;
6644
6645
10
   if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
6646
10
   if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
6647
6648
10
   if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments
6649
6650
10
   if (is_info) return 1;
6651
6652
5
   if (g->flags & 0x80)
6653
0
      stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
6654
6655
5
   return 1;
6656
10
}
6657
6658
static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
6659
6.10k
{
6660
6.10k
   stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));
6661
6.10k
   if (!g) return stbi__err("outofmem", "Out of memory");
6662
6.10k
   if (!stbi__gif_header(s, g, comp, 1)) {
6663
6.09k
      STBI_FREE(g);
6664
6.09k
      stbi__rewind( s );
6665
6.09k
      return 0;
6666
6.09k
   }
6667
5
   if (x) *x = g->w;
6668
5
   if (y) *y = g->h;
6669
5
   STBI_FREE(g);
6670
5
   return 1;
6671
6.10k
}
6672
6673
static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6674
241k
{
6675
241k
   stbi_uc *p, *c;
6676
241k
   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
241k
   if (g->codes[code].prefix >= 0)
6681
214k
      stbi__out_gif_code(g, g->codes[code].prefix);
6682
6683
241k
   if (g->cur_y >= g->max_y) return;
6684
6685
241k
   idx = g->cur_x + g->cur_y;
6686
241k
   p = &g->out[idx];
6687
241k
   g->history[idx / 4] = 1;
6688
6689
241k
   c = &g->color_table[g->codes[code].suffix * 4];
6690
241k
   if (c[3] > 128) { // don't render transparent pixels;
6691
241k
      p[0] = c[2];
6692
241k
      p[1] = c[1];
6693
241k
      p[2] = c[0];
6694
241k
      p[3] = c[3];
6695
241k
   }
6696
241k
   g->cur_x += 4;
6697
6698
241k
   if (g->cur_x >= g->max_x) {
6699
9
      g->cur_x = g->start_x;
6700
9
      g->cur_y += g->step;
6701
6702
9
      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
9
   }
6708
241k
}
6709
6710
static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
6711
5
{
6712
5
   stbi_uc lzw_cs;
6713
5
   stbi__int32 len, init_code;
6714
5
   stbi__uint32 first;
6715
5
   stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6716
5
   stbi__gif_lzw *p;
6717
6718
5
   lzw_cs = stbi__get8(s);
6719
5
   if (lzw_cs > 12) return NULL;
6720
5
   clear = 1 << lzw_cs;
6721
5
   first = 1;
6722
5
   codesize = lzw_cs + 1;
6723
5
   codemask = (1 << codesize) - 1;
6724
5
   bits = 0;
6725
5
   valid_bits = 0;
6726
10
   for (init_code = 0; init_code < clear; init_code++) {
6727
5
      g->codes[init_code].prefix = -1;
6728
5
      g->codes[init_code].first = (stbi_uc) init_code;
6729
5
      g->codes[init_code].suffix = (stbi_uc) init_code;
6730
5
   }
6731
6732
   // support no starting clear code
6733
5
   avail = clear+2;
6734
5
   oldcode = -1;
6735
6736
5
   len = 0;
6737
62.4k
   for(;;) {
6738
62.4k
      if (valid_bits < codesize) {
6739
34.9k
         if (len == 0) {
6740
334
            len = stbi__get8(s); // start new block
6741
334
            if (len == 0)
6742
3
               return g->out;
6743
334
         }
6744
34.9k
         --len;
6745
34.9k
         bits |= (stbi__int32) stbi__get8(s) << valid_bits;
6746
34.9k
         valid_bits += 8;
6747
34.9k
      } else {
6748
27.4k
         stbi__int32 code = bits & codemask;
6749
27.4k
         bits >>= codesize;
6750
27.4k
         valid_bits -= codesize;
6751
         // @OPTIMIZE: is there some way we can accelerate the non-clear path?
6752
27.4k
         if (code == clear) {  // clear code
6753
398
            codesize = lzw_cs + 1;
6754
398
            codemask = (1 << codesize) - 1;
6755
398
            avail = clear + 2;
6756
398
            oldcode = -1;
6757
398
            first = 0;
6758
27.0k
         } else if (code == clear + 1) { // end of stream code
6759
1
            stbi__skip(s, len);
6760
129
            while ((len = stbi__get8(s)) > 0)
6761
128
               stbi__skip(s,len);
6762
1
            return g->out;
6763
27.0k
         } else if (code <= avail) {
6764
27.0k
            if (first) {
6765
0
               return stbi__errpuc("no clear code", "Corrupt GIF");
6766
0
            }
6767
6768
27.0k
            if (oldcode >= 0) {
6769
27.0k
               p = &g->codes[avail++];
6770
27.0k
               if (avail > 8192) {
6771
1
                  return stbi__errpuc("too many codes", "Corrupt GIF");
6772
1
               }
6773
6774
27.0k
               p->prefix = (stbi__int16) oldcode;
6775
27.0k
               p->first = g->codes[oldcode].first;
6776
27.0k
               p->suffix = (code == avail) ? p->first : g->codes[code].first;
6777
27.0k
            } else if (code == avail)
6778
0
               return stbi__errpuc("illegal code in raster", "Corrupt GIF");
6779
6780
27.0k
            stbi__out_gif_code(g, (stbi__uint16) code);
6781
6782
27.0k
            if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6783
51
               codesize++;
6784
51
               codemask = (1 << codesize) - 1;
6785
51
            }
6786
6787
27.0k
            oldcode = code;
6788
27.0k
         } else {
6789
0
            return stbi__errpuc("illegal code in raster", "Corrupt GIF");
6790
0
         }
6791
27.4k
      }
6792
62.4k
   }
6793
5
}
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
5
{
6799
5
   int dispose;
6800
5
   int first_frame;
6801
5
   int pi;
6802
5
   int pcount;
6803
5
   STBI_NOTUSED(req_comp);
6804
6805
   // on first frame, any non-written pixels get the background colour (non-transparent)
6806
5
   first_frame = 0;
6807
5
   if (g->out == 0) {
6808
5
      if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
6809
5
      if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
6810
0
         return stbi__errpuc("too large", "GIF image is too large");
6811
5
      pcount = g->w * g->h;
6812
5
      g->out = (stbi_uc *) stbi__malloc(4 * pcount);
6813
5
      g->background = (stbi_uc *) stbi__malloc(4 * pcount);
6814
5
      g->history = (stbi_uc *) stbi__malloc(pcount);
6815
5
      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
5
      memset(g->out, 0x00, 4 * pcount);
6822
5
      memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
6823
5
      memset(g->history, 0x00, pcount);        // pixels that were affected previous frame
6824
5
      first_frame = 1;
6825
5
   } 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
5
   memset( g->history, 0x00, g->w * g->h );        // pixels that were affected previous frame
6860
6861
5
   for (;;) {
6862
5
      int tag = stbi__get8(s);
6863
5
      switch (tag) {
6864
5
         case 0x2C: /* Image Descriptor */
6865
5
         {
6866
5
            stbi__int32 x, y, w, h;
6867
5
            stbi_uc *o;
6868
6869
5
            x = stbi__get16le(s);
6870
5
            y = stbi__get16le(s);
6871
5
            w = stbi__get16le(s);
6872
5
            h = stbi__get16le(s);
6873
5
            if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6874
0
               return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
6875
6876
5
            g->line_size = g->w * 4;
6877
5
            g->start_x = x * 4;
6878
5
            g->start_y = y * g->line_size;
6879
5
            g->max_x   = g->start_x + w * 4;
6880
5
            g->max_y   = g->start_y + h * g->line_size;
6881
5
            g->cur_x   = g->start_x;
6882
5
            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
5
            if (w == 0)
6889
0
               g->cur_y = g->max_y;
6890
6891
5
            g->lflags = stbi__get8(s);
6892
6893
5
            if (g->lflags & 0x40) {
6894
5
               g->step = 8 * g->line_size; // first interlaced spacing
6895
5
               g->parse = 3;
6896
5
            } else {
6897
0
               g->step = g->line_size;
6898
0
               g->parse = 0;
6899
0
            }
6900
6901
5
            if (g->lflags & 0x80) {
6902
5
               stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6903
5
               g->color_table = (stbi_uc *) g->lpal;
6904
5
            } 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
5
            o = stbi__process_gif_raster(s, g);
6910
5
            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
5
         }
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
5
      }
6968
5
   }
6969
5
}
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
5
{
7069
5
   stbi_uc *u = 0;
7070
5
   stbi__gif g;
7071
5
   memset(&g, 0, sizeof(g));
7072
5
   STBI_NOTUSED(ri);
7073
7074
5
   u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
7075
5
   if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker
7076
5
   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
1
      STBI_FREE(g.out);
7087
1
   }
7088
7089
   // free buffers needed for multiple frame loading;
7090
5
   STBI_FREE(g.history);
7091
5
   STBI_FREE(g.background);
7092
7093
5
   return u;
7094
5
}
7095
7096
static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
7097
6.10k
{
7098
6.10k
   return stbi__gif_info_raw(s,x,y,comp);
7099
6.10k
}
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.98k
{
7108
3.98k
   int i;
7109
4.24k
   for (i=0; signature[i]; ++i)
7110
4.24k
      if (stbi__get8(s) != signature[i])
7111
3.98k
          return 0;
7112
0
   stbi__rewind(s);
7113
0
   return 1;
7114
3.98k
}
7115
7116
static int stbi__hdr_test(stbi__context* s)
7117
1.99k
{
7118
1.99k
   int r = stbi__hdr_test_core(s, "#?RADIANCE\n");
7119
1.99k
   stbi__rewind(s);
7120
1.99k
   if(!r) {
7121
1.99k
       r = stbi__hdr_test_core(s, "#?RGBE\n");
7122
1.99k
       stbi__rewind(s);
7123
1.99k
   }
7124
1.99k
   return r;
7125
1.99k
}
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
1.06k
{
7310
1.06k
   char buffer[STBI__HDR_BUFLEN];
7311
1.06k
   char *token;
7312
1.06k
   int valid = 0;
7313
1.06k
   int dummy;
7314
7315
1.06k
   if (!x) x = &dummy;
7316
1.06k
   if (!y) y = &dummy;
7317
1.06k
   if (!comp) comp = &dummy;
7318
7319
1.06k
   if (stbi__hdr_test(s) == 0) {
7320
1.06k
       stbi__rewind( s );
7321
1.06k
       return 0;
7322
1.06k
   }
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
6.09k
{
7356
6.09k
   void *p;
7357
6.09k
   stbi__bmp_data info;
7358
7359
6.09k
   info.all_a = 255;
7360
6.09k
   p = stbi__bmp_parse_header(s, &info);
7361
6.09k
   if (p == NULL) {
7362
5.22k
      stbi__rewind( s );
7363
5.22k
      return 0;
7364
5.22k
   }
7365
871
   if (x) *x = s->img_x;
7366
871
   if (y) *y = s->img_y;
7367
871
   if (comp) {
7368
871
      if (info.bpp == 24 && info.ma == 0xff000000)
7369
0
         *comp = 3;
7370
871
      else
7371
871
         *comp = info.ma ? 4 : 3;
7372
871
   }
7373
871
   return 1;
7374
6.09k
}
7375
#endif
7376
7377
#ifndef STBI_NO_PSD
7378
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
7379
5.22k
{
7380
5.22k
   int channelCount, dummy, depth;
7381
5.22k
   if (!x) x = &dummy;
7382
5.22k
   if (!y) y = &dummy;
7383
5.22k
   if (!comp) comp = &dummy;
7384
5.22k
   if (stbi__get32be(s) != 0x38425053) {
7385
5.22k
       stbi__rewind( s );
7386
5.22k
       return 0;
7387
5.22k
   }
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
11.0k
{
7415
11.0k
   int channelCount, depth;
7416
11.0k
   if (stbi__get32be(s) != 0x38425053) {
7417
11.0k
       stbi__rewind( s );
7418
11.0k
       return 0;
7419
11.0k
   }
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
5.22k
{
7444
5.22k
   int act_comp=0,num_packets=0,chained,dummy;
7445
5.22k
   stbi__pic_packet packets[10];
7446
7447
5.22k
   if (!x) x = &dummy;
7448
5.22k
   if (!y) y = &dummy;
7449
5.22k
   if (!comp) comp = &dummy;
7450
7451
5.22k
   if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
7452
5.22k
      stbi__rewind(s);
7453
5.22k
      return 0;
7454
5.22k
   }
7455
7456
3
   stbi__skip(s, 88);
7457
7458
3
   *x = stbi__get16be(s);
7459
3
   *y = stbi__get16be(s);
7460
3
   if (stbi__at_eof(s)) {
7461
2
      stbi__rewind( s);
7462
2
      return 0;
7463
2
   }
7464
1
   if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
7465
1
      stbi__rewind( s );
7466
1
      return 0;
7467
1
   }
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
5.09k
{
7515
5.09k
   char p, t;
7516
5.09k
   p = (char) stbi__get8(s);
7517
5.09k
   t = (char) stbi__get8(s);
7518
5.09k
   if (p != 'P' || (t != '5' && t != '6')) {
7519
929
       stbi__rewind( s );
7520
929
       return 0;
7521
929
   }
7522
4.16k
   return 1;
7523
5.09k
}
7524
7525
static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
7526
4.16k
{
7527
4.16k
   stbi_uc *out;
7528
4.16k
   STBI_NOTUSED(ri);
7529
7530
4.16k
   ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n);
7531
4.16k
   if (ri->bits_per_channel == 0)
7532
0
      return 0;
7533
7534
4.16k
   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
7535
4.16k
   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
7536
7537
4.16k
   *x = s->img_x;
7538
4.16k
   *y = s->img_y;
7539
4.16k
   if (comp) *comp = s->img_n;
7540
7541
4.16k
   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
4.16k
   out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);
7545
4.16k
   if (!out) return stbi__errpuc("outofmem", "Out of memory");
7546
4.16k
   if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) {
7547
4
      STBI_FREE(out);
7548
4
      return stbi__errpuc("bad PNM", "PNM file truncated");
7549
4
   }
7550
7551
4.16k
   if (req_comp && req_comp != s->img_n) {
7552
4.16k
      if (ri->bits_per_channel == 16) {
7553
693
         out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y);
7554
3.46k
      } else {
7555
3.46k
         out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7556
3.46k
      }
7557
4.16k
      if (out == NULL) return out; // stbi__convert_format frees input on failure
7558
4.16k
   }
7559
4.16k
   return out;
7560
4.16k
}
7561
7562
static int      stbi__pnm_isspace(char c)
7563
78.7k
{
7564
78.7k
   return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
7565
78.7k
}
7566
7567
static void     stbi__pnm_skip_whitespace(stbi__context *s, char *c)
7568
37.4k
{
7569
38.6k
   for (;;) {
7570
78.7k
      while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7571
40.1k
         *c = (char) stbi__get8(s);
7572
7573
38.6k
      if (stbi__at_eof(s) || *c != '#')
7574
37.4k
         break;
7575
7576
3.44k
      while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' )
7577
2.29k
         *c = (char) stbi__get8(s);
7578
1.14k
   }
7579
37.4k
}
7580
7581
static int      stbi__pnm_isdigit(char c)
7582
82.4k
{
7583
82.4k
   return c >= '0' && c <= '9';
7584
82.4k
}
7585
7586
static int      stbi__pnm_getinteger(stbi__context *s, char *c)
7587
37.4k
{
7588
37.4k
   int value = 0;
7589
7590
82.5k
   while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7591
45.3k
      value = value*10 + (*c - '0');
7592
45.3k
      *c = (char) stbi__get8(s);
7593
45.3k
      if((value > 214748364) || (value == 214748364 && *c > '7'))
7594
294
          return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int");
7595
45.3k
   }
7596
7597
37.1k
   return value;
7598
37.4k
}
7599
7600
static int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
7601
20.4k
{
7602
20.4k
   int maxv, dummy;
7603
20.4k
   char c, p, t;
7604
7605
20.4k
   if (!x) x = &dummy;
7606
20.4k
   if (!y) y = &dummy;
7607
20.4k
   if (!comp) comp = &dummy;
7608
7609
20.4k
   stbi__rewind(s);
7610
7611
   // Get identifier
7612
20.4k
   p = (char) stbi__get8(s);
7613
20.4k
   t = (char) stbi__get8(s);
7614
20.4k
   if (p != 'P' || (t != '5' && t != '6')) {
7615
7.93k
       stbi__rewind(s);
7616
7.93k
       return 0;
7617
7.93k
   }
7618
7619
12.4k
   *comp = (t == '6') ? 3 : 1;  // '5' is 1-component .pgm; '6' is 3-component .ppm
7620
7621
12.4k
   c = (char) stbi__get8(s);
7622
12.4k
   stbi__pnm_skip_whitespace(s, &c);
7623
7624
12.4k
   *x = stbi__pnm_getinteger(s, &c); // read width
7625
12.4k
   if(*x == 0)
7626
1
       return stbi__err("invalid width", "PPM image header had zero or overflowing width");
7627
12.4k
   stbi__pnm_skip_whitespace(s, &c);
7628
7629
12.4k
   *y = stbi__pnm_getinteger(s, &c); // read height
7630
12.4k
   if (*y == 0)
7631
3
       return stbi__err("invalid width", "PPM image header had zero or overflowing width");
7632
12.4k
   stbi__pnm_skip_whitespace(s, &c);
7633
7634
12.4k
   maxv = stbi__pnm_getinteger(s, &c);  // read max value
7635
12.4k
   if (maxv > 65535)
7636
0
      return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images");
7637
12.4k
   else if (maxv > 255)
7638
2.08k
      return 16;
7639
10.4k
   else
7640
10.4k
      return 8;
7641
12.4k
}
7642
7643
static int stbi__pnm_is16(stbi__context *s)
7644
11.0k
{
7645
11.0k
   if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)
7646
695
     return 1;
7647
10.3k
   return 0;
7648
11.0k
}
7649
#endif
7650
7651
static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
7652
11.1k
{
7653
11.1k
   #ifndef STBI_NO_JPEG
7654
11.1k
   if (stbi__jpeg_info(s, x, y, comp)) return 1;
7655
6.10k
   #endif
7656
7657
6.10k
   #ifndef STBI_NO_PNG
7658
6.10k
   if (stbi__png_info(s, x, y, comp))  return 1;
7659
6.10k
   #endif
7660
7661
6.10k
   #ifndef STBI_NO_GIF
7662
6.10k
   if (stbi__gif_info(s, x, y, comp))  return 1;
7663
6.09k
   #endif
7664
7665
6.09k
   #ifndef STBI_NO_BMP
7666
6.09k
   if (stbi__bmp_info(s, x, y, comp))  return 1;
7667
5.22k
   #endif
7668
7669
5.22k
   #ifndef STBI_NO_PSD
7670
5.22k
   if (stbi__psd_info(s, x, y, comp))  return 1;
7671
5.22k
   #endif
7672
7673
5.22k
   #ifndef STBI_NO_PIC
7674
5.22k
   if (stbi__pic_info(s, x, y, comp))  return 1;
7675
5.22k
   #endif
7676
7677
5.22k
   #ifndef STBI_NO_PNM
7678
5.22k
   if (stbi__pnm_info(s, x, y, comp))  return 1;
7679
1.06k
   #endif
7680
7681
1.06k
   #ifndef STBI_NO_HDR
7682
1.06k
   if (stbi__hdr_info(s, x, y, comp))  return 1;
7683
1.06k
   #endif
7684
7685
   // test tga last because it's a crappy test!
7686
1.06k
   #ifndef STBI_NO_TGA
7687
1.06k
   if (stbi__tga_info(s, x, y, comp))
7688
929
       return 1;
7689
135
   #endif
7690
135
   return stbi__err("unknown image type", "Image not of any known type, or corrupt");
7691
1.06k
}
7692
7693
static int stbi__is_16_main(stbi__context *s)
7694
11.0k
{
7695
11.0k
   #ifndef STBI_NO_PNG
7696
11.0k
   if (stbi__png_is16(s))  return 1;
7697
11.0k
   #endif
7698
7699
11.0k
   #ifndef STBI_NO_PSD
7700
11.0k
   if (stbi__psd_is16(s))  return 1;
7701
11.0k
   #endif
7702
7703
11.0k
   #ifndef STBI_NO_PNM
7704
11.0k
   if (stbi__pnm_is16(s))  return 1;
7705
10.3k
   #endif
7706
10.3k
   return 0;
7707
11.0k
}
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
11.1k
{
7755
11.1k
   stbi__context s;
7756
11.1k
   stbi__start_mem(&s,buffer,len);
7757
11.1k
   return stbi__info_main(&s,x,y,comp);
7758
11.1k
}
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
11.0k
{
7769
11.0k
   stbi__context s;
7770
11.0k
   stbi__start_mem(&s,buffer,len);
7771
11.0k
   return stbi__is_16_main(&s);
7772
11.0k
}
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
*/