Coverage Report

Created: 2025-11-24 06: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.29G
#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
27.1M
#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
95.1k
#define STBI_MALLOC(sz)           malloc(sz)
681
0
#define STBI_REALLOC(p,newsz)     realloc(p,newsz)
682
95.1k
#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.8k
{
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.8k
   return 1;
769
15.8k
}
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
33.3k
#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.8k
{
826
33.8k
   s->io.read = NULL;
827
33.8k
   s->read_from_callbacks = 0;
828
33.8k
   s->callback_already_read = 0;
829
33.8k
   s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
830
33.8k
   s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
831
33.8k
}
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
157k
{
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
157k
   s->img_buffer = s->img_buffer_original;
890
157k
   s->img_buffer_end = s->img_buffer_original_end;
891
157k
}
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
55.1k
{
978
55.1k
   stbi__g_failure_reason = str;
979
55.1k
   return 0;
980
55.1k
}
981
#endif
982
983
static void *stbi__malloc(size_t size)
984
95.1k
{
985
95.1k
    return STBI_MALLOC(size);
986
95.1k
}
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
50.8k
{
1002
50.8k
   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
50.8k
   return a <= INT_MAX - b;
1008
50.8k
}
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
87.2k
{
1014
87.2k
   if (a < 0 || b < 0) return 0;
1015
87.2k
   if (b == 0) return 1; // mul-by-0 is always safe
1016
   // portable way to check for no overflows in a*b
1017
87.2k
   return a <= INT_MAX/b;
1018
87.2k
}
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
22.2k
{
1024
22.2k
   return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
1025
22.2k
}
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.9k
{
1031
20.9k
   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
1032
20.9k
      stbi__addsizes_valid(a*b*c, add);
1033
20.9k
}
1034
1035
// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow
1036
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1037
static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
1038
7.70k
{
1039
7.70k
   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
1040
7.70k
      stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
1041
7.70k
}
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
22.2k
{
1048
22.2k
   if (!stbi__mad2sizes_valid(a, b, add)) return NULL;
1049
22.2k
   return stbi__malloc(a*b + add);
1050
22.2k
}
1051
#endif
1052
1053
static void *stbi__malloc_mad3(int a, int b, int c, int add)
1054
13.5k
{
1055
13.5k
   if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;
1056
13.5k
   return stbi__malloc(a*b*c + add);
1057
13.5k
}
1058
1059
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1060
static void *stbi__malloc_mad4(int a, int b, int c, int d, int add)
1061
3.85k
{
1062
3.85k
   if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;
1063
3.85k
   return stbi__malloc(a*b*c*d + add);
1064
3.85k
}
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
55.1k
   #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.15k
#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.2k
{
1101
11.2k
   STBI_FREE(retval_from_stbi_load);
1102
11.2k
}
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.2k
#define stbi__vertically_flip_on_load  (stbi__vertically_flip_on_load_set       \
1131
11.2k
                                         ? stbi__vertically_flip_on_load_local  \
1132
11.2k
                                         : 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.2k
{
1137
11.2k
   memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
1138
11.2k
   ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed
1139
11.2k
   ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order
1140
11.2k
   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.2k
   #ifndef STBI_NO_PNG
1145
11.2k
   if (stbi__png_test(s))  return stbi__png_load(s,x,y,comp,req_comp, ri);
1146
11.2k
   #endif
1147
11.2k
   #ifndef STBI_NO_BMP
1148
11.2k
   if (stbi__bmp_test(s))  return stbi__bmp_load(s,x,y,comp,req_comp, ri);
1149
10.4k
   #endif
1150
10.4k
   #ifndef STBI_NO_GIF
1151
10.4k
   if (stbi__gif_test(s))  return stbi__gif_load(s,x,y,comp,req_comp, ri);
1152
10.4k
   #endif
1153
10.4k
   #ifndef STBI_NO_PSD
1154
10.4k
   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.4k
   #ifndef STBI_NO_PIC
1159
10.4k
   if (stbi__pic_test(s))  return stbi__pic_load(s,x,y,comp,req_comp, ri);
1160
10.4k
   #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.4k
   #ifndef STBI_NO_JPEG
1166
10.4k
   if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
1167
5.01k
   #endif
1168
5.01k
   #ifndef STBI_NO_PNM
1169
5.01k
   if (stbi__pnm_test(s))  return stbi__pnm_load(s,x,y,comp,req_comp, ri);
1170
1.16k
   #endif
1171
1172
1.16k
   #ifndef STBI_NO_HDR
1173
1.16k
   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
1.16k
   #endif
1178
1179
1.16k
   #ifndef STBI_NO_TGA
1180
   // test tga last because it's a crappy test!
1181
1.16k
   if (stbi__tga_test(s))
1182
1.16k
      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
1.16k
}
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.7k
{
1260
10.7k
   stbi__result_info ri;
1261
10.7k
   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
1262
1263
10.7k
   if (result == NULL)
1264
8
      return NULL;
1265
1266
   // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
1267
10.6k
   STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1268
1269
10.6k
   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.6k
   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.6k
   return (unsigned char *) result;
1282
10.6k
}
1283
1284
static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1285
552
{
1286
552
   stbi__result_info ri;
1287
552
   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
1288
1289
552
   if (result == NULL)
1290
1
      return NULL;
1291
1292
   // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
1293
551
   STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
1294
1295
551
   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
551
   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
551
   return (stbi__uint16 *) result;
1309
551
}
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
552
{
1415
552
   stbi__context s;
1416
552
   stbi__start_mem(&s,buffer,len);
1417
552
   return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
1418
552
}
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.7k
{
1429
10.7k
   stbi__context s;
1430
10.7k
   stbi__start_mem(&s,buffer,len);
1431
10.7k
   return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1432
10.7k
}
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.05G
{
1614
2.05G
   if (s->img_buffer < s->img_buffer_end)
1615
1.18M
      return *s->img_buffer++;
1616
2.05G
   if (s->read_from_callbacks) {
1617
0
      stbi__refill_buffer(s);
1618
0
      return *s->img_buffer++;
1619
0
   }
1620
2.05G
   return 0;
1621
2.05G
}
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
184k
{
1628
184k
   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
184k
   return s->img_buffer >= s->img_buffer_end;
1636
184k
}
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
13.2M
{
1644
13.2M
   if (n == 0) return;  // already there!
1645
12.4k
   if (n < 0) {
1646
0
      s->img_buffer = s->img_buffer_end;
1647
0
      return;
1648
0
   }
1649
12.4k
   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
12.4k
   s->img_buffer += n;
1658
12.4k
}
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
175k
{
1666
175k
   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
175k
   if (s->img_buffer+n <= s->img_buffer_end) {
1681
4.10k
      memcpy(buffer, s->img_buffer, n);
1682
4.10k
      s->img_buffer += n;
1683
4.10k
      return 1;
1684
4.10k
   } else
1685
171k
      return 0;
1686
175k
}
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
106k
{
1694
106k
   int z = stbi__get8(s);
1695
106k
   return (z << 8) + stbi__get8(s);
1696
106k
}
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.8k
{
1704
26.8k
   stbi__uint32 z = stbi__get16be(s);
1705
26.8k
   return (z << 16) + stbi__get16be(s);
1706
26.8k
}
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
857M
{
1714
857M
   int z = stbi__get8(s);
1715
857M
   return z + (stbi__get8(s) << 8);
1716
857M
}
1717
#endif
1718
1719
#ifndef STBI_NO_BMP
1720
static stbi__uint32 stbi__get32le(stbi__context *s)
1721
353M
{
1722
353M
   stbi__uint32 z = stbi__get16le(s);
1723
353M
   z += (stbi__uint32)stbi__get16le(s) << 16;
1724
353M
   return z;
1725
353M
}
1726
#endif
1727
1728
1.41G
#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.32k
{
1755
4.32k
   int i,j;
1756
4.32k
   unsigned char *good;
1757
1758
4.32k
   if (req_comp == img_n) return data;
1759
4.32k
   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1760
1761
4.32k
   good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
1762
4.32k
   if (good == NULL) {
1763
0
      STBI_FREE(data);
1764
0
      return stbi__errpuc("outofmem", "Out of memory");
1765
0
   }
1766
1767
627k
   for (j=0; j < (int) y; ++j) {
1768
622k
      unsigned char *src  = data + j * x * img_n   ;
1769
622k
      unsigned char *dest = good + j * x * req_comp;
1770
1771
1.24M
      #define STBI__COMBO(a,b)  ((a)*8+(b))
1772
533M
      #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
622k
      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
43.7M
         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
352M
         STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                  } break;
1782
137M
         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
622k
      }
1790
622k
      #undef STBI__CASE
1791
622k
   }
1792
1793
4.32k
   STBI_FREE(data);
1794
4.32k
   return good;
1795
4.32k
}
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
551
{
1812
551
   int i,j;
1813
551
   stbi__uint16 *good;
1814
1815
551
   if (req_comp == img_n) return data;
1816
551
   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1817
1818
551
   good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
1819
551
   if (good == NULL) {
1820
0
      STBI_FREE(data);
1821
0
      return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
1822
0
   }
1823
1824
1.23k
   for (j=0; j < (int) y; ++j) {
1825
679
      stbi__uint16 *src  = data + j * x * img_n   ;
1826
679
      stbi__uint16 *dest = good + j * x * req_comp;
1827
1828
1.35k
      #define STBI__COMBO(a,b)  ((a)*8+(b))
1829
2.03k
      #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
679
      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
846
         STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff;                     } break;
1836
0
         STBI__CASE(2,1) { dest[0]=src[0];                                                     } break;
1837
0
         STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } break;
1838
0
         STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                     } break;
1839
512
         STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff;        } break;
1840
0
         STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;
1841
0
         STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;
1842
0
         STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;
1843
0
         STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;
1844
0
         STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                       } break;
1845
0
         default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion");
1846
679
      }
1847
679
      #undef STBI__CASE
1848
679
   }
1849
1850
551
   STBI_FREE(data);
1851
551
   return good;
1852
551
}
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.52M
#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
982k
{
2003
982k
   int i,j,k=0;
2004
982k
   unsigned int code;
2005
   // build size list for each symbol (from JPEG spec)
2006
16.7M
   for (i=0; i < 16; ++i) {
2007
16.0M
      for (j=0; j < count[i]; ++j) {
2008
305k
         h->size[k++] = (stbi_uc) (i+1);
2009
305k
         if(k >= 257) return stbi__err("bad size list","Corrupt JPEG");
2010
305k
      }
2011
15.7M
   }
2012
982k
   h->size[k] = 0;
2013
2014
   // compute actual symbols (from jpeg spec)
2015
982k
   code = 0;
2016
982k
   k = 0;
2017
16.6M
   for(j=1; j <= 16; ++j) {
2018
      // compute delta to add to code to compute symbol id
2019
15.7M
      h->delta[j] = k - code;
2020
15.7M
      if (h->size[k] == j) {
2021
302k
         while (h->size[k] == j)
2022
287k
            h->code[k++] = (stbi__uint16) (code++);
2023
15.0k
         if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG");
2024
15.0k
      }
2025
      // compute largest code + 1 for this size, preshifted as needed later
2026
15.7M
      h->maxcode[j] = code << (16-j);
2027
15.7M
      code <<= 1;
2028
15.7M
   }
2029
981k
   h->maxcode[j] = 0xffffffff;
2030
2031
   // build non-spec acceleration table; 255 is flag for not-accelerated
2032
981k
   memset(h->fast, 255, 1 << FAST_BITS);
2033
1.19M
   for (i=0; i < k; ++i) {
2034
217k
      int s = h->size[i];
2035
217k
      if (s <= FAST_BITS) {
2036
60.8k
         int c = h->code[i] << (FAST_BITS-s);
2037
60.8k
         int m = 1 << (FAST_BITS-s);
2038
630k
         for (j=0; j < m; ++j) {
2039
569k
            h->fast[c+j] = (stbi_uc) i;
2040
569k
         }
2041
60.8k
      }
2042
217k
   }
2043
981k
   return 1;
2044
982k
}
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
988
{
2050
988
   int i;
2051
506k
   for (i=0; i < (1 << FAST_BITS); ++i) {
2052
505k
      stbi_uc fast = h->fast[i];
2053
505k
      fast_ac[i] = 0;
2054
505k
      if (fast < 255) {
2055
248k
         int rs = h->values[fast];
2056
248k
         int run = (rs >> 4) & 15;
2057
248k
         int magbits = rs & 15;
2058
248k
         int len = h->size[fast];
2059
2060
248k
         if (magbits && len + magbits <= FAST_BITS) {
2061
            // magnitude code followed by receive_extend code
2062
232k
            int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
2063
232k
            int m = 1 << (magbits - 1);
2064
232k
            if (k < m) k += (~0U << magbits) + 1;
2065
            // if the result is small enough, we can fit it in fast_ac table
2066
232k
            if (k >= -128 && k <= 127)
2067
923
               fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
2068
232k
         }
2069
248k
      }
2070
505k
   }
2071
988
}
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
827k
{
2530
   // This is constructed to match our regular (generic) integer IDCT exactly.
2531
827k
   __m128i row0, row1, row2, row3, row4, row5, row6, row7;
2532
827k
   __m128i tmp;
2533
2534
   // dot product constant: even elems=x, odd elems=y
2535
6.61M
   #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
827k
   #define dct_rot(out0,out1, x,y,c0,c1) \
2540
6.61M
      __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2541
6.61M
      __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2542
6.61M
      __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2543
6.61M
      __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2544
6.61M
      __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2545
6.61M
      __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2546
2547
   // out = in << 12  (in 16-bit, out 32-bit)
2548
827k
   #define dct_widen(out, in) \
2549
3.30M
      __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2550
3.30M
      __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2551
2552
   // wide add
2553
827k
   #define dct_wadd(out, a, b) \
2554
16.5M
      __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2555
16.5M
      __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2556
2557
   // wide sub
2558
827k
   #define dct_wsub(out, a, b) \
2559
9.92M
      __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2560
9.92M
      __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2561
2562
   // butterfly a/b, add bias, then shift by "s" and pack
2563
827k
   #define dct_bfly32o(out0, out1, a,b,bias,s) \
2564
6.61M
      { \
2565
6.61M
         __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2566
6.61M
         __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2567
6.61M
         dct_wadd(sum, abiased, b); \
2568
6.61M
         dct_wsub(dif, abiased, b); \
2569
6.61M
         out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2570
6.61M
         out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2571
6.61M
      }
2572
2573
   // 8-bit interleave step (for transposes)
2574
827k
   #define dct_interleave8(a, b) \
2575
4.96M
      tmp = a; \
2576
4.96M
      a = _mm_unpacklo_epi8(a, b); \
2577
4.96M
      b = _mm_unpackhi_epi8(tmp, b)
2578
2579
   // 16-bit interleave step (for transposes)
2580
827k
   #define dct_interleave16(a, b) \
2581
9.92M
      tmp = a; \
2582
9.92M
      a = _mm_unpacklo_epi16(a, b); \
2583
9.92M
      b = _mm_unpackhi_epi16(tmp, b)
2584
2585
827k
   #define dct_pass(bias,shift) \
2586
1.65M
      { \
2587
         /* even part */ \
2588
1.65M
         dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2589
1.65M
         __m128i sum04 = _mm_add_epi16(row0, row4); \
2590
1.65M
         __m128i dif04 = _mm_sub_epi16(row0, row4); \
2591
1.65M
         dct_widen(t0e, sum04); \
2592
1.65M
         dct_widen(t1e, dif04); \
2593
1.65M
         dct_wadd(x0, t0e, t3e); \
2594
1.65M
         dct_wsub(x3, t0e, t3e); \
2595
1.65M
         dct_wadd(x1, t1e, t2e); \
2596
1.65M
         dct_wsub(x2, t1e, t2e); \
2597
         /* odd part */ \
2598
1.65M
         dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2599
1.65M
         dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2600
1.65M
         __m128i sum17 = _mm_add_epi16(row1, row7); \
2601
1.65M
         __m128i sum35 = _mm_add_epi16(row3, row5); \
2602
1.65M
         dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2603
1.65M
         dct_wadd(x4, y0o, y4o); \
2604
1.65M
         dct_wadd(x5, y1o, y5o); \
2605
1.65M
         dct_wadd(x6, y2o, y5o); \
2606
1.65M
         dct_wadd(x7, y3o, y4o); \
2607
1.65M
         dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2608
1.65M
         dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2609
1.65M
         dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2610
1.65M
         dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2611
1.65M
      }
2612
2613
827k
   __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2614
827k
   __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2615
827k
   __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2616
827k
   __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2617
827k
   __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2618
827k
   __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2619
827k
   __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2620
827k
   __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
827k
   __m128i bias_0 = _mm_set1_epi32(512);
2624
827k
   __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2625
2626
   // load
2627
827k
   row0 = _mm_load_si128((const __m128i *) (data + 0*8));
2628
827k
   row1 = _mm_load_si128((const __m128i *) (data + 1*8));
2629
827k
   row2 = _mm_load_si128((const __m128i *) (data + 2*8));
2630
827k
   row3 = _mm_load_si128((const __m128i *) (data + 3*8));
2631
827k
   row4 = _mm_load_si128((const __m128i *) (data + 4*8));
2632
827k
   row5 = _mm_load_si128((const __m128i *) (data + 5*8));
2633
827k
   row6 = _mm_load_si128((const __m128i *) (data + 6*8));
2634
827k
   row7 = _mm_load_si128((const __m128i *) (data + 7*8));
2635
2636
   // column pass
2637
827k
   dct_pass(bias_0, 10);
2638
2639
827k
   {
2640
      // 16bit 8x8 transpose pass 1
2641
827k
      dct_interleave16(row0, row4);
2642
827k
      dct_interleave16(row1, row5);
2643
827k
      dct_interleave16(row2, row6);
2644
827k
      dct_interleave16(row3, row7);
2645
2646
      // transpose pass 2
2647
827k
      dct_interleave16(row0, row2);
2648
827k
      dct_interleave16(row1, row3);
2649
827k
      dct_interleave16(row4, row6);
2650
827k
      dct_interleave16(row5, row7);
2651
2652
      // transpose pass 3
2653
827k
      dct_interleave16(row0, row1);
2654
827k
      dct_interleave16(row2, row3);
2655
827k
      dct_interleave16(row4, row5);
2656
827k
      dct_interleave16(row6, row7);
2657
827k
   }
2658
2659
   // row pass
2660
827k
   dct_pass(bias_1, 17);
2661
2662
827k
   {
2663
      // pack
2664
827k
      __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7
2665
827k
      __m128i p1 = _mm_packus_epi16(row2, row3);
2666
827k
      __m128i p2 = _mm_packus_epi16(row4, row5);
2667
827k
      __m128i p3 = _mm_packus_epi16(row6, row7);
2668
2669
      // 8bit 8x8 transpose pass 1
2670
827k
      dct_interleave8(p0, p2); // a0e0a1e1...
2671
827k
      dct_interleave8(p1, p3); // c0g0c1g1...
2672
2673
      // transpose pass 2
2674
827k
      dct_interleave8(p0, p1); // a0c0e0g0...
2675
827k
      dct_interleave8(p2, p3); // b0d0f0h0...
2676
2677
      // transpose pass 3
2678
827k
      dct_interleave8(p0, p2); // a0b0c0d0...
2679
827k
      dct_interleave8(p1, p3); // a4b4c4d4...
2680
2681
      // store
2682
827k
      _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2683
827k
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2684
827k
      _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2685
827k
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2686
827k
      _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2687
827k
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2688
827k
      _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2689
827k
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2690
827k
   }
2691
2692
827k
#undef dct_const
2693
827k
#undef dct_rot
2694
827k
#undef dct_widen
2695
827k
#undef dct_wadd
2696
827k
#undef dct_wsub
2697
827k
#undef dct_bfly32o
2698
827k
#undef dct_interleave8
2699
827k
#undef dct_interleave16
2700
827k
#undef dct_pass
2701
827k
}
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
86.2k
#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
45.2k
{
2919
45.2k
   stbi_uc x;
2920
45.2k
   if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
2921
45.2k
   x = stbi__get8(j->s);
2922
45.2k
   if (x != 0xff) return STBI__MARKER_none;
2923
95.5k
   while (x == 0xff)
2924
62.5k
      x = stbi__get8(j->s); // consume repeated 0xff fill bytes
2925
33.0k
   return x;
2926
45.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
827k
{
3073
827k
   int i;
3074
53.7M
   for (i=0; i < 64; ++i)
3075
52.9M
      data[i] *= dequant[i];
3076
827k
}
3077
3078
static void stbi__jpeg_finish(stbi__jpeg *z)
3079
385
{
3080
385
   if (z->progressive) {
3081
      // dequantize and idct the data
3082
385
      int i,j,n;
3083
1.92k
      for (n=0; n < z->s->img_n; ++n) {
3084
1.54k
         int w = (z->img_comp[n].x+7) >> 3;
3085
1.54k
         int h = (z->img_comp[n].y+7) >> 3;
3086
128k
         for (j=0; j < h; ++j) {
3087
954k
            for (i=0; i < w; ++i) {
3088
827k
               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
3089
827k
               stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
3090
827k
               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
827k
            }
3092
127k
         }
3093
1.54k
      }
3094
385
   }
3095
385
}
3096
3097
static int stbi__process_marker(stbi__jpeg *z, int m)
3098
6.07k
{
3099
6.07k
   int L;
3100
6.07k
   switch (m) {
3101
1.02k
      case STBI__MARKER_none: // no marker found
3102
1.02k
         return stbi__err("expected marker","Corrupt JPEG");
3103
3104
170
      case 0xDD: // DRI - specify restart interval
3105
170
         if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
3106
130
         z->restart_interval = stbi__get16be(z->s);
3107
130
         return 1;
3108
3109
675
      case 0xDB: // DQT - define quantization table
3110
675
         L = stbi__get16be(z->s)-2;
3111
153k
         while (L > 0) {
3112
152k
            int q = stbi__get8(z->s);
3113
152k
            int p = q >> 4, sixteen = (p != 0);
3114
152k
            int t = q & 15,i;
3115
152k
            if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG");
3116
152k
            if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
3117
3118
9.90M
            for (i=0; i < 64; ++i)
3119
9.75M
               z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
3120
152k
            L -= (sixteen ? 129 : 65);
3121
152k
         }
3122
273
         return L==0;
3123
3124
2.25k
      case 0xC4: // DHT - define huffman table
3125
2.25k
         L = stbi__get16be(z->s)-2;
3126
984k
         while (L > 0) {
3127
983k
            stbi_uc *v;
3128
983k
            int sizes[16],i,n=0;
3129
983k
            int q = stbi__get8(z->s);
3130
983k
            int tc = q >> 4;
3131
983k
            int th = q & 15;
3132
983k
            if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
3133
16.7M
            for (i=0; i < 16; ++i) {
3134
15.7M
               sizes[i] = stbi__get8(z->s);
3135
15.7M
               n += sizes[i];
3136
15.7M
            }
3137
983k
            if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values!
3138
982k
            L -= 17;
3139
982k
            if (tc == 0) {
3140
981k
               if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
3141
980k
               v = z->huff_dc[th].values;
3142
980k
            } else {
3143
1.42k
               if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
3144
988
               v = z->huff_ac[th].values;
3145
988
            }
3146
1.19M
            for (i=0; i < n; ++i)
3147
217k
               v[i] = stbi__get8(z->s);
3148
981k
            if (tc != 0)
3149
988
               stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
3150
981k
            L -= n;
3151
981k
         }
3152
345
         return L==0;
3153
6.07k
   }
3154
3155
   // check for comment block or APP blocks
3156
1.94k
   if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
3157
1.34k
      L = stbi__get16be(z->s);
3158
1.34k
      if (L < 2) {
3159
244
         if (m == 0xFE)
3160
2
            return stbi__err("bad COM len","Corrupt JPEG");
3161
242
         else
3162
242
            return stbi__err("bad APP len","Corrupt JPEG");
3163
244
      }
3164
1.10k
      L -= 2;
3165
3166
1.10k
      if (m == 0xE0 && L >= 5) { // JFIF APP0 segment
3167
320
         static const unsigned char tag[5] = {'J','F','I','F','\0'};
3168
320
         int ok = 1;
3169
320
         int i;
3170
1.92k
         for (i=0; i < 5; ++i)
3171
1.60k
            if (stbi__get8(z->s) != tag[i])
3172
1.34k
               ok = 0;
3173
320
         L -= 5;
3174
320
         if (ok)
3175
0
            z->jfif = 1;
3176
780
      } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment
3177
26
         static const unsigned char tag[6] = {'A','d','o','b','e','\0'};
3178
26
         int ok = 1;
3179
26
         int i;
3180
182
         for (i=0; i < 6; ++i)
3181
156
            if (stbi__get8(z->s) != tag[i])
3182
145
               ok = 0;
3183
26
         L -= 6;
3184
26
         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
26
      }
3192
3193
1.10k
      stbi__skip(z->s, L);
3194
1.10k
      return 1;
3195
1.34k
   }
3196
3197
601
   return stbi__err("unknown marker","Corrupt JPEG");
3198
1.94k
}
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.43k
{
3242
5.43k
   int i;
3243
27.1k
   for (i=0; i < ncomp; ++i) {
3244
21.7k
      if (z->img_comp[i].raw_data) {
3245
21.7k
         STBI_FREE(z->img_comp[i].raw_data);
3246
21.7k
         z->img_comp[i].raw_data = NULL;
3247
21.7k
         z->img_comp[i].data = NULL;
3248
21.7k
      }
3249
21.7k
      if (z->img_comp[i].raw_coeff) {
3250
1.80k
         STBI_FREE(z->img_comp[i].raw_coeff);
3251
1.80k
         z->img_comp[i].raw_coeff = 0;
3252
1.80k
         z->img_comp[i].coeff = 0;
3253
1.80k
      }
3254
21.7k
      if (z->img_comp[i].linebuf) {
3255
21.7k
         STBI_FREE(z->img_comp[i].linebuf);
3256
21.7k
         z->img_comp[i].linebuf = NULL;
3257
21.7k
      }
3258
21.7k
   }
3259
5.43k
   return why;
3260
5.43k
}
3261
3262
static int stbi__process_frame_header(stbi__jpeg *z, int scan)
3263
10.8k
{
3264
10.8k
   stbi__context *s = z->s;
3265
10.8k
   int Lf,p,i,q, h_max=1,v_max=1,c;
3266
10.8k
   Lf = stbi__get16be(s);         if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG
3267
10.8k
   p  = stbi__get8(s);            if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
3268
10.8k
   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.8k
   s->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
3270
10.8k
   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
3271
10.8k
   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
3272
10.8k
   c = stbi__get8(s);
3273
10.8k
   if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG");
3274
10.8k
   s->img_n = c;
3275
54.3k
   for (i=0; i < c; ++i) {
3276
43.4k
      z->img_comp[i].data = NULL;
3277
43.4k
      z->img_comp[i].linebuf = NULL;
3278
43.4k
   }
3279
3280
10.8k
   if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
3281
3282
10.8k
   z->rgb = 0;
3283
54.3k
   for (i=0; i < s->img_n; ++i) {
3284
43.4k
      static const unsigned char rgb[3] = { 'R', 'G', 'B' };
3285
43.4k
      z->img_comp[i].id = stbi__get8(s);
3286
43.4k
      if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
3287
0
         ++z->rgb;
3288
43.4k
      q = stbi__get8(s);
3289
43.4k
      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
43.4k
      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
43.4k
      z->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
3292
43.4k
   }
3293
3294
10.8k
   if (scan != STBI__SCAN_load) return 1;
3295
3296
5.43k
   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
27.1k
   for (i=0; i < s->img_n; ++i) {
3299
21.7k
      if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
3300
21.7k
      if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
3301
21.7k
   }
3302
3303
   // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios
3304
   // and I've never seen a non-corrupted JPEG file actually use them
3305
27.1k
   for (i=0; i < s->img_n; ++i) {
3306
21.7k
      if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG");
3307
21.7k
      if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG");
3308
21.7k
   }
3309
3310
   // compute interleaved mcu info
3311
5.43k
   z->img_h_max = h_max;
3312
5.43k
   z->img_v_max = v_max;
3313
5.43k
   z->img_mcu_w = h_max * 8;
3314
5.43k
   z->img_mcu_h = v_max * 8;
3315
   // these sizes can't be more than 17 bits
3316
5.43k
   z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
3317
5.43k
   z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
3318
3319
27.1k
   for (i=0; i < s->img_n; ++i) {
3320
      // number of effective pixels (e.g. for non-interleaved MCU)
3321
21.7k
      z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
3322
21.7k
      z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
3323
      // to simplify generation, we'll allocate enough memory to decode
3324
      // the bogus oversized data from using interleaved MCUs and their
3325
      // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
3326
      // discard the extra data until colorspace conversion
3327
      //
3328
      // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)
3329
      // so these muls can't overflow with 32-bit ints (which we require)
3330
21.7k
      z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
3331
21.7k
      z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
3332
21.7k
      z->img_comp[i].coeff = 0;
3333
21.7k
      z->img_comp[i].raw_coeff = 0;
3334
21.7k
      z->img_comp[i].linebuf = NULL;
3335
21.7k
      z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
3336
21.7k
      if (z->img_comp[i].raw_data == NULL)
3337
0
         return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
3338
      // align blocks for idct using mmx/sse
3339
21.7k
      z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
3340
21.7k
      if (z->progressive) {
3341
         // w2, h2 are multiples of 8 (see above)
3342
1.80k
         z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
3343
1.80k
         z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
3344
1.80k
         z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);
3345
1.80k
         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.80k
         z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
3348
1.80k
      }
3349
21.7k
   }
3350
3351
5.43k
   return 1;
3352
5.43k
}
3353
3354
// use comparisons since in some cases we handle more than one case (e.g. SOF)
3355
6.05k
#define stbi__DNL(x)         ((x) == 0xdc)
3356
27.2k
#define stbi__SOI(x)         ((x) == 0xd8)
3357
6.70k
#define stbi__EOI(x)         ((x) == 0xd9)
3358
11.0k
#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3359
6.05k
#define stbi__SOS(x)         ((x) == 0xda)
3360
3361
10.8k
#define stbi__SOF_progressive(x)   ((x) == 0xc2)
3362
3363
static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
3364
27.2k
{
3365
27.2k
   int m;
3366
27.2k
   z->jfif = 0;
3367
27.2k
   z->app14_color_transform = -1; // valid values are 0,1,2
3368
27.2k
   z->marker = STBI__MARKER_none; // initialize cached marker to empty
3369
27.2k
   m = stbi__get_marker(z);
3370
27.2k
   if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
3371
16.3k
   if (scan == STBI__SCAN_type) return 1;
3372
10.8k
   m = stbi__get_marker(z);
3373
11.0k
   while (!stbi__SOF(m)) {
3374
146
      if (!stbi__process_marker(z,m)) return 0;
3375
134
      m = stbi__get_marker(z);
3376
414
      while (m == STBI__MARKER_none) {
3377
         // some files have extra padding after their blocks, so ok, we'll scan
3378
281
         if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");
3379
280
         m = stbi__get_marker(z);
3380
280
      }
3381
134
   }
3382
10.8k
   z->progressive = stbi__SOF_progressive(m);
3383
10.8k
   if (!stbi__process_frame_header(z, scan)) return 0;
3384
10.8k
   return 1;
3385
10.8k
}
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.43k
{
3412
5.43k
   int m;
3413
27.1k
   for (m = 0; m < 4; m++) {
3414
21.7k
      j->img_comp[m].raw_data = NULL;
3415
21.7k
      j->img_comp[m].raw_coeff = NULL;
3416
21.7k
   }
3417
5.43k
   j->restart_interval = 0;
3418
5.43k
   if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;
3419
5.43k
   m = stbi__get_marker(j);
3420
6.70k
   while (!stbi__EOI(m)) {
3421
6.05k
      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
6.05k
      } else if (stbi__DNL(m)) {
3432
130
         int Ld = stbi__get16be(j->s);
3433
130
         stbi__uint32 NL = stbi__get16be(j->s);
3434
130
         if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG");
3435
129
         if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG");
3436
129
         m = stbi__get_marker(j);
3437
5.92k
      } else {
3438
5.92k
         if (!stbi__process_marker(j, m)) return 1;
3439
1.13k
         m = stbi__get_marker(j);
3440
1.13k
      }
3441
6.05k
   }
3442
646
   if (j->progressive)
3443
385
      stbi__jpeg_finish(j);
3444
646
   return 1;
3445
5.43k
}
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.81G
#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.25M
{
3456
2.25M
   STBI_NOTUSED(out);
3457
2.25M
   STBI_NOTUSED(in_far);
3458
2.25M
   STBI_NOTUSED(w);
3459
2.25M
   STBI_NOTUSED(hs);
3460
2.25M
   return in_near;
3461
2.25M
}
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.32M
{
3465
   // need to generate two samples vertically for every one in input
3466
6.32M
   int i;
3467
6.32M
   STBI_NOTUSED(hs);
3468
1.53G
   for (i=0; i < w; ++i)
3469
1.53G
      out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
3470
6.32M
   return out;
3471
6.32M
}
3472
3473
static stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3474
3.12M
{
3475
   // need to generate two samples horizontally for every one in input
3476
3.12M
   int i;
3477
3.12M
   stbi_uc *input = in_near;
3478
3479
3.12M
   if (w == 1) {
3480
      // if only one sample, can't do any interpolation
3481
2.16M
      out[0] = out[1] = input[0];
3482
2.16M
      return out;
3483
2.16M
   }
3484
3485
960k
   out[0] = input[0];
3486
960k
   out[1] = stbi__div4(input[0]*3 + input[1] + 2);
3487
140M
   for (i=1; i < w-1; ++i) {
3488
139M
      int n = 3*input[i]+2;
3489
139M
      out[i*2+0] = stbi__div4(n+input[i-1]);
3490
139M
      out[i*2+1] = stbi__div4(n+input[i+1]);
3491
139M
   }
3492
960k
   out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
3493
960k
   out[i*2+1] = input[w-1];
3494
3495
960k
   STBI_NOTUSED(in_far);
3496
960k
   STBI_NOTUSED(hs);
3497
3498
960k
   return out;
3499
3.12M
}
3500
3501
2.63M
#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3502
3503
static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3504
0
{
3505
   // need to generate 2x2 samples for every one in input
3506
0
   int i,t0,t1;
3507
0
   if (w == 1) {
3508
0
      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3509
0
      return out;
3510
0
   }
3511
3512
0
   t1 = 3*in_near[0] + in_far[0];
3513
0
   out[0] = stbi__div4(t1+2);
3514
0
   for (i=1; i < w; ++i) {
3515
0
      t0 = t1;
3516
0
      t1 = 3*in_near[i]+in_far[i];
3517
0
      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3518
0
      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
3519
0
   }
3520
0
   out[w*2-1] = stbi__div4(t1+2);
3521
3522
0
   STBI_NOTUSED(hs);
3523
3524
0
   return out;
3525
0
}
3526
3527
#if defined(STBI_SSE2) || defined(STBI_NEON)
3528
static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3529
1.55M
{
3530
   // need to generate 2x2 samples for every one in input
3531
1.55M
   int i=0,t0,t1;
3532
3533
1.55M
   if (w == 1) {
3534
1.08M
      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3535
1.08M
      return out;
3536
1.08M
   }
3537
3538
475k
   t1 = 3*in_near[0] + in_far[0];
3539
   // process groups of 8 pixels for as long as we can.
3540
   // note we can't handle the last pixel in a row in this loop
3541
   // because we need to handle the filter boundary conditions.
3542
9.11M
   for (; i < ((w-1) & ~7); i += 8) {
3543
8.64M
#if defined(STBI_SSE2)
3544
      // load and perform the vertical filtering pass
3545
      // this uses 3*x + y = 4*x + (y - x)
3546
8.64M
      __m128i zero  = _mm_setzero_si128();
3547
8.64M
      __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));
3548
8.64M
      __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
3549
8.64M
      __m128i farw  = _mm_unpacklo_epi8(farb, zero);
3550
8.64M
      __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
3551
8.64M
      __m128i diff  = _mm_sub_epi16(farw, nearw);
3552
8.64M
      __m128i nears = _mm_slli_epi16(nearw, 2);
3553
8.64M
      __m128i curr  = _mm_add_epi16(nears, diff); // current row
3554
3555
      // horizontal filter works the same based on shifted vers of current
3556
      // row. "prev" is current row shifted right by 1 pixel; we need to
3557
      // insert the previous pixel value (from t1).
3558
      // "next" is current row shifted left by 1 pixel, with first pixel
3559
      // of next block of 8 pixels added in.
3560
8.64M
      __m128i prv0 = _mm_slli_si128(curr, 2);
3561
8.64M
      __m128i nxt0 = _mm_srli_si128(curr, 2);
3562
8.64M
      __m128i prev = _mm_insert_epi16(prv0, t1, 0);
3563
8.64M
      __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
3564
3565
      // horizontal filter, polyphase implementation since it's convenient:
3566
      // even pixels = 3*cur + prev = cur*4 + (prev - cur)
3567
      // odd  pixels = 3*cur + next = cur*4 + (next - cur)
3568
      // note the shared term.
3569
8.64M
      __m128i bias  = _mm_set1_epi16(8);
3570
8.64M
      __m128i curs = _mm_slli_epi16(curr, 2);
3571
8.64M
      __m128i prvd = _mm_sub_epi16(prev, curr);
3572
8.64M
      __m128i nxtd = _mm_sub_epi16(next, curr);
3573
8.64M
      __m128i curb = _mm_add_epi16(curs, bias);
3574
8.64M
      __m128i even = _mm_add_epi16(prvd, curb);
3575
8.64M
      __m128i odd  = _mm_add_epi16(nxtd, curb);
3576
3577
      // interleave even and odd pixels, then undo scaling.
3578
8.64M
      __m128i int0 = _mm_unpacklo_epi16(even, odd);
3579
8.64M
      __m128i int1 = _mm_unpackhi_epi16(even, odd);
3580
8.64M
      __m128i de0  = _mm_srli_epi16(int0, 4);
3581
8.64M
      __m128i de1  = _mm_srli_epi16(int1, 4);
3582
3583
      // pack and write output
3584
8.64M
      __m128i outv = _mm_packus_epi16(de0, de1);
3585
8.64M
      _mm_storeu_si128((__m128i *) (out + i*2), outv);
3586
#elif defined(STBI_NEON)
3587
      // load and perform the vertical filtering pass
3588
      // this uses 3*x + y = 4*x + (y - x)
3589
      uint8x8_t farb  = vld1_u8(in_far + i);
3590
      uint8x8_t nearb = vld1_u8(in_near + i);
3591
      int16x8_t diff  = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3592
      int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3593
      int16x8_t curr  = vaddq_s16(nears, diff); // current row
3594
3595
      // horizontal filter works the same based on shifted vers of current
3596
      // row. "prev" is current row shifted right by 1 pixel; we need to
3597
      // insert the previous pixel value (from t1).
3598
      // "next" is current row shifted left by 1 pixel, with first pixel
3599
      // of next block of 8 pixels added in.
3600
      int16x8_t prv0 = vextq_s16(curr, curr, 7);
3601
      int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3602
      int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3603
      int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3604
3605
      // horizontal filter, polyphase implementation since it's convenient:
3606
      // even pixels = 3*cur + prev = cur*4 + (prev - cur)
3607
      // odd  pixels = 3*cur + next = cur*4 + (next - cur)
3608
      // note the shared term.
3609
      int16x8_t curs = vshlq_n_s16(curr, 2);
3610
      int16x8_t prvd = vsubq_s16(prev, curr);
3611
      int16x8_t nxtd = vsubq_s16(next, curr);
3612
      int16x8_t even = vaddq_s16(curs, prvd);
3613
      int16x8_t odd  = vaddq_s16(curs, nxtd);
3614
3615
      // undo scaling and round, then store with even/odd phases interleaved
3616
      uint8x8x2_t o;
3617
      o.val[0] = vqrshrun_n_s16(even, 4);
3618
      o.val[1] = vqrshrun_n_s16(odd,  4);
3619
      vst2_u8(out + i*2, o);
3620
#endif
3621
3622
      // "previous" value for next iter
3623
8.64M
      t1 = 3*in_near[i+7] + in_far[i+7];
3624
8.64M
   }
3625
3626
475k
   t0 = t1;
3627
475k
   t1 = 3*in_near[i] + in_far[i];
3628
475k
   out[i*2] = stbi__div16(3*t1 + t0 + 8);
3629
3630
1.55M
   for (++i; i < w; ++i) {
3631
1.08M
      t0 = t1;
3632
1.08M
      t1 = 3*in_near[i]+in_far[i];
3633
1.08M
      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3634
1.08M
      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
3635
1.08M
   }
3636
475k
   out[w*2-1] = stbi__div4(t1+2);
3637
3638
475k
   STBI_NOTUSED(hs);
3639
3640
475k
   return out;
3641
1.55M
}
3642
#endif
3643
3644
static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3645
9.41M
{
3646
   // resample with nearest-neighbor
3647
9.41M
   int i,j;
3648
9.41M
   STBI_NOTUSED(in_far);
3649
332M
   for (i=0; i < w; ++i)
3650
1.22G
      for (j=0; j < hs; ++j)
3651
897M
         out[i*hs+j] = in_near[i];
3652
9.41M
   return out;
3653
9.41M
}
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
93.6M
#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.66M
{
3686
5.66M
   int i = 0;
3687
3688
5.66M
#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.66M
   if (step == 4) {
3693
      // this is a fairly straightforward implementation and not super-optimized.
3694
5.66M
      __m128i signflip  = _mm_set1_epi8(-0x80);
3695
5.66M
      __m128i cr_const0 = _mm_set1_epi16(   (short) ( 1.40200f*4096.0f+0.5f));
3696
5.66M
      __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
3697
5.66M
      __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
3698
5.66M
      __m128i cb_const1 = _mm_set1_epi16(   (short) ( 1.77200f*4096.0f+0.5f));
3699
5.66M
      __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
3700
5.66M
      __m128i xw = _mm_set1_epi16(255); // alpha channel
3701
3702
127M
      for (; i+7 < count; i += 8) {
3703
         // load
3704
122M
         __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3705
122M
         __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3706
122M
         __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3707
122M
         __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
3708
122M
         __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128
3709
3710
         // unpack to short (and left-shift cr, cb by 8)
3711
122M
         __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);
3712
122M
         __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3713
122M
         __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3714
3715
         // color transform
3716
122M
         __m128i yws = _mm_srli_epi16(yw, 4);
3717
122M
         __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3718
122M
         __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3719
122M
         __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3720
122M
         __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3721
122M
         __m128i rws = _mm_add_epi16(cr0, yws);
3722
122M
         __m128i gwt = _mm_add_epi16(cb0, yws);
3723
122M
         __m128i bws = _mm_add_epi16(yws, cb1);
3724
122M
         __m128i gws = _mm_add_epi16(gwt, cr1);
3725
3726
         // descale
3727
122M
         __m128i rw = _mm_srai_epi16(rws, 4);
3728
122M
         __m128i bw = _mm_srai_epi16(bws, 4);
3729
122M
         __m128i gw = _mm_srai_epi16(gws, 4);
3730
3731
         // back to byte, set up for transpose
3732
122M
         __m128i brb = _mm_packus_epi16(rw, bw);
3733
122M
         __m128i gxb = _mm_packus_epi16(gw, xw);
3734
3735
         // transpose to interleave channels
3736
122M
         __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3737
122M
         __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3738
122M
         __m128i o0 = _mm_unpacklo_epi16(t0, t1);
3739
122M
         __m128i o1 = _mm_unpackhi_epi16(t0, t1);
3740
3741
         // store
3742
122M
         _mm_storeu_si128((__m128i *) (out + 0), o0);
3743
122M
         _mm_storeu_si128((__m128i *) (out + 16), o1);
3744
122M
         out += 32;
3745
122M
      }
3746
5.66M
   }
3747
5.66M
#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
29.0M
   for (; i < count; ++i) {
3796
23.4M
      int y_fixed = (y[i] << 20) + (1<<19); // rounding
3797
23.4M
      int r,g,b;
3798
23.4M
      int cr = pcr[i] - 128;
3799
23.4M
      int cb = pcb[i] - 128;
3800
23.4M
      r = y_fixed + cr* stbi__float2fixed(1.40200f);
3801
23.4M
      g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3802
23.4M
      b = y_fixed                                   +   cb* stbi__float2fixed(1.77200f);
3803
23.4M
      r >>= 20;
3804
23.4M
      g >>= 20;
3805
23.4M
      b >>= 20;
3806
23.4M
      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
3807
23.4M
      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
3808
23.4M
      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
3809
23.4M
      out[0] = (stbi_uc)r;
3810
23.4M
      out[1] = (stbi_uc)g;
3811
23.4M
      out[2] = (stbi_uc)b;
3812
23.4M
      out[3] = 255;
3813
23.4M
      out += step;
3814
23.4M
   }
3815
5.66M
}
3816
#endif
3817
3818
// set up the kernels
3819
static void stbi__setup_jpeg(stbi__jpeg *j)
3820
15.8k
{
3821
15.8k
   j->idct_block_kernel = stbi__idct_block;
3822
15.8k
   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3823
15.8k
   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3824
3825
15.8k
#ifdef STBI_SSE2
3826
15.8k
   if (stbi__sse2_available()) {
3827
15.8k
      j->idct_block_kernel = stbi__idct_simd;
3828
15.8k
      j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3829
15.8k
      j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3830
15.8k
   }
3831
15.8k
#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.8k
}
3839
3840
// clean up the temporary component buffers
3841
static void stbi__cleanup_jpeg(stbi__jpeg *j)
3842
5.43k
{
3843
5.43k
   stbi__free_jpeg_components(j, j->s->img_n, 0);
3844
5.43k
}
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.43k
{
3865
5.43k
   int n, decode_n, is_rgb;
3866
5.43k
   z->s->img_n = 0; // make stbi__cleanup_jpeg safe
3867
3868
   // validate req_comp
3869
5.43k
   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.43k
   if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
3873
3874
   // determine actual number of components to generate
3875
5.43k
   n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
3876
3877
5.43k
   is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
3878
3879
5.43k
   if (z->s->img_n == 3 && n < 3 && !is_rgb)
3880
0
      decode_n = 1;
3881
5.43k
   else
3882
5.43k
      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.43k
   if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; }
3887
3888
   // resample and color-convert
3889
5.43k
   {
3890
5.43k
      int k;
3891
5.43k
      unsigned int i,j;
3892
5.43k
      stbi_uc *output;
3893
5.43k
      stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
3894
3895
5.43k
      stbi__resample res_comp[4];
3896
3897
27.1k
      for (k=0; k < decode_n; ++k) {
3898
21.7k
         stbi__resample *r = &res_comp[k];
3899
3900
         // allocate line buffer big enough for upsampling off the edges
3901
         // with upsample factor of 4
3902
21.7k
         z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
3903
21.7k
         if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
3904
3905
21.7k
         r->hs      = z->img_h_max / z->img_comp[k].h;
3906
21.7k
         r->vs      = z->img_v_max / z->img_comp[k].v;
3907
21.7k
         r->ystep   = r->vs >> 1;
3908
21.7k
         r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3909
21.7k
         r->ypos    = 0;
3910
21.7k
         r->line0   = r->line1 = z->img_comp[k].data;
3911
3912
21.7k
         if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3913
19.4k
         else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3914
13.3k
         else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3915
11.6k
         else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3916
10.7k
         else                               r->resample = stbi__resample_row_generic;
3917
21.7k
      }
3918
3919
      // can't error after this so, this is safe
3920
5.43k
      output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
3921
5.43k
      if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
3922
3923
      // now go ahead and resample
3924
5.67M
      for (j=0; j < z->s->img_y; ++j) {
3925
5.66M
         stbi_uc *out = output + n * z->s->img_x * j;
3926
28.3M
         for (k=0; k < decode_n; ++k) {
3927
22.6M
            stbi__resample *r = &res_comp[k];
3928
22.6M
            int y_bot = r->ystep >= (r->vs >> 1);
3929
22.6M
            coutput[k] = r->resample(z->img_comp[k].linebuf,
3930
22.6M
                                     y_bot ? r->line1 : r->line0,
3931
22.6M
                                     y_bot ? r->line0 : r->line1,
3932
22.6M
                                     r->w_lores, r->hs);
3933
22.6M
            if (++r->ystep >= r->vs) {
3934
16.6M
               r->ystep = 0;
3935
16.6M
               r->line0 = r->line1;
3936
16.6M
               if (++r->ypos < z->img_comp[k].y)
3937
16.6M
                  r->line1 += z->img_comp[k].w2;
3938
16.6M
            }
3939
22.6M
         }
3940
5.66M
         if (n >= 3) {
3941
5.66M
            stbi_uc *y = coutput[0];
3942
5.66M
            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.66M
            } else if (z->s->img_n == 4) {
3955
5.66M
               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.66M
               } 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.66M
               } else { // YCbCr + alpha?  Ignore the fourth channel for now
3974
5.66M
                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3975
5.66M
               }
3976
5.66M
            } 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.66M
         } 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.66M
      }
4018
5.43k
      stbi__cleanup_jpeg(z);
4019
5.43k
      *out_x = z->s->img_x;
4020
5.43k
      *out_y = z->s->img_y;
4021
5.43k
      if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output
4022
5.43k
      return output;
4023
5.43k
   }
4024
5.43k
}
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.43k
{
4028
5.43k
   unsigned char* result;
4029
5.43k
   stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));
4030
5.43k
   if (!j) return stbi__errpuc("outofmem", "Out of memory");
4031
5.43k
   memset(j, 0, sizeof(stbi__jpeg));
4032
5.43k
   STBI_NOTUSED(ri);
4033
5.43k
   j->s = s;
4034
5.43k
   stbi__setup_jpeg(j);
4035
5.43k
   result = load_jpeg_image(j, x,y,comp,req_comp);
4036
5.43k
   STBI_FREE(j);
4037
5.43k
   return result;
4038
5.43k
}
4039
4040
static int stbi__jpeg_test(stbi__context *s)
4041
10.4k
{
4042
10.4k
   int r;
4043
10.4k
   stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));
4044
10.4k
   if (!j) return stbi__err("outofmem", "Out of memory");
4045
10.4k
   memset(j, 0, sizeof(stbi__jpeg));
4046
10.4k
   j->s = s;
4047
10.4k
   stbi__setup_jpeg(j);
4048
10.4k
   r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
4049
10.4k
   stbi__rewind(s);
4050
10.4k
   STBI_FREE(j);
4051
10.4k
   return r;
4052
10.4k
}
4053
4054
static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
4055
11.3k
{
4056
11.3k
   if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
4057
5.94k
      stbi__rewind( j->s );
4058
5.94k
      return 0;
4059
5.94k
   }
4060
5.43k
   if (x) *x = j->s->img_x;
4061
5.43k
   if (y) *y = j->s->img_y;
4062
5.43k
   if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
4063
5.43k
   return 1;
4064
11.3k
}
4065
4066
static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
4067
11.3k
{
4068
11.3k
   int result;
4069
11.3k
   stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));
4070
11.3k
   if (!j) return stbi__err("outofmem", "Out of memory");
4071
11.3k
   memset(j, 0, sizeof(stbi__jpeg));
4072
11.3k
   j->s = s;
4073
11.3k
   result = stbi__jpeg_info_raw(j, x, y, comp);
4074
11.3k
   STBI_FREE(j);
4075
11.3k
   return result;
4076
11.3k
}
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.4k
{
4621
28.4k
   static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
4622
28.4k
   int i;
4623
28.8k
   for (i=0; i < 8; ++i)
4624
28.8k
      if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
4625
0
   return 1;
4626
28.4k
}
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.2k
{
5323
11.2k
   int r;
5324
11.2k
   r = stbi__check_png_header(s);
5325
11.2k
   stbi__rewind(s);
5326
11.2k
   return r;
5327
11.2k
}
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
5.94k
{
5343
5.94k
   stbi__png p;
5344
5.94k
   p.s = s;
5345
5.94k
   return stbi__png_info_raw(&p, x, y, comp);
5346
5.94k
}
5347
5348
static int stbi__png_is16(stbi__context *s)
5349
11.2k
{
5350
11.2k
   stbi__png p;
5351
11.2k
   p.s = s;
5352
11.2k
   if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
5353
11.2k
     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.2k
{
5367
11.2k
   int r;
5368
11.2k
   int sz;
5369
11.2k
   if (stbi__get8(s) != 'B') return 0;
5370
792
   if (stbi__get8(s) != 'M') return 0;
5371
792
   stbi__get32le(s); // discard filesize
5372
792
   stbi__get16le(s); // discard reserved
5373
792
   stbi__get16le(s); // discard reserved
5374
792
   stbi__get32le(s); // discard data offset
5375
792
   sz = stbi__get32le(s);
5376
792
   r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
5377
792
   return r;
5378
792
}
5379
5380
static int stbi__bmp_test(stbi__context *s)
5381
11.2k
{
5382
11.2k
   int r = stbi__bmp_test_raw(s);
5383
11.2k
   stbi__rewind(s);
5384
11.2k
   return r;
5385
11.2k
}
5386
5387
5388
// returns 0..31 for the highest set bit
5389
static int stbi__high_bit(unsigned int z)
5390
1.62k
{
5391
1.62k
   int n=0;
5392
1.62k
   if (z == 0) return -1;
5393
1.23k
   if (z >= 0x10000) { n += 16; z >>= 16; }
5394
1.23k
   if (z >= 0x00100) { n +=  8; z >>=  8; }
5395
1.23k
   if (z >= 0x00010) { n +=  4; z >>=  4; }
5396
1.23k
   if (z >= 0x00004) { n +=  2; z >>=  2; }
5397
1.23k
   if (z >= 0x00002) { n +=  1;/* >>=  1;*/ }
5398
1.23k
   return n;
5399
1.62k
}
5400
5401
static int stbi__bitcount(unsigned int a)
5402
1.62k
{
5403
1.62k
   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2
5404
1.62k
   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4
5405
1.62k
   a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
5406
1.62k
   a = (a + (a >> 8)); // max 16 per 8 bits
5407
1.62k
   a = (a + (a >> 16)); // max 32 per 8 bits
5408
1.62k
   return a & 0xff;
5409
1.62k
}
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.09G
{
5416
1.09G
   static unsigned int mul_table[9] = {
5417
1.09G
      0,
5418
1.09G
      0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,
5419
1.09G
      0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,
5420
1.09G
   };
5421
1.09G
   static unsigned int shift_table[9] = {
5422
1.09G
      0, 0,0,1,0,2,4,6,0,
5423
1.09G
   };
5424
1.09G
   if (shift < 0)
5425
320M
      v <<= -shift;
5426
778M
   else
5427
778M
      v >>= shift;
5428
1.09G
   STBI_ASSERT(v < 256);
5429
1.09G
   v >>= (8-bits);
5430
1.09G
   STBI_ASSERT(bits >= 0 && bits <= 8);
5431
1.09G
   return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
5432
1.09G
}
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
814
{
5443
   // BI_BITFIELDS specifies masks explicitly, don't override
5444
814
   if (compress == 3)
5445
0
      return 1;
5446
5447
814
   if (compress == 0) {
5448
2
      if (info->bpp == 16) {
5449
0
         info->mr = 31u << 10;
5450
0
         info->mg = 31u <<  5;
5451
0
         info->mb = 31u <<  0;
5452
2
      } 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
2
      } else {
5459
         // otherwise, use defaults, which is all-0
5460
2
         info->mr = info->mg = info->mb = info->ma = 0;
5461
2
      }
5462
2
      return 1;
5463
2
   }
5464
812
   return 0; // error
5465
814
}
5466
5467
static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
5468
6.72k
{
5469
6.72k
   int hsz;
5470
6.72k
   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
5471
1.59k
   stbi__get32le(s); // discard filesize
5472
1.59k
   stbi__get16le(s); // discard reserved
5473
1.59k
   stbi__get16le(s); // discard reserved
5474
1.59k
   info->offset = stbi__get32le(s);
5475
1.59k
   info->hsz = hsz = stbi__get32le(s);
5476
1.59k
   info->mr = info->mg = info->mb = info->ma = 0;
5477
1.59k
   info->extra_read = 14;
5478
5479
1.59k
   if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP");
5480
5481
1.58k
   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
5482
1.58k
   if (hsz == 12) {
5483
770
      s->img_x = stbi__get16le(s);
5484
770
      s->img_y = stbi__get16le(s);
5485
816
   } else {
5486
816
      s->img_x = stbi__get32le(s);
5487
816
      s->img_y = stbi__get32le(s);
5488
816
   }
5489
1.58k
   if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
5490
1.58k
   info->bpp = stbi__get16le(s);
5491
1.58k
   if (hsz != 12) {
5492
814
      int compress = stbi__get32le(s);
5493
814
      if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
5494
814
      if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes
5495
814
      if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel
5496
814
      stbi__get32le(s); // discard sizeof
5497
814
      stbi__get32le(s); // discard hres
5498
814
      stbi__get32le(s); // discard vres
5499
814
      stbi__get32le(s); // discard colorsused
5500
814
      stbi__get32le(s); // discard max important
5501
814
      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
814
      } else {
5525
         // V4/V5 header
5526
814
         int i;
5527
814
         if (hsz != 108 && hsz != 124)
5528
0
            return stbi__errpuc("bad BMP", "bad BMP");
5529
814
         info->mr = stbi__get32le(s);
5530
814
         info->mg = stbi__get32le(s);
5531
814
         info->mb = stbi__get32le(s);
5532
814
         info->ma = stbi__get32le(s);
5533
814
         if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs
5534
814
            stbi__bmp_set_mask_defaults(info, compress);
5535
814
         stbi__get32le(s); // discard color space
5536
10.5k
         for (i=0; i < 12; ++i)
5537
9.76k
            stbi__get32le(s); // discard color space parameters
5538
814
         if (hsz == 124) {
5539
814
            stbi__get32le(s); // discard rendering intent
5540
814
            stbi__get32le(s); // discard offset of profile data
5541
814
            stbi__get32le(s); // discard size of profile data
5542
814
            stbi__get32le(s); // discard reserved
5543
814
         }
5544
814
      }
5545
814
   }
5546
1.58k
   return (void *) 1;
5547
1.58k
}
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
792
{
5552
792
   stbi_uc *out;
5553
792
   unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
5554
792
   stbi_uc pal[256][4];
5555
792
   int psize=0,i,j,width;
5556
792
   int flip_vertically, pad, target;
5557
792
   stbi__bmp_data info;
5558
792
   STBI_NOTUSED(ri);
5559
5560
792
   info.all_a = 255;
5561
792
   if (stbi__bmp_parse_header(s, &info) == NULL)
5562
0
      return NULL; // error code already set
5563
5564
792
   flip_vertically = ((int) s->img_y) > 0;
5565
792
   s->img_y = abs((int) s->img_y);
5566
5567
792
   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5568
792
   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5569
5570
792
   mr = info.mr;
5571
792
   mg = info.mg;
5572
792
   mb = info.mb;
5573
792
   ma = info.ma;
5574
792
   all_a = info.all_a;
5575
5576
792
   if (info.hsz == 12) {
5577
385
      if (info.bpp < 24)
5578
257
         psize = (info.offset - info.extra_read - 24) / 3;
5579
407
   } else {
5580
407
      if (info.bpp < 16)
5581
0
         psize = (info.offset - info.extra_read - info.hsz) >> 2;
5582
407
   }
5583
792
   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
535
      int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original);
5587
535
      int header_limit = 1024; // max we actually read is below 256 bytes currently.
5588
535
      int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size.
5589
535
      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
535
      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
535
      } else {
5599
535
         stbi__skip(s, info.offset - bytes_read_so_far);
5600
535
      }
5601
535
   }
5602
5603
792
   if (info.bpp == 24 && ma == 0xff000000)
5604
0
      s->img_n = 3;
5605
792
   else
5606
792
      s->img_n = ma ? 4 : 3;
5607
792
   if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
5608
792
      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
792
   if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
5614
0
      return stbi__errpuc("too large", "Corrupt BMP");
5615
5616
792
   out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
5617
792
   if (!out) return stbi__errpuc("outofmem", "Out of memory");
5618
792
   if (info.bpp < 16) {
5619
257
      int z=0;
5620
257
      if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
5621
25.5k
      for (i=0; i < psize; ++i) {
5622
25.2k
         pal[i][2] = stbi__get8(s);
5623
25.2k
         pal[i][1] = stbi__get8(s);
5624
25.2k
         pal[i][0] = stbi__get8(s);
5625
25.2k
         if (info.hsz != 12) stbi__get8(s);
5626
25.2k
         pal[i][3] = 255;
5627
25.2k
      }
5628
257
      stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
5629
257
      if (info.bpp == 1) width = (s->img_x + 7) >> 3;
5630
129
      else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
5631
1
      else if (info.bpp == 8) width = s->img_x;
5632
0
      else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
5633
257
      pad = (-width)&3;
5634
257
      if (info.bpp == 1) {
5635
5.37k
         for (j=0; j < (int) s->img_y; ++j) {
5636
5.24k
            int bit_offset = 7, v = stbi__get8(s);
5637
159M
            for (i=0; i < (int) s->img_x; ++i) {
5638
159M
               int color = (v>>bit_offset)&0x1;
5639
159M
               out[z++] = pal[color][0];
5640
159M
               out[z++] = pal[color][1];
5641
159M
               out[z++] = pal[color][2];
5642
159M
               if (target == 4) out[z++] = 255;
5643
159M
               if (i+1 == (int) s->img_x) break;
5644
159M
               if((--bit_offset) < 0) {
5645
19.9M
                  bit_offset = 7;
5646
19.9M
                  v = stbi__get8(s);
5647
19.9M
               }
5648
159M
            }
5649
5.24k
            stbi__skip(s, pad);
5650
5.24k
         }
5651
129
      } else {
5652
288
         for (j=0; j < (int) s->img_y; ++j) {
5653
920k
            for (i=0; i < (int) s->img_x; i += 2) {
5654
920k
               int v=stbi__get8(s),v2=0;
5655
920k
               if (info.bpp == 4) {
5656
648k
                  v2 = v & 15;
5657
648k
                  v >>= 4;
5658
648k
               }
5659
920k
               out[z++] = pal[v][0];
5660
920k
               out[z++] = pal[v][1];
5661
920k
               out[z++] = pal[v][2];
5662
920k
               if (target == 4) out[z++] = 255;
5663
920k
               if (i+1 == (int) s->img_x) break;
5664
920k
               v = (info.bpp == 8) ? stbi__get8(s) : v2;
5665
920k
               out[z++] = pal[v][0];
5666
920k
               out[z++] = pal[v][1];
5667
920k
               out[z++] = pal[v][2];
5668
920k
               if (target == 4) out[z++] = 255;
5669
920k
            }
5670
159
            stbi__skip(s, pad);
5671
159
         }
5672
129
      }
5673
535
   } else {
5674
535
      int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
5675
535
      int z = 0;
5676
535
      int easy=0;
5677
535
      stbi__skip(s, info.offset - info.extra_read - info.hsz);
5678
535
      if (info.bpp == 24) width = 3 * s->img_x;
5679
407
      else if (info.bpp == 16) width = 2*s->img_x;
5680
407
      else /* bpp = 32 and pad = 0 */ width=0;
5681
535
      pad = (-width) & 3;
5682
535
      if (info.bpp == 24) {
5683
128
         easy = 1;
5684
407
      } else if (info.bpp == 32) {
5685
0
         if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
5686
0
            easy = 2;
5687
0
      }
5688
535
      if (!easy) {
5689
407
         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
406
         rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
5692
406
         gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
5693
406
         bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
5694
406
         ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
5695
406
         if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
5696
406
      }
5697
13.2M
      for (j=0; j < (int) s->img_y; ++j) {
5698
13.2M
         if (easy) {
5699
4.62M
            for (i=0; i < (int) s->img_x; ++i) {
5700
4.62M
               unsigned char a;
5701
4.62M
               out[z+2] = stbi__get8(s);
5702
4.62M
               out[z+1] = stbi__get8(s);
5703
4.62M
               out[z+0] = stbi__get8(s);
5704
4.62M
               z += 3;
5705
4.62M
               a = (easy == 2 ? stbi__get8(s) : 255);
5706
4.62M
               all_a |= a;
5707
4.62M
               if (target == 4) out[z++] = a;
5708
4.62M
            }
5709
13.2M
         } else {
5710
13.2M
            int bpp = info.bpp;
5711
366M
            for (i=0; i < (int) s->img_x; ++i) {
5712
353M
               stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
5713
353M
               unsigned int a;
5714
353M
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
5715
353M
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
5716
353M
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
5717
353M
               a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
5718
353M
               all_a |= a;
5719
353M
               if (target == 4) out[z++] = STBI__BYTECAST(a);
5720
353M
            }
5721
13.2M
         }
5722
13.2M
         stbi__skip(s, pad);
5723
13.2M
      }
5724
534
   }
5725
5726
   // if alpha channel is all 0s, replace with all 255s
5727
791
   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
791
   if (flip_vertically) {
5732
791
      stbi_uc t;
5733
6.60M
      for (j=0; j < (int) s->img_y>>1; ++j) {
5734
6.60M
         stbi_uc *p1 = out +      j     *s->img_x*target;
5735
6.60M
         stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
5736
1.03G
         for (i=0; i < (int) s->img_x*target; ++i) {
5737
1.03G
            t = p1[i]; p1[i] = p2[i]; p2[i] = t;
5738
1.03G
         }
5739
6.60M
      }
5740
791
   }
5741
5742
791
   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
791
   *x = s->img_x;
5748
791
   *y = s->img_y;
5749
791
   if (comp) *comp = s->img_n;
5750
791
   return out;
5751
791
}
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
2.33k
{
5760
   // only RGB or RGBA (incl. 16bit) or grey allowed
5761
2.33k
   if (is_rgb16) *is_rgb16 = 0;
5762
2.33k
   switch(bits_per_pixel) {
5763
256
      case 8:  return STBI_grey;
5764
776
      case 16: if(is_grey) return STBI_grey_alpha;
5765
               // fallthrough
5766
776
      case 15: if(is_rgb16) *is_rgb16 = 1;
5767
776
               return STBI_rgb;
5768
514
      case 24: // fallthrough
5769
784
      case 32: return bits_per_pixel/8;
5770
0
      default: return 0;
5771
2.33k
   }
5772
2.33k
}
5773
5774
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
5775
1.29k
{
5776
1.29k
    int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
5777
1.29k
    int sz, tga_colormap_type;
5778
1.29k
    stbi__get8(s);                   // discard Offset
5779
1.29k
    tga_colormap_type = stbi__get8(s); // colormap type
5780
1.29k
    if( tga_colormap_type > 1 ) {
5781
99
        stbi__rewind(s);
5782
99
        return 0;      // only RGB or indexed allowed
5783
99
    }
5784
1.19k
    tga_image_type = stbi__get8(s); // image type
5785
1.19k
    if ( tga_colormap_type == 1 ) { // colormapped (paletted) image
5786
516
        if (tga_image_type != 1 && tga_image_type != 9) {
5787
0
            stbi__rewind(s);
5788
0
            return 0;
5789
0
        }
5790
516
        stbi__skip(s,4);       // skip index of first colormap entry and number of entries
5791
516
        sz = stbi__get8(s);    //   check bits per palette color entry
5792
516
        if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
5793
1
            stbi__rewind(s);
5794
1
            return 0;
5795
1
        }
5796
515
        stbi__skip(s,4);       // skip image x and y origin
5797
515
        tga_colormap_bpp = sz;
5798
677
    } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE
5799
677
        if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
5800
21
            stbi__rewind(s);
5801
21
            return 0; // only RGB or grey allowed, +/- RLE
5802
21
        }
5803
656
        stbi__skip(s,9); // skip colormap specification and image x/y origin
5804
656
        tga_colormap_bpp = 0;
5805
656
    }
5806
1.17k
    tga_w = stbi__get16le(s);
5807
1.17k
    if( tga_w < 1 ) {
5808
1
        stbi__rewind(s);
5809
1
        return 0;   // test width
5810
1
    }
5811
1.17k
    tga_h = stbi__get16le(s);
5812
1.17k
    if( tga_h < 1 ) {
5813
1
        stbi__rewind(s);
5814
1
        return 0;   // test height
5815
1
    }
5816
1.16k
    tga_bits_per_pixel = stbi__get8(s); // bits per pixel
5817
1.16k
    stbi__get8(s); // ignore alpha bits
5818
1.16k
    if (tga_colormap_bpp != 0) {
5819
515
        if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
5820
            // when using a colormap, tga_bits_per_pixel is the size of the indexes
5821
            // I don't think anything but 8 or 16bit indexes makes sense
5822
2
            stbi__rewind(s);
5823
2
            return 0;
5824
2
        }
5825
513
        tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
5826
654
    } else {
5827
654
        tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
5828
654
    }
5829
1.16k
    if(!tga_comp) {
5830
0
      stbi__rewind(s);
5831
0
      return 0;
5832
0
    }
5833
1.16k
    if (x) *x = tga_w;
5834
1.16k
    if (y) *y = tga_h;
5835
1.16k
    if (comp) *comp = tga_comp;
5836
1.16k
    return 1;                   // seems to have passed everything
5837
1.16k
}
5838
5839
static int stbi__tga_test(stbi__context *s)
5840
1.16k
{
5841
1.16k
   int res = 0;
5842
1.16k
   int sz, tga_color_type;
5843
1.16k
   stbi__get8(s);      //   discard Offset
5844
1.16k
   tga_color_type = stbi__get8(s);   //   color type
5845
1.16k
   if ( tga_color_type > 1 ) goto errorEnd;   //   only RGB or indexed allowed
5846
1.16k
   sz = stbi__get8(s);   //   image type
5847
1.16k
   if ( tga_color_type == 1 ) { // colormapped (paletted) image
5848
513
      if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9
5849
513
      stbi__skip(s,4);       // skip index of first colormap entry and number of entries
5850
513
      sz = stbi__get8(s);    //   check bits per palette color entry
5851
513
      if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
5852
513
      stbi__skip(s,4);       // skip image x and y origin
5853
654
   } else { // "normal" image w/o colormap
5854
654
      if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE
5855
654
      stbi__skip(s,9); // skip colormap specification and image x/y origin
5856
654
   }
5857
1.16k
   if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test width
5858
1.16k
   if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test height
5859
1.16k
   sz = stbi__get8(s);   //   bits per pixel
5860
1.16k
   if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index
5861
1.16k
   if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
5862
5863
1.16k
   res = 1; // if we got this far, everything's good and we can return 1 instead of 0
5864
5865
1.16k
errorEnd:
5866
1.16k
   stbi__rewind(s);
5867
1.16k
   return res;
5868
1.16k
}
5869
5870
// read 16bit value and convert to 24bit RGB
5871
static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
5872
101M
{
5873
101M
   stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
5874
101M
   stbi__uint16 fiveBitMask = 31;
5875
   // we have 3 channels with 5bits each
5876
101M
   int r = (px >> 10) & fiveBitMask;
5877
101M
   int g = (px >> 5) & fiveBitMask;
5878
101M
   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
101M
   out[0] = (stbi_uc)((r * 255)/31);
5881
101M
   out[1] = (stbi_uc)((g * 255)/31);
5882
101M
   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
101M
}
5889
5890
static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
5891
1.16k
{
5892
   //   read in the TGA header stuff
5893
1.16k
   int tga_offset = stbi__get8(s);
5894
1.16k
   int tga_indexed = stbi__get8(s);
5895
1.16k
   int tga_image_type = stbi__get8(s);
5896
1.16k
   int tga_is_RLE = 0;
5897
1.16k
   int tga_palette_start = stbi__get16le(s);
5898
1.16k
   int tga_palette_len = stbi__get16le(s);
5899
1.16k
   int tga_palette_bits = stbi__get8(s);
5900
1.16k
   int tga_x_origin = stbi__get16le(s);
5901
1.16k
   int tga_y_origin = stbi__get16le(s);
5902
1.16k
   int tga_width = stbi__get16le(s);
5903
1.16k
   int tga_height = stbi__get16le(s);
5904
1.16k
   int tga_bits_per_pixel = stbi__get8(s);
5905
1.16k
   int tga_comp, tga_rgb16=0;
5906
1.16k
   int tga_inverted = stbi__get8(s);
5907
   // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)
5908
   //   image data
5909
1.16k
   unsigned char *tga_data;
5910
1.16k
   unsigned char *tga_palette = NULL;
5911
1.16k
   int i, j;
5912
1.16k
   unsigned char raw_data[4] = {0};
5913
1.16k
   int RLE_count = 0;
5914
1.16k
   int RLE_repeating = 0;
5915
1.16k
   int read_next_pixel = 1;
5916
1.16k
   STBI_NOTUSED(ri);
5917
1.16k
   STBI_NOTUSED(tga_x_origin); // @TODO
5918
1.16k
   STBI_NOTUSED(tga_y_origin); // @TODO
5919
5920
1.16k
   if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5921
1.16k
   if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
5922
5923
   //   do a tiny bit of precessing
5924
1.16k
   if ( tga_image_type >= 8 )
5925
520
   {
5926
520
      tga_image_type -= 8;
5927
520
      tga_is_RLE = 1;
5928
520
   }
5929
1.16k
   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
1.16k
   if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
5933
654
   else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
5934
5935
1.16k
   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
1.16k
   *x = tga_width;
5940
1.16k
   *y = tga_height;
5941
1.16k
   if (comp) *comp = tga_comp;
5942
5943
1.16k
   if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
5944
0
      return stbi__errpuc("too large", "Corrupt TGA");
5945
5946
1.16k
   tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
5947
1.16k
   if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
5948
5949
   // skip to the data's starting position (offset usually = 0)
5950
1.16k
   stbi__skip(s, tga_offset );
5951
5952
1.16k
   if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
5953
171k
      for (i=0; i < tga_height; ++i) {
5954
171k
         int row = tga_inverted ? tga_height -i - 1 : i;
5955
171k
         stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
5956
171k
         stbi__getn(s, tga_row, tga_width * tga_comp);
5957
171k
      }
5958
908
   } else  {
5959
      //   do I need to load a palette?
5960
908
      if ( tga_indexed)
5961
513
      {
5962
513
         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
513
         stbi__skip(s, tga_palette_start );
5969
         //   load the palette
5970
513
         tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
5971
513
         if (!tga_palette) {
5972
0
            STBI_FREE(tga_data);
5973
0
            return stbi__errpuc("outofmem", "Out of memory");
5974
0
         }
5975
513
         if (tga_rgb16) {
5976
256
            stbi_uc *pal_entry = tga_palette;
5977
256
            STBI_ASSERT(tga_comp == STBI_rgb);
5978
418k
            for (i=0; i < tga_palette_len; ++i) {
5979
418k
               stbi__tga_read_rgb16(s, pal_entry);
5980
418k
               pal_entry += tga_comp;
5981
418k
            }
5982
257
         } 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
513
      }
5988
      //   load the data
5989
205M
      for (i=0; i < tga_width * tga_height; ++i)
5990
205M
      {
5991
         //   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
5992
205M
         if ( tga_is_RLE )
5993
99.1M
         {
5994
99.1M
            if ( RLE_count == 0 )
5995
99.1M
            {
5996
               //   yep, get the next byte as a RLE command
5997
99.1M
               int RLE_cmd = stbi__get8(s);
5998
99.1M
               RLE_count = 1 + (RLE_cmd & 127);
5999
99.1M
               RLE_repeating = RLE_cmd >> 7;
6000
99.1M
               read_next_pixel = 1;
6001
99.1M
            } else if ( !RLE_repeating )
6002
5.13k
            {
6003
5.13k
               read_next_pixel = 1;
6004
5.13k
            }
6005
99.1M
         } else
6006
106M
         {
6007
106M
            read_next_pixel = 1;
6008
106M
         }
6009
         //   OK, if I need to read a pixel, do it now
6010
205M
         if ( read_next_pixel )
6011
205M
         {
6012
            //   load however much data we did have
6013
205M
            if ( tga_indexed )
6014
54.9M
            {
6015
               // read in index, then perform the lookup
6016
54.9M
               int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
6017
54.9M
               if ( pal_idx >= tga_palette_len ) {
6018
                  // invalid index
6019
1.50k
                  pal_idx = 0;
6020
1.50k
               }
6021
54.9M
               pal_idx *= tga_comp;
6022
132M
               for (j = 0; j < tga_comp; ++j) {
6023
77.5M
                  raw_data[j] = tga_palette[pal_idx+j];
6024
77.5M
               }
6025
150M
            } else if(tga_rgb16) {
6026
100M
               STBI_ASSERT(tga_comp == STBI_rgb);
6027
100M
               stbi__tga_read_rgb16(s, raw_data);
6028
100M
            } else {
6029
               //   read in the data raw
6030
224M
               for (j = 0; j < tga_comp; ++j) {
6031
174M
                  raw_data[j] = stbi__get8(s);
6032
174M
               }
6033
49.8M
            }
6034
            //   clear the reading flag for the next pixel
6035
205M
            read_next_pixel = 0;
6036
205M
         } // end of reading a pixel
6037
6038
         // copy data
6039
759M
         for (j = 0; j < tga_comp; ++j)
6040
554M
           tga_data[i*tga_comp+j] = raw_data[j];
6041
6042
         //   in case we're in RLE mode, keep counting down
6043
205M
         --RLE_count;
6044
205M
      }
6045
      //   do I need to invert the image?
6046
907
      if ( tga_inverted )
6047
495
      {
6048
260k
         for (j = 0; j*2 < tga_height; ++j)
6049
259k
         {
6050
259k
            int index1 = j * tga_width * tga_comp;
6051
259k
            int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
6052
243M
            for (i = tga_width * tga_comp; i > 0; --i)
6053
242M
            {
6054
242M
               unsigned char temp = tga_data[index1];
6055
242M
               tga_data[index1] = tga_data[index2];
6056
242M
               tga_data[index2] = temp;
6057
242M
               ++index1;
6058
242M
               ++index2;
6059
242M
            }
6060
259k
         }
6061
495
      }
6062
      //   clear my palette, if I had one
6063
907
      if ( tga_palette != NULL )
6064
512
      {
6065
512
         STBI_FREE( tga_palette );
6066
512
      }
6067
907
   }
6068
6069
   // swap RGB - if the source data was RGB16, it already is in the right order
6070
1.16k
   if (tga_comp >= 3 && !tga_rgb16)
6071
391
   {
6072
391
      unsigned char* tga_pixel = tga_data;
6073
51.0M
      for (i=0; i < tga_width * tga_height; ++i)
6074
51.0M
      {
6075
51.0M
         unsigned char temp = tga_pixel[0];
6076
51.0M
         tga_pixel[0] = tga_pixel[2];
6077
51.0M
         tga_pixel[2] = temp;
6078
51.0M
         tga_pixel += tga_comp;
6079
51.0M
      }
6080
391
   }
6081
6082
   // convert to target component count
6083
1.16k
   if (req_comp && req_comp != tga_comp)
6084
1.03k
      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
1.16k
   tga_palette_start = tga_palette_len = tga_palette_bits =
6089
1.16k
         tga_x_origin = tga_y_origin = 0;
6090
1.16k
   STBI_NOTUSED(tga_palette_start);
6091
   //   OK, done
6092
1.16k
   return tga_data;
6093
1.16k
}
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.4k
{
6102
10.4k
   int r = (stbi__get32be(s) == 0x38425053);
6103
10.4k
   stbi__rewind(s);
6104
10.4k
   return r;
6105
10.4k
}
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.5k
{
6357
15.5k
   int i;
6358
15.5k
   for (i=0; i<4; ++i)
6359
15.5k
      if (stbi__get8(s) != (stbi_uc)str[i])
6360
15.5k
         return 0;
6361
6362
0
   return 1;
6363
15.5k
}
6364
6365
static int stbi__pic_test_core(stbi__context *s)
6366
10.4k
{
6367
10.4k
   int i;
6368
6369
10.4k
   if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
6370
10.4k
      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.4k
{
6562
10.4k
   int r = stbi__pic_test_core(s);
6563
10.4k
   stbi__rewind(s);
6564
10.4k
   return r;
6565
10.4k
}
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.4k
{
6601
10.4k
   int sz;
6602
10.4k
   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
6603
7
   sz = stbi__get8(s);
6604
7
   if (sz != '9' && sz != '7') return 0;
6605
7
   if (stbi__get8(s) != 'a') return 0;
6606
7
   return 1;
6607
7
}
6608
6609
static int stbi__gif_test(stbi__context *s)
6610
10.4k
{
6611
10.4k
   int r = stbi__gif_test_raw(s);
6612
10.4k
   stbi__rewind(s);
6613
10.4k
   return r;
6614
10.4k
}
6615
6616
static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
6617
7
{
6618
7
   int i;
6619
21
   for (i=0; i < num_entries; ++i) {
6620
14
      pal[i][2] = stbi__get8(s);
6621
14
      pal[i][1] = stbi__get8(s);
6622
14
      pal[i][0] = stbi__get8(s);
6623
14
      pal[i][3] = transp == i ? 0 : 255;
6624
14
   }
6625
7
}
6626
6627
static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
6628
5.94k
{
6629
5.94k
   stbi_uc version;
6630
5.94k
   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
6631
5.93k
      return stbi__err("not GIF", "Corrupt GIF");
6632
6633
14
   version = stbi__get8(s);
6634
14
   if (version != '7' && version != '9')    return stbi__err("not GIF", "Corrupt GIF");
6635
14
   if (stbi__get8(s) != 'a')                return stbi__err("not GIF", "Corrupt GIF");
6636
6637
14
   stbi__g_failure_reason = "";
6638
14
   g->w = stbi__get16le(s);
6639
14
   g->h = stbi__get16le(s);
6640
14
   g->flags = stbi__get8(s);
6641
14
   g->bgindex = stbi__get8(s);
6642
14
   g->ratio = stbi__get8(s);
6643
14
   g->transparent = -1;
6644
6645
14
   if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
6646
14
   if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
6647
6648
14
   if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments
6649
6650
14
   if (is_info) return 1;
6651
6652
7
   if (g->flags & 0x80)
6653
0
      stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
6654
6655
7
   return 1;
6656
14
}
6657
6658
static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
6659
5.94k
{
6660
5.94k
   stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));
6661
5.94k
   if (!g) return stbi__err("outofmem", "Out of memory");
6662
5.94k
   if (!stbi__gif_header(s, g, comp, 1)) {
6663
5.93k
      STBI_FREE(g);
6664
5.93k
      stbi__rewind( s );
6665
5.93k
      return 0;
6666
5.93k
   }
6667
7
   if (x) *x = g->w;
6668
7
   if (y) *y = g->h;
6669
7
   STBI_FREE(g);
6670
7
   return 1;
6671
5.94k
}
6672
6673
static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6674
452k
{
6675
452k
   stbi_uc *p, *c;
6676
452k
   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
452k
   if (g->codes[code].prefix >= 0)
6681
401k
      stbi__out_gif_code(g, g->codes[code].prefix);
6682
6683
452k
   if (g->cur_y >= g->max_y) return;
6684
6685
452k
   idx = g->cur_x + g->cur_y;
6686
452k
   p = &g->out[idx];
6687
452k
   g->history[idx / 4] = 1;
6688
6689
452k
   c = &g->color_table[g->codes[code].suffix * 4];
6690
452k
   if (c[3] > 128) { // don't render transparent pixels;
6691
452k
      p[0] = c[2];
6692
452k
      p[1] = c[1];
6693
452k
      p[2] = c[0];
6694
452k
      p[3] = c[3];
6695
452k
   }
6696
452k
   g->cur_x += 4;
6697
6698
452k
   if (g->cur_x >= g->max_x) {
6699
18
      g->cur_x = g->start_x;
6700
18
      g->cur_y += g->step;
6701
6702
18
      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
18
   }
6708
452k
}
6709
6710
static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
6711
7
{
6712
7
   stbi_uc lzw_cs;
6713
7
   stbi__int32 len, init_code;
6714
7
   stbi__uint32 first;
6715
7
   stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6716
7
   stbi__gif_lzw *p;
6717
6718
7
   lzw_cs = stbi__get8(s);
6719
7
   if (lzw_cs > 12) return NULL;
6720
7
   clear = 1 << lzw_cs;
6721
7
   first = 1;
6722
7
   codesize = lzw_cs + 1;
6723
7
   codemask = (1 << codesize) - 1;
6724
7
   bits = 0;
6725
7
   valid_bits = 0;
6726
14
   for (init_code = 0; init_code < clear; init_code++) {
6727
7
      g->codes[init_code].prefix = -1;
6728
7
      g->codes[init_code].first = (stbi_uc) init_code;
6729
7
      g->codes[init_code].suffix = (stbi_uc) init_code;
6730
7
   }
6731
6732
   // support no starting clear code
6733
7
   avail = clear+2;
6734
7
   oldcode = -1;
6735
6736
7
   len = 0;
6737
117k
   for(;;) {
6738
117k
      if (valid_bits < codesize) {
6739
65.9k
         if (len == 0) {
6740
642
            len = stbi__get8(s); // start new block
6741
642
            if (len == 0)
6742
4
               return g->out;
6743
642
         }
6744
65.9k
         --len;
6745
65.9k
         bits |= (stbi__int32) stbi__get8(s) << valid_bits;
6746
65.9k
         valid_bits += 8;
6747
65.9k
      } else {
6748
51.1k
         stbi__int32 code = bits & codemask;
6749
51.1k
         bits >>= codesize;
6750
51.1k
         valid_bits -= codesize;
6751
         // @OPTIMIZE: is there some way we can accelerate the non-clear path?
6752
51.1k
         if (code == clear) {  // clear code
6753
592
            codesize = lzw_cs + 1;
6754
592
            codemask = (1 << codesize) - 1;
6755
592
            avail = clear + 2;
6756
592
            oldcode = -1;
6757
592
            first = 0;
6758
50.5k
         } 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
50.5k
         } else if (code <= avail) {
6764
50.5k
            if (first) {
6765
0
               return stbi__errpuc("no clear code", "Corrupt GIF");
6766
0
            }
6767
6768
50.5k
            if (oldcode >= 0) {
6769
50.5k
               p = &g->codes[avail++];
6770
50.5k
               if (avail > 8192) {
6771
2
                  return stbi__errpuc("too many codes", "Corrupt GIF");
6772
2
               }
6773
6774
50.5k
               p->prefix = (stbi__int16) oldcode;
6775
50.5k
               p->first = g->codes[oldcode].first;
6776
50.5k
               p->suffix = (code == avail) ? p->first : g->codes[code].first;
6777
50.5k
            } else if (code == avail)
6778
0
               return stbi__errpuc("illegal code in raster", "Corrupt GIF");
6779
6780
50.5k
            stbi__out_gif_code(g, (stbi__uint16) code);
6781
6782
50.5k
            if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6783
74
               codesize++;
6784
74
               codemask = (1 << codesize) - 1;
6785
74
            }
6786
6787
50.5k
            oldcode = code;
6788
50.5k
         } else {
6789
0
            return stbi__errpuc("illegal code in raster", "Corrupt GIF");
6790
0
         }
6791
51.1k
      }
6792
117k
   }
6793
7
}
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
7
{
6799
7
   int dispose;
6800
7
   int first_frame;
6801
7
   int pi;
6802
7
   int pcount;
6803
7
   STBI_NOTUSED(req_comp);
6804
6805
   // on first frame, any non-written pixels get the background colour (non-transparent)
6806
7
   first_frame = 0;
6807
7
   if (g->out == 0) {
6808
7
      if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
6809
7
      if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
6810
0
         return stbi__errpuc("too large", "GIF image is too large");
6811
7
      pcount = g->w * g->h;
6812
7
      g->out = (stbi_uc *) stbi__malloc(4 * pcount);
6813
7
      g->background = (stbi_uc *) stbi__malloc(4 * pcount);
6814
7
      g->history = (stbi_uc *) stbi__malloc(pcount);
6815
7
      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
7
      memset(g->out, 0x00, 4 * pcount);
6822
7
      memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
6823
7
      memset(g->history, 0x00, pcount);        // pixels that were affected previous frame
6824
7
      first_frame = 1;
6825
7
   } 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
7
   memset( g->history, 0x00, g->w * g->h );        // pixels that were affected previous frame
6860
6861
7
   for (;;) {
6862
7
      int tag = stbi__get8(s);
6863
7
      switch (tag) {
6864
7
         case 0x2C: /* Image Descriptor */
6865
7
         {
6866
7
            stbi__int32 x, y, w, h;
6867
7
            stbi_uc *o;
6868
6869
7
            x = stbi__get16le(s);
6870
7
            y = stbi__get16le(s);
6871
7
            w = stbi__get16le(s);
6872
7
            h = stbi__get16le(s);
6873
7
            if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6874
0
               return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
6875
6876
7
            g->line_size = g->w * 4;
6877
7
            g->start_x = x * 4;
6878
7
            g->start_y = y * g->line_size;
6879
7
            g->max_x   = g->start_x + w * 4;
6880
7
            g->max_y   = g->start_y + h * g->line_size;
6881
7
            g->cur_x   = g->start_x;
6882
7
            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
7
            if (w == 0)
6889
0
               g->cur_y = g->max_y;
6890
6891
7
            g->lflags = stbi__get8(s);
6892
6893
7
            if (g->lflags & 0x40) {
6894
7
               g->step = 8 * g->line_size; // first interlaced spacing
6895
7
               g->parse = 3;
6896
7
            } else {
6897
0
               g->step = g->line_size;
6898
0
               g->parse = 0;
6899
0
            }
6900
6901
7
            if (g->lflags & 0x80) {
6902
7
               stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6903
7
               g->color_table = (stbi_uc *) g->lpal;
6904
7
            } 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
7
            o = stbi__process_gif_raster(s, g);
6910
7
            if (!o) return NULL;
6911
6912
            // if this was the first frame,
6913
5
            pcount = g->w * g->h;
6914
5
            if (first_frame && (g->bgindex > 0)) {
6915
               // if first frame, any pixel not drawn to gets the background color
6916
769M
               for (pi = 0; pi < pcount; ++pi) {
6917
769M
                  if (g->history[pi] == 0) {
6918
769M
                     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
769M
                     memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
6920
769M
                  }
6921
769M
               }
6922
5
            }
6923
6924
5
            return o;
6925
7
         }
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
7
      }
6968
7
   }
6969
7
}
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
7
{
7069
7
   stbi_uc *u = 0;
7070
7
   stbi__gif g;
7071
7
   memset(&g, 0, sizeof(g));
7072
7
   STBI_NOTUSED(ri);
7073
7074
7
   u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
7075
7
   if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker
7076
7
   if (u) {
7077
5
      *x = g.w;
7078
5
      *y = g.h;
7079
7080
      // moved conversion to after successful load so that the same
7081
      // can be done for multiple frames.
7082
5
      if (req_comp && req_comp != 4)
7083
0
         u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
7084
5
   } else if (g.out) {
7085
      // if there was an error and we allocated an image buffer, free it!
7086
2
      STBI_FREE(g.out);
7087
2
   }
7088
7089
   // free buffers needed for multiple frame loading;
7090
7
   STBI_FREE(g.history);
7091
7
   STBI_FREE(g.background);
7092
7093
7
   return u;
7094
7
}
7095
7096
static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
7097
5.94k
{
7098
5.94k
   return stbi__gif_info_raw(s,x,y,comp);
7099
5.94k
}
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
4.91k
{
7108
4.91k
   int i;
7109
5.93k
   for (i=0; signature[i]; ++i)
7110
5.93k
      if (stbi__get8(s) != signature[i])
7111
4.91k
          return 0;
7112
0
   stbi__rewind(s);
7113
0
   return 1;
7114
4.91k
}
7115
7116
static int stbi__hdr_test(stbi__context* s)
7117
2.45k
{
7118
2.45k
   int r = stbi__hdr_test_core(s, "#?RADIANCE\n");
7119
2.45k
   stbi__rewind(s);
7120
2.45k
   if(!r) {
7121
2.45k
       r = stbi__hdr_test_core(s, "#?RGBE\n");
7122
2.45k
       stbi__rewind(s);
7123
2.45k
   }
7124
2.45k
   return r;
7125
2.45k
}
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.29k
{
7310
1.29k
   char buffer[STBI__HDR_BUFLEN];
7311
1.29k
   char *token;
7312
1.29k
   int valid = 0;
7313
1.29k
   int dummy;
7314
7315
1.29k
   if (!x) x = &dummy;
7316
1.29k
   if (!y) y = &dummy;
7317
1.29k
   if (!comp) comp = &dummy;
7318
7319
1.29k
   if (stbi__hdr_test(s) == 0) {
7320
1.29k
       stbi__rewind( s );
7321
1.29k
       return 0;
7322
1.29k
   }
7323
7324
0
   for(;;) {
7325
0
      token = stbi__hdr_gettoken(s,buffer);
7326
0
      if (token[0] == 0) break;
7327
0
      if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
7328
0
   }
7329
7330
0
   if (!valid) {
7331
0
       stbi__rewind( s );
7332
0
       return 0;
7333
0
   }
7334
0
   token = stbi__hdr_gettoken(s,buffer);
7335
0
   if (strncmp(token, "-Y ", 3)) {
7336
0
       stbi__rewind( s );
7337
0
       return 0;
7338
0
   }
7339
0
   token += 3;
7340
0
   *y = (int) strtol(token, &token, 10);
7341
0
   while (*token == ' ') ++token;
7342
0
   if (strncmp(token, "+X ", 3)) {
7343
0
       stbi__rewind( s );
7344
0
       return 0;
7345
0
   }
7346
0
   token += 3;
7347
0
   *x = (int) strtol(token, NULL, 10);
7348
0
   *comp = 3;
7349
0
   return 1;
7350
0
}
7351
#endif // STBI_NO_HDR
7352
7353
#ifndef STBI_NO_BMP
7354
static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
7355
5.93k
{
7356
5.93k
   void *p;
7357
5.93k
   stbi__bmp_data info;
7358
7359
5.93k
   info.all_a = 255;
7360
5.93k
   p = stbi__bmp_parse_header(s, &info);
7361
5.93k
   if (p == NULL) {
7362
5.14k
      stbi__rewind( s );
7363
5.14k
      return 0;
7364
5.14k
   }
7365
792
   if (x) *x = s->img_x;
7366
792
   if (y) *y = s->img_y;
7367
792
   if (comp) {
7368
792
      if (info.bpp == 24 && info.ma == 0xff000000)
7369
0
         *comp = 3;
7370
792
      else
7371
792
         *comp = info.ma ? 4 : 3;
7372
792
   }
7373
792
   return 1;
7374
5.93k
}
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.14k
{
7380
5.14k
   int channelCount, dummy, depth;
7381
5.14k
   if (!x) x = &dummy;
7382
5.14k
   if (!y) y = &dummy;
7383
5.14k
   if (!comp) comp = &dummy;
7384
5.14k
   if (stbi__get32be(s) != 0x38425053) {
7385
5.14k
       stbi__rewind( s );
7386
5.14k
       return 0;
7387
5.14k
   }
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.2k
{
7415
11.2k
   int channelCount, depth;
7416
11.2k
   if (stbi__get32be(s) != 0x38425053) {
7417
11.2k
       stbi__rewind( s );
7418
11.2k
       return 0;
7419
11.2k
   }
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.14k
{
7444
5.14k
   int act_comp=0,num_packets=0,chained,dummy;
7445
5.14k
   stbi__pic_packet packets[10];
7446
7447
5.14k
   if (!x) x = &dummy;
7448
5.14k
   if (!y) y = &dummy;
7449
5.14k
   if (!comp) comp = &dummy;
7450
7451
5.14k
   if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
7452
5.14k
      stbi__rewind(s);
7453
5.14k
      return 0;
7454
5.14k
   }
7455
7456
0
   stbi__skip(s, 88);
7457
7458
0
   *x = stbi__get16be(s);
7459
0
   *y = stbi__get16be(s);
7460
0
   if (stbi__at_eof(s)) {
7461
0
      stbi__rewind( s);
7462
0
      return 0;
7463
0
   }
7464
0
   if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
7465
0
      stbi__rewind( s );
7466
0
      return 0;
7467
0
   }
7468
7469
0
   stbi__skip(s, 8);
7470
7471
0
   do {
7472
0
      stbi__pic_packet *packet;
7473
7474
0
      if (num_packets==sizeof(packets)/sizeof(packets[0]))
7475
0
         return 0;
7476
7477
0
      packet = &packets[num_packets++];
7478
0
      chained = stbi__get8(s);
7479
0
      packet->size    = stbi__get8(s);
7480
0
      packet->type    = stbi__get8(s);
7481
0
      packet->channel = stbi__get8(s);
7482
0
      act_comp |= packet->channel;
7483
7484
0
      if (stbi__at_eof(s)) {
7485
0
          stbi__rewind( s );
7486
0
          return 0;
7487
0
      }
7488
0
      if (packet->size != 8) {
7489
0
          stbi__rewind( s );
7490
0
          return 0;
7491
0
      }
7492
0
   } while (chained);
7493
7494
0
   *comp = (act_comp & 0x10 ? 4 : 3);
7495
7496
0
   return 1;
7497
0
}
7498
#endif
7499
7500
// *************************************************************************************************
7501
// Portable Gray Map and Portable Pixel Map loader
7502
// by Ken Miller
7503
//
7504
// PGM: http://netpbm.sourceforge.net/doc/pgm.html
7505
// PPM: http://netpbm.sourceforge.net/doc/ppm.html
7506
//
7507
// Known limitations:
7508
//    Does not support comments in the header section
7509
//    Does not support ASCII image data (formats P2 and P3)
7510
7511
#ifndef STBI_NO_PNM
7512
7513
static int      stbi__pnm_test(stbi__context *s)
7514
5.01k
{
7515
5.01k
   char p, t;
7516
5.01k
   p = (char) stbi__get8(s);
7517
5.01k
   t = (char) stbi__get8(s);
7518
5.01k
   if (p != 'P' || (t != '5' && t != '6')) {
7519
1.16k
       stbi__rewind( s );
7520
1.16k
       return 0;
7521
1.16k
   }
7522
3.85k
   return 1;
7523
5.01k
}
7524
7525
static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
7526
3.85k
{
7527
3.85k
   stbi_uc *out;
7528
3.85k
   STBI_NOTUSED(ri);
7529
7530
3.85k
   ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n);
7531
3.85k
   if (ri->bits_per_channel == 0)
7532
0
      return 0;
7533
7534
3.85k
   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
7535
3.85k
   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
7536
7537
3.85k
   *x = s->img_x;
7538
3.85k
   *y = s->img_y;
7539
3.85k
   if (comp) *comp = s->img_n;
7540
7541
3.85k
   if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))
7542
0
      return stbi__errpuc("too large", "PNM too large");
7543
7544
3.85k
   out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);
7545
3.85k
   if (!out) return stbi__errpuc("outofmem", "Out of memory");
7546
3.85k
   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
3.84k
   if (req_comp && req_comp != s->img_n) {
7552
3.84k
      if (ri->bits_per_channel == 16) {
7553
551
         out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y);
7554
3.29k
      } else {
7555
3.29k
         out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7556
3.29k
      }
7557
3.84k
      if (out == NULL) return out; // stbi__convert_format frees input on failure
7558
3.84k
   }
7559
3.84k
   return out;
7560
3.84k
}
7561
7562
static int      stbi__pnm_isspace(char c)
7563
70.4k
{
7564
70.4k
   return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
7565
70.4k
}
7566
7567
static void     stbi__pnm_skip_whitespace(stbi__context *s, char *c)
7568
34.6k
{
7569
35.6k
   for (;;) {
7570
70.4k
      while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7571
34.8k
         *c = (char) stbi__get8(s);
7572
7573
35.6k
      if (stbi__at_eof(s) || *c != '#')
7574
34.6k
         break;
7575
7576
3.31k
      while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' )
7577
2.37k
         *c = (char) stbi__get8(s);
7578
942
   }
7579
34.6k
}
7580
7581
static int      stbi__pnm_isdigit(char c)
7582
74.6k
{
7583
74.6k
   return c >= '0' && c <= '9';
7584
74.6k
}
7585
7586
static int      stbi__pnm_getinteger(stbi__context *s, char *c)
7587
34.6k
{
7588
34.6k
   int value = 0;
7589
7590
74.7k
   while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7591
40.2k
      value = value*10 + (*c - '0');
7592
40.2k
      *c = (char) stbi__get8(s);
7593
40.2k
      if((value > 214748364) || (value == 214748364 && *c > '7'))
7594
258
          return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int");
7595
40.2k
   }
7596
7597
34.4k
   return value;
7598
34.6k
}
7599
7600
static int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
7601
20.2k
{
7602
20.2k
   int maxv, dummy;
7603
20.2k
   char c, p, t;
7604
7605
20.2k
   if (!x) x = &dummy;
7606
20.2k
   if (!y) y = &dummy;
7607
20.2k
   if (!comp) comp = &dummy;
7608
7609
20.2k
   stbi__rewind(s);
7610
7611
   // Get identifier
7612
20.2k
   p = (char) stbi__get8(s);
7613
20.2k
   t = (char) stbi__get8(s);
7614
20.2k
   if (p != 'P' || (t != '5' && t != '6')) {
7615
8.68k
       stbi__rewind(s);
7616
8.68k
       return 0;
7617
8.68k
   }
7618
7619
11.5k
   *comp = (t == '6') ? 3 : 1;  // '5' is 1-component .pgm; '6' is 3-component .ppm
7620
7621
11.5k
   c = (char) stbi__get8(s);
7622
11.5k
   stbi__pnm_skip_whitespace(s, &c);
7623
7624
11.5k
   *x = stbi__pnm_getinteger(s, &c); // read width
7625
11.5k
   if(*x == 0)
7626
3
       return stbi__err("invalid width", "PPM image header had zero or overflowing width");
7627
11.5k
   stbi__pnm_skip_whitespace(s, &c);
7628
7629
11.5k
   *y = stbi__pnm_getinteger(s, &c); // read height
7630
11.5k
   if (*y == 0)
7631
3
       return stbi__err("invalid width", "PPM image header had zero or overflowing width");
7632
11.5k
   stbi__pnm_skip_whitespace(s, &c);
7633
7634
11.5k
   maxv = stbi__pnm_getinteger(s, &c);  // read max value
7635
11.5k
   if (maxv > 65535)
7636
1
      return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images");
7637
11.5k
   else if (maxv > 255)
7638
1.65k
      return 16;
7639
9.89k
   else
7640
9.89k
      return 8;
7641
11.5k
}
7642
7643
static int stbi__pnm_is16(stbi__context *s)
7644
11.2k
{
7645
11.2k
   if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)
7646
552
     return 1;
7647
10.7k
   return 0;
7648
11.2k
}
7649
#endif
7650
7651
static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
7652
11.3k
{
7653
11.3k
   #ifndef STBI_NO_JPEG
7654
11.3k
   if (stbi__jpeg_info(s, x, y, comp)) return 1;
7655
5.94k
   #endif
7656
7657
5.94k
   #ifndef STBI_NO_PNG
7658
5.94k
   if (stbi__png_info(s, x, y, comp))  return 1;
7659
5.94k
   #endif
7660
7661
5.94k
   #ifndef STBI_NO_GIF
7662
5.94k
   if (stbi__gif_info(s, x, y, comp))  return 1;
7663
5.93k
   #endif
7664
7665
5.93k
   #ifndef STBI_NO_BMP
7666
5.93k
   if (stbi__bmp_info(s, x, y, comp))  return 1;
7667
5.14k
   #endif
7668
7669
5.14k
   #ifndef STBI_NO_PSD
7670
5.14k
   if (stbi__psd_info(s, x, y, comp))  return 1;
7671
5.14k
   #endif
7672
7673
5.14k
   #ifndef STBI_NO_PIC
7674
5.14k
   if (stbi__pic_info(s, x, y, comp))  return 1;
7675
5.14k
   #endif
7676
7677
5.14k
   #ifndef STBI_NO_PNM
7678
5.14k
   if (stbi__pnm_info(s, x, y, comp))  return 1;
7679
1.29k
   #endif
7680
7681
1.29k
   #ifndef STBI_NO_HDR
7682
1.29k
   if (stbi__hdr_info(s, x, y, comp))  return 1;
7683
1.29k
   #endif
7684
7685
   // test tga last because it's a crappy test!
7686
1.29k
   #ifndef STBI_NO_TGA
7687
1.29k
   if (stbi__tga_info(s, x, y, comp))
7688
1.16k
       return 1;
7689
125
   #endif
7690
125
   return stbi__err("unknown image type", "Image not of any known type, or corrupt");
7691
1.29k
}
7692
7693
static int stbi__is_16_main(stbi__context *s)
7694
11.2k
{
7695
11.2k
   #ifndef STBI_NO_PNG
7696
11.2k
   if (stbi__png_is16(s))  return 1;
7697
11.2k
   #endif
7698
7699
11.2k
   #ifndef STBI_NO_PSD
7700
11.2k
   if (stbi__psd_is16(s))  return 1;
7701
11.2k
   #endif
7702
7703
11.2k
   #ifndef STBI_NO_PNM
7704
11.2k
   if (stbi__pnm_is16(s))  return 1;
7705
10.7k
   #endif
7706
10.7k
   return 0;
7707
11.2k
}
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.3k
{
7755
11.3k
   stbi__context s;
7756
11.3k
   stbi__start_mem(&s,buffer,len);
7757
11.3k
   return stbi__info_main(&s,x,y,comp);
7758
11.3k
}
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.2k
{
7769
11.2k
   stbi__context s;
7770
11.2k
   stbi__start_mem(&s,buffer,len);
7771
11.2k
   return stbi__is_16_main(&s);
7772
11.2k
}
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
*/