• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

saitoha / libsixel / 19918707358

04 Dec 2025 05:12AM UTC coverage: 38.402% (-4.0%) from 42.395%
19918707358

push

github

saitoha
tests: fix meson msys dll lookup

9738 of 38220 branches covered (25.48%)

12841 of 33438 relevant lines covered (38.4%)

782420.02 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

50.22
/src/stb_image.h
1
/* stb_image - v2.30 - 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.30  (2024-05-31) avoid erroneous gcc warning
52
      2.29  (2023-05-xx) optimizations
53
      2.28  (2023-01-29) many error fixes, security errors, just tons of stuff
54
      2.27  (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes
55
      2.26  (2020-07-13) many minor fixes
56
      2.25  (2020-02-02) fix warnings
57
      2.24  (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically
58
      2.23  (2019-08-11) fix clang static analysis warning
59
      2.22  (2019-03-04) gif fixes, fix warnings
60
      2.21  (2019-02-25) fix typo in comment
61
      2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
62
      2.19  (2018-02-11) fix warning
63
      2.18  (2018-01-30) fix warnings
64
      2.17  (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings
65
      2.16  (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes
66
      2.15  (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC
67
      2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
68
      2.13  (2016-12-04) experimental 16-bit API, only for PNG so far; fixes
69
      2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
70
      2.11  (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64
71
                         RGB-format JPEG; remove white matting in PSD;
72
                         allocate large structures on the stack;
73
                         correct channel count for PNG & BMP
74
      2.10  (2016-01-22) avoid warning introduced in 2.09
75
      2.09  (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED
76

77
   See end of file for full revision history.
78

79

80
 ============================    Contributors    =========================
81

82
 Image formats                          Extensions, features
83
    Sean Barrett (jpeg, png, bmp)          Jetro Lauha (stbi_info)
84
    Nicolas Schulz (hdr, psd)              Martin "SpartanJ" Golini (stbi_info)
85
    Jonathan Dummer (tga)                  James "moose2000" Brown (iPhone PNG)
86
    Jean-Marc Lienher (gif)                Ben "Disch" Wenger (io callbacks)
87
    Tom Seddon (pic)                       Omar Cornut (1/2/4-bit PNG)
88
    Thatcher Ulrich (psd)                  Nicolas Guillemot (vertical flip)
89
    Ken Miller (pgm, ppm)                  Richard Mitton (16-bit PSD)
90
    github:urraka (animated gif)           Junggon Kim (PNM comments)
91
    Christopher Forseth (animated gif)     Daniel Gibson (16-bit TGA)
92
                                           socks-the-fox (16-bit PNG)
93
                                           Jeremy Sawicki (handle all ImageNet JPGs)
94
 Optimizations & bugfixes                  Mikhail Morozov (1-bit BMP)
95
    Fabian "ryg" Giesen                    Anael Seghezzi (is-16-bit query)
96
    Arseny Kapoulkine                      Simon Breuss (16-bit PNM)
97
    John-Mark Allen
98
    Carmelo J Fdez-Aguera
99

100
 Bug & warning fixes
101
    Marc LeBlanc            David Woo          Guillaume George     Martins Mozeiko
102
    Christpher Lloyd        Jerry Jansson      Joseph Thomson       Blazej Dariusz Roszkowski
103
    Phil Jordan                                Dave Moore           Roy Eltham
104
    Hayaki Saito            Nathan Reed        Won Chun
105
    Luke Graham             Johan Duparc       Nick Verigakis       the Horde3D community
106
    Thomas Ruf              Ronny Chevalier                         github:rlyeh
107
    Janez Zemva             John Bartholomew   Michal Cichon        github:romigrou
108
    Jonathan Blow           Ken Hamada         Tero Hanninen        github:svdijk
109
    Eugene Golushkov        Laurent Gomila     Cort Stratton        github:snagar
110
    Aruelien Pocheville     Sergio Gonzalez    Thibault Reuille     github:Zelex
111
    Cass Everitt            Ryamond Barbiero                        github:grim210
112
    Paul Du Bois            Engin Manap        Aldo Culquicondor    github:sammyhw
113
    Philipp Wiesemann       Dale Weiler        Oriol Ferrer Mesia   github:phprus
114
    Josh Tobin              Neil Bickford      Matthew Gregan       github:poppolopoppo
115
    Julian Raschke          Gregory Mullen     Christian Floisand   github:darealshinji
116
    Baldur Karlsson         Kevin Schmidt      JR Smith             github:Michaelangel007
117
                            Brad Weinberger    Matvey Cherevko      github:mosra
118
    Luca Sas                Alexander Veselov  Zack Middleton       [reserved]
119
    Ryan C. Gordon          [reserved]                              [reserved]
120
                     DO NOT ADD YOUR NAME HERE
121

122
                     Jacko Dirks
123

124
  To add your name to the credits, pick a random blank space in the middle and fill it.
125
  80% of merge conflicts on stb PRs are due to people adding their name at the end
126
  of the credits.
127
*/
128

129
#ifndef STBI_INCLUDE_STB_IMAGE_H
130
#define STBI_INCLUDE_STB_IMAGE_H
131

132
// DOCUMENTATION
133
//
134
// Limitations:
135
//    - no 12-bit-per-channel JPEG
136
//    - no JPEGs with arithmetic coding
137
//    - GIF always returns *comp=4
138
//
139
// Basic usage (see HDR discussion below for HDR usage):
140
//    int x,y,n;
141
//    unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
142
//    // ... process data if not NULL ...
143
//    // ... x = width, y = height, n = # 8-bit components per pixel ...
144
//    // ... replace '0' with '1'..'4' to force that many components per pixel
145
//    // ... but 'n' will always be the number that it would have been if you said 0
146
//    stbi_image_free(data);
147
//
148
// Standard parameters:
149
//    int *x                 -- outputs image width in pixels
150
//    int *y                 -- outputs image height in pixels
151
//    int *channels_in_file  -- outputs # of image components in image file
152
//    int desired_channels   -- if non-zero, # of image components requested in result
153
//
154
// The return value from an image loader is an 'unsigned char *' which points
155
// to the pixel data, or NULL on an allocation failure or if the image is
156
// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,
157
// with each pixel consisting of N interleaved 8-bit components; the first
158
// pixel pointed to is top-left-most in the image. There is no padding between
159
// image scanlines or between pixels, regardless of format. The number of
160
// components N is 'desired_channels' if desired_channels is non-zero, or
161
// *channels_in_file otherwise. If desired_channels is non-zero,
162
// *channels_in_file has the number of components that _would_ have been
163
// output otherwise. E.g. if you set desired_channels to 4, you will always
164
// get RGBA output, but you can check *channels_in_file to see if it's trivially
165
// opaque because e.g. there were only 3 channels in the source image.
166
//
167
// An output image with N components has the following components interleaved
168
// in this order in each pixel:
169
//
170
//     N=#comp     components
171
//       1           grey
172
//       2           grey, alpha
173
//       3           red, green, blue
174
//       4           red, green, blue, alpha
175
//
176
// If image loading fails for any reason, the return value will be NULL,
177
// and *x, *y, *channels_in_file will be unchanged. The function
178
// stbi_failure_reason() can be queried for an extremely brief, end-user
179
// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS
180
// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
181
// more user-friendly ones.
182
//
183
// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
184
//
185
// To query the width, height and component count of an image without having to
186
// decode the full file, you can use the stbi_info family of functions:
187
//
188
//   int x,y,n,ok;
189
//   ok = stbi_info(filename, &x, &y, &n);
190
//   // returns ok=1 and sets x, y, n if image is a supported format,
191
//   // 0 otherwise.
192
//
193
// Note that stb_image pervasively uses ints in its public API for sizes,
194
// including sizes of memory buffers. This is now part of the API and thus
195
// hard to change without causing breakage. As a result, the various image
196
// loaders all have certain limits on image size; these differ somewhat
197
// by format but generally boil down to either just under 2GB or just under
198
// 1GB. When the decoded image would be larger than this, stb_image decoding
199
// will fail.
200
//
201
// Additionally, stb_image will reject image files that have any of their
202
// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS,
203
// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit,
204
// the only way to have an image with such dimensions load correctly
205
// is for it to have a rather extreme aspect ratio. Either way, the
206
// assumption here is that such larger images are likely to be malformed
207
// or malicious. If you do need to load an image with individual dimensions
208
// larger than that, and it still fits in the overall size limit, you can
209
// #define STBI_MAX_DIMENSIONS on your own to be something larger.
210
//
211
// ===========================================================================
212
//
213
// UNICODE:
214
//
215
//   If compiling for Windows and you wish to use Unicode filenames, compile
216
//   with
217
//       #define STBI_WINDOWS_UTF8
218
//   and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert
219
//   Windows wchar_t filenames to utf8.
220
//
221
// ===========================================================================
222
//
223
// Philosophy
224
//
225
// stb libraries are designed with the following priorities:
226
//
227
//    1. easy to use
228
//    2. easy to maintain
229
//    3. good performance
230
//
231
// Sometimes I let "good performance" creep up in priority over "easy to maintain",
232
// and for best performance I may provide less-easy-to-use APIs that give higher
233
// performance, in addition to the easy-to-use ones. Nevertheless, it's important
234
// to keep in mind that from the standpoint of you, a client of this library,
235
// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
236
//
237
// Some secondary priorities arise directly from the first two, some of which
238
// provide more explicit reasons why performance can't be emphasized.
239
//
240
//    - Portable ("ease of use")
241
//    - Small source code footprint ("easy to maintain")
242
//    - No dependencies ("ease of use")
243
//
244
// ===========================================================================
245
//
246
// I/O callbacks
247
//
248
// I/O callbacks allow you to read from arbitrary sources, like packaged
249
// files or some other source. Data read from callbacks are processed
250
// through a small internal buffer (currently 128 bytes) to try to reduce
251
// overhead.
252
//
253
// The three functions you must define are "read" (reads some bytes of data),
254
// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
255
//
256
// ===========================================================================
257
//
258
// SIMD support
259
//
260
// The JPEG decoder will try to automatically use SIMD kernels on x86 when
261
// supported by the compiler. For ARM Neon support, you must explicitly
262
// request it.
263
//
264
// (The old do-it-yourself SIMD API is no longer supported in the current
265
// code.)
266
//
267
// On x86, SSE2 will automatically be used when available based on a run-time
268
// test; if not, the generic C versions are used as a fall-back. On ARM targets,
269
// the typical path is to have separate builds for NEON and non-NEON devices
270
// (at least this is true for iOS and Android). Therefore, the NEON support is
271
// toggled by a build flag: define STBI_NEON to get NEON loops.
272
//
273
// If for some reason you do not want to use any of SIMD code, or if
274
// you have issues compiling it, you can disable it entirely by
275
// defining STBI_NO_SIMD.
276
//
277
// ===========================================================================
278
//
279
// HDR image support   (disable by defining STBI_NO_HDR)
280
//
281
// stb_image supports loading HDR images in general, and currently the Radiance
282
// .HDR file format specifically. You can still load any file through the existing
283
// interface; if you attempt to load an HDR file, it will be automatically remapped
284
// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
285
// both of these constants can be reconfigured through this interface:
286
//
287
//     stbi_hdr_to_ldr_gamma(2.2f);
288
//     stbi_hdr_to_ldr_scale(1.0f);
289
//
290
// (note, do not use _inverse_ constants; stbi_image will invert them
291
// appropriately).
292
//
293
// Additionally, there is a new, parallel interface for loading files as
294
// (linear) floats to preserve the full dynamic range:
295
//
296
//    float *data = stbi_loadf(filename, &x, &y, &n, 0);
297
//
298
// If you load LDR images through this interface, those images will
299
// be promoted to floating point values, run through the inverse of
300
// constants corresponding to the above:
301
//
302
//     stbi_ldr_to_hdr_scale(1.0f);
303
//     stbi_ldr_to_hdr_gamma(2.2f);
304
//
305
// Finally, given a filename (or an open file or memory block--see header
306
// file for details) containing image data, you can query for the "most
307
// appropriate" interface to use (that is, whether the image is HDR or
308
// not), using:
309
//
310
//     stbi_is_hdr(char *filename);
311
//
312
// ===========================================================================
313
//
314
// iPhone PNG support:
315
//
316
// We optionally support converting iPhone-formatted PNGs (which store
317
// premultiplied BGRA) back to RGB, even though they're internally encoded
318
// differently. To enable this conversion, call
319
// stbi_convert_iphone_png_to_rgb(1).
320
//
321
// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
322
// pixel to remove any premultiplied alpha *only* if the image file explicitly
323
// says there's premultiplied data (currently only happens in iPhone images,
324
// and only if iPhone convert-to-rgb processing is on).
325
//
326
// ===========================================================================
327
//
328
// ADDITIONAL CONFIGURATION
329
//
330
//  - You can suppress implementation of any of the decoders to reduce
331
//    your code footprint by #defining one or more of the following
332
//    symbols before creating the implementation.
333
//
334
//        STBI_NO_JPEG
335
//        STBI_NO_PNG
336
//        STBI_NO_BMP
337
//        STBI_NO_PSD
338
//        STBI_NO_TGA
339
//        STBI_NO_GIF
340
//        STBI_NO_HDR
341
//        STBI_NO_PIC
342
//        STBI_NO_PNM   (.ppm and .pgm)
343
//
344
//  - You can request *only* certain decoders and suppress all other ones
345
//    (this will be more forward-compatible, as addition of new decoders
346
//    doesn't require you to disable them explicitly):
347
//
348
//        STBI_ONLY_JPEG
349
//        STBI_ONLY_PNG
350
//        STBI_ONLY_BMP
351
//        STBI_ONLY_PSD
352
//        STBI_ONLY_TGA
353
//        STBI_ONLY_GIF
354
//        STBI_ONLY_HDR
355
//        STBI_ONLY_PIC
356
//        STBI_ONLY_PNM   (.ppm and .pgm)
357
//
358
//   - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
359
//     want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
360
//
361
//  - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater
362
//    than that size (in either width or height) without further processing.
363
//    This is to let programs in the wild set an upper bound to prevent
364
//    denial-of-service attacks on untrusted data, as one could generate a
365
//    valid image of gigantic dimensions and force stb_image to allocate a
366
//    huge block of memory and spend disproportionate time decoding it. By
367
//    default this is set to (1 << 24), which is 16777216, but that's still
368
//    very big.
369

370
#ifndef STBI_NO_STDIO
371
#include <stdio.h>
372
#endif // STBI_NO_STDIO
373

374
#define STBI_VERSION 1
375

376
enum
377
{
378
   STBI_default = 0, // only used for desired_channels
379

380
   STBI_grey       = 1,
381
   STBI_grey_alpha = 2,
382
   STBI_rgb        = 3,
383
   STBI_rgb_alpha  = 4
384
};
385

386
#include <stdlib.h>
387
typedef unsigned char stbi_uc;
388
typedef unsigned short stbi_us;
389

390
#ifdef __cplusplus
391
extern "C" {
392
#endif
393

394
#ifndef STBIDEF
395
#ifdef STB_IMAGE_STATIC
396
#define STBIDEF static
397
#else
398
#define STBIDEF extern
399
#endif
400
#endif
401

402
//////////////////////////////////////////////////////////////////////////////
403
//
404
// PRIMARY API - works on images of any type
405
//
406

407
//
408
// load image by filename, open file, or memory buffer
409
//
410

411
typedef struct
412
{
413
   int      (*read)  (void *user,char *data,int size);   // fill 'data' with 'size' bytes.  return number of bytes actually read
414
   void     (*skip)  (void *user,int n);                 // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
415
   int      (*eof)   (void *user);                       // returns nonzero if we are at end of file/data
416
} stbi_io_callbacks;
417

418
////////////////////////////////////
419
//
420
// 8-bits-per-channel interface
421
//
422

423
STBIDEF stbi_uc *stbi_load_from_memory   (stbi_uc           const *buffer, int len   , int *x, int *y, int *channels_in_file, int desired_channels);
424
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);
425

426
#ifndef STBI_NO_STDIO
427
STBIDEF stbi_uc *stbi_load            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
428
STBIDEF stbi_uc *stbi_load_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
429
// for stbi_load_from_file, file pointer is left pointing immediately after image
430
#endif
431

432
#ifndef STBI_NO_GIF
433
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);
434
#endif
435

436
#ifdef STBI_WINDOWS_UTF8
437
STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);
438
#endif
439

440
////////////////////////////////////
441
//
442
// 16-bits-per-channel interface
443
//
444

445
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);
446
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);
447

448
#ifndef STBI_NO_STDIO
449
STBIDEF stbi_us *stbi_load_16          (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
450
STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
451
#endif
452

453
////////////////////////////////////
454
//
455
// float-per-channel interface
456
//
457
#ifndef STBI_NO_LINEAR
458
   STBIDEF float *stbi_loadf_from_memory     (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
459
   STBIDEF float *stbi_loadf_from_callbacks  (stbi_io_callbacks const *clbk, void *user, int *x, int *y,  int *channels_in_file, int desired_channels);
460

461
   #ifndef STBI_NO_STDIO
462
   STBIDEF float *stbi_loadf            (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
463
   STBIDEF float *stbi_loadf_from_file  (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
464
   #endif
465
#endif
466

467
#ifndef STBI_NO_HDR
468
   STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma);
469
   STBIDEF void   stbi_hdr_to_ldr_scale(float scale);
470
#endif // STBI_NO_HDR
471

472
#ifndef STBI_NO_LINEAR
473
   STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma);
474
   STBIDEF void   stbi_ldr_to_hdr_scale(float scale);
475
#endif // STBI_NO_LINEAR
476

477
// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
478
STBIDEF int    stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
479
STBIDEF int    stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
480
#ifndef STBI_NO_STDIO
481
STBIDEF int      stbi_is_hdr          (char const *filename);
482
STBIDEF int      stbi_is_hdr_from_file(FILE *f);
483
#endif // STBI_NO_STDIO
484

485

486
// get a VERY brief reason for failure
487
// on most compilers (and ALL modern mainstream compilers) this is threadsafe
488
STBIDEF const char *stbi_failure_reason  (void);
489

490
// free the loaded image -- this is just free()
491
STBIDEF void     stbi_image_free      (void *retval_from_stbi_load);
492

493
// get image dimensions & components without fully decoding
494
STBIDEF int      stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
495
STBIDEF int      stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
496
STBIDEF int      stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len);
497
STBIDEF int      stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user);
498

499
#ifndef STBI_NO_STDIO
500
STBIDEF int      stbi_info               (char const *filename,     int *x, int *y, int *comp);
501
STBIDEF int      stbi_info_from_file     (FILE *f,                  int *x, int *y, int *comp);
502
STBIDEF int      stbi_is_16_bit          (char const *filename);
503
STBIDEF int      stbi_is_16_bit_from_file(FILE *f);
504
#endif
505

506

507

508
// for image formats that explicitly notate that they have premultiplied alpha,
509
// we just return the colors as stored in the file. set this flag to force
510
// unpremultiplication. results are undefined if the unpremultiply overflow.
511
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
512

513
// indicate whether we should process iphone images back to canonical format,
514
// or just pass them through "as-is"
515
STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
516

517
// flip the image vertically, so the first pixel in the output array is the bottom left
518
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);
519

520
// as above, but only applies to images loaded on the thread that calls the function
521
// this function is only available if your compiler supports thread-local variables;
522
// calling it will fail to link if your compiler doesn't
523
STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply);
524
STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert);
525
STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip);
526

527
// ZLIB client - used by PNG, available for other purposes
528

529
STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
530
STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
531
STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
532
STBIDEF int   stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
533

534
STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
535
STBIDEF int   stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
536

537

538
#ifdef __cplusplus
539
}
540
#endif
541

542
//
543
//
544
////   end header file   /////////////////////////////////////////////////////
545
#endif // STBI_INCLUDE_STB_IMAGE_H
546

547
#ifdef STB_IMAGE_IMPLEMENTATION
548

549
#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
550
  || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
551
  || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
552
  || defined(STBI_ONLY_ZLIB)
553
   #ifndef STBI_ONLY_JPEG
554
   #define STBI_NO_JPEG
555
   #endif
556
   #ifndef STBI_ONLY_PNG
557
   #define STBI_NO_PNG
558
   #endif
559
   #ifndef STBI_ONLY_BMP
560
   #define STBI_NO_BMP
561
   #endif
562
   #ifndef STBI_ONLY_PSD
563
   #define STBI_NO_PSD
564
   #endif
565
   #ifndef STBI_ONLY_TGA
566
   #define STBI_NO_TGA
567
   #endif
568
   #ifndef STBI_ONLY_GIF
569
   #define STBI_NO_GIF
570
   #endif
571
   #ifndef STBI_ONLY_HDR
572
   #define STBI_NO_HDR
573
   #endif
574
   #ifndef STBI_ONLY_PIC
575
   #define STBI_NO_PIC
576
   #endif
577
   #ifndef STBI_ONLY_PNM
578
   #define STBI_NO_PNM
579
   #endif
580
#endif
581

582
#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
583
#define STBI_NO_ZLIB
584
#endif
585

586

587
#include <stdarg.h>
588
#if HAVE_STDDEF_H
589
#include <stddef.h> // ptrdiff_t on osx
590
#endif  /* HAVE_STDDEF_H */
591
#include <stdlib.h>
592
#include <string.h>
593
#include <limits.h>
594

595
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
596
#include <math.h>  // ldexp, pow
597
#endif
598

599
#ifndef STBI_NO_STDIO
600
#include <stdio.h>
601
#endif
602

603
#ifndef STBI_ASSERT
604
#include <assert.h>
605
#define STBI_ASSERT(x) assert(x)
606
#endif
607

608
#ifdef __cplusplus
609
#define STBI_EXTERN extern "C"
610
#else
611
#define STBI_EXTERN extern
612
#endif
613

614

615
#ifndef _MSC_VER
616
   #ifdef __cplusplus
617
   #define stbi_inline inline
618
   #else
619
   #define stbi_inline
620
   #endif
621
#else
622
   #define stbi_inline __forceinline
623
#endif
624

625
#ifndef STBI_NO_THREAD_LOCALS
626
   #if defined(__cplusplus) &&  __cplusplus >= 201103L
627
      #define STBI_THREAD_LOCAL       thread_local
628
   #elif defined(__GNUC__) && __GNUC__ < 5
629
      #define STBI_THREAD_LOCAL       __thread
630
   #elif defined(_MSC_VER)
631
      #define STBI_THREAD_LOCAL       __declspec(thread)
632
   #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__)
633
      #define STBI_THREAD_LOCAL       _Thread_local
634
   #endif
635

636
   #ifndef STBI_THREAD_LOCAL
637
      #if defined(__GNUC__)
638
        #define STBI_THREAD_LOCAL       __thread
639
      #endif
640
   #endif
641
#endif
642

643
#if defined(_MSC_VER) || defined(__SYMBIAN32__)
644
typedef unsigned short stbi__uint16;
645
typedef   signed short stbi__int16;
646
typedef unsigned int   stbi__uint32;
647
typedef   signed int   stbi__int32;
648
#else
649
#if HAVE_STDINT_H
650
# include <stdint.h>
651
#endif
652
typedef uint16_t stbi__uint16;
653
typedef int16_t  stbi__int16;
654
typedef uint32_t stbi__uint32;
655
typedef int32_t  stbi__int32;
656
#endif
657

658
// should produce compiler error if size is wrong
659
typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
660

661
#ifdef _MSC_VER
662
#define STBI_NOTUSED(v)  (void)(v)
663
#else
664
#define STBI_NOTUSED(v)  (void)sizeof(v)
665
#endif
666

667
#ifdef _MSC_VER
668
#define STBI_HAS_LROTL
669
#endif
670

671
#ifdef STBI_HAS_LROTL
672
   #define stbi_lrot(x,y)  _lrotl(x,y)
673
#else
674
   #define stbi_lrot(x,y)  (((x) << (y)) | ((x) >> (-(y) & 31)))
675
#endif
676

677
#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))
678
// ok
679
#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)
680
// ok
681
#else
682
#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."
683
#endif
684

685
#ifndef STBI_MALLOC
686
#define STBI_MALLOC(sz)           malloc(sz)
687
#define STBI_REALLOC(p,newsz)     realloc(p,newsz)
688
#define STBI_FREE(p)              free(p)
689
#endif
690

691
#ifndef STBI_REALLOC_SIZED
692
#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)
693
#endif
694

695
// x86/x64 detection
696
#if defined(__x86_64__) || defined(_M_X64)
697
#define STBI__X64_TARGET
698
#elif defined(__i386) || defined(_M_IX86)
699
#define STBI__X86_TARGET
700
#endif
701

702
#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
703
// gcc doesn't support sse2 intrinsics unless you compile with -msse2,
704
// which in turn means it gets to use SSE2 everywhere. This is unfortunate,
705
// but previous attempts to provide the SSE2 functions with runtime
706
// detection caused numerous issues. The way architecture extensions are
707
// exposed in GCC/Clang is, sadly, not really suited for one-file libs.
708
// New behavior: if compiled with -msse2, we use SSE2 without any
709
// detection; if not, we don't use it at all.
710
#define STBI_NO_SIMD
711
#endif
712

713
#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
714
// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET
715
//
716
// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the
717
// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.
718
// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not
719
// simultaneously enabling "-mstackrealign".
720
//
721
// See https://github.com/nothings/stb/issues/81 for more information.
722
//
723
// So default to no SSE2 on 32-bit MinGW. If you've read this far and added
724
// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.
725
#define STBI_NO_SIMD
726
#endif
727

728
#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))
729
#define STBI_SSE2
730
#include <emmintrin.h>
731

732
#ifdef _MSC_VER
733

734
#if _MSC_VER >= 1400  // not VC6
735
#include <intrin.h> // __cpuid
736
static int stbi__cpuid3(void)
737
{
738
   int info[4];
739
   __cpuid(info,1);
740
   return info[3];
741
}
742
#else
743
static int stbi__cpuid3(void)
744
{
745
   int res;
746
   __asm {
747
      mov  eax,1
748
      cpuid
749
      mov  res,edx
750
   }
751
   return res;
752
}
753
#endif
754

755
#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
756

757
#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
758
static int stbi__sse2_available(void)
759
{
760
   int info3 = stbi__cpuid3();
761
   return ((info3 >> 26) & 1) != 0;
762
}
763
#endif
764

765
#else // assume GCC-style if not VC++
766
#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
767

768
#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)
769
static int stbi__sse2_available(void)
770
{
771
   // If we're even attempting to compile this on GCC/Clang, that means
772
   // -msse2 is on, which means the compiler is allowed to use SSE2
773
   // instructions at will, and so are we.
774
   return 1;
775
}
776
#endif
777

778
#endif
779
#endif
780

781
// ARM NEON
782
#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
783
#undef STBI_NEON
784
#endif
785

786
#ifdef STBI_NEON
787
#include <arm_neon.h>
788
#ifdef _MSC_VER
789
#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
790
#else
791
#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
792
#endif
793
#endif
794

795
#ifndef STBI_SIMD_ALIGN
796
#define STBI_SIMD_ALIGN(type, name) type name
797
#endif
798

799
#ifndef STBI_MAX_DIMENSIONS
800
#define STBI_MAX_DIMENSIONS (1 << 24)
801
#endif
802

803
///////////////////////////////////////////////
804
//
805
//  stbi__context struct and start_xxx functions
806

807
// stbi__context structure is our basic context used by all images, so it
808
// contains all the IO context, plus some basic image information
809
typedef struct
810
{
811
   stbi__uint32 img_x, img_y;
812
   int img_n, img_out_n;
813

814
   stbi_io_callbacks io;
815
   void *io_user_data;
816

817
   int read_from_callbacks;
818
   int buflen;
819
   stbi_uc buffer_start[128];
820
   int callback_already_read;
821

822
   stbi_uc *img_buffer, *img_buffer_end;
823
   stbi_uc *img_buffer_original, *img_buffer_original_end;
824
} stbi__context;
825

826

827
static void stbi__refill_buffer(stbi__context *s);
828

829
// initialize a memory-decode context
830
static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)
243✔
831
{
832
   s->io.read = NULL;
243✔
833
   s->read_from_callbacks = 0;
243✔
834
   s->callback_already_read = 0;
243✔
835
   s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
243✔
836
   s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
243✔
837
}
838

839
// initialize a callback-based context
840
static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)
×
841
{
842
   s->io = *c;
×
843
   s->io_user_data = user;
×
844
   s->buflen = sizeof(s->buffer_start);
×
845
   s->read_from_callbacks = 1;
×
846
   s->callback_already_read = 0;
×
847
   s->img_buffer = s->img_buffer_original = s->buffer_start;
×
848
   stbi__refill_buffer(s);
×
849
   s->img_buffer_original_end = s->img_buffer_end;
×
850
}
×
851

852
#ifndef STBI_NO_STDIO
853

854
static int stbi__stdio_read(void *user, char *data, int size)
855
{
856
   return (int) fread(data,1,size,(FILE*) user);
857
}
858

859
static void stbi__stdio_skip(void *user, int n)
860
{
861
   int ch;
862
   fseek((FILE*) user, n, SEEK_CUR);
863
   ch = fgetc((FILE*) user);  /* have to read a byte to reset feof()'s flag */
864
   if (ch != EOF) {
865
      ungetc(ch, (FILE *) user);  /* push byte back onto stream if valid. */
866
   }
867
}
868

869
static int stbi__stdio_eof(void *user)
870
{
871
   return feof((FILE*) user) || ferror((FILE *) user);
872
}
873

874
static stbi_io_callbacks stbi__stdio_callbacks =
875
{
876
   stbi__stdio_read,
877
   stbi__stdio_skip,
878
   stbi__stdio_eof,
879
};
880

881
static void stbi__start_file(stbi__context *s, FILE *f)
882
{
883
   stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);
884
}
885

886
//static void stop_file(stbi__context *s) { }
887

888
#endif // !STBI_NO_STDIO
889

890
static void stbi__rewind(stbi__context *s)
645✔
891
{
892
   // conceptually rewind SHOULD rewind to the beginning of the stream,
893
   // but we just rewind to the beginning of the initial buffer, because
894
   // we only use it after doing 'test', which only ever looks at at most 92 bytes
895
   s->img_buffer = s->img_buffer_original;
645✔
896
   s->img_buffer_end = s->img_buffer_original_end;
645✔
897
}
21✔
898

899
enum
900
{
901
   STBI_ORDER_RGB,
902
   STBI_ORDER_BGR
903
};
904

905
typedef struct
906
{
907
   int bits_per_channel;
908
   int num_channels;
909
   int channel_order;
910
} stbi__result_info;
911

912
#ifndef STBI_NO_JPEG
913
static int      stbi__jpeg_test(stbi__context *s);
914
static void    *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
915
static int      stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
916
#endif
917

918
#ifndef STBI_NO_PNG
919
static int      stbi__png_test(stbi__context *s);
920
static void    *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
921
static int      stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
922
static int      stbi__png_is16(stbi__context *s);
923
#endif
924

925
#ifndef STBI_NO_BMP
926
static int      stbi__bmp_test(stbi__context *s);
927
static void    *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
928
static int      stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);
929
#endif
930

931
#ifndef STBI_NO_TGA
932
static int      stbi__tga_test(stbi__context *s);
933
static void    *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
934
static int      stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
935
#endif
936

937
#ifndef STBI_NO_PSD
938
static int      stbi__psd_test(stbi__context *s);
939
static void    *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);
940
static int      stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
941
static int      stbi__psd_is16(stbi__context *s);
942
#endif
943

944
#ifndef STBI_NO_HDR
945
static int      stbi__hdr_test(stbi__context *s);
946
static float   *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
947
static int      stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);
948
#endif
949

950
#ifndef STBI_NO_PIC
951
static int      stbi__pic_test(stbi__context *s);
952
static void    *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
953
static int      stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
954
#endif
955

956
#ifndef STBI_NO_GIF
957
static int      stbi__gif_test(stbi__context *s);
958
static void    *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
959
static void    *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp);
960
static int      stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
961
#endif
962

963
#ifndef STBI_NO_PNM
964
static int      stbi__pnm_test(stbi__context *s);
965
static void    *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);
966
static int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
967
static int      stbi__pnm_is16(stbi__context *s);
968
#endif
969

970
static
971
#ifdef STBI_THREAD_LOCAL
972
STBI_THREAD_LOCAL
973
#endif
974
const char *stbi__g_failure_reason;
975

976
STBIDEF const char *stbi_failure_reason(void)
3✔
977
{
978
   return stbi__g_failure_reason;
3✔
979
}
980

981
#ifndef STBI_NO_FAILURE_STRINGS
982
static int stbi__err(const char *str)
111✔
983
{
984
   stbi__g_failure_reason = str;
111✔
985
   return 0;
111✔
986
}
987
#endif
988

989
static void *stbi__malloc(size_t size)
1,206✔
990
{
991
    return STBI_MALLOC(size);
1,368✔
992
}
993

994
// stb_image uses ints pervasively, including for offset calculations.
995
// therefore the largest decoded image size we can support with the
996
// current code, even on 64-bit targets, is INT_MAX. this is not a
997
// significant limitation for the intended use case.
998
//
999
// we do, however, need to make sure our size calculations don't
1000
// overflow. hence a few helper functions for size calculations that
1001
// multiply integers together, making sure that they're non-negative
1002
// and no overflow occurs.
1003

1004
// return 1 if the sum is valid, 0 on overflow.
1005
// negative terms are considered invalid.
1006
static int stbi__addsizes_valid(int a, int b)
1,116✔
1007
{
1008
   if (b < 0) return 0;
1,116!
1009
   // now 0 <= b <= INT_MAX, hence also
1010
   // 0 <= INT_MAX - b <= INTMAX.
1011
   // And "a + b <= INT_MAX" (which might overflow) is the
1012
   // same as a <= INT_MAX - b (no overflow)
1013
   return a <= INT_MAX - b;
1,116✔
1014
}
1015

1016
// returns 1 if the product is valid, 0 on overflow.
1017
// negative factors are considered invalid.
1018
static int stbi__mul2sizes_valid(int a, int b)
1,725✔
1019
{
1020
   if (a < 0 || b < 0) return 0;
1,725!
1021
   if (b == 0) return 1; // mul-by-0 is always safe
1,725!
1022
   // portable way to check for no overflows in a*b
1023
   return a <= INT_MAX/b;
1,725✔
1024
}
1025

1026
#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1027
// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow
1028
static int stbi__mad2sizes_valid(int a, int b, int add)
507✔
1029
{
1030
   return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);
1,014!
1031
}
1032
#endif
1033

1034
// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow
1035
static int stbi__mad3sizes_valid(int a, int b, int c, int add)
609✔
1036
{
1037
   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
1,827!
1038
      stbi__addsizes_valid(a*b*c, add);
609!
1039
}
1040

1041
// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow
1042
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1043
static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)
×
1044
{
1045
   return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&
×
1046
      stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);
×
1047
}
1048
#endif
1049

1050
#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR)
1051
// mallocs with size overflow checking
1052
static void *stbi__malloc_mad2(int a, int b, int add)
351✔
1053
{
1054
   if (!stbi__mad2sizes_valid(a, b, add)) return NULL;
351!
1055
   return stbi__malloc(a*b + add);
351✔
1056
}
1057
#endif
1058

1059
static void *stbi__malloc_mad3(int a, int b, int c, int add)
369✔
1060
{
1061
   if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;
369!
1062
   return stbi__malloc(a*b*c + add);
369✔
1063
}
1064

1065
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM)
1066
static void *stbi__malloc_mad4(int a, int b, int c, int d, int add)
×
1067
{
1068
   if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;
×
1069
   return stbi__malloc(a*b*c*d + add);
×
1070
}
1071
#endif
1072

1073
// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow.
1074
static int stbi__addints_valid(int a, int b)
763,686✔
1075
{
1076
   if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow
763,686!
1077
   if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0.
342,822!
1078
   return a <= INT_MAX - b;
178,926✔
1079
}
1080

1081
// returns 1 if the product of two ints fits in a signed short, 0 on overflow.
1082
static int stbi__mul2shorts_valid(int a, int b)
763,686✔
1083
{
1084
   if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow
763,686!
1085
   if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid
763,686!
1086
   if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN
464,628!
1087
   return a >= SHRT_MIN / b;
464,628✔
1088
}
1089

1090
// stbi__err - error
1091
// stbi__errpf - error returning pointer to float
1092
// stbi__errpuc - error returning pointer to unsigned char
1093

1094
#ifdef STBI_NO_FAILURE_STRINGS
1095
   #define stbi__err(x,y)  0
1096
#elif defined(STBI_FAILURE_USERMSG)
1097
   #define stbi__err(x,y)  stbi__err(y)
1098
#else
1099
   #define stbi__err(x,y)  stbi__err(x)
1100
#endif
1101

1102
#define stbi__errpf(x,y)   ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
1103
#define stbi__errpuc(x,y)  ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
1104

1105
STBIDEF void stbi_image_free(void *retval_from_stbi_load)
×
1106
{
1107
   STBI_FREE(retval_from_stbi_load);
×
1108
}
×
1109

1110
#ifndef STBI_NO_LINEAR
1111
static float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
1112
#endif
1113

1114
#ifndef STBI_NO_HDR
1115
static stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp);
1116
#endif
1117

1118
static int stbi__vertically_flip_on_load_global = 0;
1119

1120
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
×
1121
{
1122
   stbi__vertically_flip_on_load_global = flag_true_if_should_flip;
×
1123
}
×
1124

1125
#ifndef STBI_THREAD_LOCAL
1126
#define stbi__vertically_flip_on_load  stbi__vertically_flip_on_load_global
1127
#else
1128
static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set;
1129

1130
STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip)
×
1131
{
1132
   stbi__vertically_flip_on_load_local = flag_true_if_should_flip;
×
1133
   stbi__vertically_flip_on_load_set = 1;
×
1134
}
×
1135

1136
#define stbi__vertically_flip_on_load  (stbi__vertically_flip_on_load_set       \
1137
                                         ? stbi__vertically_flip_on_load_local  \
1138
                                         : stbi__vertically_flip_on_load_global)
1139
#endif // STBI_THREAD_LOCAL
1140

1141
static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
243✔
1142
{
1143
   memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields
243✔
1144
   ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed
243✔
1145
   ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order
243✔
1146
   ri->num_channels = 0;
243✔
1147

1148
   // test the formats with a very explicit header first (at least a FOURCC
1149
   // or distinctive magic number first)
1150
   #ifndef STBI_NO_PNG
1151
   if (stbi__png_test(s))  return stbi__png_load(s,x,y,comp,req_comp, ri);
156!
1152
   #endif
1153
   #ifndef STBI_NO_BMP
1154
   if (stbi__bmp_test(s))  return stbi__bmp_load(s,x,y,comp,req_comp, ri);
3✔
1155
   #endif
1156
   #ifndef STBI_NO_GIF
1157
   if (stbi__gif_test(s))  return stbi__gif_load(s,x,y,comp,req_comp, ri);
1158
   #endif
1159
   #ifndef STBI_NO_PSD
1160
   if (stbi__psd_test(s))  return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);
×
1161
   #else
1162
   STBI_NOTUSED(bpc);
1163
   #endif
1164
   #ifndef STBI_NO_PIC
1165
   if (stbi__pic_test(s))  return stbi__pic_load(s,x,y,comp,req_comp, ri);
×
1166
   #endif
1167

1168
   // then the formats that can end up attempting to load with just 1 or 2
1169
   // bytes matching expectations; these are prone to false positives, so
1170
   // try them later
1171
   #ifndef STBI_NO_JPEG
1172
   if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);
84!
1173
   #endif
1174
   #ifndef STBI_NO_PNM
1175
   if (stbi__pnm_test(s))  return stbi__pnm_load(s,x,y,comp,req_comp, ri);
1176
   #endif
1177

1178
   #ifndef STBI_NO_HDR
1179
   if (stbi__hdr_test(s)) {
21!
1180
      float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);
×
1181
      return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
×
1182
   }
1183
   #endif
1184

1185
   #ifndef STBI_NO_TGA
1186
   // test tga last because it's a crappy test!
1187
   if (stbi__tga_test(s))
21✔
1188
      return stbi__tga_load(s,x,y,comp,req_comp, ri);
18✔
1189
   #endif
1190

1191
   return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
3✔
1192
}
1193

1194
static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)
×
1195
{
1196
   int i;
×
1197
   int img_len = w * h * channels;
×
1198
   stbi_uc *reduced;
×
1199

1200
   reduced = (stbi_uc *) stbi__malloc(img_len);
×
1201
   if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory");
×
1202

1203
   for (i = 0; i < img_len; ++i)
×
1204
      reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling
×
1205

1206
   STBI_FREE(orig);
×
1207
   return reduced;
×
1208
}
1209

1210
static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)
×
1211
{
1212
   int i;
×
1213
   int img_len = w * h * channels;
×
1214
   stbi__uint16 *enlarged;
×
1215

1216
   enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);
×
1217
   if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
×
1218

1219
   for (i = 0; i < img_len; ++i)
×
1220
      enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff
×
1221

1222
   STBI_FREE(orig);
×
1223
   return enlarged;
×
1224
}
1225

1226
static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)
×
1227
{
1228
   int row;
×
1229
   size_t bytes_per_row = (size_t)w * bytes_per_pixel;
×
1230
   stbi_uc temp[2048];
×
1231
   stbi_uc *bytes = (stbi_uc *)image;
×
1232

1233
   for (row = 0; row < (h>>1); row++) {
×
1234
      stbi_uc *row0 = bytes + row*bytes_per_row;
×
1235
      stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;
×
1236
      // swap row0 with row1
1237
      size_t bytes_left = bytes_per_row;
×
1238
      while (bytes_left) {
×
1239
         size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);
×
1240
         memcpy(temp, row0, bytes_copy);
×
1241
         memcpy(row0, row1, bytes_copy);
×
1242
         memcpy(row1, temp, bytes_copy);
×
1243
         row0 += bytes_copy;
×
1244
         row1 += bytes_copy;
×
1245
         bytes_left -= bytes_copy;
×
1246
      }
1247
   }
1248
}
×
1249

1250
#ifndef STBI_NO_GIF
1251
static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)
1252
{
1253
   int slice;
1254
   int slice_size = w * h * bytes_per_pixel;
1255

1256
   stbi_uc *bytes = (stbi_uc *)image;
1257
   for (slice = 0; slice < z; ++slice) {
1258
      stbi__vertical_flip(bytes, w, h, bytes_per_pixel);
1259
      bytes += slice_size;
1260
   }
1261
}
1262
#endif
1263

1264
static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
243✔
1265
{
1266
   stbi__result_info ri;
243✔
1267
   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);
243✔
1268

1269
   if (result == NULL)
243✔
1270
      return NULL;
1271

1272
   // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
1273
   STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
240!
1274

1275
   if (ri.bits_per_channel != 8) {
240!
1276
      result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
×
1277
      ri.bits_per_channel = 8;
×
1278
   }
1279

1280
   // @TODO: move stbi__convert_format to here
1281

1282
   if (stbi__vertically_flip_on_load) {
240!
1283
      int channels = req_comp ? req_comp : *comp;
×
1284
      stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));
×
1285
   }
1286

1287
   return (unsigned char *) result;
1288
}
1289

1290
static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)
×
1291
{
1292
   stbi__result_info ri;
×
1293
   void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);
×
1294

1295
   if (result == NULL)
×
1296
      return NULL;
1297

1298
   // it is the responsibility of the loaders to make sure we get either 8 or 16 bit.
1299
   STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16);
×
1300

1301
   if (ri.bits_per_channel != 16) {
×
1302
      result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);
×
1303
      ri.bits_per_channel = 16;
×
1304
   }
1305

1306
   // @TODO: move stbi__convert_format16 to here
1307
   // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision
1308

1309
   if (stbi__vertically_flip_on_load) {
×
1310
      int channels = req_comp ? req_comp : *comp;
×
1311
      stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));
×
1312
   }
1313

1314
   return (stbi__uint16 *) result;
1315
}
1316

1317
#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)
1318
static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
×
1319
{
1320
   if (stbi__vertically_flip_on_load && result != NULL) {
×
1321
      int channels = req_comp ? req_comp : *comp;
×
1322
      stbi__vertical_flip(result, *x, *y, channels * sizeof(float));
×
1323
   }
1324
}
×
1325
#endif
1326

1327
#ifndef STBI_NO_STDIO
1328

1329
#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1330
STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);
1331
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);
1332
#endif
1333

1334
#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1335
STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)
1336
{
1337
        return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);
1338
}
1339
#endif
1340

1341
static FILE *stbi__fopen(char const *filename, char const *mode)
1342
{
1343
   FILE *f;
1344
#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8)
1345
   wchar_t wMode[64];
1346
   wchar_t wFilename[1024];
1347
        if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename)))
1348
      return 0;
1349

1350
        if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode)))
1351
      return 0;
1352

1353
#if defined(_MSC_VER) && _MSC_VER >= 1400
1354
        if (0 != _wfopen_s(&f, wFilename, wMode))
1355
                f = 0;
1356
#else
1357
   f = _wfopen(wFilename, wMode);
1358
#endif
1359

1360
#elif defined(_MSC_VER) && _MSC_VER >= 1400
1361
   if (0 != fopen_s(&f, filename, mode))
1362
      f=0;
1363
#else
1364
   f = fopen(filename, mode);
1365
#endif
1366
   return f;
1367
}
1368

1369

1370
STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
1371
{
1372
   FILE *f = stbi__fopen(filename, "rb");
1373
   unsigned char *result;
1374
   if (!f) return stbi__errpuc("can't fopen", "Unable to open file");
1375
   result = stbi_load_from_file(f,x,y,comp,req_comp);
1376
   fclose(f);
1377
   return result;
1378
}
1379

1380
STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
1381
{
1382
   unsigned char *result;
1383
   stbi__context s;
1384
   stbi__start_file(&s,f);
1385
   result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
1386
   if (result) {
1387
      // need to 'unget' all the characters in the IO buffer
1388
      fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1389
   }
1390
   return result;
1391
}
1392

1393
STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)
1394
{
1395
   stbi__uint16 *result;
1396
   stbi__context s;
1397
   stbi__start_file(&s,f);
1398
   result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);
1399
   if (result) {
1400
      // need to 'unget' all the characters in the IO buffer
1401
      fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1402
   }
1403
   return result;
1404
}
1405

1406
STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)
1407
{
1408
   FILE *f = stbi__fopen(filename, "rb");
1409
   stbi__uint16 *result;
1410
   if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file");
1411
   result = stbi_load_from_file_16(f,x,y,comp,req_comp);
1412
   fclose(f);
1413
   return result;
1414
}
1415

1416

1417
#endif //!STBI_NO_STDIO
1418

1419
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)
×
1420
{
1421
   stbi__context s;
×
1422
   stbi__start_mem(&s,buffer,len);
×
1423
   return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
×
1424
}
1425

1426
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)
×
1427
{
1428
   stbi__context s;
×
1429
   stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);
×
1430
   return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);
×
1431
}
1432

1433
STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
×
1434
{
1435
   stbi__context s;
×
1436
   stbi__start_mem(&s,buffer,len);
×
1437
   return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
×
1438
}
1439

1440
STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
×
1441
{
1442
   stbi__context s;
×
1443
   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
×
1444
   return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);
×
1445
}
1446

1447
#ifndef STBI_NO_GIF
1448
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)
1449
{
1450
   unsigned char *result;
1451
   stbi__context s;
1452
   stbi__start_mem(&s,buffer,len);
1453

1454
   result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);
1455
   if (stbi__vertically_flip_on_load) {
1456
      stbi__vertical_flip_slices( result, *x, *y, *z, *comp );
1457
   }
1458

1459
   return result;
1460
}
1461
#endif
1462

1463
#ifndef STBI_NO_LINEAR
1464
static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
×
1465
{
1466
   unsigned char *data;
×
1467
   #ifndef STBI_NO_HDR
1468
   if (stbi__hdr_test(s)) {
×
1469
      stbi__result_info ri;
×
1470
      float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);
×
1471
      if (hdr_data)
×
1472
         stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
×
1473
      return hdr_data;
×
1474
   }
1475
   #endif
1476
   data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);
×
1477
   if (data)
×
1478
      return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
×
1479
   return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");
×
1480
}
1481

1482
STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
×
1483
{
1484
   stbi__context s;
×
1485
   stbi__start_mem(&s,buffer,len);
×
1486
   return stbi__loadf_main(&s,x,y,comp,req_comp);
×
1487
}
1488

1489
STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
×
1490
{
1491
   stbi__context s;
×
1492
   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
×
1493
   return stbi__loadf_main(&s,x,y,comp,req_comp);
×
1494
}
1495

1496
#ifndef STBI_NO_STDIO
1497
STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
1498
{
1499
   float *result;
1500
   FILE *f = stbi__fopen(filename, "rb");
1501
   if (!f) return stbi__errpf("can't fopen", "Unable to open file");
1502
   result = stbi_loadf_from_file(f,x,y,comp,req_comp);
1503
   fclose(f);
1504
   return result;
1505
}
1506

1507
STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
1508
{
1509
   stbi__context s;
1510
   stbi__start_file(&s,f);
1511
   return stbi__loadf_main(&s,x,y,comp,req_comp);
1512
}
1513
#endif // !STBI_NO_STDIO
1514

1515
#endif // !STBI_NO_LINEAR
1516

1517
// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is
1518
// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always
1519
// reports false!
1520

1521
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
×
1522
{
1523
   #ifndef STBI_NO_HDR
1524
   stbi__context s;
×
1525
   stbi__start_mem(&s,buffer,len);
×
1526
   return stbi__hdr_test(&s);
×
1527
   #else
1528
   STBI_NOTUSED(buffer);
1529
   STBI_NOTUSED(len);
1530
   return 0;
1531
   #endif
1532
}
1533

1534
#ifndef STBI_NO_STDIO
1535
STBIDEF int      stbi_is_hdr          (char const *filename)
1536
{
1537
   FILE *f = stbi__fopen(filename, "rb");
1538
   int result=0;
1539
   if (f) {
1540
      result = stbi_is_hdr_from_file(f);
1541
      fclose(f);
1542
   }
1543
   return result;
1544
}
1545

1546
STBIDEF int stbi_is_hdr_from_file(FILE *f)
1547
{
1548
   #ifndef STBI_NO_HDR
1549
   long pos = ftell(f);
1550
   int res;
1551
   stbi__context s;
1552
   stbi__start_file(&s,f);
1553
   res = stbi__hdr_test(&s);
1554
   fseek(f, pos, SEEK_SET);
1555
   return res;
1556
   #else
1557
   STBI_NOTUSED(f);
1558
   return 0;
1559
   #endif
1560
}
1561
#endif // !STBI_NO_STDIO
1562

1563
STBIDEF int      stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
×
1564
{
1565
   #ifndef STBI_NO_HDR
1566
   stbi__context s;
×
1567
   stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
×
1568
   return stbi__hdr_test(&s);
×
1569
   #else
1570
   STBI_NOTUSED(clbk);
1571
   STBI_NOTUSED(user);
1572
   return 0;
1573
   #endif
1574
}
1575

1576
#ifndef STBI_NO_LINEAR
1577
static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1578

1579
STBIDEF void   stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
×
1580
STBIDEF void   stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
×
1581
#endif
1582

1583
static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1584

1585
STBIDEF void   stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
×
1586
STBIDEF void   stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
×
1587

1588

1589
//////////////////////////////////////////////////////////////////////////////
1590
//
1591
// Common code used by all image loaders
1592
//
1593

1594
enum
1595
{
1596
   STBI__SCAN_load=0,
1597
   STBI__SCAN_type,
1598
   STBI__SCAN_header
1599
};
1600

1601
static void stbi__refill_buffer(stbi__context *s)
×
1602
{
1603
   int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);
×
1604
   s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original);
×
1605
   if (n == 0) {
×
1606
      // at end of file, treat same as if from memory, but need to handle case
1607
      // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file
1608
      s->read_from_callbacks = 0;
×
1609
      s->img_buffer = s->buffer_start;
×
1610
      s->img_buffer_end = s->buffer_start+1;
×
1611
      *s->img_buffer = 0;
×
1612
   } else {
1613
      s->img_buffer = s->buffer_start;
×
1614
      s->img_buffer_end = s->buffer_start + n;
×
1615
   }
1616
}
×
1617

1618
stbi_inline static stbi_uc stbi__get8(stbi__context *s)
4,886,568✔
1619
{
1620
   if (s->img_buffer < s->img_buffer_end)
4,886,568!
1621
      return *s->img_buffer++;
4,886,553✔
1622
   if (s->read_from_callbacks) {
15!
1623
      stbi__refill_buffer(s);
×
1624
      return *s->img_buffer++;
×
1625
   }
1626
   return 0;
1627
}
1628

1629
#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM)
1630
// nothing
1631
#else
1632
stbi_inline static int stbi__at_eof(stbi__context *s)
12✔
1633
{
1634
   if (s->io.read) {
12!
1635
      if (!(s->io.eof)(s->io_user_data)) return 0;
×
1636
      // if feof() is true, check if buffer = end
1637
      // special case: we've only got the special 0 character at the end
1638
      if (s->read_from_callbacks == 0) return 1;
×
1639
   }
1640

1641
   return s->img_buffer >= s->img_buffer_end;
12✔
1642
}
1643
#endif
1644

1645
#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)
1646
// nothing
1647
#else
1648
static void stbi__skip(stbi__context *s, int n)
2,043✔
1649
{
1650
   if (n == 0) return;  // already there!
2,043✔
1651
   if (n < 0) {
669!
1652
      s->img_buffer = s->img_buffer_end;
×
1653
      return;
×
1654
   }
1655
   if (s->io.read) {
669!
1656
      int blen = (int) (s->img_buffer_end - s->img_buffer);
×
1657
      if (blen < n) {
×
1658
         s->img_buffer = s->img_buffer_end;
×
1659
         (s->io.skip)(s->io_user_data, n - blen);
×
1660
         return;
×
1661
      }
1662
   }
×
1663
   s->img_buffer += n;
669✔
1664
}
1665
#endif
1666

1667
#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM)
1668
// nothing
1669
#else
1670
static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
9,558✔
1671
{
1672
   if (s->io.read) {
9,558!
1673
      int blen = (int) (s->img_buffer_end - s->img_buffer);
×
1674
      if (blen < n) {
×
1675
         int res, count;
×
1676

1677
         memcpy(buffer, s->img_buffer, blen);
×
1678

1679
         count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);
×
1680
         res = (count == (n-blen));
×
1681
         s->img_buffer = s->img_buffer_end;
×
1682
         return res;
×
1683
      }
1684
   }
×
1685

1686
   if (s->img_buffer+n <= s->img_buffer_end) {
9,558!
1687
      memcpy(buffer, s->img_buffer, n);
9,558✔
1688
      s->img_buffer += n;
9,558✔
1689
      return 1;
9,558✔
1690
   } else
1691
      return 0;
1692
}
1693
#endif
1694

1695
#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1696
// nothing
1697
#else
1698
static int stbi__get16be(stbi__context *s)
15,741✔
1699
{
1700
   int z = stbi__get8(s);
15,741✔
1701
   return (z << 8) + stbi__get8(s);
15,741✔
1702
}
1703
#endif
1704

1705
#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC)
1706
// nothing
1707
#else
1708
static stbi__uint32 stbi__get32be(stbi__context *s)
7,506✔
1709
{
1710
   stbi__uint32 z = stbi__get16be(s);
7,506✔
1711
   return (z << 16) + stbi__get16be(s);
7,506✔
1712
}
1713
#endif
1714

1715
#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1716
// nothing
1717
#else
1718
static int stbi__get16le(stbi__context *s)
372✔
1719
{
1720
   int z = stbi__get8(s);
372✔
1721
   return z + (stbi__get8(s) << 8);
372✔
1722
}
1723
#endif
1724

1725
#ifndef STBI_NO_BMP
1726
static stbi__uint32 stbi__get32le(stbi__context *s)
105✔
1727
{
1728
   stbi__uint32 z = stbi__get16le(s);
105✔
1729
   z += (stbi__uint32)stbi__get16le(s) << 16;
105✔
1730
   return z;
105✔
1731
}
1732
#endif
1733

1734
#define STBI__BYTECAST(x)  ((stbi_uc) ((x) & 255))  // truncate int to byte without warnings
1735

1736
#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)
1737
// nothing
1738
#else
1739
//////////////////////////////////////////////////////////////////////////////
1740
//
1741
//  generic converter from built-in img_n to req_comp
1742
//    individual types do this automatically as much as possible (e.g. jpeg
1743
//    does all cases internally since it needs to colorspace convert anyway,
1744
//    and it never has alpha, so very few cases ). png can automatically
1745
//    interleave an alpha=255 channel, but falls back to this for other cases
1746
//
1747
//  assume data buffer is malloced, so malloc a new one and free that one
1748
//  only failure mode is malloc failing
1749

1750
static stbi_uc stbi__compute_y(int r, int g, int b)
×
1751
{
1752
   return (stbi_uc) (((r*77) + (g*150) +  (29*b)) >> 8);
×
1753
}
1754
#endif
1755

1756
#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)
1757
// nothing
1758
#else
1759
static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
120✔
1760
{
1761
   int i,j;
120✔
1762
   unsigned char *good;
120✔
1763

1764
   if (data == NULL) return data;
120!
1765
   if (req_comp == img_n) return data;
120!
1766
   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
120!
1767

1768
   good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);
120✔
1769
   if (good == NULL) {
120!
1770
      STBI_FREE(data);
×
1771
      return stbi__errpuc("outofmem", "Out of memory");
×
1772
   }
1773

1774
   for (j=0; j < (int) y; ++j) {
9,648!
1775
      unsigned char *src  = data + j * x * img_n   ;
9,528✔
1776
      unsigned char *dest = good + j * x * req_comp;
9,528✔
1777

1778
      #define STBI__COMBO(a,b)  ((a)*8+(b))
1779
      #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1780
      // convert source image with img_n components to one with req_comp components;
1781
      // avoid switch per pixel, so use switch per scanline and massive macros
1782
      switch (STBI__COMBO(img_n, req_comp)) {
9,528!
1783
         STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255;                                     } break;
×
1784
         STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } break;
4,868,100!
1785
         STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255;                     } break;
×
1786
         STBI__CASE(2,1) { dest[0]=src[0];                                                  } break;
×
1787
         STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                  } break;
×
1788
         STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                  } break;
×
1789
         STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255;        } break;
×
1790
         STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } break;
×
1791
         STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255;    } break;
×
1792
         STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]);                   } break;
×
1793
         STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;
×
1794
         STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                    } break;
134,232!
1795
         default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion");
×
1796
      }
1797
      #undef STBI__CASE
1798
   }
1799

1800
   STBI_FREE(data);
120✔
1801
   return good;
120✔
1802
}
1803
#endif
1804

1805
#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1806
// nothing
1807
#else
1808
static stbi__uint16 stbi__compute_y_16(int r, int g, int b)
×
1809
{
1810
   return (stbi__uint16) (((r*77) + (g*150) +  (29*b)) >> 8);
×
1811
}
1812
#endif
1813

1814
#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD)
1815
// nothing
1816
#else
1817
static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)
×
1818
{
1819
   int i,j;
×
1820
   stbi__uint16 *good;
×
1821

1822
   if (req_comp == img_n) return data;
×
1823
   STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
×
1824

1825
   good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);
×
1826
   if (good == NULL) {
×
1827
      STBI_FREE(data);
×
1828
      return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");
×
1829
   }
1830

1831
   for (j=0; j < (int) y; ++j) {
×
1832
      stbi__uint16 *src  = data + j * x * img_n   ;
×
1833
      stbi__uint16 *dest = good + j * x * req_comp;
×
1834

1835
      #define STBI__COMBO(a,b)  ((a)*8+(b))
1836
      #define STBI__CASE(a,b)   case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1837
      // convert source image with img_n components to one with req_comp components;
1838
      // avoid switch per pixel, so use switch per scanline and massive macros
1839
      switch (STBI__COMBO(img_n, req_comp)) {
×
1840
         STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff;                                     } break;
×
1841
         STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } break;
×
1842
         STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff;                     } break;
×
1843
         STBI__CASE(2,1) { dest[0]=src[0];                                                     } break;
×
1844
         STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0];                                     } break;
×
1845
         STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1];                     } break;
×
1846
         STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff;        } break;
×
1847
         STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;
×
1848
         STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;
×
1849
         STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]);                   } break;
×
1850
         STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;
×
1851
         STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];                       } break;
×
1852
         default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion");
×
1853
      }
1854
      #undef STBI__CASE
1855
   }
1856

1857
   STBI_FREE(data);
×
1858
   return good;
×
1859
}
1860
#endif
1861

1862
#ifndef STBI_NO_LINEAR
1863
static float   *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
×
1864
{
1865
   int i,k,n;
×
1866
   float *output;
×
1867
   if (!data) return NULL;
×
1868
   output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0);
×
1869
   if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); }
×
1870
   // compute number of non-alpha components
1871
   if (comp & 1) n = comp; else n = comp-1;
×
1872
   for (i=0; i < x*y; ++i) {
×
1873
      for (k=0; k < n; ++k) {
×
1874
         output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
×
1875
      }
1876
   }
1877
   if (n < comp) {
×
1878
      for (i=0; i < x*y; ++i) {
×
1879
         output[i*comp + n] = data[i*comp + n]/255.0f;
×
1880
      }
1881
   }
1882
   STBI_FREE(data);
×
1883
   return output;
×
1884
}
1885
#endif
1886

1887
#ifndef STBI_NO_HDR
1888
#define stbi__float2int(x)   ((int) (x))
1889
static stbi_uc *stbi__hdr_to_ldr(float   *data, int x, int y, int comp)
×
1890
{
1891
   int i,k,n;
×
1892
   stbi_uc *output;
×
1893
   if (!data) return NULL;
×
1894
   output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);
×
1895
   if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); }
×
1896
   // compute number of non-alpha components
1897
   if (comp & 1) n = comp; else n = comp-1;
×
1898
   for (i=0; i < x*y; ++i) {
×
1899
      for (k=0; k < n; ++k) {
×
1900
         float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
×
1901
         if (z < 0) z = 0;
×
1902
         if (z > 255) z = 255;
×
1903
         output[i*comp + k] = (stbi_uc) stbi__float2int(z);
×
1904
      }
1905
      if (k < comp) {
×
1906
         float z = data[i*comp+k] * 255 + 0.5f;
×
1907
         if (z < 0) z = 0;
×
1908
         if (z > 255) z = 255;
×
1909
         output[i*comp + k] = (stbi_uc) stbi__float2int(z);
×
1910
      }
1911
   }
1912
   STBI_FREE(data);
×
1913
   return output;
×
1914
}
1915
#endif
1916

1917
//////////////////////////////////////////////////////////////////////////////
1918
//
1919
//  "baseline" JPEG/JFIF decoder
1920
//
1921
//    simple implementation
1922
//      - doesn't support delayed output of y-dimension
1923
//      - simple interface (only one output format: 8-bit interleaved RGB)
1924
//      - doesn't try to recover corrupt jpegs
1925
//      - doesn't allow partial loading, loading multiple at once
1926
//      - still fast on x86 (copying globals into locals doesn't help x86)
1927
//      - allocates lots of intermediate memory (full size of all components)
1928
//        - non-interleaved case requires this anyway
1929
//        - allows good upsampling (see next)
1930
//    high-quality
1931
//      - upsampled channels are bilinearly interpolated, even across blocks
1932
//      - quality integer IDCT derived from IJG's 'slow'
1933
//    performance
1934
//      - fast huffman; reasonable integer IDCT
1935
//      - some SIMD kernels for common paths on targets with SSE2/NEON
1936
//      - uses a lot of intermediate memory, could cache poorly
1937

1938
#ifndef STBI_NO_JPEG
1939

1940
// huffman decoding acceleration
1941
#define FAST_BITS   9  // larger handles more cases; smaller stomps less cache
1942

1943
typedef struct
1944
{
1945
   stbi_uc  fast[1 << FAST_BITS];
1946
   // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
1947
   stbi__uint16 code[256];
1948
   stbi_uc  values[256];
1949
   stbi_uc  size[257];
1950
   unsigned int maxcode[18];
1951
   int    delta[17];   // old 'firstsymbol' - old 'firstcode'
1952
} stbi__huffman;
1953

1954
typedef struct
1955
{
1956
   stbi__context *s;
1957
   stbi__huffman huff_dc[4];
1958
   stbi__huffman huff_ac[4];
1959
   stbi__uint16 dequant[4][64];
1960
   stbi__int16 fast_ac[4][1 << FAST_BITS];
1961

1962
// sizes for components, interleaved MCUs
1963
   int img_h_max, img_v_max;
1964
   int img_mcu_x, img_mcu_y;
1965
   int img_mcu_w, img_mcu_h;
1966

1967
// definition of jpeg image component
1968
   struct
1969
   {
1970
      int id;
1971
      int h,v;
1972
      int tq;
1973
      int hd,ha;
1974
      int dc_pred;
1975

1976
      int x,y,w2,h2;
1977
      stbi_uc *data;
1978
      void *raw_data, *raw_coeff;
1979
      stbi_uc *linebuf;
1980
      short   *coeff;   // progressive only
1981
      int      coeff_w, coeff_h; // number of 8x8 coefficient blocks
1982
   } img_comp[4];
1983

1984
   stbi__uint32   code_buffer; // jpeg entropy-coded buffer
1985
   int            code_bits;   // number of valid bits
1986
   unsigned char  marker;      // marker seen while filling entropy buffer
1987
   int            nomore;      // flag if we saw a marker so must stop
1988

1989
   int            progressive;
1990
   int            spec_start;
1991
   int            spec_end;
1992
   int            succ_high;
1993
   int            succ_low;
1994
   int            eob_run;
1995
   int            jfif;
1996
   int            app14_color_transform; // Adobe APP14 tag
1997
   int            rgb;
1998

1999
   int scan_n, order[4];
2000
   int restart_interval, todo;
2001

2002
// kernels
2003
   void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);
2004
   void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);
2005
   stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);
2006
} stbi__jpeg;
2007

2008
static int stbi__build_huffman(stbi__huffman *h, int *count)
264✔
2009
{
2010
   int i,j,k=0;
264✔
2011
   unsigned int code;
264✔
2012
   // build size list for each symbol (from JPEG spec)
2013
   for (i=0; i < 16; ++i) {
4,488!
2014
      for (j=0; j < count[i]; ++j) {
9,909!
2015
         h->size[k++] = (stbi_uc) (i+1);
5,685✔
2016
         if(k >= 257) return stbi__err("bad size list","Corrupt JPEG");
5,685!
2017
      }
2018
   }
2019
   h->size[k] = 0;
264✔
2020

2021
   // compute actual symbols (from jpeg spec)
2022
   code = 0;
264✔
2023
   k = 0;
264✔
2024
   for(j=1; j <= 16; ++j) {
4,488!
2025
      // compute delta to add to code to compute symbol id
2026
      h->delta[j] = k - code;
4,224✔
2027
      if (h->size[k] == j) {
4,224!
2028
         while (h->size[k] == j)
8,058!
2029
            h->code[k++] = (stbi__uint16) (code++);
5,685✔
2030
         if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG");
2,373!
2031
      }
2032
      // compute largest code + 1 for this size, preshifted as needed later
2033
      h->maxcode[j] = code << (16-j);
4,224✔
2034
      code <<= 1;
4,224✔
2035
   }
2036
   h->maxcode[j] = 0xffffffff;
264✔
2037

2038
   // build non-spec acceleration table; 255 is flag for not-accelerated
2039
   memset(h->fast, 255, 1 << FAST_BITS);
264✔
2040
   for (i=0; i < k; ++i) {
5,949!
2041
      int s = h->size[i];
5,685✔
2042
      if (s <= FAST_BITS) {
5,685!
2043
         int c = h->code[i] << (FAST_BITS-s);
3,636✔
2044
         int m = 1 << (FAST_BITS-s);
3,636✔
2045
         for (j=0; j < m; ++j) {
137,031!
2046
            h->fast[c+j] = (stbi_uc) i;
133,395✔
2047
         }
2048
      }
2049
   }
2050
   return 1;
2051
}
2052

2053
// build a table that decodes both magnitude and value of small ACs in
2054
// one go.
2055
static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
141✔
2056
{
2057
   int i;
141✔
2058
   for (i=0; i < (1 << FAST_BITS); ++i) {
72,333!
2059
      stbi_uc fast = h->fast[i];
72,192✔
2060
      fast_ac[i] = 0;
72,192✔
2061
      if (fast < 255) {
72,192!
2062
         int rs = h->values[fast];
71,829✔
2063
         int run = (rs >> 4) & 15;
71,829✔
2064
         int magbits = rs & 15;
71,829✔
2065
         int len = h->size[fast];
71,829✔
2066

2067
         if (magbits && len + magbits <= FAST_BITS) {
71,829!
2068
            // magnitude code followed by receive_extend code
2069
            int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
54,510✔
2070
            int m = 1 << (magbits - 1);
54,510✔
2071
            if (k < m) k += (~0U << magbits) + 1;
54,510!
2072
            // if the result is small enough, we can fit it in fast_ac table
2073
            if (k >= -128 && k <= 127)
54,510!
2074
               fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));
54,510✔
2075
         }
2076
      }
2077
   }
2078
}
141✔
2079

2080
static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1,159,791✔
2081
{
2082
   do {
2,389,428✔
2083
      unsigned int b = j->nomore ? 0 : stbi__get8(j->s);
2,389,428!
2084
      if (b == 0xff) {
2,389,272!
2085
         int c = stbi__get8(j->s);
7,326✔
2086
         while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes
7,326!
2087
         if (c != 0) {
7,326!
2088
            j->marker = (unsigned char) c;
84✔
2089
            j->nomore = 1;
84✔
2090
            return;
84✔
2091
         }
2092
      }
×
2093
      j->code_buffer |= b << (24 - j->code_bits);
2,389,344✔
2094
      j->code_bits += 8;
2,389,344✔
2095
   } while (j->code_bits <= 24);
2,389,344!
2096
}
2097

2098
// (1 << n) - 1
2099
static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
2100

2101
// decode a jpeg huffman value from the bitstream
2102
stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1,775,589✔
2103
{
2104
   unsigned int temp;
1,775,589✔
2105
   int c,k;
1,775,589✔
2106

2107
   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1,775,589!
2108

2109
   // look at the top FAST_BITS and determine what symbol ID it is,
2110
   // if the code is <= FAST_BITS
2111
   c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1,775,589✔
2112
   k = h->fast[c];
1,775,589✔
2113
   if (k < 255) {
1,775,589!
2114
      int s = h->size[k];
1,759,770✔
2115
      if (s > j->code_bits)
1,759,770!
2116
         return -1;
2117
      j->code_buffer <<= s;
1,759,770✔
2118
      j->code_bits -= s;
1,759,770✔
2119
      return h->values[k];
1,759,770✔
2120
   }
2121

2122
   // naive test is to shift the code_buffer down so k bits are
2123
   // valid, then test against maxcode. To speed this up, we've
2124
   // preshifted maxcode left so that it has (16-k) 0s at the
2125
   // end; in other words, regardless of the number of bits, it
2126
   // wants to be compared against something shifted to have 16;
2127
   // that way we don't need to shift inside the loop.
2128
   temp = j->code_buffer >> 16;
15,819✔
2129
   for (k=FAST_BITS+1 ; ; ++k)
29,259✔
2130
      if (temp < h->maxcode[k])
29,259!
2131
         break;
2132
   if (k == 17) {
15,819!
2133
      // error! code not found
2134
      j->code_bits -= 16;
×
2135
      return -1;
×
2136
   }
2137

2138
   if (k > j->code_bits)
15,819!
2139
      return -1;
2140

2141
   // convert the huffman code to the symbol id
2142
   c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
15,819✔
2143
   if(c < 0 || c >= 256) // symbol id out of bounds!
15,819!
2144
       return -1;
2145
   STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
15,819!
2146

2147
   // convert the id to a symbol
2148
   j->code_bits -= k;
15,819✔
2149
   j->code_buffer <<= k;
15,819✔
2150
   return h->values[c];
15,819✔
2151
}
2152

2153
// bias[n] = (-1<<n) + 1
2154
static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
2155

2156
// combined JPEG 'receive' and JPEG 'extend', since baseline
2157
// always extends everything it receives.
2158
stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
748,665✔
2159
{
2160
   unsigned int k;
748,665✔
2161
   int sgn;
748,665✔
2162
   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
748,665!
2163
   if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing
748,665!
2164

2165
   sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative)
748,665✔
2166
   k = stbi_lrot(j->code_buffer, n);
748,665✔
2167
   j->code_buffer = k & ~stbi__bmask[n];
748,665✔
2168
   k &= stbi__bmask[n];
748,665✔
2169
   j->code_bits -= n;
748,665✔
2170
   return k + (stbi__jbias[n] & (sgn - 1));
748,665✔
2171
}
2172

2173
// get some unsigned bits
2174
stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)
9,153✔
2175
{
2176
   unsigned int k;
9,153✔
2177
   if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
9,153!
2178
   if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing
9,153!
2179
   k = stbi_lrot(j->code_buffer, n);
9,153✔
2180
   j->code_buffer = k & ~stbi__bmask[n];
9,153✔
2181
   k &= stbi__bmask[n];
9,153✔
2182
   j->code_bits -= n;
9,153✔
2183
   return k;
9,153✔
2184
}
2185

2186
stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
206,313✔
2187
{
2188
   unsigned int k;
206,313✔
2189
   if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
206,313!
2190
   if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing
206,313!
2191
   k = j->code_buffer;
206,313✔
2192
   j->code_buffer <<= 1;
206,313✔
2193
   --j->code_bits;
206,313✔
2194
   return k & 0x80000000;
206,313✔
2195
}
2196

2197
// given a value that's at position X in the zigzag stream,
2198
// where does it appear in the 8x8 matrix coded as row-major?
2199
static const stbi_uc stbi__jpeg_dezigzag[64+15] =
2200
{
2201
    0,  1,  8, 16,  9,  2,  3, 10,
2202
   17, 24, 32, 25, 18, 11,  4,  5,
2203
   12, 19, 26, 33, 40, 48, 41, 34,
2204
   27, 20, 13,  6,  7, 14, 21, 28,
2205
   35, 42, 49, 56, 57, 50, 43, 36,
2206
   29, 22, 15, 23, 30, 37, 44, 51,
2207
   58, 59, 52, 45, 38, 31, 39, 46,
2208
   53, 60, 61, 54, 47, 55, 62, 63,
2209
   // let corrupt input sample past end
2210
   63, 63, 63, 63, 63, 63, 63, 63,
2211
   63, 63, 63, 63, 63, 63, 63
2212
};
2213

2214
// decode one 64-entry block--
2215
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)
725,211✔
2216
{
2217
   int diff,dc,k;
725,211✔
2218
   int t;
725,211✔
2219

2220
   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
725,211!
2221
   t = stbi__jpeg_huff_decode(j, hdc);
725,211✔
2222
   if (t < 0 || t > 15) return stbi__err("bad huffman code","Corrupt JPEG");
725,211!
2223

2224
   // 0 all the ac values now so we can do it 32-bits at a time
2225
   memset(data,0,64*sizeof(data[0]));
725,211✔
2226

2227
   diff = t ? stbi__extend_receive(j, t) : 0;
725,211!
2228
   if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG");
725,211!
2229
   dc = j->img_comp[b].dc_pred + diff;
725,211✔
2230
   j->img_comp[b].dc_pred = dc;
725,211✔
2231
   if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
725,211!
2232
   data[0] = (short) (dc * dequant[0]);
725,211✔
2233

2234
   // decode AC components, see JPEG spec
2235
   k = 1;
725,211✔
2236
   do {
3,237,030✔
2237
      unsigned int zig;
3,237,030✔
2238
      int c,r,s;
3,237,030✔
2239
      if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
3,237,030!
2240
      c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
3,237,030✔
2241
      r = fac[c];
3,237,030✔
2242
      if (r) { // fast-AC path
3,237,030!
2243
         k += (r >> 4) & 15; // run
2,367,774✔
2244
         s = r & 15; // combined length
2,367,774✔
2245
         if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available");
2,367,774!
2246
         j->code_buffer <<= s;
2,367,774✔
2247
         j->code_bits -= s;
2,367,774✔
2248
         // decode into unzigzag'd location
2249
         zig = stbi__jpeg_dezigzag[k++];
2,367,774✔
2250
         data[zig] = (short) ((r >> 8) * dequant[zig]);
2,367,774✔
2251
      } else {
2252
         int rs = stbi__jpeg_huff_decode(j, hac);
869,256✔
2253
         if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
869,256!
2254
         s = rs & 15;
869,256✔
2255
         r = rs >> 4;
869,256✔
2256
         if (s == 0) {
869,256!
2257
            if (rs != 0xf0) break; // end block
725,595!
2258
            k += 16;
387✔
2259
         } else {
2260
            k += r;
143,661✔
2261
            // decode into unzigzag'd location
2262
            zig = stbi__jpeg_dezigzag[k++];
143,661✔
2263
            data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
143,661✔
2264
         }
2265
      }
×
2266
   } while (k < 64);
2,511,822!
2267
   return 1;
2268
}
2269

2270
static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)
76,950✔
2271
{
2272
   int diff,dc;
76,950✔
2273
   int t;
76,950✔
2274
   if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
76,950!
2275

2276
   if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
76,950!
2277

2278
   if (j->succ_high == 0) {
76,950!
2279
      // first scan for DC coefficient, must be first
2280
      memset(data,0,64*sizeof(data[0])); // 0 all the ac values now
38,475✔
2281
      t = stbi__jpeg_huff_decode(j, hdc);
38,475✔
2282
      if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
38,475!
2283
      diff = t ? stbi__extend_receive(j, t) : 0;
38,475!
2284

2285
      if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG");
38,475!
2286
      dc = j->img_comp[b].dc_pred + diff;
38,475✔
2287
      j->img_comp[b].dc_pred = dc;
38,475✔
2288
      if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
38,475!
2289
      data[0] = (short) (dc * (1 << j->succ_low));
38,475✔
2290
   } else {
2291
      // refinement scan for DC coefficient
2292
      if (stbi__jpeg_get_bit(j))
38,475!
2293
         data[0] += (short) (1 << j->succ_low);
20,517✔
2294
   }
2295
   return 1;
2296
}
2297

2298
// @OPTIMIZE: store non-zigzagged during the decode passes,
2299
// and only de-zigzag when dequantizing
2300
static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)
102,600✔
2301
{
2302
   int k;
102,600✔
2303
   if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
102,600!
2304

2305
   if (j->succ_high == 0) {
102,600!
2306
      int shift = j->succ_low;
51,300✔
2307

2308
      if (j->eob_run) {
51,300!
2309
         --j->eob_run;
33,582✔
2310
         return 1;
33,582✔
2311
      }
2312

2313
      k = j->spec_start;
2314
      do {
56,523✔
2315
         unsigned int zig;
56,523✔
2316
         int c,r,s;
56,523✔
2317
         if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
56,523!
2318
         c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
56,523✔
2319
         r = fac[c];
56,523✔
2320
         if (r) { // fast-AC path
56,523!
2321
            k += (r >> 4) & 15; // run
39,948✔
2322
            s = r & 15; // combined length
39,948✔
2323
            if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available");
39,948!
2324
            j->code_buffer <<= s;
39,948✔
2325
            j->code_bits -= s;
39,948✔
2326
            zig = stbi__jpeg_dezigzag[k++];
39,948✔
2327
            data[zig] = (short) ((r >> 8) * (1 << shift));
39,948✔
2328
         } else {
2329
            int rs = stbi__jpeg_huff_decode(j, hac);
16,575✔
2330
            if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
16,575!
2331
            s = rs & 15;
16,575✔
2332
            r = rs >> 4;
16,575✔
2333
            if (s == 0) {
16,575!
2334
               if (r < 15) {
15,732!
2335
                  j->eob_run = (1 << r);
15,732✔
2336
                  if (r)
15,732!
2337
                     j->eob_run += stbi__jpeg_get_bits(j, r);
3,156✔
2338
                  --j->eob_run;
15,732✔
2339
                  break;
15,732✔
2340
               }
2341
               k += 16;
×
2342
            } else {
2343
               k += r;
843✔
2344
               zig = stbi__jpeg_dezigzag[k++];
843✔
2345
               data[zig] = (short) (stbi__extend_receive(j,s) * (1 << shift));
843✔
2346
            }
2347
         }
×
2348
      } while (k <= j->spec_end);
40,791!
2349
   } else {
×
2350
      // refinement scan for these AC coefficients
2351

2352
      short bit = (short) (1 << j->succ_low);
51,300✔
2353

2354
      if (j->eob_run) {
51,300!
2355
         --j->eob_run;
15,945✔
2356
         for (k = j->spec_start; k <= j->spec_end; ++k) {
1,020,480!
2357
            short *p = &data[stbi__jpeg_dezigzag[k]];
1,004,535✔
2358
            if (*p != 0)
1,004,535!
2359
               if (stbi__jpeg_get_bit(j))
3,843!
2360
                  if ((*p & bit)==0) {
1,206!
2361
                     if (*p > 0)
1,206!
2362
                        *p += bit;
645✔
2363
                     else
2364
                        *p -= bit;
561✔
2365
                  }
2366
         }
2367
      } else {
2368
         k = j->spec_start;
2369
         do {
126,072✔
2370
            int r,s;
126,072✔
2371
            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
126,072✔
2372
            if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
126,072!
2373
            s = rs & 15;
126,072✔
2374
            r = rs >> 4;
126,072✔
2375
            if (s == 0) {
126,072!
2376
               if (r < 15) {
35,385!
2377
                  j->eob_run = (1 << r) - 1;
35,355✔
2378
                  if (r)
35,355!
2379
                     j->eob_run += stbi__jpeg_get_bits(j, r);
5,997✔
2380
                  r = 64; // force end of block
126,072✔
2381
               } else {
2382
                  // r=15 s=0 should write 16 0s, so we just do
2383
                  // a run of 15 0s and then write s (which is 0),
2384
                  // so we don't have to do anything special here
2385
               }
2386
            } else {
2387
               if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG");
90,687!
2388
               // sign bit
2389
               if (stbi__jpeg_get_bit(j))
90,687!
2390
                  s = bit;
44,850✔
2391
               else
2392
                  s = -bit;
45,837✔
2393
            }
2394

2395
            // advance by r
2396
            while (k <= j->spec_end) {
2,262,720!
2397
               short *p = &data[stbi__jpeg_dezigzag[k++]];
2,227,365✔
2398
               if (*p != 0) {
2,227,365!
2399
                  if (stbi__jpeg_get_bit(j))
73,308!
2400
                     if ((*p & bit)==0) {
28,653!
2401
                        if (*p > 0)
28,653!
2402
                           *p += bit;
14,394✔
2403
                        else
2404
                           *p -= bit;
14,259✔
2405
                     }
2406
               } else {
2407
                  if (r == 0) {
2,154,057!
2408
                     *p = (short) s;
90,717✔
2409
                     break;
90,717✔
2410
                  }
2411
                  --r;
2,063,340✔
2412
               }
2413
            }
×
2414
         } while (k <= j->spec_end);
126,072!
2415
      }
2416
   }
×
2417
   return 1;
2418
}
2419

2420
// take a -128..127 value and stbi__clamp it and convert to 0..255
2421
stbi_inline static stbi_uc stbi__clamp(int x)
2422
{
2423
   // trick to use a single test to catch both cases
2424
   if ((unsigned int) x > 255) {
×
2425
      if (x < 0) return 0;
×
2426
      if (x > 255) return 255;
×
2427
   }
2428
   return (stbi_uc) x;
2429
}
2430

2431
#define stbi__f2f(x)  ((int) (((x) * 4096 + 0.5)))
2432
#define stbi__fsh(x)  ((x) * 4096)
2433

2434
// derived from jidctint -- DCT_ISLOW
2435
#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
2436
   int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
2437
   p2 = s2;                                    \
2438
   p3 = s6;                                    \
2439
   p1 = (p2+p3) * stbi__f2f(0.5411961f);       \
2440
   t2 = p1 + p3*stbi__f2f(-1.847759065f);      \
2441
   t3 = p1 + p2*stbi__f2f( 0.765366865f);      \
2442
   p2 = s0;                                    \
2443
   p3 = s4;                                    \
2444
   t0 = stbi__fsh(p2+p3);                      \
2445
   t1 = stbi__fsh(p2-p3);                      \
2446
   x0 = t0+t3;                                 \
2447
   x3 = t0-t3;                                 \
2448
   x1 = t1+t2;                                 \
2449
   x2 = t1-t2;                                 \
2450
   t0 = s7;                                    \
2451
   t1 = s5;                                    \
2452
   t2 = s3;                                    \
2453
   t3 = s1;                                    \
2454
   p3 = t0+t2;                                 \
2455
   p4 = t1+t3;                                 \
2456
   p1 = t0+t3;                                 \
2457
   p2 = t1+t2;                                 \
2458
   p5 = (p3+p4)*stbi__f2f( 1.175875602f);      \
2459
   t0 = t0*stbi__f2f( 0.298631336f);           \
2460
   t1 = t1*stbi__f2f( 2.053119869f);           \
2461
   t2 = t2*stbi__f2f( 3.072711026f);           \
2462
   t3 = t3*stbi__f2f( 1.501321110f);           \
2463
   p1 = p5 + p1*stbi__f2f(-0.899976223f);      \
2464
   p2 = p5 + p2*stbi__f2f(-2.562915447f);      \
2465
   p3 = p3*stbi__f2f(-1.961570560f);           \
2466
   p4 = p4*stbi__f2f(-0.390180644f);           \
2467
   t3 += p1+p4;                                \
2468
   t2 += p2+p3;                                \
2469
   t1 += p2+p4;                                \
2470
   t0 += p1+p3;
2471

2472
static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
2473
{
2474
   int i,val[64],*v=val;
2475
   stbi_uc *o;
2476
   short *d = data;
2477

2478
   // columns
2479
   for (i=0; i < 8; ++i,++d, ++v) {
×
2480
      // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
2481
      if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
×
2482
           && d[40]==0 && d[48]==0 && d[56]==0) {
×
2483
         //    no shortcut                 0     seconds
2484
         //    (1|2|3|4|5|6|7)==0          0     seconds
2485
         //    all separate               -0.047 seconds
2486
         //    1 && 2|3 && 4|5 && 6|7:    -0.047 seconds
2487
         int dcterm = d[0]*4;
2488
         v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
2489
      } else {
2490
         STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
2491
         // constants scaled things up by 1<<12; let's bring them back
2492
         // down, but keep 2 extra bits of precision
2493
         x0 += 512; x1 += 512; x2 += 512; x3 += 512;
2494
         v[ 0] = (x0+t3) >> 10;
2495
         v[56] = (x0-t3) >> 10;
2496
         v[ 8] = (x1+t2) >> 10;
2497
         v[48] = (x1-t2) >> 10;
2498
         v[16] = (x2+t1) >> 10;
2499
         v[40] = (x2-t1) >> 10;
2500
         v[24] = (x3+t0) >> 10;
2501
         v[32] = (x3-t0) >> 10;
2502
      }
2503
   }
2504

2505
   for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
×
2506
      // no fast case since the first 1D IDCT spread components out
2507
      STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
2508
      // constants scaled things up by 1<<12, plus we had 1<<2 from first
2509
      // loop, plus horizontal and vertical each scale by sqrt(8) so together
2510
      // we've got an extra 1<<3, so 1<<17 total we need to remove.
2511
      // so we want to round that, which means adding 0.5 * 1<<17,
2512
      // aka 65536. Also, we'll end up with -128 to 127 that we want
2513
      // to encode as 0..255 by adding 128, so we'll add that before the shift
2514
      x0 += 65536 + (128<<17);
2515
      x1 += 65536 + (128<<17);
2516
      x2 += 65536 + (128<<17);
2517
      x3 += 65536 + (128<<17);
2518
      // tried computing the shifts into temps, or'ing the temps to see
2519
      // if any were out of range, but that was slower
2520
      o[0] = stbi__clamp((x0+t3) >> 17);
2521
      o[7] = stbi__clamp((x0-t3) >> 17);
2522
      o[1] = stbi__clamp((x1+t2) >> 17);
2523
      o[6] = stbi__clamp((x1-t2) >> 17);
2524
      o[2] = stbi__clamp((x2+t1) >> 17);
2525
      o[5] = stbi__clamp((x2-t1) >> 17);
2526
      o[3] = stbi__clamp((x3+t0) >> 17);
2527
      o[4] = stbi__clamp((x3-t0) >> 17);
2528
   }
2529
}
2530

2531
#ifdef STBI_SSE2
2532
// sse2 integer IDCT. not the fastest possible implementation but it
2533
// produces bit-identical results to the generic C version so it's
2534
// fully "transparent".
2535
static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
763,686✔
2536
{
2537
   // This is constructed to match our regular (generic) integer IDCT exactly.
2538
   __m128i row0, row1, row2, row3, row4, row5, row6, row7;
763,686✔
2539
   __m128i tmp;
763,686✔
2540

2541
   // dot product constant: even elems=x, odd elems=y
2542
   #define dct_const(x,y)  _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2543

2544
   // out(0) = c0[even]*x + c0[odd]*y   (c0, x, y 16-bit, out 32-bit)
2545
   // out(1) = c1[even]*x + c1[odd]*y
2546
   #define dct_rot(out0,out1, x,y,c0,c1) \
2547
      __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2548
      __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2549
      __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2550
      __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2551
      __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2552
      __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2553

2554
   // out = in << 12  (in 16-bit, out 32-bit)
2555
   #define dct_widen(out, in) \
2556
      __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2557
      __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2558

2559
   // wide add
2560
   #define dct_wadd(out, a, b) \
2561
      __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2562
      __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2563

2564
   // wide sub
2565
   #define dct_wsub(out, a, b) \
2566
      __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2567
      __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2568

2569
   // butterfly a/b, add bias, then shift by "s" and pack
2570
   #define dct_bfly32o(out0, out1, a,b,bias,s) \
2571
      { \
2572
         __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2573
         __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2574
         dct_wadd(sum, abiased, b); \
2575
         dct_wsub(dif, abiased, b); \
2576
         out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2577
         out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2578
      }
2579

2580
   // 8-bit interleave step (for transposes)
2581
   #define dct_interleave8(a, b) \
2582
      tmp = a; \
2583
      a = _mm_unpacklo_epi8(a, b); \
2584
      b = _mm_unpackhi_epi8(tmp, b)
2585

2586
   // 16-bit interleave step (for transposes)
2587
   #define dct_interleave16(a, b) \
2588
      tmp = a; \
2589
      a = _mm_unpacklo_epi16(a, b); \
2590
      b = _mm_unpackhi_epi16(tmp, b)
2591

2592
   #define dct_pass(bias,shift) \
2593
      { \
2594
         /* even part */ \
2595
         dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2596
         __m128i sum04 = _mm_add_epi16(row0, row4); \
2597
         __m128i dif04 = _mm_sub_epi16(row0, row4); \
2598
         dct_widen(t0e, sum04); \
2599
         dct_widen(t1e, dif04); \
2600
         dct_wadd(x0, t0e, t3e); \
2601
         dct_wsub(x3, t0e, t3e); \
2602
         dct_wadd(x1, t1e, t2e); \
2603
         dct_wsub(x2, t1e, t2e); \
2604
         /* odd part */ \
2605
         dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2606
         dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2607
         __m128i sum17 = _mm_add_epi16(row1, row7); \
2608
         __m128i sum35 = _mm_add_epi16(row3, row5); \
2609
         dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2610
         dct_wadd(x4, y0o, y4o); \
2611
         dct_wadd(x5, y1o, y5o); \
2612
         dct_wadd(x6, y2o, y5o); \
2613
         dct_wadd(x7, y3o, y4o); \
2614
         dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2615
         dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2616
         dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2617
         dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2618
      }
2619

2620
   __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
763,686✔
2621
   __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
763,686✔
2622
   __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
763,686✔
2623
   __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
763,686✔
2624
   __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
763,686✔
2625
   __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
763,686✔
2626
   __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
763,686✔
2627
   __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
763,686✔
2628

2629
   // rounding biases in column/row passes, see stbi__idct_block for explanation.
2630
   __m128i bias_0 = _mm_set1_epi32(512);
763,686✔
2631
   __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
763,686✔
2632

2633
   // load
2634
   row0 = _mm_load_si128((const __m128i *) (data + 0*8));
763,686✔
2635
   row1 = _mm_load_si128((const __m128i *) (data + 1*8));
763,686✔
2636
   row2 = _mm_load_si128((const __m128i *) (data + 2*8));
763,686✔
2637
   row3 = _mm_load_si128((const __m128i *) (data + 3*8));
763,686✔
2638
   row4 = _mm_load_si128((const __m128i *) (data + 4*8));
763,686✔
2639
   row5 = _mm_load_si128((const __m128i *) (data + 5*8));
763,686✔
2640
   row6 = _mm_load_si128((const __m128i *) (data + 6*8));
763,686✔
2641
   row7 = _mm_load_si128((const __m128i *) (data + 7*8));
763,686✔
2642

2643
   // column pass
2644
   dct_pass(bias_0, 10);
763,686✔
2645

2646
   {
2647
      // 16bit 8x8 transpose pass 1
2648
      dct_interleave16(row0, row4);
763,686✔
2649
      dct_interleave16(row1, row5);
763,686✔
2650
      dct_interleave16(row2, row6);
763,686✔
2651
      dct_interleave16(row3, row7);
763,686✔
2652

2653
      // transpose pass 2
2654
      dct_interleave16(row0, row2);
763,686✔
2655
      dct_interleave16(row1, row3);
763,686✔
2656
      dct_interleave16(row4, row6);
763,686✔
2657
      dct_interleave16(row5, row7);
763,686✔
2658

2659
      // transpose pass 3
2660
      dct_interleave16(row0, row1);
763,686✔
2661
      dct_interleave16(row2, row3);
763,686✔
2662
      dct_interleave16(row4, row5);
763,686✔
2663
      dct_interleave16(row6, row7);
763,686✔
2664
   }
2665

2666
   // row pass
2667
   dct_pass(bias_1, 17);
763,686✔
2668

2669
   {
2670
      // pack
2671
      __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7
763,686✔
2672
      __m128i p1 = _mm_packus_epi16(row2, row3);
763,686✔
2673
      __m128i p2 = _mm_packus_epi16(row4, row5);
763,686✔
2674
      __m128i p3 = _mm_packus_epi16(row6, row7);
763,686✔
2675

2676
      // 8bit 8x8 transpose pass 1
2677
      dct_interleave8(p0, p2); // a0e0a1e1...
763,686✔
2678
      dct_interleave8(p1, p3); // c0g0c1g1...
763,686✔
2679

2680
      // transpose pass 2
2681
      dct_interleave8(p0, p1); // a0c0e0g0...
763,686✔
2682
      dct_interleave8(p2, p3); // b0d0f0h0...
763,686✔
2683

2684
      // transpose pass 3
2685
      dct_interleave8(p0, p2); // a0b0c0d0...
763,686✔
2686
      dct_interleave8(p1, p3); // a4b4c4d4...
763,686✔
2687

2688
      // store
2689
      _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
763,686✔
2690
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
763,686✔
2691
      _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
763,686✔
2692
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
763,686✔
2693
      _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
763,686✔
2694
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
763,686✔
2695
      _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
763,686✔
2696
      _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
763,686✔
2697
   }
2698

2699
#undef dct_const
2700
#undef dct_rot
2701
#undef dct_widen
2702
#undef dct_wadd
2703
#undef dct_wsub
2704
#undef dct_bfly32o
2705
#undef dct_interleave8
2706
#undef dct_interleave16
2707
#undef dct_pass
2708
}
763,686✔
2709

2710
#endif // STBI_SSE2
2711

2712
#ifdef STBI_NEON
2713

2714
// NEON integer IDCT. should produce bit-identical
2715
// results to the generic C version.
2716
static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
2717
{
2718
   int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2719

2720
   int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2721
   int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2722
   int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2723
   int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2724
   int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2725
   int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2726
   int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2727
   int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2728
   int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2729
   int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2730
   int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2731
   int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2732

2733
#define dct_long_mul(out, inq, coeff) \
2734
   int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2735
   int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2736

2737
#define dct_long_mac(out, acc, inq, coeff) \
2738
   int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2739
   int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2740

2741
#define dct_widen(out, inq) \
2742
   int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2743
   int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2744

2745
// wide add
2746
#define dct_wadd(out, a, b) \
2747
   int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2748
   int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2749

2750
// wide sub
2751
#define dct_wsub(out, a, b) \
2752
   int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2753
   int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2754

2755
// butterfly a/b, then shift using "shiftop" by "s" and pack
2756
#define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2757
   { \
2758
      dct_wadd(sum, a, b); \
2759
      dct_wsub(dif, a, b); \
2760
      out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2761
      out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2762
   }
2763

2764
#define dct_pass(shiftop, shift) \
2765
   { \
2766
      /* even part */ \
2767
      int16x8_t sum26 = vaddq_s16(row2, row6); \
2768
      dct_long_mul(p1e, sum26, rot0_0); \
2769
      dct_long_mac(t2e, p1e, row6, rot0_1); \
2770
      dct_long_mac(t3e, p1e, row2, rot0_2); \
2771
      int16x8_t sum04 = vaddq_s16(row0, row4); \
2772
      int16x8_t dif04 = vsubq_s16(row0, row4); \
2773
      dct_widen(t0e, sum04); \
2774
      dct_widen(t1e, dif04); \
2775
      dct_wadd(x0, t0e, t3e); \
2776
      dct_wsub(x3, t0e, t3e); \
2777
      dct_wadd(x1, t1e, t2e); \
2778
      dct_wsub(x2, t1e, t2e); \
2779
      /* odd part */ \
2780
      int16x8_t sum15 = vaddq_s16(row1, row5); \
2781
      int16x8_t sum17 = vaddq_s16(row1, row7); \
2782
      int16x8_t sum35 = vaddq_s16(row3, row5); \
2783
      int16x8_t sum37 = vaddq_s16(row3, row7); \
2784
      int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2785
      dct_long_mul(p5o, sumodd, rot1_0); \
2786
      dct_long_mac(p1o, p5o, sum17, rot1_1); \
2787
      dct_long_mac(p2o, p5o, sum35, rot1_2); \
2788
      dct_long_mul(p3o, sum37, rot2_0); \
2789
      dct_long_mul(p4o, sum15, rot2_1); \
2790
      dct_wadd(sump13o, p1o, p3o); \
2791
      dct_wadd(sump24o, p2o, p4o); \
2792
      dct_wadd(sump23o, p2o, p3o); \
2793
      dct_wadd(sump14o, p1o, p4o); \
2794
      dct_long_mac(x4, sump13o, row7, rot3_0); \
2795
      dct_long_mac(x5, sump24o, row5, rot3_1); \
2796
      dct_long_mac(x6, sump23o, row3, rot3_2); \
2797
      dct_long_mac(x7, sump14o, row1, rot3_3); \
2798
      dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2799
      dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2800
      dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2801
      dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2802
   }
2803

2804
   // load
2805
   row0 = vld1q_s16(data + 0*8);
2806
   row1 = vld1q_s16(data + 1*8);
2807
   row2 = vld1q_s16(data + 2*8);
2808
   row3 = vld1q_s16(data + 3*8);
2809
   row4 = vld1q_s16(data + 4*8);
2810
   row5 = vld1q_s16(data + 5*8);
2811
   row6 = vld1q_s16(data + 6*8);
2812
   row7 = vld1q_s16(data + 7*8);
2813

2814
   // add DC bias
2815
   row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2816

2817
   // column pass
2818
   dct_pass(vrshrn_n_s32, 10);
2819

2820
   // 16bit 8x8 transpose
2821
   {
2822
// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.
2823
// whether compilers actually get this is another story, sadly.
2824
#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2825
#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]); }
2826
#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)); }
2827

2828
      // pass 1
2829
      dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
2830
      dct_trn16(row2, row3);
2831
      dct_trn16(row4, row5);
2832
      dct_trn16(row6, row7);
2833

2834
      // pass 2
2835
      dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
2836
      dct_trn32(row1, row3);
2837
      dct_trn32(row4, row6);
2838
      dct_trn32(row5, row7);
2839

2840
      // pass 3
2841
      dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
2842
      dct_trn64(row1, row5);
2843
      dct_trn64(row2, row6);
2844
      dct_trn64(row3, row7);
2845

2846
#undef dct_trn16
2847
#undef dct_trn32
2848
#undef dct_trn64
2849
   }
2850

2851
   // row pass
2852
   // vrshrn_n_s32 only supports shifts up to 16, we need
2853
   // 17. so do a non-rounding shift of 16 first then follow
2854
   // up with a rounding shift by 1.
2855
   dct_pass(vshrn_n_s32, 16);
2856

2857
   {
2858
      // pack and round
2859
      uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2860
      uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2861
      uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2862
      uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2863
      uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2864
      uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2865
      uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2866
      uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2867

2868
      // again, these can translate into one instruction, but often don't.
2869
#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2870
#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]); }
2871
#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]); }
2872

2873
      // sadly can't use interleaved stores here since we only write
2874
      // 8 bytes to each scan line!
2875

2876
      // 8x8 8-bit transpose pass 1
2877
      dct_trn8_8(p0, p1);
2878
      dct_trn8_8(p2, p3);
2879
      dct_trn8_8(p4, p5);
2880
      dct_trn8_8(p6, p7);
2881

2882
      // pass 2
2883
      dct_trn8_16(p0, p2);
2884
      dct_trn8_16(p1, p3);
2885
      dct_trn8_16(p4, p6);
2886
      dct_trn8_16(p5, p7);
2887

2888
      // pass 3
2889
      dct_trn8_32(p0, p4);
2890
      dct_trn8_32(p1, p5);
2891
      dct_trn8_32(p2, p6);
2892
      dct_trn8_32(p3, p7);
2893

2894
      // store
2895
      vst1_u8(out, p0); out += out_stride;
2896
      vst1_u8(out, p1); out += out_stride;
2897
      vst1_u8(out, p2); out += out_stride;
2898
      vst1_u8(out, p3); out += out_stride;
2899
      vst1_u8(out, p4); out += out_stride;
2900
      vst1_u8(out, p5); out += out_stride;
2901
      vst1_u8(out, p6); out += out_stride;
2902
      vst1_u8(out, p7);
2903

2904
#undef dct_trn8_8
2905
#undef dct_trn8_16
2906
#undef dct_trn8_32
2907
   }
2908

2909
#undef dct_long_mul
2910
#undef dct_long_mac
2911
#undef dct_widen
2912
#undef dct_wadd
2913
#undef dct_wsub
2914
#undef dct_bfly32o
2915
#undef dct_pass
2916
}
2917

2918
#endif // STBI_NEON
2919

2920
#define STBI__MARKER_none  0xff
2921
// if there's a pending marker from the entropy stream, return that
2922
// otherwise, fetch from the stream and get a marker. if there's no
2923
// marker, return 0xff, which is never a valid marker value
2924
static stbi_uc stbi__get_marker(stbi__jpeg *j)
813✔
2925
{
2926
   stbi_uc x;
813✔
2927
   if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
813!
2928
   x = stbi__get8(j->s);
723✔
2929
   if (x != 0xff) return STBI__MARKER_none;
723!
2930
   while (x == 0xff)
1,404!
2931
      x = stbi__get8(j->s); // consume repeated 0xff fill bytes
702✔
2932
   return x;
2933
}
2934

2935
// in each scan, we'll have scan_n components, and the order
2936
// of the components is specified by order[]
2937
#define STBI__RESTART(x)     ((x) >= 0xd0 && (x) <= 0xd7)
2938

2939
// after a restart interval, stbi__jpeg_reset the entropy decoder and
2940
// the dc prediction
2941
static void stbi__jpeg_reset(stbi__jpeg *j)
90✔
2942
{
2943
   j->code_bits = 0;
90✔
2944
   j->code_buffer = 0;
90✔
2945
   j->nomore = 0;
90✔
2946
   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;
90✔
2947
   j->marker = STBI__MARKER_none;
90✔
2948
   j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
180!
2949
   j->eob_run = 0;
90✔
2950
   // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
2951
   // since we don't even allow 1<<30 pixels
2952
}
×
2953

2954
static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
90✔
2955
{
2956
   stbi__jpeg_reset(z);
90!
2957
   if (!z->progressive) {
90!
2958
      if (z->scan_n == 1) {
60!
2959
         int i,j;
3✔
2960
         STBI_SIMD_ALIGN(short, data[64]);
3✔
2961
         int n = z->order[0];
3✔
2962
         // non-interleaved data, we just need to process one block at a time,
2963
         // in trivial scanline order
2964
         // number of blocks to do just depends on how many actual "pixels" this
2965
         // component has, independent of interleaved MCU blocking and such
2966
         int w = (z->img_comp[n].x+7) >> 3;
3✔
2967
         int h = (z->img_comp[n].y+7) >> 3;
3✔
2968
         for (j=0; j < h; ++j) {
174!
2969
            for (i=0; i < w; ++i) {
12,996!
2970
               int ha = z->img_comp[n].ha;
12,825✔
2971
               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;
12,825!
2972
               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
12,825✔
2973
               // every data block is an MCU, so countdown the restart interval
2974
               if (--z->todo <= 0) {
12,825!
2975
                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
×
2976
                  // if it's NOT a restart, then just bail, so we get corrupt data
2977
                  // rather than no data
2978
                  if (!STBI__RESTART(z->marker)) return 1;
×
2979
                  stbi__jpeg_reset(z);
×
2980
               }
2981
            }
×
2982
         }
2983
         return 1;
2984
      } else { // interleaved
2985
         int i,j,k,x,y;
2986
         STBI_SIMD_ALIGN(short, data[64]);
2987
         for (j=0; j < z->img_mcu_y; ++j) {
3,222!
2988
            for (i=0; i < z->img_mcu_x; ++i) {
237,321!
2989
               // scan an interleaved mcu... process scan_n components in order
2990
               for (k=0; k < z->scan_n; ++k) {
936,624!
2991
                  int n = z->order[k];
702,468✔
2992
                  // scan out an mcu's worth of this component; that's just determined
2993
                  // by the basic H and V specified for the component
2994
                  for (y=0; y < z->img_comp[n].v; ++y) {
1,408,242!
2995
                     for (x=0; x < z->img_comp[n].h; ++x) {
1,418,160!
2996
                        int x2 = (i*z->img_comp[n].h + x)*8;
712,386✔
2997
                        int y2 = (j*z->img_comp[n].v + y)*8;
712,386✔
2998
                        int ha = z->img_comp[n].ha;
712,386✔
2999
                        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;
712,386!
3000
                        z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
712,386✔
3001
                     }
×
3002
                  }
3003
               }
×
3004
               // after all interleaved components, that's an interleaved MCU,
3005
               // so now count down the restart interval
3006
               if (--z->todo <= 0) {
234,156!
3007
                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
×
3008
                  if (!STBI__RESTART(z->marker)) return 1;
×
3009
                  stbi__jpeg_reset(z);
×
3010
               }
3011
            }
3012
         }
3013
         return 1;
3014
      }
3015
   } else {
3016
      if (z->scan_n == 1) {
30!
3017
         int i,j;
24✔
3018
         int n = z->order[0];
24✔
3019
         // non-interleaved data, we just need to process one block at a time,
3020
         // in trivial scanline order
3021
         // number of blocks to do just depends on how many actual "pixels" this
3022
         // component has, independent of interleaved MCU blocking and such
3023
         int w = (z->img_comp[n].x+7) >> 3;
24✔
3024
         int h = (z->img_comp[n].y+7) >> 3;
24✔
3025
         for (j=0; j < h; ++j) {
1,392!
3026
            for (i=0; i < w; ++i) {
103,968!
3027
               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
102,600✔
3028
               if (z->spec_start == 0) {
102,600!
3029
                  if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
×
3030
                     return 0;
3031
               } else {
3032
                  int ha = z->img_comp[n].ha;
102,600✔
3033
                  if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
102,600!
3034
                     return 0;
3035
               }
×
3036
               // every data block is an MCU, so countdown the restart interval
3037
               if (--z->todo <= 0) {
102,600!
3038
                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
×
3039
                  if (!STBI__RESTART(z->marker)) return 1;
×
3040
                  stbi__jpeg_reset(z);
×
3041
               }
3042
            }
×
3043
         }
3044
         return 1;
3045
      } else { // interleaved
3046
         int i,j,k,x,y;
3047
         for (j=0; j < z->img_mcu_y; ++j) {
348!
3048
            for (i=0; i < z->img_mcu_x; ++i) {
25,992!
3049
               // scan an interleaved mcu... process scan_n components in order
3050
               for (k=0; k < z->scan_n; ++k) {
102,600!
3051
                  int n = z->order[k];
76,950✔
3052
                  // scan out an mcu's worth of this component; that's just determined
3053
                  // by the basic H and V specified for the component
3054
                  for (y=0; y < z->img_comp[n].v; ++y) {
153,900!
3055
                     for (x=0; x < z->img_comp[n].h; ++x) {
153,900!
3056
                        int x2 = (i*z->img_comp[n].h + x);
76,950✔
3057
                        int y2 = (j*z->img_comp[n].v + y);
76,950✔
3058
                        short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
76,950✔
3059
                        if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
76,950!
3060
                           return 0;
3061
                     }
×
3062
                  }
3063
               }
×
3064
               // after all interleaved components, that's an interleaved MCU,
3065
               // so now count down the restart interval
3066
               if (--z->todo <= 0) {
25,650!
3067
                  if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
×
3068
                  if (!STBI__RESTART(z->marker)) return 1;
×
3069
                  stbi__jpeg_reset(z);
×
3070
               }
3071
            }
3072
         }
3073
         return 1;
3074
      }
3075
   }
3076
}
3077

3078
static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)
38,475✔
3079
{
3080
   int i;
38,475✔
3081
   for (i=0; i < 64; ++i)
2,500,875!
3082
      data[i] *= dequant[i];
2,462,400✔
3083
}
38,475✔
3084

3085
static void stbi__jpeg_finish(stbi__jpeg *z)
3✔
3086
{
3087
   if (z->progressive) {
3!
3088
      // dequantize and idct the data
3089
      int i,j,n;
3090
      for (n=0; n < z->s->img_n; ++n) {
12!
3091
         int w = (z->img_comp[n].x+7) >> 3;
9✔
3092
         int h = (z->img_comp[n].y+7) >> 3;
9✔
3093
         for (j=0; j < h; ++j) {
522!
3094
            for (i=0; i < w; ++i) {
38,988!
3095
               short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
38,475✔
3096
               stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
38,475✔
3097
               z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
38,475✔
3098
            }
3099
         }
3100
      }
3101
   }
3102
}
3✔
3103

3104
static int stbi__process_marker(stbi__jpeg *z, int m)
450✔
3105
{
3106
   int L;
450✔
3107
   switch (m) {
450!
3108
      case STBI__MARKER_none: // no marker found
3109
         return stbi__err("expected marker","Corrupt JPEG");
×
3110

3111
      case 0xDD: // DRI - specify restart interval
×
3112
         if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
×
3113
         z->restart_interval = stbi__get16be(z->s);
×
3114
         return 1;
×
3115

3116
      case 0xDB: // DQT - define quantization table
123✔
3117
         L = stbi__get16be(z->s)-2;
123✔
3118
         while (L > 0) {
246!
3119
            int q = stbi__get8(z->s);
123✔
3120
            int p = q >> 4, sixteen = (p != 0);
123✔
3121
            int t = q & 15,i;
123✔
3122
            if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG");
123!
3123
            if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
123!
3124

3125
            for (i=0; i < 64; ++i)
7,995!
3126
               z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));
7,872!
3127
            L -= (sixteen ? 129 : 65);
246!
3128
         }
×
3129
         return L==0;
123✔
3130

3131
      case 0xC4: // DHT - define huffman table
264✔
3132
         L = stbi__get16be(z->s)-2;
264✔
3133
         while (L > 0) {
528!
3134
            stbi_uc *v;
264✔
3135
            int sizes[16],i,n=0;
264✔
3136
            int q = stbi__get8(z->s);
264✔
3137
            int tc = q >> 4;
264✔
3138
            int th = q & 15;
264✔
3139
            if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
264!
3140
            for (i=0; i < 16; ++i) {
4,488!
3141
               sizes[i] = stbi__get8(z->s);
4,224✔
3142
               n += sizes[i];
4,224✔
3143
            }
3144
            if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values!
264!
3145
            L -= 17;
264✔
3146
            if (tc == 0) {
264!
3147
               if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
123!
3148
               v = z->huff_dc[th].values;
123✔
3149
            } else {
3150
               if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
141!
3151
               v = z->huff_ac[th].values;
141✔
3152
            }
3153
            for (i=0; i < n; ++i)
5,949!
3154
               v[i] = stbi__get8(z->s);
5,685✔
3155
            if (tc != 0)
264!
3156
               stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
141✔
3157
            L -= n;
264✔
3158
         }
×
3159
         return L==0;
264✔
3160
   }
3161

3162
   // check for comment block or APP blocks
3163
   if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
63!
3164
      L = stbi__get16be(z->s);
63✔
3165
      if (L < 2) {
63!
3166
         if (m == 0xFE)
×
3167
            return stbi__err("bad COM len","Corrupt JPEG");
×
3168
         else
3169
            return stbi__err("bad APP len","Corrupt JPEG");
×
3170
      }
3171
      L -= 2;
63✔
3172

3173
      if (m == 0xE0 && L >= 5) { // JFIF APP0 segment
63!
3174
         static const unsigned char tag[5] = {'J','F','I','F','\0'};
3175
         int ok = 1;
3176
         int i;
3177
         for (i=0; i < 5; ++i)
378!
3178
            if (stbi__get8(z->s) != tag[i])
315!
3179
               ok = 0;
×
3180
         L -= 5;
63✔
3181
         if (ok)
63!
3182
            z->jfif = 1;
63✔
3183
      } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment
×
3184
         static const unsigned char tag[6] = {'A','d','o','b','e','\0'};
3185
         int ok = 1;
3186
         int i;
3187
         for (i=0; i < 6; ++i)
×
3188
            if (stbi__get8(z->s) != tag[i])
×
3189
               ok = 0;
×
3190
         L -= 6;
×
3191
         if (ok) {
×
3192
            stbi__get8(z->s); // version
×
3193
            stbi__get16be(z->s); // flags0
×
3194
            stbi__get16be(z->s); // flags1
×
3195
            z->app14_color_transform = stbi__get8(z->s); // color transform
×
3196
            L -= 6;
×
3197
         }
3198
      }
3199

3200
      stbi__skip(z->s, L);
63✔
3201
      return 1;
63✔
3202
   }
3203

3204
   return stbi__err("unknown marker","Corrupt JPEG");
×
3205
}
3206

3207
// after we see SOS
3208
static int stbi__process_scan_header(stbi__jpeg *z)
90✔
3209
{
3210
   int i;
90✔
3211
   int Ls = stbi__get16be(z->s);
90✔
3212
   z->scan_n = stbi__get8(z->s);
90✔
3213
   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");
90!
3214
   if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG");
90!
3215
   for (i=0; i < z->scan_n; ++i) {
306!
3216
      int id = stbi__get8(z->s), which;
216✔
3217
      int q = stbi__get8(z->s);
216✔
3218
      for (which = 0; which < z->s->img_n; ++which)
423!
3219
         if (z->img_comp[which].id == id)
423!
3220
            break;
3221
      if (which == z->s->img_n) return 0; // no match
216!
3222
      z->img_comp[which].hd = q >> 4;   if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG");
216!
3223
      z->img_comp[which].ha = q & 15;   if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG");
216!
3224
      z->order[i] = which;
216✔
3225
   }
×
3226

3227
   {
3228
      int aa;
90✔
3229
      z->spec_start = stbi__get8(z->s);
90✔
3230
      z->spec_end   = stbi__get8(z->s); // should be 63, but might be 0
90✔
3231
      aa = stbi__get8(z->s);
90✔
3232
      z->succ_high = (aa >> 4);
90✔
3233
      z->succ_low  = (aa & 15);
90✔
3234
      if (z->progressive) {
90!
3235
         if (z->spec_start > 63 || z->spec_end > 63  || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
30!
3236
            return stbi__err("bad SOS", "Corrupt JPEG");
×
3237
      } else {
3238
         if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG");
60!
3239
         if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG");
60!
3240
         z->spec_end = 63;
60✔
3241
      }
3242
   }
×
3243

3244
   return 1;
3245
}
3246

3247
static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)
63✔
3248
{
3249
   int i;
63✔
3250
   for (i=0; i < ncomp; ++i) {
246!
3251
      if (z->img_comp[i].raw_data) {
183!
3252
         STBI_FREE(z->img_comp[i].raw_data);
183✔
3253
         z->img_comp[i].raw_data = NULL;
183✔
3254
         z->img_comp[i].data = NULL;
183✔
3255
      }
3256
      if (z->img_comp[i].raw_coeff) {
183!
3257
         STBI_FREE(z->img_comp[i].raw_coeff);
9✔
3258
         z->img_comp[i].raw_coeff = 0;
9✔
3259
         z->img_comp[i].coeff = 0;
9✔
3260
      }
3261
      if (z->img_comp[i].linebuf) {
183!
3262
         STBI_FREE(z->img_comp[i].linebuf);
183✔
3263
         z->img_comp[i].linebuf = NULL;
183✔
3264
      }
3265
   }
3266
   return why;
63✔
3267
}
3268

3269
static int stbi__process_frame_header(stbi__jpeg *z, int scan)
63✔
3270
{
3271
   stbi__context *s = z->s;
63✔
3272
   int Lf,p,i,q, h_max=1,v_max=1,c;
63✔
3273
   Lf = stbi__get16be(s);         if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG
63!
3274
   p  = stbi__get8(s);            if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
63!
3275
   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
63!
3276
   s->img_x = stbi__get16be(s);   if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
63!
3277
   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
63!
3278
   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
63!
3279
   c = stbi__get8(s);
63✔
3280
   if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG");
63!
3281
   s->img_n = c;
63✔
3282
   for (i=0; i < c; ++i) {
246!
3283
      z->img_comp[i].data = NULL;
183✔
3284
      z->img_comp[i].linebuf = NULL;
183✔
3285
   }
3286

3287
   if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
63!
3288

3289
   z->rgb = 0;
63✔
3290
   for (i=0; i < s->img_n; ++i) {
246!
3291
      static const unsigned char rgb[3] = { 'R', 'G', 'B' };
183✔
3292
      z->img_comp[i].id = stbi__get8(s);
183✔
3293
      if (s->img_n == 3 && z->img_comp[i].id == rgb[i])
183!
3294
         ++z->rgb;
×
3295
      q = stbi__get8(s);
183✔
3296
      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");
183!
3297
      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");
183!
3298
      z->img_comp[i].tq = stbi__get8(s);  if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
183!
3299
   }
3300

3301
   if (scan != STBI__SCAN_load) return 1;
63!
3302

3303
   if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode");
63!
3304

3305
   for (i=0; i < s->img_n; ++i) {
246!
3306
      if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
183!
3307
      if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
183!
3308
   }
3309

3310
   // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios
3311
   // and I've never seen a non-corrupted JPEG file actually use them
3312
   for (i=0; i < s->img_n; ++i) {
246!
3313
      if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG");
183!
3314
      if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG");
183!
3315
   }
3316

3317
   // compute interleaved mcu info
3318
   z->img_h_max = h_max;
63✔
3319
   z->img_v_max = v_max;
63✔
3320
   z->img_mcu_w = h_max * 8;
63✔
3321
   z->img_mcu_h = v_max * 8;
63✔
3322
   // these sizes can't be more than 17 bits
3323
   z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
63✔
3324
   z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
63✔
3325

3326
   for (i=0; i < s->img_n; ++i) {
246!
3327
      // number of effective pixels (e.g. for non-interleaved MCU)
3328
      z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
183✔
3329
      z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
183✔
3330
      // to simplify generation, we'll allocate enough memory to decode
3331
      // the bogus oversized data from using interleaved MCUs and their
3332
      // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
3333
      // discard the extra data until colorspace conversion
3334
      //
3335
      // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)
3336
      // so these muls can't overflow with 32-bit ints (which we require)
3337
      z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
183✔
3338
      z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
183✔
3339
      z->img_comp[i].coeff = 0;
183✔
3340
      z->img_comp[i].raw_coeff = 0;
183✔
3341
      z->img_comp[i].linebuf = NULL;
183✔
3342
      z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);
183✔
3343
      if (z->img_comp[i].raw_data == NULL)
183!
3344
         return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
×
3345
      // align blocks for idct using mmx/sse
3346
      z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
183✔
3347
      if (z->progressive) {
183!
3348
         // w2, h2 are multiples of 8 (see above)
3349
         z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;
9✔
3350
         z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;
9✔
3351
         z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);
9✔
3352
         if (z->img_comp[i].raw_coeff == NULL)
9!
3353
            return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));
×
3354
         z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
9✔
3355
      }
3356
   }
3357

3358
   return 1;
3359
}
3360

3361
// use comparisons since in some cases we handle more than one case (e.g. SOF)
3362
#define stbi__DNL(x)         ((x) == 0xdc)
3363
#define stbi__SOI(x)         ((x) == 0xd8)
3364
#define stbi__EOI(x)         ((x) == 0xd9)
3365
#define stbi__SOF(x)         ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
3366
#define stbi__SOS(x)         ((x) == 0xda)
3367

3368
#define stbi__SOF_progressive(x)   ((x) == 0xc2)
3369

3370
static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
147✔
3371
{
3372
   int m;
147✔
3373
   z->jfif = 0;
147✔
3374
   z->app14_color_transform = -1; // valid values are 0,1,2
147✔
3375
   z->marker = STBI__MARKER_none; // initialize cached marker to empty
147✔
3376
   m = stbi__get_marker(z);
147✔
3377
   if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
147!
3378
   if (scan == STBI__SCAN_type) return 1;
126!
3379
   m = stbi__get_marker(z);
63✔
3380
   while (!stbi__SOF(m)) {
249!
3381
      if (!stbi__process_marker(z,m)) return 0;
186!
3382
      m = stbi__get_marker(z);
186✔
3383
      while (m == STBI__MARKER_none) {
186!
3384
         // some files have extra padding after their blocks, so ok, we'll scan
3385
         if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");
×
3386
         m = stbi__get_marker(z);
×
3387
      }
3388
   }
3389
   z->progressive = stbi__SOF_progressive(m);
63✔
3390
   if (!stbi__process_frame_header(z, scan)) return 0;
63!
3391
   return 1;
3392
}
3393

3394
static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j)
6✔
3395
{
3396
   // some JPEGs have junk at end, skip over it but if we find what looks
3397
   // like a valid marker, resume there
3398
   while (!stbi__at_eof(j->s)) {
6!
3399
      stbi_uc x = stbi__get8(j->s);
6✔
3400
      while (x == 0xff) { // might be a marker
6!
3401
         if (stbi__at_eof(j->s)) return STBI__MARKER_none;
6!
3402
         x = stbi__get8(j->s);
6✔
3403
         if (x != 0x00 && x != 0xff) {
6!
3404
            // not a stuffed zero or lead-in to another marker, looks
3405
            // like an actual marker, return it
3406
            return x;
3407
         }
3408
         // stuffed zero has x=0 now which ends the loop, meaning we go
3409
         // back to regular scan loop.
3410
         // repeated 0xff keeps trying to read the next byte of the marker.
3411
      }
3412
   }
×
3413
   return STBI__MARKER_none;
3414
}
3415

3416
// decode image to YCbCr format
3417
static int stbi__decode_jpeg_image(stbi__jpeg *j)
63✔
3418
{
3419
   int m;
63✔
3420
   for (m = 0; m < 4; m++) {
315!
3421
      j->img_comp[m].raw_data = NULL;
252✔
3422
      j->img_comp[m].raw_coeff = NULL;
252✔
3423
   }
3424
   j->restart_interval = 0;
63✔
3425
   if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;
63!
3426
   m = stbi__get_marker(j);
63✔
3427
   while (!stbi__EOI(m)) {
417!
3428
      if (stbi__SOS(m)) {
354!
3429
         if (!stbi__process_scan_header(j)) return 0;
90!
3430
         if (!stbi__parse_entropy_coded_data(j)) return 0;
90!
3431
         if (j->marker == STBI__MARKER_none ) {
90!
3432
         j->marker = stbi__skip_jpeg_junk_at_end(j);
6✔
3433
            // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
3434
         }
3435
         m = stbi__get_marker(j);
90✔
3436
         if (STBI__RESTART(m))
90!
3437
            m = stbi__get_marker(j);
×
3438
      } else if (stbi__DNL(m)) {
264!
3439
         int Ld = stbi__get16be(j->s);
×
3440
         stbi__uint32 NL = stbi__get16be(j->s);
×
3441
         if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG");
×
3442
         if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG");
×
3443
         m = stbi__get_marker(j);
×
3444
      } else {
×
3445
         if (!stbi__process_marker(j, m)) return 1;
264!
3446
         m = stbi__get_marker(j);
264✔
3447
      }
3448
   }
3449
   if (j->progressive)
63!
3450
      stbi__jpeg_finish(j);
3✔
3451
   return 1;
3452
}
3453

3454
// static jfif-centered resampling (across block boundaries)
3455

3456
typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
3457
                                    int w, int hs);
3458

3459
#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
3460

3461
static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
79,650✔
3462
{
3463
   STBI_NOTUSED(out);
79,650✔
3464
   STBI_NOTUSED(in_far);
79,650✔
3465
   STBI_NOTUSED(w);
79,650✔
3466
   STBI_NOTUSED(hs);
79,650✔
3467
   return in_near;
79,650✔
3468
}
3469

3470
static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
×
3471
{
3472
   // need to generate two samples vertically for every one in input
3473
   int i;
×
3474
   STBI_NOTUSED(hs);
×
3475
   for (i=0; i < w; ++i)
×
3476
      out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
×
3477
   return out;
×
3478
}
3479

3480
static stbi_uc*  stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
×
3481
{
3482
   // need to generate two samples horizontally for every one in input
3483
   int i;
×
3484
   stbi_uc *input = in_near;
×
3485

3486
   if (w == 1) {
×
3487
      // if only one sample, can't do any interpolation
3488
      out[0] = out[1] = input[0];
×
3489
      return out;
×
3490
   }
3491

3492
   out[0] = input[0];
×
3493
   out[1] = stbi__div4(input[0]*3 + input[1] + 2);
×
3494
   for (i=1; i < w-1; ++i) {
×
3495
      int n = 3*input[i]+2;
×
3496
      out[i*2+0] = stbi__div4(n+input[i-1]);
×
3497
      out[i*2+1] = stbi__div4(n+input[i+1]);
×
3498
   }
3499
   out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
×
3500
   out[i*2+1] = input[w-1];
×
3501

3502
   STBI_NOTUSED(in_far);
×
3503
   STBI_NOTUSED(hs);
×
3504

3505
   return out;
×
3506
}
3507

3508
#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
3509

3510
static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3511
{
3512
   // need to generate 2x2 samples for every one in input
3513
   int i,t0,t1;
3514
   if (w == 1) {
×
3515
      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
3516
      return out;
3517
   }
3518

3519
   t1 = 3*in_near[0] + in_far[0];
3520
   out[0] = stbi__div4(t1+2);
3521
   for (i=1; i < w; ++i) {
×
3522
      t0 = t1;
3523
      t1 = 3*in_near[i]+in_far[i];
3524
      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3525
      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
3526
   }
3527
   out[w*2-1] = stbi__div4(t1+2);
3528

3529
   STBI_NOTUSED(hs);
3530

3531
   return out;
3532
}
3533

3534
#if defined(STBI_SSE2) || defined(STBI_NEON)
3535
static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
2,700✔
3536
{
3537
   // need to generate 2x2 samples for every one in input
3538
   int i=0,t0,t1;
2,700✔
3539

3540
   if (w == 1) {
2,700!
3541
      out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
×
3542
      return out;
×
3543
   }
3544

3545
   t1 = 3*in_near[0] + in_far[0];
2,700✔
3546
   // process groups of 8 pixels for as long as we can.
3547
   // note we can't handle the last pixel in a row in this loop
3548
   // because we need to handle the filter boundary conditions.
3549
   for (; i < ((w-1) & ~7); i += 8) {
102,600✔
3550
#if defined(STBI_SSE2)
3551
      // load and perform the vertical filtering pass
3552
      // this uses 3*x + y = 4*x + (y - x)
3553
      __m128i zero  = _mm_setzero_si128();
99,900✔
3554
      __m128i farb  = _mm_loadl_epi64((__m128i *) (in_far + i));
99,900✔
3555
      __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
99,900✔
3556
      __m128i farw  = _mm_unpacklo_epi8(farb, zero);
99,900✔
3557
      __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
99,900✔
3558
      __m128i diff  = _mm_sub_epi16(farw, nearw);
99,900✔
3559
      __m128i nears = _mm_slli_epi16(nearw, 2);
99,900✔
3560
      __m128i curr  = _mm_add_epi16(nears, diff); // current row
99,900✔
3561

3562
      // horizontal filter works the same based on shifted vers of current
3563
      // row. "prev" is current row shifted right by 1 pixel; we need to
3564
      // insert the previous pixel value (from t1).
3565
      // "next" is current row shifted left by 1 pixel, with first pixel
3566
      // of next block of 8 pixels added in.
3567
      __m128i prv0 = _mm_slli_si128(curr, 2);
99,900✔
3568
      __m128i nxt0 = _mm_srli_si128(curr, 2);
99,900✔
3569
      __m128i prev = _mm_insert_epi16(prv0, t1, 0);
99,900✔
3570
      __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
99,900✔
3571

3572
      // horizontal filter, polyphase implementation since it's convenient:
3573
      // even pixels = 3*cur + prev = cur*4 + (prev - cur)
3574
      // odd  pixels = 3*cur + next = cur*4 + (next - cur)
3575
      // note the shared term.
3576
      __m128i bias  = _mm_set1_epi16(8);
99,900✔
3577
      __m128i curs = _mm_slli_epi16(curr, 2);
99,900✔
3578
      __m128i prvd = _mm_sub_epi16(prev, curr);
99,900✔
3579
      __m128i nxtd = _mm_sub_epi16(next, curr);
99,900✔
3580
      __m128i curb = _mm_add_epi16(curs, bias);
99,900✔
3581
      __m128i even = _mm_add_epi16(prvd, curb);
99,900✔
3582
      __m128i odd  = _mm_add_epi16(nxtd, curb);
99,900✔
3583

3584
      // interleave even and odd pixels, then undo scaling.
3585
      __m128i int0 = _mm_unpacklo_epi16(even, odd);
99,900✔
3586
      __m128i int1 = _mm_unpackhi_epi16(even, odd);
99,900✔
3587
      __m128i de0  = _mm_srli_epi16(int0, 4);
99,900✔
3588
      __m128i de1  = _mm_srli_epi16(int1, 4);
99,900✔
3589

3590
      // pack and write output
3591
      __m128i outv = _mm_packus_epi16(de0, de1);
99,900✔
3592
      _mm_storeu_si128((__m128i *) (out + i*2), outv);
99,900✔
3593
#elif defined(STBI_NEON)
3594
      // load and perform the vertical filtering pass
3595
      // this uses 3*x + y = 4*x + (y - x)
3596
      uint8x8_t farb  = vld1_u8(in_far + i);
3597
      uint8x8_t nearb = vld1_u8(in_near + i);
3598
      int16x8_t diff  = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3599
      int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3600
      int16x8_t curr  = vaddq_s16(nears, diff); // current row
3601

3602
      // horizontal filter works the same based on shifted vers of current
3603
      // row. "prev" is current row shifted right by 1 pixel; we need to
3604
      // insert the previous pixel value (from t1).
3605
      // "next" is current row shifted left by 1 pixel, with first pixel
3606
      // of next block of 8 pixels added in.
3607
      int16x8_t prv0 = vextq_s16(curr, curr, 7);
3608
      int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3609
      int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3610
      int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3611

3612
      // horizontal filter, polyphase implementation since it's convenient:
3613
      // even pixels = 3*cur + prev = cur*4 + (prev - cur)
3614
      // odd  pixels = 3*cur + next = cur*4 + (next - cur)
3615
      // note the shared term.
3616
      int16x8_t curs = vshlq_n_s16(curr, 2);
3617
      int16x8_t prvd = vsubq_s16(prev, curr);
3618
      int16x8_t nxtd = vsubq_s16(next, curr);
3619
      int16x8_t even = vaddq_s16(curs, prvd);
3620
      int16x8_t odd  = vaddq_s16(curs, nxtd);
3621

3622
      // undo scaling and round, then store with even/odd phases interleaved
3623
      uint8x8x2_t o;
3624
      o.val[0] = vqrshrun_n_s16(even, 4);
3625
      o.val[1] = vqrshrun_n_s16(odd,  4);
3626
      vst2_u8(out + i*2, o);
3627
#endif
3628

3629
      // "previous" value for next iter
3630
      t1 = 3*in_near[i+7] + in_far[i+7];
99,900✔
3631
   }
3632

3633
   t0 = t1;
2,700✔
3634
   t1 = 3*in_near[i] + in_far[i];
2,700✔
3635
   out[i*2] = stbi__div16(3*t1 + t0 + 8);
2,700✔
3636

3637
   for (++i; i < w; ++i) {
10,800✔
3638
      t0 = t1;
8,100✔
3639
      t1 = 3*in_near[i]+in_far[i];
8,100✔
3640
      out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
8,100✔
3641
      out[i*2  ] = stbi__div16(3*t1 + t0 + 8);
8,100✔
3642
   }
3643
   out[w*2-1] = stbi__div4(t1+2);
2,700✔
3644

3645
   STBI_NOTUSED(hs);
2,700✔
3646

3647
   return out;
2,700✔
3648
}
3649
#endif
3650

3651
static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
×
3652
{
3653
   // resample with nearest-neighbor
3654
   int i,j;
×
3655
   STBI_NOTUSED(in_far);
×
3656
   for (i=0; i < w; ++i)
×
3657
      for (j=0; j < hs; ++j)
×
3658
         out[i*hs+j] = in_near[i];
×
3659
   return out;
×
3660
}
3661

3662
// this is a reduced-precision calculation of YCbCr-to-RGB introduced
3663
// to make sure the code produces the same results in both SIMD and scalar
3664
#define stbi__float2fixed(x)  (((int) ((x) * 4096.0f + 0.5f)) << 8)
3665
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)
3666
{
3667
   int i;
3668
   for (i=0; i < count; ++i) {
×
3669
      int y_fixed = (y[i] << 20) + (1<<19); // rounding
3670
      int r,g,b;
3671
      int cr = pcr[i] - 128;
3672
      int cb = pcb[i] - 128;
3673
      r = y_fixed +  cr* stbi__float2fixed(1.40200f);
3674
      g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
3675
      b = y_fixed                                     +   cb* stbi__float2fixed(1.77200f);
3676
      r >>= 20;
3677
      g >>= 20;
3678
      b >>= 20;
3679
      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
×
3680
      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
×
3681
      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
×
3682
      out[0] = (stbi_uc)r;
3683
      out[1] = (stbi_uc)g;
3684
      out[2] = (stbi_uc)b;
3685
      out[3] = 255;
3686
      out += step;
3687
   }
3688
}
3689

3690
#if defined(STBI_SSE2) || defined(STBI_NEON)
3691
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)
27,000✔
3692
{
3693
   int i = 0;
27,000✔
3694

3695
#ifdef STBI_SSE2
3696
   // step == 3 is pretty ugly on the final interleave, and i'm not convinced
3697
   // it's useful in practice (you wouldn't use it for textures, for example).
3698
   // so just accelerate step == 4 case.
3699
   if (step == 4) {
27,000!
3700
      // this is a fairly straightforward implementation and not super-optimized.
3701
      __m128i signflip  = _mm_set1_epi8(-0x80);
3702
      __m128i cr_const0 = _mm_set1_epi16(   (short) ( 1.40200f*4096.0f+0.5f));
3703
      __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
3704
      __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
3705
      __m128i cb_const1 = _mm_set1_epi16(   (short) ( 1.77200f*4096.0f+0.5f));
3706
      __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
3707
      __m128i xw = _mm_set1_epi16(255); // alpha channel
3708

3709
      for (; i+7 < count; i += 8) {
×
3710
         // load
3711
         __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
×
3712
         __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
×
3713
         __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
×
3714
         __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
×
3715
         __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128
×
3716

3717
         // unpack to short (and left-shift cr, cb by 8)
3718
         __m128i yw  = _mm_unpacklo_epi8(y_bias, y_bytes);
×
3719
         __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
×
3720
         __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
×
3721

3722
         // color transform
3723
         __m128i yws = _mm_srli_epi16(yw, 4);
×
3724
         __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
×
3725
         __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
×
3726
         __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
×
3727
         __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
×
3728
         __m128i rws = _mm_add_epi16(cr0, yws);
×
3729
         __m128i gwt = _mm_add_epi16(cb0, yws);
×
3730
         __m128i bws = _mm_add_epi16(yws, cb1);
×
3731
         __m128i gws = _mm_add_epi16(gwt, cr1);
×
3732

3733
         // descale
3734
         __m128i rw = _mm_srai_epi16(rws, 4);
×
3735
         __m128i bw = _mm_srai_epi16(bws, 4);
×
3736
         __m128i gw = _mm_srai_epi16(gws, 4);
×
3737

3738
         // back to byte, set up for transpose
3739
         __m128i brb = _mm_packus_epi16(rw, bw);
×
3740
         __m128i gxb = _mm_packus_epi16(gw, xw);
×
3741

3742
         // transpose to interleave channels
3743
         __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
×
3744
         __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
×
3745
         __m128i o0 = _mm_unpacklo_epi16(t0, t1);
×
3746
         __m128i o1 = _mm_unpackhi_epi16(t0, t1);
×
3747

3748
         // store
3749
         _mm_storeu_si128((__m128i *) (out + 0), o0);
×
3750
         _mm_storeu_si128((__m128i *) (out + 16), o1);
×
3751
         out += 32;
×
3752
      }
3753
   }
3754
#endif
3755

3756
#ifdef STBI_NEON
3757
   // in this version, step=3 support would be easy to add. but is there demand?
3758
   if (step == 4) {
3759
      // this is a fairly straightforward implementation and not super-optimized.
3760
      uint8x8_t signflip = vdup_n_u8(0x80);
3761
      int16x8_t cr_const0 = vdupq_n_s16(   (short) ( 1.40200f*4096.0f+0.5f));
3762
      int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));
3763
      int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));
3764
      int16x8_t cb_const1 = vdupq_n_s16(   (short) ( 1.77200f*4096.0f+0.5f));
3765

3766
      for (; i+7 < count; i += 8) {
3767
         // load
3768
         uint8x8_t y_bytes  = vld1_u8(y + i);
3769
         uint8x8_t cr_bytes = vld1_u8(pcr + i);
3770
         uint8x8_t cb_bytes = vld1_u8(pcb + i);
3771
         int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3772
         int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3773

3774
         // expand to s16
3775
         int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3776
         int16x8_t crw = vshll_n_s8(cr_biased, 7);
3777
         int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3778

3779
         // color transform
3780
         int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3781
         int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3782
         int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3783
         int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3784
         int16x8_t rws = vaddq_s16(yws, cr0);
3785
         int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3786
         int16x8_t bws = vaddq_s16(yws, cb1);
3787

3788
         // undo scaling, round, convert to byte
3789
         uint8x8x4_t o;
3790
         o.val[0] = vqrshrun_n_s16(rws, 4);
3791
         o.val[1] = vqrshrun_n_s16(gws, 4);
3792
         o.val[2] = vqrshrun_n_s16(bws, 4);
3793
         o.val[3] = vdup_n_u8(255);
3794

3795
         // store, interleaving r/g/b/a
3796
         vst4_u8(out, o);
3797
         out += 8*4;
3798
      }
3799
   }
3800
#endif
3801

3802
   for (; i < count; ++i) {
16,227,000✔
3803
      int y_fixed = (y[i] << 20) + (1<<19); // rounding
16,200,000✔
3804
      int r,g,b;
16,200,000✔
3805
      int cr = pcr[i] - 128;
16,200,000✔
3806
      int cb = pcb[i] - 128;
16,200,000✔
3807
      r = y_fixed + cr* stbi__float2fixed(1.40200f);
16,200,000✔
3808
      g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);
16,200,000✔
3809
      b = y_fixed                                   +   cb* stbi__float2fixed(1.77200f);
16,200,000✔
3810
      r >>= 20;
16,200,000✔
3811
      g >>= 20;
16,200,000✔
3812
      b >>= 20;
16,200,000✔
3813
      if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
16,200,000✔
3814
      if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
16,200,000✔
3815
      if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
16,200,000✔
3816
      out[0] = (stbi_uc)r;
16,200,000✔
3817
      out[1] = (stbi_uc)g;
16,200,000✔
3818
      out[2] = (stbi_uc)b;
16,200,000✔
3819
      out[3] = 255;
16,200,000✔
3820
      out += step;
16,200,000✔
3821
   }
3822
}
27,000✔
3823
#endif
3824

3825
// set up the kernels
3826
static void stbi__setup_jpeg(stbi__jpeg *j)
147✔
3827
{
3828
   j->idct_block_kernel = stbi__idct_block;
147✔
3829
   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
147✔
3830
   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
147✔
3831

3832
#ifdef STBI_SSE2
3833
   if (stbi__sse2_available()) {
147✔
3834
      j->idct_block_kernel = stbi__idct_simd;
147✔
3835
      j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
147✔
3836
      j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
147✔
3837
   }
3838
#endif
3839

3840
#ifdef STBI_NEON
3841
   j->idct_block_kernel = stbi__idct_simd;
3842
   j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3843
   j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3844
#endif
3845
}
3846

3847
// clean up the temporary component buffers
3848
static void stbi__cleanup_jpeg(stbi__jpeg *j)
63✔
3849
{
3850
   stbi__free_jpeg_components(j, j->s->img_n, 0);
63✔
3851
}
63✔
3852

3853
typedef struct
3854
{
3855
   resample_row_func resample;
3856
   stbi_uc *line0,*line1;
3857
   int hs,vs;   // expansion factor in each axis
3858
   int w_lores; // horizontal pixels pre-expansion
3859
   int ystep;   // how far through vertical expansion we are
3860
   int ypos;    // which pre-expansion row we're on
3861
} stbi__resample;
3862

3863
// fast 0..255 * 0..255 => 0..255 rounded multiplication
3864
static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)
×
3865
{
3866
   unsigned int t = x*y + 128;
×
3867
   return (stbi_uc) ((t + (t >>8)) >> 8);
×
3868
}
3869

3870
static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
63✔
3871
{
3872
   int n, decode_n, is_rgb;
63✔
3873
   z->s->img_n = 0; // make stbi__cleanup_jpeg safe
63✔
3874

3875
   // validate req_comp
3876
   if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
63!
3877

3878
   // load a jpeg image from whichever source, but leave in YCbCr format
3879
   if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
63!
3880

3881
   // determine actual number of components to generate
3882
   n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;
63!
3883

3884
   is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));
63!
3885

3886
   if (z->s->img_n == 3 && n < 3 && !is_rgb)
63!
3887
      decode_n = 1;
3888
   else
3889
      decode_n = z->s->img_n;
63✔
3890

3891
   // nothing to do if no components requested; check this now to avoid
3892
   // accessing uninitialized coutput[0] later
3893
   if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; }
63!
3894

3895
   // resample and color-convert
3896
   {
3897
      int k;
63✔
3898
      unsigned int i,j;
63✔
3899
      stbi_uc *output;
63✔
3900
      stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };
63✔
3901

3902
      stbi__resample res_comp[4];
63✔
3903

3904
      for (k=0; k < decode_n; ++k) {
246!
3905
         stbi__resample *r = &res_comp[k];
183✔
3906

3907
         // allocate line buffer big enough for upsampling off the edges
3908
         // with upsample factor of 4
3909
         z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
183✔
3910
         if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
183!
3911

3912
         r->hs      = z->img_h_max / z->img_comp[k].h;
183✔
3913
         r->vs      = z->img_v_max / z->img_comp[k].v;
183✔
3914
         r->ystep   = r->vs >> 1;
183✔
3915
         r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
183✔
3916
         r->ypos    = 0;
183✔
3917
         r->line0   = r->line1 = z->img_comp[k].data;
183✔
3918

3919
         if      (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
183!
3920
         else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
6!
3921
         else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
6!
3922
         else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
6!
3923
         else                               r->resample = stbi__resample_row_generic;
×
3924
      }
×
3925

3926
      // can't error after this so, this is safe
3927
      output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);
63✔
3928
      if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
63!
3929

3930
      // now go ahead and resample
3931
      for (j=0; j < z->s->img_y; ++j) {
28,413!
3932
         stbi_uc *out = output + n * z->s->img_x * j;
28,350✔
3933
         for (k=0; k < decode_n; ++k) {
110,700!
3934
            stbi__resample *r = &res_comp[k];
82,350✔
3935
            int y_bot = r->ystep >= (r->vs >> 1);
82,350✔
3936
            coutput[k] = r->resample(z->img_comp[k].linebuf,
82,350✔
3937
                                     y_bot ? r->line1 : r->line0,
×
3938
                                     y_bot ? r->line0 : r->line1,
×
3939
                                     r->w_lores, r->hs);
3940
            if (++r->ystep >= r->vs) {
82,350!
3941
               r->ystep = 0;
81,000✔
3942
               r->line0 = r->line1;
81,000✔
3943
               if (++r->ypos < z->img_comp[k].y)
81,000!
3944
                  r->line1 += z->img_comp[k].w2;
80,817✔
3945
            }
3946
         }
3947
         if (n >= 3) {
28,350!
3948
            stbi_uc *y = coutput[0];
28,350✔
3949
            if (z->s->img_n == 3) {
28,350!
3950
               if (is_rgb) {
27,000!
3951
                  for (i=0; i < z->s->img_x; ++i) {
×
3952
                     out[0] = y[i];
×
3953
                     out[1] = coutput[1][i];
×
3954
                     out[2] = coutput[2][i];
×
3955
                     out[3] = 255;
×
3956
                     out += n;
×
3957
                  }
3958
               } else {
3959
                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
27,000✔
3960
               }
3961
            } else if (z->s->img_n == 4) {
1,350!
3962
               if (z->app14_color_transform == 0) { // CMYK
×
3963
                  for (i=0; i < z->s->img_x; ++i) {
×
3964
                     stbi_uc m = coutput[3][i];
×
3965
                     out[0] = stbi__blinn_8x8(coutput[0][i], m);
×
3966
                     out[1] = stbi__blinn_8x8(coutput[1][i], m);
×
3967
                     out[2] = stbi__blinn_8x8(coutput[2][i], m);
×
3968
                     out[3] = 255;
×
3969
                     out += n;
×
3970
                  }
3971
               } else if (z->app14_color_transform == 2) { // YCCK
×
3972
                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
×
3973
                  for (i=0; i < z->s->img_x; ++i) {
×
3974
                     stbi_uc m = coutput[3][i];
×
3975
                     out[0] = stbi__blinn_8x8(255 - out[0], m);
×
3976
                     out[1] = stbi__blinn_8x8(255 - out[1], m);
×
3977
                     out[2] = stbi__blinn_8x8(255 - out[2], m);
×
3978
                     out += n;
×
3979
                  }
3980
               } else { // YCbCr + alpha?  Ignore the fourth channel for now
3981
                  z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
×
3982
               }
3983
            } else
3984
               for (i=0; i < z->s->img_x; ++i) {
811,350!
3985
                  out[0] = out[1] = out[2] = y[i];
810,000✔
3986
                  out[3] = 255; // not used if n==3
810,000✔
3987
                  out += n;
810,000✔
3988
               }
3989
         } else {
3990
            if (is_rgb) {
×
3991
               if (n == 1)
×
3992
                  for (i=0; i < z->s->img_x; ++i)
×
3993
                     *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
×
3994
               else {
3995
                  for (i=0; i < z->s->img_x; ++i, out += 2) {
×
3996
                     out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);
×
3997
                     out[1] = 255;
×
3998
                  }
3999
               }
4000
            } else if (z->s->img_n == 4 && z->app14_color_transform == 0) {
×
4001
               for (i=0; i < z->s->img_x; ++i) {
×
4002
                  stbi_uc m = coutput[3][i];
×
4003
                  stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);
×
4004
                  stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);
×
4005
                  stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);
×
4006
                  out[0] = stbi__compute_y(r, g, b);
×
4007
                  out[1] = 255;
×
4008
                  out += n;
×
4009
               }
4010
            } else if (z->s->img_n == 4 && z->app14_color_transform == 2) {
×
4011
               for (i=0; i < z->s->img_x; ++i) {
×
4012
                  out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);
×
4013
                  out[1] = 255;
×
4014
                  out += n;
×
4015
               }
4016
            } else {
4017
               stbi_uc *y = coutput[0];
×
4018
               if (n == 1)
×
4019
                  for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
×
4020
               else
4021
                  for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }
×
4022
            }
4023
         }
4024
      }
4025
      stbi__cleanup_jpeg(z);
63✔
4026
      *out_x = z->s->img_x;
63✔
4027
      *out_y = z->s->img_y;
63✔
4028
      if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output
66!
4029
      return output;
4030
   }
4031
}
4032

4033
static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
63✔
4034
{
4035
   unsigned char* result;
63✔
4036
   stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));
63✔
4037
   if (!j) return stbi__errpuc("outofmem", "Out of memory");
63!
4038
   memset(j, 0, sizeof(stbi__jpeg));
63✔
4039
   STBI_NOTUSED(ri);
63✔
4040
   j->s = s;
63✔
4041
   stbi__setup_jpeg(j);
63✔
4042
   result = load_jpeg_image(j, x,y,comp,req_comp);
63✔
4043
   STBI_FREE(j);
63✔
4044
   return result;
63✔
4045
}
4046

4047
static int stbi__jpeg_test(stbi__context *s)
84✔
4048
{
4049
   int r;
84✔
4050
   stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));
84✔
4051
   if (!j) return stbi__err("outofmem", "Out of memory");
84!
4052
   memset(j, 0, sizeof(stbi__jpeg));
84✔
4053
   j->s = s;
84✔
4054
   stbi__setup_jpeg(j);
84✔
4055
   r = stbi__decode_jpeg_header(j, STBI__SCAN_type);
84✔
4056
   stbi__rewind(s);
84✔
4057
   STBI_FREE(j);
84✔
4058
   return r;
84✔
4059
}
4060

4061
static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
×
4062
{
4063
   if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
×
4064
      stbi__rewind( j->s );
×
4065
      return 0;
×
4066
   }
4067
   if (x) *x = j->s->img_x;
×
4068
   if (y) *y = j->s->img_y;
×
4069
   if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;
×
4070
   return 1;
4071
}
4072

4073
static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
×
4074
{
4075
   int result;
×
4076
   stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));
×
4077
   if (!j) return stbi__err("outofmem", "Out of memory");
×
4078
   memset(j, 0, sizeof(stbi__jpeg));
×
4079
   j->s = s;
×
4080
   result = stbi__jpeg_info_raw(j, x, y, comp);
×
4081
   STBI_FREE(j);
×
4082
   return result;
×
4083
}
4084
#endif
4085

4086
// public domain zlib decode    v0.2  Sean Barrett 2006-11-18
4087
//    simple implementation
4088
//      - all input must be provided in an upfront buffer
4089
//      - all output is written to a single output buffer (can malloc/realloc)
4090
//    performance
4091
//      - fast huffman
4092

4093
#ifndef STBI_NO_ZLIB
4094

4095
// fast-way is faster to check than jpeg huffman, but slow way is slower
4096
#define STBI__ZFAST_BITS  9 // accelerate all cases in default tables
4097
#define STBI__ZFAST_MASK  ((1 << STBI__ZFAST_BITS) - 1)
4098
#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet
4099

4100
// zlib-style huffman encoding
4101
// (jpegs packs from left, zlib from right, so can't share code)
4102
typedef struct
4103
{
4104
   stbi__uint16 fast[1 << STBI__ZFAST_BITS];
4105
   stbi__uint16 firstcode[16];
4106
   int maxcode[17];
4107
   stbi__uint16 firstsymbol[16];
4108
   stbi_uc  size[STBI__ZNSYMS];
4109
   stbi__uint16 value[STBI__ZNSYMS];
4110
} stbi__zhuffman;
4111

4112
stbi_inline static int stbi__bitreverse16(int n)
670,377✔
4113
{
4114
  n = ((n & 0xAAAA) >>  1) | ((n & 0x5555) << 1);
670,377✔
4115
  n = ((n & 0xCCCC) >>  2) | ((n & 0x3333) << 2);
670,377✔
4116
  n = ((n & 0xF0F0) >>  4) | ((n & 0x0F0F) << 4);
670,377✔
4117
  n = ((n & 0xFF00) >>  8) | ((n & 0x00FF) << 8);
670,377✔
4118
  return n;
670,377✔
4119
}
4120

4121
stbi_inline static int stbi__bit_reverse(int v, int bits)
670,377✔
4122
{
4123
   STBI_ASSERT(bits <= 16);
92,712!
4124
   // to bit reverse n bits, reverse 16 and shift
4125
   // e.g. 11 bits, bit reverse and shift away 5
4126
   return stbi__bitreverse16(v) >> (16-bits);
670,377✔
4127
}
4128

4129
static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)
3,153✔
4130
{
4131
   int i,k=0;
3,153✔
4132
   int code, next_code[16], sizes[17];
3,153✔
4133

4134
   // DEFLATE spec for generating codes
4135
   memset(sizes, 0, sizeof(sizes));
3,153✔
4136
   memset(z->fast, 0, sizeof(z->fast));
3,153✔
4137
   for (i=0; i < num; ++i)
342,246!
4138
      ++sizes[sizelist[i]];
339,093✔
4139
   sizes[0] = 0;
3,153✔
4140
   for (i=1; i < 16; ++i)
50,448!
4141
      if (sizes[i] > (1 << i))
47,295!
4142
         return stbi__err("bad sizes", "Corrupt PNG");
×
4143
   code = 0;
4144
   for (i=1; i < 16; ++i) {
50,448!
4145
      next_code[i] = code;
47,295✔
4146
      z->firstcode[i] = (stbi__uint16) code;
47,295✔
4147
      z->firstsymbol[i] = (stbi__uint16) k;
47,295✔
4148
      code = (code + sizes[i]);
47,295✔
4149
      if (sizes[i])
47,295!
4150
         if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG");
22,836!
4151
      z->maxcode[i] = code << (16-i); // preshift for inner loop
47,295✔
4152
      code <<= 1;
47,295✔
4153
      k += sizes[i];
47,295✔
4154
   }
4155
   z->maxcode[16] = 0x10000; // sentinel
3,153✔
4156
   for (i=0; i < num; ++i) {
342,246!
4157
      int s = sizelist[i];
339,093✔
4158
      if (s) {
339,093!
4159
         int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
157,290✔
4160
         stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
157,290✔
4161
         z->size [c] = (stbi_uc     ) s;
157,290✔
4162
         z->value[c] = (stbi__uint16) i;
157,290✔
4163
         if (s <= STBI__ZFAST_BITS) {
157,290!
4164
            int j = stbi__bit_reverse(next_code[s],s);
92,712✔
4165
            while (j < (1 << STBI__ZFAST_BITS)) {
1,694,505!
4166
               z->fast[j] = fastv;
1,601,793✔
4167
               j += (1 << s);
1,601,793✔
4168
            }
4169
         }
4170
         ++next_code[s];
157,290✔
4171
      }
4172
   }
4173
   return 1;
4174
}
4175

4176
// zlib-from-memory implementation for PNG reading
4177
//    because PNG allows splitting the zlib stream arbitrarily,
4178
//    and it's annoying structurally to have PNG call ZLIB call PNG,
4179
//    we require PNG read all the IDATs and combine them into a single
4180
//    memory buffer
4181

4182
typedef struct
4183
{
4184
   stbi_uc *zbuffer, *zbuffer_end;
4185
   int num_bits;
4186
   int hit_zeof_once;
4187
   stbi__uint32 code_buffer;
4188

4189
   char *zout;
4190
   char *zout_start;
4191
   char *zout_end;
4192
   int   z_expandable;
4193

4194
   stbi__zhuffman z_length, z_distance;
4195
} stbi__zbuf;
4196

4197
stbi_inline static int stbi__zeof(stbi__zbuf *z)
36,802,140✔
4198
{
4199
   return (z->zbuffer >= z->zbuffer_end);
36,802,140✔
4200
}
4201

4202
stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)
25,667,604✔
4203
{
4204
   return stbi__zeof(z) ? 0 : *z->zbuffer++;
25,667,604!
4205
}
4206

4207
static void stbi__fill_bits(stbi__zbuf *z)
11,229,387✔
4208
{
4209
   do {
25,667,292✔
4210
      if (z->code_buffer >= (1U << z->num_bits)) {
25,667,292!
4211
        z->zbuffer = z->zbuffer_end;  /* treat this as EOF so we fail. */
×
4212
        return;
×
4213
      }
4214
      z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;
25,667,292!
4215
      z->num_bits += 8;
25,667,292✔
4216
   } while (z->num_bits <= 24);
25,667,292!
4217
}
4218

4219
stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
11,243,355✔
4220
{
4221
   unsigned int k;
11,243,355✔
4222
   if (z->num_bits < n) stbi__fill_bits(z);
11,243,355!
4223
   k = z->code_buffer & ((1 << n) - 1);
11,243,355✔
4224
   z->code_buffer >>= n;
11,243,355✔
4225
   z->num_bits -= n;
11,243,355✔
4226
   return k;
11,243,355✔
4227
}
4228

4229
static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
577,665✔
4230
{
4231
   int b,s,k;
577,665✔
4232
   // not resolved by fast table, so compute it the slow way
4233
   // use jpeg approach, which requires MSbits at top
4234
   k = stbi__bit_reverse(a->code_buffer, 16);
577,665✔
4235
   for (s=STBI__ZFAST_BITS+1; ; ++s)
1,030,035✔
4236
      if (k < z->maxcode[s])
1,030,035!
4237
         break;
4238
   if (s >= 16) return -1; // invalid code!
577,665!
4239
   // code size is s, so:
4240
   b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
577,665✔
4241
   if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere!
577,665!
4242
   if (z->size[b] != s) return -1;  // was originally an assert, but report failure instead.
577,665!
4243
   a->code_buffer >>= s;
577,665✔
4244
   a->num_bits -= s;
577,665✔
4245
   return z->value[b];
577,665✔
4246
}
4247

4248
stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
30,259,434✔
4249
{
4250
   int b,s;
30,259,434✔
4251
   if (a->num_bits < 16) {
30,259,434!
4252
      if (stbi__zeof(a)) {
11,134,380!
4253
         if (!a->hit_zeof_once) {
×
4254
            // This is the first time we hit eof, insert 16 extra padding btis
4255
            // to allow us to keep going; if we actually consume any of them
4256
            // though, that is invalid data. This is caught later.
4257
            a->hit_zeof_once = 1;
×
4258
            a->num_bits += 16; // add 16 implicit zero bits
×
4259
         } else {
4260
            // We already inserted our extra 16 padding bits and are again
4261
            // out, this stream is actually prematurely terminated.
4262
            return -1;
4263
         }
4264
      } else {
4265
         stbi__fill_bits(a);
11,134,380✔
4266
      }
4267
   }
4268
   b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
30,259,434✔
4269
   if (b) {
30,259,434!
4270
      s = b >> 9;
29,681,769✔
4271
      a->code_buffer >>= s;
29,681,769✔
4272
      a->num_bits -= s;
29,681,769✔
4273
      return b & 511;
29,681,769✔
4274
   }
4275
   return stbi__zhuffman_decode_slowpath(a, z);
577,665✔
4276
}
4277

4278
static int stbi__zexpand(stbi__zbuf *z, char *zout, int n)  // need to make room for n bytes
×
4279
{
4280
   char *q;
×
4281
   unsigned int cur, limit, old_limit;
×
4282
   z->zout = zout;
×
4283
   if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");
×
4284
   cur   = (unsigned int) (z->zout - z->zout_start);
×
4285
   limit = old_limit = (unsigned) (z->zout_end - z->zout_start);
×
4286
   if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory");
×
4287
   while (cur + n > limit) {
×
4288
      if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory");
×
4289
      limit *= 2;
×
4290
   }
4291
   q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);
×
4292
   STBI_NOTUSED(old_limit);
×
4293
   if (q == NULL) return stbi__err("outofmem", "Out of memory");
×
4294
   z->zout_start = q;
×
4295
   z->zout       = q + cur;
×
4296
   z->zout_end   = q + limit;
×
4297
   return 1;
×
4298
}
4299

4300
static const int stbi__zlength_base[31] = {
4301
   3,4,5,6,7,8,9,10,11,13,
4302
   15,17,19,23,27,31,35,43,51,59,
4303
   67,83,99,115,131,163,195,227,258,0,0 };
4304

4305
static const int stbi__zlength_extra[31]=
4306
{ 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 };
4307

4308
static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
4309
257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
4310

4311
static const int stbi__zdist_extra[32] =
4312
{ 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};
4313

4314
static int stbi__parse_huffman_block(stbi__zbuf *a)
1,053✔
4315
{
4316
   char *zout = a->zout;
1,053✔
4317
   for(;;) {
18,933,969✔
4318
      int z = stbi__zhuffman_decode(a, &a->z_length);
18,933,969✔
4319
      if (z < 256) {
18,933,969!
4320
         if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes
7,727,532!
4321
         if (zout >= a->zout_end) {
7,727,532!
4322
            if (!stbi__zexpand(a, zout, 1)) return 0;
×
4323
            zout = a->zout;
×
4324
         }
4325
         *zout++ = (char) z;
7,727,532✔
4326
      } else {
4327
         stbi_uc *p;
11,206,437✔
4328
         int len,dist;
11,206,437✔
4329
         if (z == 256) {
11,206,437!
4330
            a->zout = zout;
1,053✔
4331
            if (a->hit_zeof_once && a->num_bits < 16) {
1,053!
4332
               // The first time we hit zeof, we inserted 16 extra zero bits into our bit
4333
               // buffer so the decoder can just do its speculative decoding. But if we
4334
               // actually consumed any of those bits (which is the case when num_bits < 16),
4335
               // the stream actually read past the end so it is malformed.
4336
               return stbi__err("unexpected end","Corrupt PNG");
×
4337
            }
4338
            return 1;
4339
         }
4340
         if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data
11,205,384!
4341
         z -= 257;
11,205,384✔
4342
         len = stbi__zlength_base[z];
11,205,384✔
4343
         if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
11,205,384!
4344
         z = stbi__zhuffman_decode(a, &a->z_distance);
11,205,384✔
4345
         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
11,205,384!
4346
         dist = stbi__zdist_base[z];
11,205,384✔
4347
         if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
11,205,384!
4348
         if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG");
11,205,384!
4349
         if (len > a->zout_end - zout) {
11,205,384!
4350
            if (!stbi__zexpand(a, zout, len)) return 0;
×
4351
            zout = a->zout;
×
4352
         }
4353
         p = (stbi_uc *) (zout - dist);
11,205,384✔
4354
         if (dist == 1) { // run of one byte; common in images.
11,205,384!
4355
            stbi_uc v = *p;
171,660✔
4356
            if (len) { do *zout++ = v; while (--len); }
1,293,963!
4357
         } else {
4358
            if (len) { do *zout++ = *p++; while (--len); }
50,419,605!
4359
         }
4360
      }
×
4361
   }
×
4362
}
4363

4364
static int stbi__compute_huffman_codes(stbi__zbuf *a)
1,047✔
4365
{
4366
   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 };
1,047✔
4367
   stbi__zhuffman z_codelength;
1,047✔
4368
   stbi_uc lencodes[286+32+137];//padding for maximum single op
1,047✔
4369
   stbi_uc codelength_sizes[19];
1,047✔
4370
   int i,n;
1,047✔
4371

4372
   int hlit  = stbi__zreceive(a,5) + 257;
1,047✔
4373
   int hdist = stbi__zreceive(a,5) + 1;
1,047✔
4374
   int hclen = stbi__zreceive(a,4) + 4;
1,047✔
4375
   int ntot  = hlit + hdist;
1,047✔
4376

4377
   memset(codelength_sizes, 0, sizeof(codelength_sizes));
1,047✔
4378
   for (i=0; i < hclen; ++i) {
20,103!
4379
      int s = stbi__zreceive(a,3);
19,056✔
4380
      codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
19,056✔
4381
   }
4382
   if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
1,047!
4383

4384
   n = 0;
4385
   while (n < ntot) {
121,128!
4386
      int c = stbi__zhuffman_decode(a, &z_codelength);
120,081✔
4387
      if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG");
120,081!
4388
      if (c < 16)
120,081!
4389
         lencodes[n++] = (stbi_uc) c;
105,750✔
4390
      else {
4391
         stbi_uc fill = 0;
14,331✔
4392
         if (c == 16) {
14,331!
4393
            c = stbi__zreceive(a,2)+3;
9,192✔
4394
            if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG");
9,192!
4395
            fill = lencodes[n-1];
9,192✔
4396
         } else if (c == 17) {
5,139!
4397
            c = stbi__zreceive(a,3)+3;
2,679✔
4398
         } else if (c == 18) {
2,460!
4399
            c = stbi__zreceive(a,7)+11;
2,460✔
4400
         } else {
4401
            return stbi__err("bad codelengths", "Corrupt PNG");
4402
         }
4403
         if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG");
14,331!
4404
         memset(lencodes+n, fill, c);
14,331✔
4405
         n += c;
14,331✔
4406
      }
×
4407
   }
×
4408
   if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG");
1,047!
4409
   if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
1,047!
4410
   if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
1,047!
4411
   return 1;
4412
}
4413

4414
static int stbi__parse_uncompressed_block(stbi__zbuf *a)
×
4415
{
4416
   stbi_uc header[4];
×
4417
   int len,nlen,k;
×
4418
   if (a->num_bits & 7)
×
4419
      stbi__zreceive(a, a->num_bits & 7); // discard
×
4420
   // drain the bit-packed data into header
4421
   k = 0;
4422
   while (a->num_bits > 0) {
×
4423
      header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check
×
4424
      a->code_buffer >>= 8;
×
4425
      a->num_bits -= 8;
×
4426
   }
4427
   if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG");
×
4428
   // now fill header the normal way
4429
   while (k < 4)
×
4430
      header[k++] = stbi__zget8(a);
×
4431
   len  = header[1] * 256 + header[0];
×
4432
   nlen = header[3] * 256 + header[2];
×
4433
   if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG");
×
4434
   if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG");
×
4435
   if (a->zout + len > a->zout_end)
×
4436
      if (!stbi__zexpand(a, a->zout, len)) return 0;
×
4437
   memcpy(a->zout, a->zbuffer, len);
×
4438
   a->zbuffer += len;
×
4439
   a->zout += len;
×
4440
   return 1;
×
4441
}
4442

4443
static int stbi__parse_zlib_header(stbi__zbuf *a)
156✔
4444
{
4445
   int cmf   = stbi__zget8(a);
156!
4446
   int cm    = cmf & 15;
156✔
4447
   /* int cinfo = cmf >> 4; */
4448
   int flg   = stbi__zget8(a);
156!
4449
   if (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
156!
4450
   if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
156!
4451
   if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
156!
4452
   if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png
156!
4453
   // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
4454
   return 1;
4455
}
4456

4457
static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] =
4458
{
4459
   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,
4460
   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,
4461
   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,
4462
   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,
4463
   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,
4464
   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,
4465
   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,
4466
   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,
4467
   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
4468
};
4469
static const stbi_uc stbi__zdefault_distance[32] =
4470
{
4471
   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
4472
};
4473
/*
4474
Init algorithm:
4475
{
4476
   int i;   // use <= to match clearly with spec
4477
   for (i=0; i <= 143; ++i)     stbi__zdefault_length[i]   = 8;
4478
   for (   ; i <= 255; ++i)     stbi__zdefault_length[i]   = 9;
4479
   for (   ; i <= 279; ++i)     stbi__zdefault_length[i]   = 7;
4480
   for (   ; i <= 287; ++i)     stbi__zdefault_length[i]   = 8;
4481

4482
   for (i=0; i <=  31; ++i)     stbi__zdefault_distance[i] = 5;
4483
}
4484
*/
4485

4486
static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
156✔
4487
{
4488
   int final, type;
156✔
4489
   if (parse_header)
156!
4490
      if (!stbi__parse_zlib_header(a)) return 0;
156!
4491
   a->num_bits = 0;
156✔
4492
   a->code_buffer = 0;
156✔
4493
   a->hit_zeof_once = 0;
156✔
4494
   do {
1,053✔
4495
      final = stbi__zreceive(a,1);
1,053✔
4496
      type = stbi__zreceive(a,2);
1,053✔
4497
      if (type == 0) {
1,053!
4498
         if (!stbi__parse_uncompressed_block(a)) return 0;
×
4499
      } else if (type == 3) {
1,053!
4500
         return 0;
4501
      } else {
4502
         if (type == 1) {
1,053!
4503
            // use fixed code lengths
4504
            if (!stbi__zbuild_huffman(&a->z_length  , stbi__zdefault_length  , STBI__ZNSYMS)) return 0;
6!
4505
            if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance,  32)) return 0;
6!
4506
         } else {
4507
            if (!stbi__compute_huffman_codes(a)) return 0;
1,047!
4508
         }
4509
         if (!stbi__parse_huffman_block(a)) return 0;
1,053!
4510
      }
4511
   } while (!final);
1,053!
4512
   return 1;
4513
}
4514

4515
static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)
156✔
4516
{
4517
   a->zout_start = obuf;
156✔
4518
   a->zout       = obuf;
156✔
4519
   a->zout_end   = obuf + olen;
156✔
4520
   a->z_expandable = exp;
156✔
4521

4522
   return stbi__parse_zlib(a, parse_header);
156✔
4523
}
4524

4525
STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
×
4526
{
4527
   stbi__zbuf a;
×
4528
   char *p = (char *) stbi__malloc(initial_size);
×
4529
   if (p == NULL) return NULL;
×
4530
   a.zbuffer = (stbi_uc *) buffer;
×
4531
   a.zbuffer_end = (stbi_uc *) buffer + len;
×
4532
   if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
×
4533
      if (outlen) *outlen = (int) (a.zout - a.zout_start);
×
4534
      return a.zout_start;
×
4535
   } else {
4536
      STBI_FREE(a.zout_start);
×
4537
      return NULL;
×
4538
   }
4539
}
4540

4541
STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
×
4542
{
4543
   return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
×
4544
}
4545

4546
STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
156✔
4547
{
4548
   stbi__zbuf a;
156✔
4549
   char *p = (char *) stbi__malloc(initial_size);
156✔
4550
   if (p == NULL) return NULL;
156!
4551
   a.zbuffer = (stbi_uc *) buffer;
156✔
4552
   a.zbuffer_end = (stbi_uc *) buffer + len;
156✔
4553
   if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
156!
4554
      if (outlen) *outlen = (int) (a.zout - a.zout_start);
156!
4555
      return a.zout_start;
156✔
4556
   } else {
4557
      STBI_FREE(a.zout_start);
×
4558
      return NULL;
×
4559
   }
4560
}
4561

4562
STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
×
4563
{
4564
   stbi__zbuf a;
×
4565
   a.zbuffer = (stbi_uc *) ibuffer;
×
4566
   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
×
4567
   if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
×
4568
      return (int) (a.zout - a.zout_start);
×
4569
   else
4570
      return -1;
4571
}
4572

4573
STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
×
4574
{
4575
   stbi__zbuf a;
×
4576
   char *p = (char *) stbi__malloc(16384);
×
4577
   if (p == NULL) return NULL;
×
4578
   a.zbuffer = (stbi_uc *) buffer;
×
4579
   a.zbuffer_end = (stbi_uc *) buffer+len;
×
4580
   if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
×
4581
      if (outlen) *outlen = (int) (a.zout - a.zout_start);
×
4582
      return a.zout_start;
×
4583
   } else {
4584
      STBI_FREE(a.zout_start);
×
4585
      return NULL;
×
4586
   }
4587
}
4588

4589
STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
×
4590
{
4591
   stbi__zbuf a;
×
4592
   a.zbuffer = (stbi_uc *) ibuffer;
×
4593
   a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
×
4594
   if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
×
4595
      return (int) (a.zout - a.zout_start);
×
4596
   else
4597
      return -1;
4598
}
4599
#endif
4600

4601
// public domain "baseline" PNG decoder   v0.10  Sean Barrett 2006-11-18
4602
//    simple implementation
4603
//      - only 8-bit samples
4604
//      - no CRC checking
4605
//      - allocates lots of intermediate memory
4606
//        - avoids problem of streaming data between subsystems
4607
//        - avoids explicit window management
4608
//    performance
4609
//      - uses stb_zlib, a PD zlib implementation with fast huffman decoding
4610

4611
#ifndef STBI_NO_PNG
4612
typedef struct
4613
{
4614
   stbi__uint32 length;
4615
   stbi__uint32 type;
4616
} stbi__pngchunk;
4617

4618
static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
2,370✔
4619
{
4620
   stbi__pngchunk c;
2,370✔
4621
   c.length = stbi__get32be(s);
2,370✔
4622
   c.type   = stbi__get32be(s);
2,370✔
4623
   return c;
2,370✔
4624
}
4625

4626
static int stbi__check_png_header(stbi__context *s)
399✔
4627
{
4628
   static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
399✔
4629
   int i;
399✔
4630
   for (i=0; i < 8; ++i)
2,895!
4631
      if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
2,583!
4632
   return 1;
4633
}
4634

4635
typedef struct
4636
{
4637
   stbi__context *s;
4638
   stbi_uc *idata, *expanded, *out;
4639
   int depth;
4640
} stbi__png;
4641

4642

4643
enum {
4644
   STBI__F_none=0,
4645
   STBI__F_sub=1,
4646
   STBI__F_up=2,
4647
   STBI__F_avg=3,
4648
   STBI__F_paeth=4,
4649
   // synthetic filter used for first scanline to avoid needing a dummy row of 0s
4650
   STBI__F_avg_first
4651
};
4652

4653
static stbi_uc first_row_filter[5] =
4654
{
4655
   STBI__F_none,
4656
   STBI__F_sub,
4657
   STBI__F_none,
4658
   STBI__F_avg_first,
4659
   STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub
4660
};
4661

4662
static int stbi__paeth(int a, int b, int c)
49,693,392✔
4663
{
4664
   // This formulation looks very different from the reference in the PNG spec, but is
4665
   // actually equivalent and has favorable data dependencies and admits straightforward
4666
   // generation of branch-free code, which helps performance significantly.
4667
   int thresh = c*3 - (a + b);
49,693,392✔
4668
   int lo = a < b ? a : b;
49,693,392!
4669
   int hi = a < b ? b : a;
49,693,392!
4670
   int t0 = (hi <= thresh) ? lo : c;
99,386,784!
4671
   int t1 = (thresh <= lo) ? hi : t0;
49,693,392!
4672
   return t1;
49,693,392✔
4673
}
4674

4675
static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
4676

4677
// adds an extra all-255 alpha channel
4678
// dest == src is legal
4679
// img_n must be 1 or 3
4680
static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n)
×
4681
{
4682
   int i;
×
4683
   // must process data backwards since we allow dest==src
4684
   if (img_n == 1) {
×
4685
      for (i=x-1; i >= 0; --i) {
×
4686
         dest[i*2+1] = 255;
×
4687
         dest[i*2+0] = src[i];
×
4688
      }
4689
   } else {
4690
      STBI_ASSERT(img_n == 3);
×
4691
      for (i=x-1; i >= 0; --i) {
×
4692
         dest[i*4+3] = 255;
×
4693
         dest[i*4+2] = src[i*3+2];
×
4694
         dest[i*4+1] = src[i*3+1];
×
4695
         dest[i*4+0] = src[i*3+0];
×
4696
      }
4697
   }
4698
}
×
4699

4700
// create the png data from post-deflated data
4701
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)
156✔
4702
{
4703
   int bytes = (depth == 16 ? 2 : 1);
156!
4704
   stbi__context *s = a->s;
156✔
4705
   stbi__uint32 i,j,stride = x*out_n*bytes;
156✔
4706
   stbi__uint32 img_len, img_width_bytes;
156✔
4707
   stbi_uc *filter_buf;
156✔
4708
   int all_ok = 1;
156✔
4709
   int k;
156✔
4710
   int img_n = s->img_n; // copy it into a local for later
156✔
4711

4712
   int output_bytes = out_n*bytes;
156✔
4713
   int filter_bytes = img_n*bytes;
156✔
4714
   int width = x;
156✔
4715

4716
   STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
156!
4717
   a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into
156✔
4718
   if (!a->out) return stbi__err("outofmem", "Out of memory");
156!
4719

4720
   // note: error exits here don't need to clean up a->out individually,
4721
   // stbi__do_png always does on error.
4722
   if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG");
156!
4723
   img_width_bytes = (((img_n * x * depth) + 7) >> 3);
156✔
4724
   if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG");
156!
4725
   img_len = (img_width_bytes + 1) * y;
156✔
4726

4727
   // we used to check for exact match between raw_len and img_len on non-interlaced PNGs,
4728
   // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),
4729
   // so just check for raw_len < img_len always.
4730
   if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
156!
4731

4732
   // Allocate two scan lines worth of filter workspace buffer.
4733
   filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0);
156✔
4734
   if (!filter_buf) return stbi__err("outofmem", "Out of memory");
156!
4735

4736
   // Filtering for low-bit-depth images
4737
   if (depth < 8) {
156!
4738
      filter_bytes = 1;
9✔
4739
      width = img_width_bytes;
9✔
4740
   }
4741

4742
   for (j=0; j < y; ++j) {
23,862!
4743
      // cur/prior filter buffers alternate
4744
      stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes;
23,706✔
4745
      stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes;
23,706✔
4746
      stbi_uc *dest = a->out + stride*j;
23,706✔
4747
      int nk = width * filter_bytes;
23,706✔
4748
      int filter = *raw++;
23,706✔
4749

4750
      // check filter type
4751
      if (filter > 4) {
23,706!
4752
         all_ok = stbi__err("invalid filter","Corrupt PNG");
×
4753
         break;
×
4754
      }
4755

4756
      // if first row, use special filter that doesn't sample previous row
4757
      if (j == 0) filter = first_row_filter[filter];
23,706!
4758

4759
      // perform actual filtering
4760
      switch (filter) {
23,706!
4761
      case STBI__F_none:
9,660✔
4762
         memcpy(cur, raw, nk);
9,660✔
4763
         break;
9,660✔
4764
      case STBI__F_sub:
162✔
4765
         memcpy(cur, raw, filter_bytes);
162✔
4766
         for (k = filter_bytes; k < nk; ++k)
166,308!
4767
            cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]);
166,146✔
4768
         break;
4769
      case STBI__F_up:
4770
         for (k = 0; k < nk; ++k)
747,801!
4771
            cur[k] = STBI__BYTECAST(raw[k] + prior[k]);
746,334✔
4772
         break;
4773
      case STBI__F_avg:
4774
         for (k = 0; k < filter_bytes; ++k)
1,860!
4775
            cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1));
1,395✔
4776
         for (k = filter_bytes; k < nk; ++k)
3,062,526!
4777
            cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1));
3,062,061✔
4778
         break;
4779
      case STBI__F_paeth:
4780
         for (k = 0; k < filter_bytes; ++k)
47,808!
4781
            cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0)
35,856✔
4782
         for (k = filter_bytes; k < nk; ++k)
49,705,344!
4783
            cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes]));
99,386,784✔
4784
         break;
4785
      case STBI__F_avg_first:
×
4786
         memcpy(cur, raw, filter_bytes);
×
4787
         for (k = filter_bytes; k < nk; ++k)
×
4788
            cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1));
×
4789
         break;
4790
      }
4791

4792
      raw += nk;
23,706✔
4793

4794
      // expand decoded bits in cur to dest, also adding an extra alpha channel if desired
4795
      if (depth < 8) {
23,706!
4796
         stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range
210!
4797
         stbi_uc *in = cur;
210✔
4798
         stbi_uc *out = dest;
210✔
4799
         stbi_uc inb = 0;
210✔
4800
         stbi__uint32 nsmp = x*img_n;
210✔
4801

4802
         // expand bits to bytes first
4803
         if (depth == 4) {
210!
4804
            for (i=0; i < nsmp; ++i) {
83,370!
4805
               if ((i & 1) == 0) inb = *in++;
83,160!
4806
               *out++ = scale * (inb >> 4);
83,160✔
4807
               inb <<= 4;
83,160✔
4808
            }
4809
         } else if (depth == 2) {
×
4810
            for (i=0; i < nsmp; ++i) {
×
4811
               if ((i & 3) == 0) inb = *in++;
×
4812
               *out++ = scale * (inb >> 6);
×
4813
               inb <<= 2;
×
4814
            }
4815
         } else {
4816
            STBI_ASSERT(depth == 1);
×
4817
            for (i=0; i < nsmp; ++i) {
×
4818
               if ((i & 7) == 0) inb = *in++;
×
4819
               *out++ = scale * (inb >> 7);
×
4820
               inb <<= 1;
×
4821
            }
4822
         }
4823

4824
         // insert alpha=255 values if desired
4825
         if (img_n != out_n)
210!
4826
            stbi__create_png_alpha_expand8(dest, dest, x, img_n);
×
4827
      } else if (depth == 8) {
23,496!
4828
         if (img_n == out_n)
23,496!
4829
            memcpy(dest, cur, x*img_n);
23,496✔
4830
         else
4831
            stbi__create_png_alpha_expand8(dest, cur, x, img_n);
×
4832
      } else if (depth == 16) {
×
4833
         // convert the image data from big-endian to platform-native
4834
         stbi__uint16 *dest16 = (stbi__uint16*)dest;
×
4835
         stbi__uint32 nsmp = x*img_n;
×
4836

4837
         if (img_n == out_n) {
×
4838
            for (i = 0; i < nsmp; ++i, ++dest16, cur += 2)
×
4839
               *dest16 = (cur[0] << 8) | cur[1];
×
4840
         } else {
4841
            STBI_ASSERT(img_n+1 == out_n);
×
4842
            if (img_n == 1) {
×
4843
               for (i = 0; i < x; ++i, dest16 += 2, cur += 2) {
×
4844
                  dest16[0] = (cur[0] << 8) | cur[1];
×
4845
                  dest16[1] = 0xffff;
×
4846
               }
4847
            } else {
4848
               STBI_ASSERT(img_n == 3);
×
4849
               for (i = 0; i < x; ++i, dest16 += 4, cur += 6) {
×
4850
                  dest16[0] = (cur[0] << 8) | cur[1];
×
4851
                  dest16[1] = (cur[2] << 8) | cur[3];
×
4852
                  dest16[2] = (cur[4] << 8) | cur[5];
×
4853
                  dest16[3] = 0xffff;
×
4854
               }
4855
            }
4856
         }
4857
      }
4858
   }
×
4859

4860
   STBI_FREE(filter_buf);
156✔
4861
   if (!all_ok) return 0;
156!
4862

4863
   return 1;
4864
}
4865

4866
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)
156✔
4867
{
4868
   int bytes = (depth == 16 ? 2 : 1);
156!
4869
   int out_bytes = out_n * bytes;
156✔
4870
   stbi_uc *final;
156✔
4871
   int p;
156✔
4872
   if (!interlaced)
156!
4873
      return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
156✔
4874

4875
   // de-interlacing
4876
   final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);
×
4877
   if (!final) return stbi__err("outofmem", "Out of memory");
×
4878
   for (p=0; p < 7; ++p) {
×
4879
      int xorig[] = { 0,4,0,2,0,1,0 };
×
4880
      int yorig[] = { 0,0,4,0,2,0,1 };
×
4881
      int xspc[]  = { 8,8,4,4,2,2,1 };
×
4882
      int yspc[]  = { 8,8,8,4,4,2,2 };
×
4883
      int i,j,x,y;
×
4884
      // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
4885
      x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
×
4886
      y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
×
4887
      if (x && y) {
×
4888
         stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
×
4889
         if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
×
4890
            STBI_FREE(final);
×
4891
            return 0;
×
4892
         }
4893
         for (j=0; j < y; ++j) {
×
4894
            for (i=0; i < x; ++i) {
×
4895
               int out_y = j*yspc[p]+yorig[p];
×
4896
               int out_x = i*xspc[p]+xorig[p];
×
4897
               memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,
×
4898
                      a->out + (j*x+i)*out_bytes, out_bytes);
×
4899
            }
4900
         }
4901
         STBI_FREE(a->out);
×
4902
         image_data += img_len;
×
4903
         image_data_len -= img_len;
×
4904
      }
×
4905
   }
×
4906
   a->out = final;
×
4907

4908
   return 1;
×
4909
}
4910

4911
static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)
×
4912
{
4913
   stbi__context *s = z->s;
×
4914
   stbi__uint32 i, pixel_count = s->img_x * s->img_y;
×
4915
   stbi_uc *p = z->out;
×
4916

4917
   // compute color-based transparency, assuming we've
4918
   // already got 255 as the alpha value in the output
4919
   STBI_ASSERT(out_n == 2 || out_n == 4);
×
4920

4921
   if (out_n == 2) {
×
4922
      for (i=0; i < pixel_count; ++i) {
×
4923
         p[1] = (p[0] == tc[0] ? 0 : 255);
×
4924
         p += 2;
×
4925
      }
4926
   } else {
4927
      for (i=0; i < pixel_count; ++i) {
×
4928
         if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
×
4929
            p[3] = 0;
×
4930
         p += 4;
×
4931
      }
4932
   }
4933
   return 1;
×
4934
}
4935

4936
static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)
×
4937
{
4938
   stbi__context *s = z->s;
×
4939
   stbi__uint32 i, pixel_count = s->img_x * s->img_y;
×
4940
   stbi__uint16 *p = (stbi__uint16*) z->out;
×
4941

4942
   // compute color-based transparency, assuming we've
4943
   // already got 65535 as the alpha value in the output
4944
   STBI_ASSERT(out_n == 2 || out_n == 4);
×
4945

4946
   if (out_n == 2) {
×
4947
      for (i = 0; i < pixel_count; ++i) {
×
4948
         p[1] = (p[0] == tc[0] ? 0 : 65535);
×
4949
         p += 2;
×
4950
      }
4951
   } else {
4952
      for (i = 0; i < pixel_count; ++i) {
×
4953
         if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
×
4954
            p[3] = 0;
×
4955
         p += 4;
×
4956
      }
4957
   }
4958
   return 1;
×
4959
}
4960

4961
static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)
12✔
4962
{
4963
   stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
12✔
4964
   stbi_uc *p, *temp_out, *orig = a->out;
12✔
4965

4966
   p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);
12✔
4967
   if (p == NULL) return stbi__err("outofmem", "Out of memory");
12!
4968

4969
   // between here and free(out) below, exitting would leak
4970
   temp_out = p;
12✔
4971

4972
   if (pal_img_n == 3) {
12!
4973
      for (i=0; i < pixel_count; ++i) {
893,172!
4974
         int n = orig[i]*4;
893,160✔
4975
         p[0] = palette[n  ];
893,160✔
4976
         p[1] = palette[n+1];
893,160✔
4977
         p[2] = palette[n+2];
893,160✔
4978
         p += 3;
893,160✔
4979
      }
4980
   } else {
4981
      for (i=0; i < pixel_count; ++i) {
×
4982
         int n = orig[i]*4;
×
4983
         p[0] = palette[n  ];
×
4984
         p[1] = palette[n+1];
×
4985
         p[2] = palette[n+2];
×
4986
         p[3] = palette[n+3];
×
4987
         p += 4;
×
4988
      }
4989
   }
4990
   STBI_FREE(a->out);
12✔
4991
   a->out = temp_out;
12✔
4992

4993
   STBI_NOTUSED(len);
12✔
4994

4995
   return 1;
12✔
4996
}
4997

4998
static int stbi__unpremultiply_on_load_global = 0;
4999
static int stbi__de_iphone_flag_global = 0;
5000

5001
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
×
5002
{
5003
   stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply;
×
5004
}
×
5005

5006
STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
×
5007
{
5008
   stbi__de_iphone_flag_global = flag_true_if_should_convert;
×
5009
}
×
5010

5011
#ifndef STBI_THREAD_LOCAL
5012
#define stbi__unpremultiply_on_load  stbi__unpremultiply_on_load_global
5013
#define stbi__de_iphone_flag  stbi__de_iphone_flag_global
5014
#else
5015
static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set;
5016
static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set;
5017

5018
STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply)
×
5019
{
5020
   stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply;
×
5021
   stbi__unpremultiply_on_load_set = 1;
×
5022
}
×
5023

5024
STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert)
×
5025
{
5026
   stbi__de_iphone_flag_local = flag_true_if_should_convert;
×
5027
   stbi__de_iphone_flag_set = 1;
×
5028
}
×
5029

5030
#define stbi__unpremultiply_on_load  (stbi__unpremultiply_on_load_set           \
5031
                                       ? stbi__unpremultiply_on_load_local      \
5032
                                       : stbi__unpremultiply_on_load_global)
5033
#define stbi__de_iphone_flag  (stbi__de_iphone_flag_set                         \
5034
                                ? stbi__de_iphone_flag_local                    \
5035
                                : stbi__de_iphone_flag_global)
5036
#endif // STBI_THREAD_LOCAL
5037

5038
static void stbi__de_iphone(stbi__png *z)
×
5039
{
5040
   stbi__context *s = z->s;
×
5041
   stbi__uint32 i, pixel_count = s->img_x * s->img_y;
×
5042
   stbi_uc *p = z->out;
×
5043

5044
   if (s->img_out_n == 3) {  // convert bgr to rgb
×
5045
      for (i=0; i < pixel_count; ++i) {
×
5046
         stbi_uc t = p[0];
×
5047
         p[0] = p[2];
×
5048
         p[2] = t;
×
5049
         p += 3;
×
5050
      }
5051
   } else {
5052
      STBI_ASSERT(s->img_out_n == 4);
×
5053
      if (stbi__unpremultiply_on_load) {
×
5054
         // convert bgr to rgb and unpremultiply
5055
         for (i=0; i < pixel_count; ++i) {
×
5056
            stbi_uc a = p[3];
×
5057
            stbi_uc t = p[0];
×
5058
            if (a) {
×
5059
               stbi_uc half = a / 2;
×
5060
               p[0] = (p[2] * 255 + half) / a;
×
5061
               p[1] = (p[1] * 255 + half) / a;
×
5062
               p[2] = ( t   * 255 + half) / a;
×
5063
            } else {
5064
               p[0] = p[2];
×
5065
               p[2] = t;
×
5066
            }
5067
            p += 4;
×
5068
         }
5069
      } else {
5070
         // convert bgr to rgb
5071
         for (i=0; i < pixel_count; ++i) {
×
5072
            stbi_uc t = p[0];
×
5073
            p[0] = p[2];
×
5074
            p[2] = t;
×
5075
            p += 4;
×
5076
         }
5077
      }
5078
   }
5079
}
×
5080

5081
#define STBI__PNG_TYPE(a,b,c,d)  (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))
5082

5083
static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
156✔
5084
{
5085
   stbi_uc palette[1024], pal_img_n=0;
156✔
5086
   stbi_uc has_trans=0, tc[3]={0};
156✔
5087
   stbi__uint16 tc16[3];
156✔
5088
   stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
156✔
5089
   int first=1,k,interlace=0, color=0, is_iphone=0;
156✔
5090
   stbi__context *s = z->s;
156✔
5091

5092
   z->expanded = NULL;
156✔
5093
   z->idata = NULL;
156✔
5094
   z->out = NULL;
156✔
5095

5096
   if (!stbi__check_png_header(s)) return 0;
156!
5097

5098
   if (scan == STBI__SCAN_type) return 1;
156!
5099

5100
   for (;;) {
2,214✔
5101
      stbi__pngchunk c = stbi__get_chunk_header(s);
2,370✔
5102
      switch (c.type) {
2,370!
5103
         case STBI__PNG_TYPE('C','g','B','I'):
×
5104
            is_iphone = 1;
×
5105
            stbi__skip(s, c.length);
×
5106
            break;
×
5107
         case STBI__PNG_TYPE('I','H','D','R'): {
156✔
5108
            int comp,filter;
156✔
5109
            if (!first) return stbi__err("multiple IHDR","Corrupt PNG");
156!
5110
            first = 0;
156✔
5111
            if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");
156!
5112
            s->img_x = stbi__get32be(s);
156✔
5113
            s->img_y = stbi__get32be(s);
156✔
5114
            if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
156!
5115
            if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
156!
5116
            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");
156!
5117
            color = stbi__get8(s);  if (color > 6)         return stbi__err("bad ctype","Corrupt PNG");
156!
5118
            if (color == 3 && z->depth == 16)                  return stbi__err("bad ctype","Corrupt PNG");
156!
5119
            if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");
144!
5120
            comp  = stbi__get8(s);  if (comp) return stbi__err("bad comp method","Corrupt PNG");
156!
5121
            filter= stbi__get8(s);  if (filter) return stbi__err("bad filter method","Corrupt PNG");
156!
5122
            interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG");
156!
5123
            if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG");
156!
5124
            if (!pal_img_n) {
156!
5125
               s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
144✔
5126
               if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
144!
5127
            } else {
5128
               // if paletted, then pal_n is our final components, and
5129
               // img_n is # components to decompress/filter.
5130
               s->img_n = 1;
12✔
5131
               if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG");
12!
5132
            }
5133
            // even with SCAN_header, have to scan to see if we have a tRNS
5134
            break;
5135
         }
×
5136

5137
         case STBI__PNG_TYPE('P','L','T','E'):  {
12✔
5138
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
12!
5139
            if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG");
12!
5140
            pal_len = c.length / 3;
12✔
5141
            if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG");
12!
5142
            for (i=0; i < pal_len; ++i) {
873!
5143
               palette[i*4+0] = stbi__get8(s);
861✔
5144
               palette[i*4+1] = stbi__get8(s);
861✔
5145
               palette[i*4+2] = stbi__get8(s);
861✔
5146
               palette[i*4+3] = 255;
861✔
5147
            }
5148
            break;
5149
         }
5150

5151
         case STBI__PNG_TYPE('t','R','N','S'): {
×
5152
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
×
5153
            if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG");
×
5154
            if (pal_img_n) {
×
5155
               if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }
×
5156
               if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG");
×
5157
               if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG");
×
5158
               pal_img_n = 4;
×
5159
               for (i=0; i < c.length; ++i)
×
5160
                  palette[i*4+3] = stbi__get8(s);
×
5161
            } else {
5162
               if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
×
5163
               if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
×
5164
               has_trans = 1;
×
5165
               // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now.
5166
               if (scan == STBI__SCAN_header) { ++s->img_n; return 1; }
×
5167
               if (z->depth == 16) {
×
5168
                  for (k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning
×
5169
                     tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is
×
5170
               } else {
5171
                  for (k = 0; k < s->img_n && k < 3; ++k)
×
5172
                     tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger
×
5173
               }
5174
            }
5175
            break;
5176
         }
5177

5178
         case STBI__PNG_TYPE('I','D','A','T'): {
1,458✔
5179
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
1,458!
5180
            if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG");
1,458!
5181
            if (scan == STBI__SCAN_header) {
1,458!
5182
               // header scan definitely stops at first IDAT
5183
               if (pal_img_n)
×
5184
                  s->img_n = pal_img_n;
×
5185
               return 1;
×
5186
            }
5187
            if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes");
1,458!
5188
            if ((int)(ioff + c.length) < (int)ioff) return 0;
1,458!
5189
            if (ioff + c.length > idata_limit) {
1,458!
5190
               stbi__uint32 idata_limit_old = idata_limit;
318✔
5191
               stbi_uc *p;
318✔
5192
               if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
318!
5193
               while (ioff + c.length > idata_limit)
480!
5194
                  idata_limit *= 2;
162✔
5195
               STBI_NOTUSED(idata_limit_old);
318✔
5196
               p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
318!
5197
               z->idata = p;
318✔
5198
            }
×
5199
            if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");
1,458!
5200
            ioff += c.length;
5201
            break;
5202
         }
5203

5204
         case STBI__PNG_TYPE('I','E','N','D'): {
156✔
5205
            stbi__uint32 raw_len, bpl;
156✔
5206
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
156!
5207
            if (scan != STBI__SCAN_load) return 1;
156!
5208
            if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");
156!
5209
            // initial guess for decoded data size to avoid unnecessary reallocs
5210
            bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component
156✔
5211
            raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
156✔
5212
            z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);
156✔
5213
            if (z->expanded == NULL) return 0; // zlib should set error
156!
5214
            STBI_FREE(z->idata); z->idata = NULL;
156✔
5215
            if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
156!
5216
               s->img_out_n = s->img_n+1;
×
5217
            else
5218
               s->img_out_n = s->img_n;
156✔
5219
            if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;
156!
5220
            if (has_trans) {
156!
5221
               if (z->depth == 16) {
×
5222
                  if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;
×
5223
               } else {
5224
                  if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
×
5225
               }
5226
            }
5227
            if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
156!
5228
               stbi__de_iphone(z);
×
5229
            if (pal_img_n) {
156!
5230
               // pal_img_n == 3 or 4
5231
               s->img_n = pal_img_n; // record the actual colors we had
12✔
5232
               s->img_out_n = pal_img_n;
12✔
5233
               if (req_comp >= 3) s->img_out_n = req_comp;
12!
5234
               if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
12!
5235
                  return 0;
5236
            } else if (has_trans) {
144!
5237
               // non-paletted image with tRNS -> source image has (constant) alpha
5238
               ++s->img_n;
×
5239
            }
5240
            STBI_FREE(z->expanded); z->expanded = NULL;
156✔
5241
            // end of PNG chunk, read and skip CRC
5242
            stbi__get32be(s);
156✔
5243
            return 1;
156✔
5244
         }
5245

5246
         default:
588✔
5247
            // if critical, fail
5248
            if (first) return stbi__err("first not IHDR", "Corrupt PNG");
588!
5249
            if ((c.type & (1 << 29)) == 0) {
588!
5250
               #ifndef STBI_NO_FAILURE_STRINGS
5251
               // not threadsafe
5252
               static char invalid_chunk[] = "XXXX PNG chunk not known";
×
5253
               invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
×
5254
               invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
×
5255
               invalid_chunk[2] = STBI__BYTECAST(c.type >>  8);
×
5256
               invalid_chunk[3] = STBI__BYTECAST(c.type >>  0);
×
5257
               #endif
5258
               return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type");
×
5259
            }
5260
            stbi__skip(s, c.length);
588✔
5261
            break;
588✔
5262
      }
5263
      // end of PNG chunk, read and skip CRC
5264
      stbi__get32be(s);
2,214✔
5265
   }
×
5266
}
5267

5268
static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)
156✔
5269
{
5270
   void *result=NULL;
156✔
5271
   if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
156!
5272
   if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
156!
5273
      if (p->depth <= 8)
156!
5274
         ri->bits_per_channel = 8;
156✔
5275
      else if (p->depth == 16)
×
5276
         ri->bits_per_channel = 16;
×
5277
      else
5278
         return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth");
×
5279
      result = p->out;
156✔
5280
      p->out = NULL;
156✔
5281
      if (req_comp && req_comp != p->s->img_out_n) {
156!
5282
         if (ri->bits_per_channel == 8)
120!
5283
            result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
120✔
5284
         else
5285
            result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
×
5286
         p->s->img_out_n = req_comp;
120✔
5287
         if (result == NULL) return result;
120!
5288
      }
5289
      *x = p->s->img_x;
156✔
5290
      *y = p->s->img_y;
156✔
5291
      if (n) *n = p->s->img_n;
156!
5292
   }
5293
   STBI_FREE(p->out);      p->out      = NULL;
156✔
5294
   STBI_FREE(p->expanded); p->expanded = NULL;
156✔
5295
   STBI_FREE(p->idata);    p->idata    = NULL;
156✔
5296

5297
   return result;
156✔
5298
}
5299

5300
static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
156✔
5301
{
5302
   stbi__png p;
156✔
5303
   p.s = s;
156✔
5304
   return stbi__do_png(&p, x,y,comp,req_comp, ri);
156✔
5305
}
5306

5307
static int stbi__png_test(stbi__context *s)
243✔
5308
{
5309
   int r;
243✔
5310
   r = stbi__check_png_header(s);
243✔
5311
   stbi__rewind(s);
243✔
5312
   return r;
243✔
5313
}
5314

5315
static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
×
5316
{
5317
   if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
×
5318
      stbi__rewind( p->s );
×
5319
      return 0;
×
5320
   }
5321
   if (x) *x = p->s->img_x;
×
5322
   if (y) *y = p->s->img_y;
×
5323
   if (comp) *comp = p->s->img_n;
×
5324
   return 1;
5325
}
5326

5327
static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
×
5328
{
5329
   stbi__png p;
×
5330
   p.s = s;
×
5331
   return stbi__png_info_raw(&p, x, y, comp);
×
5332
}
5333

5334
static int stbi__png_is16(stbi__context *s)
×
5335
{
5336
   stbi__png p;
×
5337
   p.s = s;
×
5338
   if (!stbi__png_info_raw(&p, NULL, NULL, NULL))
×
5339
           return 0;
5340
   if (p.depth != 16) {
×
5341
      stbi__rewind(p.s);
×
5342
      return 0;
×
5343
   }
5344
   return 1;
5345
}
5346
#endif
5347

5348
// Microsoft/Windows BMP image
5349

5350
#ifndef STBI_NO_BMP
5351
static int stbi__bmp_test_raw(stbi__context *s)
87✔
5352
{
5353
   int r;
87✔
5354
   int sz;
87✔
5355
   if (stbi__get8(s) != 'B') return 0;
87✔
5356
   if (stbi__get8(s) != 'M') return 0;
3!
5357
   stbi__get32le(s); // discard filesize
3✔
5358
   stbi__get16le(s); // discard reserved
3✔
5359
   stbi__get16le(s); // discard reserved
3✔
5360
   stbi__get32le(s); // discard data offset
3✔
5361
   sz = stbi__get32le(s);
3✔
5362
   r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
3!
5363
   return r;
5364
}
5365

5366
static int stbi__bmp_test(stbi__context *s)
87✔
5367
{
5368
   int r = stbi__bmp_test_raw(s);
87✔
5369
   stbi__rewind(s);
87✔
5370
   return r;
87✔
5371
}
5372

5373

5374
// returns 0..31 for the highest set bit
5375
static int stbi__high_bit(unsigned int z)
×
5376
{
5377
   int n=0;
×
5378
   if (z == 0) return -1;
×
5379
   if (z >= 0x10000) { n += 16; z >>= 16; }
×
5380
   if (z >= 0x00100) { n +=  8; z >>=  8; }
×
5381
   if (z >= 0x00010) { n +=  4; z >>=  4; }
×
5382
   if (z >= 0x00004) { n +=  2; z >>=  2; }
×
5383
   if (z >= 0x00002) { n +=  1;/* >>=  1;*/ }
×
5384
   return n;
5385
}
5386

5387
static int stbi__bitcount(unsigned int a)
×
5388
{
5389
   a = (a & 0x55555555) + ((a >>  1) & 0x55555555); // max 2
×
5390
   a = (a & 0x33333333) + ((a >>  2) & 0x33333333); // max 4
×
5391
   a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
×
5392
   a = (a + (a >> 8)); // max 16 per 8 bits
×
5393
   a = (a + (a >> 16)); // max 32 per 8 bits
×
5394
   return a & 0xff;
×
5395
}
5396

5397
// extract an arbitrarily-aligned N-bit value (N=bits)
5398
// from v, and then make it 8-bits long and fractionally
5399
// extend it to full full range.
5400
static int stbi__shiftsigned(unsigned int v, int shift, int bits)
×
5401
{
5402
   static unsigned int mul_table[9] = {
×
5403
      0,
5404
      0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,
5405
      0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,
5406
   };
5407
   static unsigned int shift_table[9] = {
×
5408
      0, 0,0,1,0,2,4,6,0,
5409
   };
5410
   if (shift < 0)
×
5411
      v <<= -shift;
×
5412
   else
5413
      v >>= shift;
×
5414
   STBI_ASSERT(v < 256);
×
5415
   v >>= (8-bits);
×
5416
   STBI_ASSERT(bits >= 0 && bits <= 8);
×
5417
   return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];
×
5418
}
5419

5420
typedef struct
5421
{
5422
   int bpp, offset, hsz;
5423
   unsigned int mr,mg,mb,ma, all_a;
5424
   int extra_read;
5425
} stbi__bmp_data;
5426

5427
static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress)
3✔
5428
{
5429
   // BI_BITFIELDS specifies masks explicitly, don't override
5430
   if (compress == 3)
3!
5431
      return 1;
5432

5433
   if (compress == 0) {
3!
5434
      if (info->bpp == 16) {
3!
5435
         info->mr = 31u << 10;
×
5436
         info->mg = 31u <<  5;
×
5437
         info->mb = 31u <<  0;
×
5438
      } else if (info->bpp == 32) {
3!
5439
         info->mr = 0xffu << 16;
×
5440
         info->mg = 0xffu <<  8;
×
5441
         info->mb = 0xffu <<  0;
×
5442
         info->ma = 0xffu << 24;
×
5443
         info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0
×
5444
      } else {
5445
         // otherwise, use defaults, which is all-0
5446
         info->mr = info->mg = info->mb = info->ma = 0;
3✔
5447
      }
5448
      return 1;
3✔
5449
   }
5450
   return 0; // error
5451
}
5452

5453
static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)
3✔
5454
{
5455
   int hsz;
3✔
5456
   if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
3!
5457
   stbi__get32le(s); // discard filesize
3✔
5458
   stbi__get16le(s); // discard reserved
3✔
5459
   stbi__get16le(s); // discard reserved
3✔
5460
   info->offset = stbi__get32le(s);
3✔
5461
   info->hsz = hsz = stbi__get32le(s);
3✔
5462
   info->mr = info->mg = info->mb = info->ma = 0;
3✔
5463
   info->extra_read = 14;
3✔
5464

5465
   if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP");
3!
5466

5467
   if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
3!
5468
   if (hsz == 12) {
×
5469
      s->img_x = stbi__get16le(s);
×
5470
      s->img_y = stbi__get16le(s);
×
5471
   } else {
5472
      s->img_x = stbi__get32le(s);
3✔
5473
      s->img_y = stbi__get32le(s);
3✔
5474
   }
5475
   if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
3!
5476
   info->bpp = stbi__get16le(s);
3✔
5477
   if (hsz != 12) {
3!
5478
      int compress = stbi__get32le(s);
3✔
5479
      if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
3!
5480
      if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes
3!
5481
      if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel
3!
5482
      stbi__get32le(s); // discard sizeof
3✔
5483
      stbi__get32le(s); // discard hres
3✔
5484
      stbi__get32le(s); // discard vres
3✔
5485
      stbi__get32le(s); // discard colorsused
3✔
5486
      stbi__get32le(s); // discard max important
3✔
5487
      if (hsz == 40 || hsz == 56) {
3!
5488
         if (hsz == 56) {
×
5489
            stbi__get32le(s);
×
5490
            stbi__get32le(s);
×
5491
            stbi__get32le(s);
×
5492
            stbi__get32le(s);
×
5493
         }
5494
         if (info->bpp == 16 || info->bpp == 32) {
×
5495
            if (compress == 0) {
×
5496
               stbi__bmp_set_mask_defaults(info, compress);
×
5497
            } else if (compress == 3) {
×
5498
               info->mr = stbi__get32le(s);
×
5499
               info->mg = stbi__get32le(s);
×
5500
               info->mb = stbi__get32le(s);
×
5501
               info->extra_read += 12;
×
5502
               // not documented, but generated by photoshop and handled by mspaint
5503
               if (info->mr == info->mg && info->mg == info->mb) {
×
5504
                  // ?!?!?
5505
                  return stbi__errpuc("bad BMP", "bad BMP");
×
5506
               }
5507
            } else
5508
               return stbi__errpuc("bad BMP", "bad BMP");
×
5509
         }
5510
      } else {
5511
         // V4/V5 header
5512
         int i;
3✔
5513
         if (hsz != 108 && hsz != 124)
3!
5514
            return stbi__errpuc("bad BMP", "bad BMP");
×
5515
         info->mr = stbi__get32le(s);
3✔
5516
         info->mg = stbi__get32le(s);
3✔
5517
         info->mb = stbi__get32le(s);
3✔
5518
         info->ma = stbi__get32le(s);
3✔
5519
         if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs
3!
5520
            stbi__bmp_set_mask_defaults(info, compress);
3✔
5521
         stbi__get32le(s); // discard color space
3✔
5522
         for (i=0; i < 12; ++i)
42✔
5523
            stbi__get32le(s); // discard color space parameters
36✔
5524
         if (hsz == 124) {
3!
5525
            stbi__get32le(s); // discard rendering intent
3✔
5526
            stbi__get32le(s); // discard offset of profile data
3✔
5527
            stbi__get32le(s); // discard size of profile data
3✔
5528
            stbi__get32le(s); // discard reserved
3✔
5529
         }
5530
      }
1!
5531
   }
1!
5532
   return (void *) 1;
5533
}
5534

5535

5536
static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
3✔
5537
{
5538
   stbi_uc *out;
3✔
5539
   unsigned int mr=0,mg=0,mb=0,ma=0, all_a;
3✔
5540
   stbi_uc pal[256][4];
3✔
5541
   int psize=0,i,j,width;
3✔
5542
   int flip_vertically, pad, target;
3✔
5543
   stbi__bmp_data info;
3✔
5544
   STBI_NOTUSED(ri);
3✔
5545

5546
   info.all_a = 255;
3✔
5547
   if (stbi__bmp_parse_header(s, &info) == NULL)
3!
5548
      return NULL; // error code already set
5549

5550
   flip_vertically = ((int) s->img_y) > 0;
3✔
5551
   s->img_y = abs((int) s->img_y);
3✔
5552

5553
   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
3!
5554
   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
3!
5555

5556
   mr = info.mr;
3✔
5557
   mg = info.mg;
3✔
5558
   mb = info.mb;
3✔
5559
   ma = info.ma;
3✔
5560
   all_a = info.all_a;
3✔
5561

5562
   if (info.hsz == 12) {
3!
5563
      if (info.bpp < 24)
×
5564
         psize = (info.offset - info.extra_read - 24) / 3;
×
5565
   } else {
5566
      if (info.bpp < 16)
3!
5567
         psize = (info.offset - info.extra_read - info.hsz) >> 2;
×
5568
   }
5569
   if (psize == 0) {
×
5570
      // accept some number of extra bytes after the header, but if the offset points either to before
5571
      // the header ends or implies a large amount of extra data, reject the file as malformed
5572
      int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original);
3✔
5573
      int header_limit = 1024; // max we actually read is below 256 bytes currently.
3✔
5574
      int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size.
3✔
5575
      if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) {
3!
5576
         return stbi__errpuc("bad header", "Corrupt BMP");
×
5577
      }
5578
      // we established that bytes_read_so_far is positive and sensible.
5579
      // the first half of this test rejects offsets that are either too small positives, or
5580
      // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn
5581
      // ensures the number computed in the second half of the test can't overflow.
5582
      if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) {
3!
5583
         return stbi__errpuc("bad offset", "Corrupt BMP");
×
5584
      } else {
5585
         stbi__skip(s, info.offset - bytes_read_so_far);
3✔
5586
      }
5587
   }
1!
5588

5589
   if (info.bpp == 24 && ma == 0xff000000)
3!
5590
      s->img_n = 3;
×
5591
   else
5592
      s->img_n = ma ? 4 : 3;
6!
5593
   if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
3!
5594
      target = req_comp;
5595
   else
5596
      target = s->img_n; // if they want monochrome, we'll post-convert
×
5597

5598
   // sanity-check size
5599
   if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))
3!
5600
      return stbi__errpuc("too large", "Corrupt BMP");
×
5601

5602
   out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);
3✔
5603
   if (!out) return stbi__errpuc("outofmem", "Out of memory");
3!
5604
   if (info.bpp < 16) {
3!
5605
      int z=0;
×
5606
      if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
×
5607
      for (i=0; i < psize; ++i) {
×
5608
         pal[i][2] = stbi__get8(s);
×
5609
         pal[i][1] = stbi__get8(s);
×
5610
         pal[i][0] = stbi__get8(s);
×
5611
         if (info.hsz != 12) stbi__get8(s);
×
5612
         pal[i][3] = 255;
×
5613
      }
5614
      stbi__skip(s, info.offset - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4));
×
5615
      if (info.bpp == 1) width = (s->img_x + 7) >> 3;
×
5616
      else if (info.bpp == 4) width = (s->img_x + 1) >> 1;
×
5617
      else if (info.bpp == 8) width = s->img_x;
×
5618
      else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
×
5619
      pad = (-width)&3;
×
5620
      if (info.bpp == 1) {
×
5621
         for (j=0; j < (int) s->img_y; ++j) {
×
5622
            int bit_offset = 7, v = stbi__get8(s);
×
5623
            for (i=0; i < (int) s->img_x; ++i) {
×
5624
               int color = (v>>bit_offset)&0x1;
×
5625
               out[z++] = pal[color][0];
×
5626
               out[z++] = pal[color][1];
×
5627
               out[z++] = pal[color][2];
×
5628
               if (target == 4) out[z++] = 255;
×
5629
               if (i+1 == (int) s->img_x) break;
×
5630
               if((--bit_offset) < 0) {
×
5631
                  bit_offset = 7;
×
5632
                  v = stbi__get8(s);
×
5633
               }
5634
            }
×
5635
            stbi__skip(s, pad);
×
5636
         }
5637
      } else {
5638
         for (j=0; j < (int) s->img_y; ++j) {
×
5639
            for (i=0; i < (int) s->img_x; i += 2) {
×
5640
               int v=stbi__get8(s),v2=0;
×
5641
               if (info.bpp == 4) {
×
5642
                  v2 = v & 15;
×
5643
                  v >>= 4;
×
5644
               }
5645
               out[z++] = pal[v][0];
×
5646
               out[z++] = pal[v][1];
×
5647
               out[z++] = pal[v][2];
×
5648
               if (target == 4) out[z++] = 255;
×
5649
               if (i+1 == (int) s->img_x) break;
×
5650
               v = (info.bpp == 8) ? stbi__get8(s) : v2;
×
5651
               out[z++] = pal[v][0];
×
5652
               out[z++] = pal[v][1];
×
5653
               out[z++] = pal[v][2];
×
5654
               if (target == 4) out[z++] = 255;
×
5655
            }
×
5656
            stbi__skip(s, pad);
×
5657
         }
5658
      }
5659
   } else {
×
5660
      int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
3✔
5661
      int z = 0;
3✔
5662
      int easy=0;
3✔
5663
      stbi__skip(s, info.offset - info.extra_read - info.hsz);
3✔
5664
      if (info.bpp == 24) width = 3 * s->img_x;
3!
5665
      else if (info.bpp == 16) width = 2*s->img_x;
×
5666
      else /* bpp = 32 and pad = 0 */ width=0;
5667
      pad = (-width) & 3;
3✔
5668
      if (info.bpp == 24) {
3!
5669
         easy = 1;
5670
      } else if (info.bpp == 32) {
×
5671
         if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
×
5672
            easy = 2;
5673
      }
5674
      if (!easy) {
1!
5675
         if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
×
5676
         // right shift amt to put high bit in position #7
5677
         rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
×
5678
         gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
×
5679
         bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
×
5680
         ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
×
5681
         if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
×
5682
      }
5683
      for (j=0; j < (int) s->img_y; ++j) {
1,353✔
5684
         if (easy) {
1,350!
5685
            for (i=0; i < (int) s->img_x; ++i) {
811,350✔
5686
               unsigned char a;
810,000✔
5687
               out[z+2] = stbi__get8(s);
810,000✔
5688
               out[z+1] = stbi__get8(s);
810,000✔
5689
               out[z+0] = stbi__get8(s);
810,000✔
5690
               z += 3;
810,000✔
5691
               a = (easy == 2 ? stbi__get8(s) : 255);
810,000!
5692
               all_a |= a;
810,000✔
5693
               if (target == 4) out[z++] = a;
810,000!
5694
            }
5695
         } else {
5696
            int bpp = info.bpp;
5697
            for (i=0; i < (int) s->img_x; ++i) {
×
5698
               stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
×
5699
               unsigned int a;
×
5700
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
×
5701
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
×
5702
               out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
×
5703
               a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
×
5704
               all_a |= a;
×
5705
               if (target == 4) out[z++] = STBI__BYTECAST(a);
×
5706
            }
5707
         }
5708
         stbi__skip(s, pad);
1,350✔
5709
      }
5710
   }
1!
5711

5712
   // if alpha channel is all 0s, replace with all 255s
5713
   if (target == 4 && all_a == 0)
3!
5714
      for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
×
5715
         out[i] = 255;
×
5716

5717
   if (flip_vertically) {
3!
5718
      stbi_uc t;
5719
      for (j=0; j < (int) s->img_y>>1; ++j) {
678✔
5720
         stbi_uc *p1 = out +      j     *s->img_x*target;
675✔
5721
         stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
675✔
5722
         for (i=0; i < (int) s->img_x*target; ++i) {
1,215,675✔
5723
            t = p1[i]; p1[i] = p2[i]; p2[i] = t;
1,215,000✔
5724
         }
5725
      }
5726
   }
5727

5728
   if (req_comp && req_comp != target) {
3!
5729
      out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
×
5730
      if (out == NULL) return out; // stbi__convert_format frees input on failure
×
5731
   }
5732

5733
   *x = s->img_x;
3✔
5734
   *y = s->img_y;
3✔
5735
   if (comp) *comp = s->img_n;
3!
5736
   return out;
5737
}
5738
#endif
5739

5740
// Targa Truevision - TGA
5741
// by Jonathan Dummer
5742
#ifndef STBI_NO_TGA
5743
// returns STBI_rgb or whatever, 0 on error
5744
static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)
18✔
5745
{
5746
   // only RGB or RGBA (incl. 16bit) or grey allowed
5747
   if (is_rgb16) *is_rgb16 = 0;
18!
5748
   switch(bits_per_pixel) {
18!
5749
      case 8:  return STBI_grey;
5750
      case 16: if(is_grey) return STBI_grey_alpha;
×
5751
               // fallthrough
5752
      case 15: if(is_rgb16) *is_rgb16 = 1;
×
5753
               return STBI_rgb;
5754
      case 24: // fallthrough
18✔
5755
      case 32: return bits_per_pixel/8;
18✔
5756
      default: return 0;
×
5757
   }
5758
}
5759

5760
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
×
5761
{
5762
    int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;
×
5763
    int sz, tga_colormap_type;
×
5764
    stbi__get8(s);                   // discard Offset
×
5765
    tga_colormap_type = stbi__get8(s); // colormap type
×
5766
    if( tga_colormap_type > 1 ) {
×
5767
        stbi__rewind(s);
×
5768
        return 0;      // only RGB or indexed allowed
×
5769
    }
5770
    tga_image_type = stbi__get8(s); // image type
×
5771
    if ( tga_colormap_type == 1 ) { // colormapped (paletted) image
×
5772
        if (tga_image_type != 1 && tga_image_type != 9) {
×
5773
            stbi__rewind(s);
×
5774
            return 0;
×
5775
        }
5776
        stbi__skip(s,4);       // skip index of first colormap entry and number of entries
×
5777
        sz = stbi__get8(s);    //   check bits per palette color entry
×
5778
        if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {
×
5779
            stbi__rewind(s);
×
5780
            return 0;
×
5781
        }
5782
        stbi__skip(s,4);       // skip image x and y origin
×
5783
        tga_colormap_bpp = sz;
×
5784
    } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE
5785
        if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {
×
5786
            stbi__rewind(s);
×
5787
            return 0; // only RGB or grey allowed, +/- RLE
×
5788
        }
5789
        stbi__skip(s,9); // skip colormap specification and image x/y origin
×
5790
        tga_colormap_bpp = 0;
×
5791
    }
5792
    tga_w = stbi__get16le(s);
×
5793
    if( tga_w < 1 ) {
×
5794
        stbi__rewind(s);
×
5795
        return 0;   // test width
×
5796
    }
5797
    tga_h = stbi__get16le(s);
×
5798
    if( tga_h < 1 ) {
×
5799
        stbi__rewind(s);
×
5800
        return 0;   // test height
×
5801
    }
5802
    tga_bits_per_pixel = stbi__get8(s); // bits per pixel
×
5803
    stbi__get8(s); // ignore alpha bits
×
5804
    if (tga_colormap_bpp != 0) {
×
5805
        if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {
×
5806
            // when using a colormap, tga_bits_per_pixel is the size of the indexes
5807
            // I don't think anything but 8 or 16bit indexes makes sense
5808
            stbi__rewind(s);
×
5809
            return 0;
×
5810
        }
5811
        tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);
×
5812
    } else {
5813
        tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);
×
5814
    }
5815
    if(!tga_comp) {
×
5816
      stbi__rewind(s);
×
5817
      return 0;
×
5818
    }
5819
    if (x) *x = tga_w;
×
5820
    if (y) *y = tga_h;
×
5821
    if (comp) *comp = tga_comp;
×
5822
    return 1;                   // seems to have passed everything
5823
}
5824

5825
static int stbi__tga_test(stbi__context *s)
21✔
5826
{
5827
   int res = 0;
21✔
5828
   int sz, tga_color_type;
21✔
5829
   stbi__get8(s);      //   discard Offset
21✔
5830
   tga_color_type = stbi__get8(s);   //   color type
21✔
5831
   if ( tga_color_type > 1 ) goto errorEnd;   //   only RGB or indexed allowed
21!
5832
   sz = stbi__get8(s);   //   image type
21✔
5833
   if ( tga_color_type == 1 ) { // colormapped (paletted) image
21!
5834
      if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9
×
5835
      stbi__skip(s,4);       // skip index of first colormap entry and number of entries
×
5836
      sz = stbi__get8(s);    //   check bits per palette color entry
×
5837
      if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
×
5838
      stbi__skip(s,4);       // skip image x and y origin
×
5839
   } else { // "normal" image w/o colormap
5840
      if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE
21!
5841
      stbi__skip(s,9); // skip colormap specification and image x/y origin
18✔
5842
   }
5843
   if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test width
18!
5844
   if ( stbi__get16le(s) < 1 ) goto errorEnd;      //   test height
18!
5845
   sz = stbi__get8(s);   //   bits per pixel
18✔
5846
   if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index
18!
5847
   if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;
18!
5848

5849
   res = 1; // if we got this far, everything's good and we can return 1 instead of 0
5850

5851
errorEnd:
21✔
5852
   stbi__rewind(s);
21✔
5853
   return res;
21✔
5854
}
5855

5856
// read 16bit value and convert to 24bit RGB
5857
static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)
×
5858
{
5859
   stbi__uint16 px = (stbi__uint16)stbi__get16le(s);
×
5860
   stbi__uint16 fiveBitMask = 31;
×
5861
   // we have 3 channels with 5bits each
5862
   int r = (px >> 10) & fiveBitMask;
×
5863
   int g = (px >> 5) & fiveBitMask;
×
5864
   int b = px & fiveBitMask;
×
5865
   // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later
5866
   out[0] = (stbi_uc)((r * 255)/31);
×
5867
   out[1] = (stbi_uc)((g * 255)/31);
×
5868
   out[2] = (stbi_uc)((b * 255)/31);
×
5869

5870
   // some people claim that the most significant bit might be used for alpha
5871
   // (possibly if an alpha-bit is set in the "image descriptor byte")
5872
   // but that only made 16bit test images completely translucent..
5873
   // so let's treat all 15 and 16bit TGAs as RGB with no alpha.
5874
}
×
5875

5876
static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
18✔
5877
{
5878
   //   read in the TGA header stuff
5879
   int tga_offset = stbi__get8(s);
18✔
5880
   int tga_indexed = stbi__get8(s);
18✔
5881
   int tga_image_type = stbi__get8(s);
18✔
5882
   int tga_is_RLE = 0;
18✔
5883
   int tga_palette_start = stbi__get16le(s);
18✔
5884
   int tga_palette_len = stbi__get16le(s);
18✔
5885
   int tga_palette_bits = stbi__get8(s);
18✔
5886
   int tga_x_origin = stbi__get16le(s);
18✔
5887
   int tga_y_origin = stbi__get16le(s);
18✔
5888
   int tga_width = stbi__get16le(s);
18✔
5889
   int tga_height = stbi__get16le(s);
18✔
5890
   int tga_bits_per_pixel = stbi__get8(s);
18✔
5891
   int tga_comp, tga_rgb16=0;
18✔
5892
   int tga_inverted = stbi__get8(s);
18✔
5893
   // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)
5894
   //   image data
5895
   unsigned char *tga_data;
18✔
5896
   unsigned char *tga_palette = NULL;
18✔
5897
   int i, j;
18✔
5898
   unsigned char raw_data[4] = {0};
18✔
5899
   int RLE_count = 0;
18✔
5900
   int RLE_repeating = 0;
18✔
5901
   int read_next_pixel = 1;
18✔
5902
   STBI_NOTUSED(ri);
18✔
5903
   STBI_NOTUSED(tga_x_origin); // @TODO
18✔
5904
   STBI_NOTUSED(tga_y_origin); // @TODO
18✔
5905

5906
   if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
18!
5907
   if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
18!
5908

5909
   //   do a tiny bit of precessing
5910
   if ( tga_image_type >= 8 )
18!
5911
   {
5912
      tga_image_type -= 8;
×
5913
      tga_is_RLE = 1;
×
5914
   }
5915
   tga_inverted = 1 - ((tga_inverted >> 5) & 1);
18✔
5916

5917
   //   If I'm paletted, then I'll use the number of bits from the palette
5918
   if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);
18!
5919
   else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);
18✔
5920

5921
   if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency
18!
5922
      return stbi__errpuc("bad format", "Can't find out TGA pixelformat");
×
5923

5924
   //   tga info
5925
   *x = tga_width;
18✔
5926
   *y = tga_height;
18✔
5927
   if (comp) *comp = tga_comp;
18!
5928

5929
   if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))
18!
5930
      return stbi__errpuc("too large", "Corrupt TGA");
×
5931

5932
   tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);
18✔
5933
   if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
18!
5934

5935
   // skip to the data's starting position (offset usually = 0)
5936
   stbi__skip(s, tga_offset );
18✔
5937

5938
   if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {
18!
5939
      for (i=0; i < tga_height; ++i) {
8,118!
5940
         int row = tga_inverted ? tga_height -i - 1 : i;
8,100!
5941
         stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
8,100✔
5942
         stbi__getn(s, tga_row, tga_width * tga_comp);
8,100✔
5943
      }
5944
   } else  {
5945
      //   do I need to load a palette?
5946
      if ( tga_indexed)
×
5947
      {
5948
         if (tga_palette_len == 0) {  /* you have to have at least one entry! */
×
5949
            STBI_FREE(tga_data);
×
5950
            return stbi__errpuc("bad palette", "Corrupt TGA");
×
5951
         }
5952

5953
         //   any data to skip? (offset usually = 0)
5954
         stbi__skip(s, tga_palette_start );
×
5955
         //   load the palette
5956
         tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);
×
5957
         if (!tga_palette) {
×
5958
            STBI_FREE(tga_data);
×
5959
            return stbi__errpuc("outofmem", "Out of memory");
×
5960
         }
5961
         if (tga_rgb16) {
×
5962
            stbi_uc *pal_entry = tga_palette;
×
5963
            STBI_ASSERT(tga_comp == STBI_rgb);
×
5964
            for (i=0; i < tga_palette_len; ++i) {
×
5965
               stbi__tga_read_rgb16(s, pal_entry);
×
5966
               pal_entry += tga_comp;
×
5967
            }
5968
         } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {
×
5969
               STBI_FREE(tga_data);
×
5970
               STBI_FREE(tga_palette);
×
5971
               return stbi__errpuc("bad palette", "Corrupt TGA");
×
5972
         }
5973
      }
5974
      //   load the data
5975
      for (i=0; i < tga_width * tga_height; ++i)
×
5976
      {
5977
         //   if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
5978
         if ( tga_is_RLE )
×
5979
         {
5980
            if ( RLE_count == 0 )
×
5981
            {
5982
               //   yep, get the next byte as a RLE command
5983
               int RLE_cmd = stbi__get8(s);
×
5984
               RLE_count = 1 + (RLE_cmd & 127);
×
5985
               RLE_repeating = RLE_cmd >> 7;
×
5986
               read_next_pixel = 1;
×
5987
            } else if ( !RLE_repeating )
×
5988
            {
5989
               read_next_pixel = 1;
5990
            }
5991
         } else
5992
         {
5993
            read_next_pixel = 1;
5994
         }
5995
         //   OK, if I need to read a pixel, do it now
5996
         if ( read_next_pixel )
×
5997
         {
5998
            //   load however much data we did have
5999
            if ( tga_indexed )
×
6000
            {
6001
               // read in index, then perform the lookup
6002
               int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);
×
6003
               if ( pal_idx >= tga_palette_len ) {
×
6004
                  // invalid index
6005
                  pal_idx = 0;
×
6006
               }
6007
               pal_idx *= tga_comp;
×
6008
               for (j = 0; j < tga_comp; ++j) {
×
6009
                  raw_data[j] = tga_palette[pal_idx+j];
×
6010
               }
6011
            } else if(tga_rgb16) {
×
6012
               STBI_ASSERT(tga_comp == STBI_rgb);
×
6013
               stbi__tga_read_rgb16(s, raw_data);
×
6014
            } else {
6015
               //   read in the data raw
6016
               for (j = 0; j < tga_comp; ++j) {
×
6017
                  raw_data[j] = stbi__get8(s);
×
6018
               }
6019
            }
6020
            //   clear the reading flag for the next pixel
6021
            read_next_pixel = 0;
6022
         } // end of reading a pixel
6023

6024
         // copy data
6025
         for (j = 0; j < tga_comp; ++j)
×
6026
           tga_data[i*tga_comp+j] = raw_data[j];
×
6027

6028
         //   in case we're in RLE mode, keep counting down
6029
         --RLE_count;
×
6030
      }
6031
      //   do I need to invert the image?
6032
      if ( tga_inverted )
×
6033
      {
6034
         for (j = 0; j*2 < tga_height; ++j)
×
6035
         {
6036
            int index1 = j * tga_width * tga_comp;
×
6037
            int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
×
6038
            for (i = tga_width * tga_comp; i > 0; --i)
×
6039
            {
6040
               unsigned char temp = tga_data[index1];
×
6041
               tga_data[index1] = tga_data[index2];
×
6042
               tga_data[index2] = temp;
×
6043
               ++index1;
×
6044
               ++index2;
×
6045
            }
6046
         }
6047
      }
6048
      //   clear my palette, if I had one
6049
      if ( tga_palette != NULL )
×
6050
      {
6051
         STBI_FREE( tga_palette );
×
6052
      }
6053
   }
6054

6055
   // swap RGB - if the source data was RGB16, it already is in the right order
6056
   if (tga_comp >= 3 && !tga_rgb16)
18!
6057
   {
6058
      unsigned char* tga_pixel = tga_data;
6059
      for (i=0; i < tga_width * tga_height; ++i)
4,860,018!
6060
      {
6061
         unsigned char temp = tga_pixel[0];
4,860,000✔
6062
         tga_pixel[0] = tga_pixel[2];
4,860,000✔
6063
         tga_pixel[2] = temp;
4,860,000✔
6064
         tga_pixel += tga_comp;
4,860,000✔
6065
      }
6066
   }
6067

6068
   // convert to target component count
6069
   if (req_comp && req_comp != tga_comp)
18!
6070
      tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
×
6071

6072
   //   the things I do to get rid of an error message, and yet keep
6073
   //   Microsoft's C compilers happy... [8^(
6074
   tga_palette_start = tga_palette_len = tga_palette_bits =
18✔
6075
         tga_x_origin = tga_y_origin = 0;
6076
   STBI_NOTUSED(tga_palette_start);
6077
   //   OK, done
6078
   return tga_data;
6079
}
6080
#endif
6081

6082
// *************************************************************************************************
6083
// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
6084

6085
#ifndef STBI_NO_PSD
6086
static int stbi__psd_test(stbi__context *s)
84✔
6087
{
6088
   int r = (stbi__get32be(s) == 0x38425053);
84✔
6089
   stbi__rewind(s);
84✔
6090
   return r;
84!
6091
}
6092

6093
static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)
×
6094
{
6095
   int count, nleft, len;
×
6096

6097
   count = 0;
×
6098
   while ((nleft = pixelCount - count) > 0) {
×
6099
      len = stbi__get8(s);
×
6100
      if (len == 128) {
×
6101
         // No-op.
6102
      } else if (len < 128) {
×
6103
         // Copy next len+1 bytes literally.
6104
         len++;
×
6105
         if (len > nleft) return 0; // corrupt data
×
6106
         count += len;
×
6107
         while (len) {
×
6108
            *p = stbi__get8(s);
×
6109
            p += 4;
×
6110
            len--;
×
6111
         }
6112
      } else if (len > 128) {
×
6113
         stbi_uc   val;
×
6114
         // Next -len+1 bytes in the dest are replicated from next source byte.
6115
         // (Interpret len as a negative 8-bit int.)
6116
         len = 257 - len;
×
6117
         if (len > nleft) return 0; // corrupt data
×
6118
         val = stbi__get8(s);
×
6119
         count += len;
×
6120
         while (len) {
×
6121
            *p = val;
×
6122
            p += 4;
×
6123
            len--;
×
6124
         }
6125
      }
×
6126
   }
6127

6128
   return 1;
6129
}
6130

6131
static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)
×
6132
{
6133
   int pixelCount;
×
6134
   int channelCount, compression;
×
6135
   int channel, i;
×
6136
   int bitdepth;
×
6137
   int w,h;
×
6138
   stbi_uc *out;
×
6139
   STBI_NOTUSED(ri);
×
6140

6141
   // Check identifier
6142
   if (stbi__get32be(s) != 0x38425053)   // "8BPS"
×
6143
      return stbi__errpuc("not PSD", "Corrupt PSD image");
×
6144

6145
   // Check file type version.
6146
   if (stbi__get16be(s) != 1)
×
6147
      return stbi__errpuc("wrong version", "Unsupported version of PSD image");
×
6148

6149
   // Skip 6 reserved bytes.
6150
   stbi__skip(s, 6 );
×
6151

6152
   // Read the number of channels (R, G, B, A, etc).
6153
   channelCount = stbi__get16be(s);
×
6154
   if (channelCount < 0 || channelCount > 16)
×
6155
      return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image");
×
6156

6157
   // Read the rows and columns of the image.
6158
   h = stbi__get32be(s);
×
6159
   w = stbi__get32be(s);
×
6160

6161
   if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
×
6162
   if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
×
6163

6164
   // Make sure the depth is 8 bits.
6165
   bitdepth = stbi__get16be(s);
×
6166
   if (bitdepth != 8 && bitdepth != 16)
×
6167
      return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit");
×
6168

6169
   // Make sure the color mode is RGB.
6170
   // Valid options are:
6171
   //   0: Bitmap
6172
   //   1: Grayscale
6173
   //   2: Indexed color
6174
   //   3: RGB color
6175
   //   4: CMYK color
6176
   //   7: Multichannel
6177
   //   8: Duotone
6178
   //   9: Lab color
6179
   if (stbi__get16be(s) != 3)
×
6180
      return stbi__errpuc("wrong color format", "PSD is not in RGB color format");
×
6181

6182
   // Skip the Mode Data.  (It's the palette for indexed color; other info for other modes.)
6183
   stbi__skip(s,stbi__get32be(s) );
×
6184

6185
   // Skip the image resources.  (resolution, pen tool paths, etc)
6186
   stbi__skip(s, stbi__get32be(s) );
×
6187

6188
   // Skip the reserved data.
6189
   stbi__skip(s, stbi__get32be(s) );
×
6190

6191
   // Find out if the data is compressed.
6192
   // Known values:
6193
   //   0: no compression
6194
   //   1: RLE compressed
6195
   compression = stbi__get16be(s);
×
6196
   if (compression > 1)
×
6197
      return stbi__errpuc("bad compression", "PSD has an unknown compression format");
×
6198

6199
   // Check size
6200
   if (!stbi__mad3sizes_valid(4, w, h, 0))
×
6201
      return stbi__errpuc("too large", "Corrupt PSD");
×
6202

6203
   // Create the destination image.
6204

6205
   if (!compression && bitdepth == 16 && bpc == 16) {
×
6206
      out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);
×
6207
      ri->bits_per_channel = 16;
×
6208
   } else
6209
      out = (stbi_uc *) stbi__malloc(4 * w*h);
×
6210

6211
   if (!out) return stbi__errpuc("outofmem", "Out of memory");
×
6212
   pixelCount = w*h;
×
6213

6214
   // Initialize the data to zero.
6215
   //memset( out, 0, pixelCount * 4 );
6216

6217
   // Finally, the image data.
6218
   if (compression) {
×
6219
      // RLE as used by .PSD and .TIFF
6220
      // Loop until you get the number of unpacked bytes you are expecting:
6221
      //     Read the next source byte into n.
6222
      //     If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
6223
      //     Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
6224
      //     Else if n is 128, noop.
6225
      // Endloop
6226

6227
      // The RLE-compressed data is preceded by a 2-byte data count for each row in the data,
6228
      // which we're going to just skip.
6229
      stbi__skip(s, h * channelCount * 2 );
×
6230

6231
      // Read the RLE data by channel.
6232
      for (channel = 0; channel < 4; channel++) {
×
6233
         stbi_uc *p;
×
6234

6235
         p = out+channel;
×
6236
         if (channel >= channelCount) {
×
6237
            // Fill this channel with default data.
6238
            for (i = 0; i < pixelCount; i++, p += 4)
×
6239
               *p = (channel == 3 ? 255 : 0);
×
6240
         } else {
6241
            // Read the RLE data.
6242
            if (!stbi__psd_decode_rle(s, p, pixelCount)) {
×
6243
               STBI_FREE(out);
×
6244
               return stbi__errpuc("corrupt", "bad RLE data");
×
6245
            }
6246
         }
6247
      }
×
6248

6249
   } else {
6250
      // We're at the raw image data.  It's each channel in order (Red, Green, Blue, Alpha, ...)
6251
      // where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.
6252

6253
      // Read the data by channel.
6254
      for (channel = 0; channel < 4; channel++) {
×
6255
         if (channel >= channelCount) {
×
6256
            // Fill this channel with default data.
6257
            if (bitdepth == 16 && bpc == 16) {
×
6258
               stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
×
6259
               stbi__uint16 val = channel == 3 ? 65535 : 0;
×
6260
               for (i = 0; i < pixelCount; i++, q += 4)
×
6261
                  *q = val;
×
6262
            } else {
6263
               stbi_uc *p = out+channel;
×
6264
               stbi_uc val = channel == 3 ? 255 : 0;
×
6265
               for (i = 0; i < pixelCount; i++, p += 4)
×
6266
                  *p = val;
×
6267
            }
6268
         } else {
6269
            if (ri->bits_per_channel == 16) {    // output bpc
×
6270
               stbi__uint16 *q = ((stbi__uint16 *) out) + channel;
×
6271
               for (i = 0; i < pixelCount; i++, q += 4)
×
6272
                  *q = (stbi__uint16) stbi__get16be(s);
×
6273
            } else {
6274
               stbi_uc *p = out+channel;
×
6275
               if (bitdepth == 16) {  // input bpc
×
6276
                  for (i = 0; i < pixelCount; i++, p += 4)
×
6277
                     *p = (stbi_uc) (stbi__get16be(s) >> 8);
×
6278
               } else {
6279
                  for (i = 0; i < pixelCount; i++, p += 4)
×
6280
                     *p = stbi__get8(s);
×
6281
               }
6282
            }
6283
         }
6284
      }
6285
   }
6286

6287
   // remove weird white matte from PSD
6288
   if (channelCount >= 4) {
×
6289
      if (ri->bits_per_channel == 16) {
×
6290
         for (i=0; i < w*h; ++i) {
×
6291
            stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;
×
6292
            if (pixel[3] != 0 && pixel[3] != 65535) {
×
6293
               float a = pixel[3] / 65535.0f;
×
6294
               float ra = 1.0f / a;
×
6295
               float inv_a = 65535.0f * (1 - ra);
×
6296
               pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);
×
6297
               pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);
×
6298
               pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);
×
6299
            }
6300
         }
6301
      } else {
6302
         for (i=0; i < w*h; ++i) {
×
6303
            unsigned char *pixel = out + 4*i;
×
6304
            if (pixel[3] != 0 && pixel[3] != 255) {
×
6305
               float a = pixel[3] / 255.0f;
×
6306
               float ra = 1.0f / a;
×
6307
               float inv_a = 255.0f * (1 - ra);
×
6308
               pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);
×
6309
               pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);
×
6310
               pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);
×
6311
            }
6312
         }
6313
      }
6314
   }
6315

6316
   // convert to desired output format
6317
   if (req_comp && req_comp != 4) {
×
6318
      if (ri->bits_per_channel == 16)
×
6319
         out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);
×
6320
      else
6321
         out = stbi__convert_format(out, 4, req_comp, w, h);
×
6322
      if (out == NULL) return out; // stbi__convert_format frees input on failure
×
6323
   }
6324

6325
   if (comp) *comp = 4;
×
6326
   *y = h;
×
6327
   *x = w;
×
6328

6329
   return out;
×
6330
}
6331
#endif
6332

6333
// *************************************************************************************************
6334
// Softimage PIC loader
6335
// by Tom Seddon
6336
//
6337
// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
6338
// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
6339

6340
#ifndef STBI_NO_PIC
6341
static int stbi__pic_is4(stbi__context *s,const char *str)
84✔
6342
{
6343
   int i;
84✔
6344
   for (i=0; i<4; ++i)
84!
6345
      if (stbi__get8(s) != (stbi_uc)str[i])
84!
6346
         return 0;
6347

6348
   return 1;
6349
}
6350

6351
static int stbi__pic_test_core(stbi__context *s)
84✔
6352
{
6353
   int i;
84✔
6354

6355
   if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
84!
6356
      return 0;
6357

6358
   for(i=0;i<84;++i)
×
6359
      stbi__get8(s);
×
6360

6361
   if (!stbi__pic_is4(s,"PICT"))
×
6362
      return 0;
6363

6364
   return 1;
6365
}
6366

6367
typedef struct
6368
{
6369
   stbi_uc size,type,channel;
6370
} stbi__pic_packet;
6371

6372
static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)
×
6373
{
6374
   int mask=0x80, i;
×
6375

6376
   for (i=0; i<4; ++i, mask>>=1) {
×
6377
      if (channel & mask) {
×
6378
         if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short");
×
6379
         dest[i]=stbi__get8(s);
×
6380
      }
6381
   }
6382

6383
   return dest;
6384
}
6385

6386
static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)
×
6387
{
6388
   int mask=0x80,i;
×
6389

6390
   for (i=0;i<4; ++i, mask>>=1)
×
6391
      if (channel&mask)
×
6392
         dest[i]=src[i];
×
6393
}
×
6394

6395
static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)
×
6396
{
6397
   int act_comp=0,num_packets=0,y,chained;
×
6398
   stbi__pic_packet packets[10];
×
6399

6400
   // this will (should...) cater for even some bizarre stuff like having data
6401
    // for the same channel in multiple packets.
6402
   do {
×
6403
      stbi__pic_packet *packet;
×
6404

6405
      if (num_packets==sizeof(packets)/sizeof(packets[0]))
×
6406
         return stbi__errpuc("bad format","too many packets");
×
6407

6408
      packet = &packets[num_packets++];
×
6409

6410
      chained = stbi__get8(s);
×
6411
      packet->size    = stbi__get8(s);
×
6412
      packet->type    = stbi__get8(s);
×
6413
      packet->channel = stbi__get8(s);
×
6414

6415
      act_comp |= packet->channel;
×
6416

6417
      if (stbi__at_eof(s))          return stbi__errpuc("bad file","file too short (reading packets)");
×
6418
      if (packet->size != 8)  return stbi__errpuc("bad format","packet isn't 8bpp");
×
6419
   } while (chained);
×
6420

6421
   *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
×
6422

6423
   for(y=0; y<height; ++y) {
×
6424
      int packet_idx;
6425

6426
      for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
×
6427
         stbi__pic_packet *packet = &packets[packet_idx];
×
6428
         stbi_uc *dest = result+y*width*4;
×
6429

6430
         switch (packet->type) {
×
6431
            default:
6432
               return stbi__errpuc("bad format","packet has bad compression type");
×
6433

6434
            case 0: {//uncompressed
6435
               int x;
6436

6437
               for(x=0;x<width;++x, dest+=4)
×
6438
                  if (!stbi__readval(s,packet->channel,dest))
×
6439
                     return 0;
6440
               break;
6441
            }
6442

6443
            case 1://Pure RLE
6444
               {
6445
                  int left=width, i;
6446

6447
                  while (left>0) {
×
6448
                     stbi_uc count,value[4];
×
6449

6450
                     count=stbi__get8(s);
×
6451
                     if (stbi__at_eof(s))   return stbi__errpuc("bad file","file too short (pure read count)");
×
6452

6453
                     if (count > left)
×
6454
                        count = (stbi_uc) left;
×
6455

6456
                     if (!stbi__readval(s,packet->channel,value))  return 0;
×
6457

6458
                     for(i=0; i<count; ++i,dest+=4)
×
6459
                        stbi__copyval(packet->channel,dest,value);
×
6460
                     left -= count;
×
6461
                  }
×
6462
               }
×
6463
               break;
6464

6465
            case 2: {//Mixed RLE
6466
               int left=width;
6467
               while (left>0) {
×
6468
                  int count = stbi__get8(s), i;
×
6469
                  if (stbi__at_eof(s))  return stbi__errpuc("bad file","file too short (mixed read count)");
×
6470

6471
                  if (count >= 128) { // Repeated
×
6472
                     stbi_uc value[4];
×
6473

6474
                     if (count==128)
×
6475
                        count = stbi__get16be(s);
×
6476
                     else
6477
                        count -= 127;
×
6478
                     if (count > left)
×
6479
                        return stbi__errpuc("bad file","scanline overrun");
×
6480

6481
                     if (!stbi__readval(s,packet->channel,value))
×
6482
                        return 0;
6483

6484
                     for(i=0;i<count;++i, dest += 4)
×
6485
                        stbi__copyval(packet->channel,dest,value);
×
6486
                  } else { // Raw
×
6487
                     ++count;
×
6488
                     if (count>left) return stbi__errpuc("bad file","scanline overrun");
×
6489

6490
                     for(i=0;i<count;++i, dest+=4)
×
6491
                        if (!stbi__readval(s,packet->channel,dest))
×
6492
                           return 0;
6493
                  }
6494
                  left-=count;
×
6495
               }
×
6496
               break;
6497
            }
×
6498
         }
6499
      }
×
6500
   }
×
6501

6502
   return result;
6503
}
6504

6505
static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri)
×
6506
{
6507
   stbi_uc *result;
×
6508
   int i, x,y, internal_comp;
×
6509
   STBI_NOTUSED(ri);
×
6510

6511
   if (!comp) comp = &internal_comp;
×
6512

6513
   for (i=0; i<92; ++i)
×
6514
      stbi__get8(s);
×
6515

6516
   x = stbi__get16be(s);
×
6517
   y = stbi__get16be(s);
×
6518

6519
   if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
×
6520
   if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
×
6521

6522
   if (stbi__at_eof(s))  return stbi__errpuc("bad file","file too short (pic header)");
×
6523
   if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode");
×
6524

6525
   stbi__get32be(s); //skip `ratio'
×
6526
   stbi__get16be(s); //skip `fields'
×
6527
   stbi__get16be(s); //skip `pad'
×
6528

6529
   // intermediate buffer is RGBA
6530
   result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);
×
6531
   if (!result) return stbi__errpuc("outofmem", "Out of memory");
×
6532
   memset(result, 0xff, x*y*4);
×
6533

6534
   if (!stbi__pic_load_core(s,x,y,comp, result)) {
×
6535
      STBI_FREE(result);
×
6536
      result=0;
×
6537
   }
6538
   *px = x;
×
6539
   *py = y;
×
6540
   if (req_comp == 0) req_comp = *comp;
×
6541
   result=stbi__convert_format(result,4,req_comp,x,y);
×
6542

6543
   return result;
×
6544
}
6545

6546
static int stbi__pic_test(stbi__context *s)
84✔
6547
{
6548
   int r = stbi__pic_test_core(s);
84✔
6549
   stbi__rewind(s);
84✔
6550
   return r;
84!
6551
}
6552
#endif
6553

6554
// *************************************************************************************************
6555
// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
6556

6557
#ifndef STBI_NO_GIF
6558
typedef struct
6559
{
6560
   stbi__int16 prefix;
6561
   stbi_uc first;
6562
   stbi_uc suffix;
6563
} stbi__gif_lzw;
6564

6565
typedef struct
6566
{
6567
   int w,h;
6568
   stbi_uc *out;                 // output buffer (always 4 components)
6569
   stbi_uc *background;          // The current "background" as far as a gif is concerned
6570
   stbi_uc *history;
6571
   int flags, bgindex, ratio, transparent, eflags;
6572
   stbi_uc  pal[256][4];
6573
   stbi_uc lpal[256][4];
6574
   stbi__gif_lzw codes[8192];
6575
   stbi_uc *color_table;
6576
   int parse, step;
6577
   int lflags;
6578
   int start_x, start_y;
6579
   int max_x, max_y;
6580
   int cur_x, cur_y;
6581
   int line_size;
6582
   int delay;
6583
} stbi__gif;
6584

6585
static int stbi__gif_test_raw(stbi__context *s)
6586
{
6587
   int sz;
6588
   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
6589
   sz = stbi__get8(s);
6590
   if (sz != '9' && sz != '7') return 0;
6591
   if (stbi__get8(s) != 'a') return 0;
6592
   return 1;
6593
}
6594

6595
static int stbi__gif_test(stbi__context *s)
6596
{
6597
   int r = stbi__gif_test_raw(s);
6598
   stbi__rewind(s);
6599
   return r;
6600
}
6601

6602
static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
6603
{
6604
   int i;
6605
   for (i=0; i < num_entries; ++i) {
6606
      pal[i][2] = stbi__get8(s);
6607
      pal[i][1] = stbi__get8(s);
6608
      pal[i][0] = stbi__get8(s);
6609
      pal[i][3] = transp == i ? 0 : 255;
6610
   }
6611
}
6612

6613
static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
6614
{
6615
   stbi_uc version;
6616
   if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
6617
      return stbi__err("not GIF", "Corrupt GIF");
6618

6619
   version = stbi__get8(s);
6620
   if (version != '7' && version != '9')    return stbi__err("not GIF", "Corrupt GIF");
6621
   if (stbi__get8(s) != 'a')                return stbi__err("not GIF", "Corrupt GIF");
6622

6623
   stbi__g_failure_reason = "";
6624
   g->w = stbi__get16le(s);
6625
   g->h = stbi__get16le(s);
6626
   g->flags = stbi__get8(s);
6627
   g->bgindex = stbi__get8(s);
6628
   g->ratio = stbi__get8(s);
6629
   g->transparent = -1;
6630

6631
   if (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
6632
   if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)");
6633

6634
   if (comp != 0) *comp = 4;  // can't actually tell whether it's 3 or 4 until we parse the comments
6635

6636
   if (is_info) return 1;
6637

6638
   if (g->flags & 0x80)
6639
      stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
6640

6641
   return 1;
6642
}
6643

6644
static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
6645
{
6646
   stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));
6647
   if (!g) return stbi__err("outofmem", "Out of memory");
6648
   if (!stbi__gif_header(s, g, comp, 1)) {
6649
      STBI_FREE(g);
6650
      stbi__rewind( s );
6651
      return 0;
6652
   }
6653
   if (x) *x = g->w;
6654
   if (y) *y = g->h;
6655
   STBI_FREE(g);
6656
   return 1;
6657
}
6658

6659
static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
6660
{
6661
   stbi_uc *p, *c;
6662
   int idx;
6663

6664
   // recurse to decode the prefixes, since the linked-list is backwards,
6665
   // and working backwards through an interleaved image would be nasty
6666
   if (g->codes[code].prefix >= 0)
6667
      stbi__out_gif_code(g, g->codes[code].prefix);
6668

6669
   if (g->cur_y >= g->max_y) return;
6670

6671
   idx = g->cur_x + g->cur_y;
6672
   p = &g->out[idx];
6673
   g->history[idx / 4] = 1;
6674

6675
   c = &g->color_table[g->codes[code].suffix * 4];
6676
   if (c[3] > 128) { // don't render transparent pixels;
6677
      p[0] = c[2];
6678
      p[1] = c[1];
6679
      p[2] = c[0];
6680
      p[3] = c[3];
6681
   }
6682
   g->cur_x += 4;
6683

6684
   if (g->cur_x >= g->max_x) {
6685
      g->cur_x = g->start_x;
6686
      g->cur_y += g->step;
6687

6688
      while (g->cur_y >= g->max_y && g->parse > 0) {
6689
         g->step = (1 << g->parse) * g->line_size;
6690
         g->cur_y = g->start_y + (g->step >> 1);
6691
         --g->parse;
6692
      }
6693
   }
6694
}
6695

6696
static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
6697
{
6698
   stbi_uc lzw_cs;
6699
   stbi__int32 len, init_code;
6700
   stbi__uint32 first;
6701
   stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
6702
   stbi__gif_lzw *p;
6703

6704
   lzw_cs = stbi__get8(s);
6705
   if (lzw_cs > 12) return NULL;
6706
   clear = 1 << lzw_cs;
6707
   first = 1;
6708
   codesize = lzw_cs + 1;
6709
   codemask = (1 << codesize) - 1;
6710
   bits = 0;
6711
   valid_bits = 0;
6712
   for (init_code = 0; init_code < clear; init_code++) {
6713
      g->codes[init_code].prefix = -1;
6714
      g->codes[init_code].first = (stbi_uc) init_code;
6715
      g->codes[init_code].suffix = (stbi_uc) init_code;
6716
   }
6717

6718
   // support no starting clear code
6719
   avail = clear+2;
6720
   oldcode = -1;
6721

6722
   len = 0;
6723
   for(;;) {
6724
      if (valid_bits < codesize) {
6725
         if (len == 0) {
6726
            len = stbi__get8(s); // start new block
6727
            if (len == 0)
6728
               return g->out;
6729
         }
6730
         --len;
6731
         bits |= (stbi__int32) stbi__get8(s) << valid_bits;
6732
         valid_bits += 8;
6733
      } else {
6734
         stbi__int32 code = bits & codemask;
6735
         bits >>= codesize;
6736
         valid_bits -= codesize;
6737
         // @OPTIMIZE: is there some way we can accelerate the non-clear path?
6738
         if (code == clear) {  // clear code
6739
            codesize = lzw_cs + 1;
6740
            codemask = (1 << codesize) - 1;
6741
            avail = clear + 2;
6742
            oldcode = -1;
6743
            first = 0;
6744
         } else if (code == clear + 1) { // end of stream code
6745
            stbi__skip(s, len);
6746
            while ((len = stbi__get8(s)) > 0)
6747
               stbi__skip(s,len);
6748
            return g->out;
6749
         } else if (code <= avail) {
6750
            if (first) {
6751
               return stbi__errpuc("no clear code", "Corrupt GIF");
6752
            }
6753

6754
            if (oldcode >= 0) {
6755
               p = &g->codes[avail++];
6756
               if (avail > 8192) {
6757
                  return stbi__errpuc("too many codes", "Corrupt GIF");
6758
               }
6759

6760
               p->prefix = (stbi__int16) oldcode;
6761
               p->first = g->codes[oldcode].first;
6762
               p->suffix = (code == avail) ? p->first : g->codes[code].first;
6763
            } else if (code == avail)
6764
               return stbi__errpuc("illegal code in raster", "Corrupt GIF");
6765

6766
            stbi__out_gif_code(g, (stbi__uint16) code);
6767

6768
            if ((avail & codemask) == 0 && avail <= 0x0FFF) {
6769
               codesize++;
6770
               codemask = (1 << codesize) - 1;
6771
            }
6772

6773
            oldcode = code;
6774
         } else {
6775
            return stbi__errpuc("illegal code in raster", "Corrupt GIF");
6776
         }
6777
      }
6778
   }
6779
}
6780

6781
// this function is designed to support animated gifs, although stb_image doesn't support it
6782
// two back is the image from two frames ago, used for a very specific disposal format
6783
static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)
6784
{
6785
   int dispose;
6786
   int first_frame;
6787
   int pi;
6788
   int pcount;
6789
   STBI_NOTUSED(req_comp);
6790

6791
   // on first frame, any non-written pixels get the background colour (non-transparent)
6792
   first_frame = 0;
6793
   if (g->out == 0) {
6794
      if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
6795
      if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))
6796
         return stbi__errpuc("too large", "GIF image is too large");
6797
      pcount = g->w * g->h;
6798
      g->out = (stbi_uc *) stbi__malloc(4 * pcount);
6799
      g->background = (stbi_uc *) stbi__malloc(4 * pcount);
6800
      g->history = (stbi_uc *) stbi__malloc(pcount);
6801
      if (!g->out || !g->background || !g->history)
6802
         return stbi__errpuc("outofmem", "Out of memory");
6803

6804
      // image is treated as "transparent" at the start - ie, nothing overwrites the current background;
6805
      // background colour is only used for pixels that are not rendered first frame, after that "background"
6806
      // color refers to the color that was there the previous frame.
6807
      memset(g->out, 0x00, 4 * pcount);
6808
      memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)
6809
      memset(g->history, 0x00, pcount);        // pixels that were affected previous frame
6810
      first_frame = 1;
6811
   } else {
6812
      // second frame - how do we dispose of the previous one?
6813
      dispose = (g->eflags & 0x1C) >> 2;
6814
      pcount = g->w * g->h;
6815

6816
      if ((dispose == 3) && (two_back == 0)) {
6817
         dispose = 2; // if I don't have an image to revert back to, default to the old background
6818
      }
6819

6820
      if (dispose == 3) { // use previous graphic
6821
         for (pi = 0; pi < pcount; ++pi) {
6822
            if (g->history[pi]) {
6823
               memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );
6824
            }
6825
         }
6826
      } else if (dispose == 2) {
6827
         // restore what was changed last frame to background before that frame;
6828
         for (pi = 0; pi < pcount; ++pi) {
6829
            if (g->history[pi]) {
6830
               memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );
6831
            }
6832
         }
6833
      } else {
6834
         // This is a non-disposal case eithe way, so just
6835
         // leave the pixels as is, and they will become the new background
6836
         // 1: do not dispose
6837
         // 0:  not specified.
6838
      }
6839

6840
      // background is what out is after the undoing of the previou frame;
6841
      memcpy( g->background, g->out, 4 * g->w * g->h );
6842
   }
6843

6844
   // clear my history;
6845
   memset( g->history, 0x00, g->w * g->h );        // pixels that were affected previous frame
6846

6847
   for (;;) {
6848
      int tag = stbi__get8(s);
6849
      switch (tag) {
6850
         case 0x2C: /* Image Descriptor */
6851
         {
6852
            stbi__int32 x, y, w, h;
6853
            stbi_uc *o;
6854

6855
            x = stbi__get16le(s);
6856
            y = stbi__get16le(s);
6857
            w = stbi__get16le(s);
6858
            h = stbi__get16le(s);
6859
            if (((x + w) > (g->w)) || ((y + h) > (g->h)))
6860
               return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
6861

6862
            g->line_size = g->w * 4;
6863
            g->start_x = x * 4;
6864
            g->start_y = y * g->line_size;
6865
            g->max_x   = g->start_x + w * 4;
6866
            g->max_y   = g->start_y + h * g->line_size;
6867
            g->cur_x   = g->start_x;
6868
            g->cur_y   = g->start_y;
6869

6870
            // if the width of the specified rectangle is 0, that means
6871
            // we may not see *any* pixels or the image is malformed;
6872
            // to make sure this is caught, move the current y down to
6873
            // max_y (which is what out_gif_code checks).
6874
            if (w == 0)
6875
               g->cur_y = g->max_y;
6876

6877
            g->lflags = stbi__get8(s);
6878

6879
            if (g->lflags & 0x40) {
6880
               g->step = 8 * g->line_size; // first interlaced spacing
6881
               g->parse = 3;
6882
            } else {
6883
               g->step = g->line_size;
6884
               g->parse = 0;
6885
            }
6886

6887
            if (g->lflags & 0x80) {
6888
               stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
6889
               g->color_table = (stbi_uc *) g->lpal;
6890
            } else if (g->flags & 0x80) {
6891
               g->color_table = (stbi_uc *) g->pal;
6892
            } else
6893
               return stbi__errpuc("missing color table", "Corrupt GIF");
6894

6895
            o = stbi__process_gif_raster(s, g);
6896
            if (!o) return NULL;
6897

6898
            // if this was the first frame,
6899
            pcount = g->w * g->h;
6900
            if (first_frame && (g->bgindex > 0)) {
6901
               // if first frame, any pixel not drawn to gets the background color
6902
               for (pi = 0; pi < pcount; ++pi) {
6903
                  if (g->history[pi] == 0) {
6904
                     g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;
6905
                     memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );
6906
                  }
6907
               }
6908
            }
6909

6910
            return o;
6911
         }
6912

6913
         case 0x21: // Comment Extension.
6914
         {
6915
            int len;
6916
            int ext = stbi__get8(s);
6917
            if (ext == 0xF9) { // Graphic Control Extension.
6918
               len = stbi__get8(s);
6919
               if (len == 4) {
6920
                  g->eflags = stbi__get8(s);
6921
                  g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths.
6922

6923
                  // unset old transparent
6924
                  if (g->transparent >= 0) {
6925
                     g->pal[g->transparent][3] = 255;
6926
                  }
6927
                  if (g->eflags & 0x01) {
6928
                     g->transparent = stbi__get8(s);
6929
                     if (g->transparent >= 0) {
6930
                        g->pal[g->transparent][3] = 0;
6931
                     }
6932
                  } else {
6933
                     // don't need transparent
6934
                     stbi__skip(s, 1);
6935
                     g->transparent = -1;
6936
                  }
6937
               } else {
6938
                  stbi__skip(s, len);
6939
                  break;
6940
               }
6941
            }
6942
            while ((len = stbi__get8(s)) != 0) {
6943
               stbi__skip(s, len);
6944
            }
6945
            break;
6946
         }
6947

6948
         case 0x3B: // gif stream termination code
6949
            return (stbi_uc *) s; // using '1' causes warning on some compilers
6950

6951
         default:
6952
            return stbi__errpuc("unknown code", "Corrupt GIF");
6953
      }
6954
   }
6955
}
6956

6957
static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays)
6958
{
6959
   STBI_FREE(g->out);
6960
   STBI_FREE(g->history);
6961
   STBI_FREE(g->background);
6962

6963
   if (out) STBI_FREE(out);
6964
   if (delays && *delays) STBI_FREE(*delays);
6965
   return stbi__errpuc("outofmem", "Out of memory");
6966
}
6967

6968
static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)
6969
{
6970
   if (stbi__gif_test(s)) {
6971
      int layers = 0;
6972
      stbi_uc *u = 0;
6973
      stbi_uc *out = 0;
6974
      stbi_uc *two_back = 0;
6975
      stbi__gif g;
6976
      int stride;
6977
      int out_size = 0;
6978
      int delays_size = 0;
6979

6980
      STBI_NOTUSED(out_size);
6981
      STBI_NOTUSED(delays_size);
6982

6983
      memset(&g, 0, sizeof(g));
6984
      if (delays) {
6985
         *delays = 0;
6986
      }
6987

6988
      do {
6989
         u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);
6990
         if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker
6991

6992
         if (u) {
6993
            *x = g.w;
6994
            *y = g.h;
6995
            ++layers;
6996
            stride = g.w * g.h * 4;
6997

6998
            if (out) {
6999
               void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride );
7000
               if (!tmp)
7001
                  return stbi__load_gif_main_outofmem(&g, out, delays);
7002
               else {
7003
                   out = (stbi_uc*) tmp;
7004
                   out_size = layers * stride;
7005
               }
7006

7007
               if (delays) {
7008
                  int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers );
7009
                  if (!new_delays)
7010
                     return stbi__load_gif_main_outofmem(&g, out, delays);
7011
                  *delays = new_delays;
7012
                  delays_size = layers * sizeof(int);
7013
               }
7014
            } else {
7015
               out = (stbi_uc*)stbi__malloc( layers * stride );
7016
               if (!out)
7017
                  return stbi__load_gif_main_outofmem(&g, out, delays);
7018
               out_size = layers * stride;
7019
               if (delays) {
7020
                  *delays = (int*) stbi__malloc( layers * sizeof(int) );
7021
                  if (!*delays)
7022
                     return stbi__load_gif_main_outofmem(&g, out, delays);
7023
                  delays_size = layers * sizeof(int);
7024
               }
7025
            }
7026
            memcpy( out + ((layers - 1) * stride), u, stride );
7027
            if (layers >= 2) {
7028
               two_back = out - 2 * stride;
7029
            }
7030

7031
            if (delays) {
7032
               (*delays)[layers - 1U] = g.delay;
7033
            }
7034
         }
7035
      } while (u != 0);
7036

7037
      // free temp buffer;
7038
      STBI_FREE(g.out);
7039
      STBI_FREE(g.history);
7040
      STBI_FREE(g.background);
7041

7042
      // do the final conversion after loading everything;
7043
      if (req_comp && req_comp != 4)
7044
         out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);
7045

7046
      *z = layers;
7047
      return out;
7048
   } else {
7049
      return stbi__errpuc("not GIF", "Image was not as a gif type.");
7050
   }
7051
}
7052

7053
static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
7054
{
7055
   stbi_uc *u = 0;
7056
   stbi__gif g;
7057
   memset(&g, 0, sizeof(g));
7058
   STBI_NOTUSED(ri);
7059

7060
   u = stbi__gif_load_next(s, &g, comp, req_comp, 0);
7061
   if (u == (stbi_uc *) s) u = 0;  // end of animated gif marker
7062
   if (u) {
7063
      *x = g.w;
7064
      *y = g.h;
7065

7066
      // moved conversion to after successful load so that the same
7067
      // can be done for multiple frames.
7068
      if (req_comp && req_comp != 4)
7069
         u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
7070
   } else if (g.out) {
7071
      // if there was an error and we allocated an image buffer, free it!
7072
      STBI_FREE(g.out);
7073
   }
7074

7075
   // free buffers needed for multiple frame loading;
7076
   STBI_FREE(g.history);
7077
   STBI_FREE(g.background);
7078

7079
   return u;
7080
}
7081

7082
static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
7083
{
7084
   return stbi__gif_info_raw(s,x,y,comp);
7085
}
7086
#endif
7087

7088
// *************************************************************************************************
7089
// Radiance RGBE HDR loader
7090
// originally by Nicolas Schulz
7091
#ifndef STBI_NO_HDR
7092
static int stbi__hdr_test_core(stbi__context *s, const char *signature)
42✔
7093
{
7094
   int i;
42✔
7095
   for (i=0; signature[i]; ++i)
42!
7096
      if (stbi__get8(s) != signature[i])
42!
7097
          return 0;
7098
   stbi__rewind(s);
×
7099
   return 1;
×
7100
}
7101

7102
static int stbi__hdr_test(stbi__context* s)
21✔
7103
{
7104
   int r = stbi__hdr_test_core(s, "#?RADIANCE\n");
21✔
7105
   stbi__rewind(s);
21✔
7106
   if(!r) {
21!
7107
       r = stbi__hdr_test_core(s, "#?RGBE\n");
21✔
7108
       stbi__rewind(s);
21✔
7109
   }
7110
   return r;
21✔
7111
}
7112

7113
#define STBI__HDR_BUFLEN  1024
7114
static char *stbi__hdr_gettoken(stbi__context *z, char *buffer)
×
7115
{
7116
   int len=0;
×
7117
   char c = '\0';
×
7118

7119
   c = (char) stbi__get8(z);
×
7120

7121
   while (!stbi__at_eof(z) && c != '\n') {
×
7122
      buffer[len++] = c;
×
7123
      if (len == STBI__HDR_BUFLEN-1) {
×
7124
         // flush to end of line
7125
         while (!stbi__at_eof(z) && stbi__get8(z) != '\n')
×
7126
            ;
7127
         break;
7128
      }
7129
      c = (char) stbi__get8(z);
×
7130
   }
7131

7132
   buffer[len] = 0;
×
7133
   return buffer;
×
7134
}
7135

7136
static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
×
7137
{
7138
   if ( input[3] != 0 ) {
×
7139
      float f1;
×
7140
      // Exponent
7141
      f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
×
7142
      if (req_comp <= 2)
×
7143
         output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
×
7144
      else {
7145
         output[0] = input[0] * f1;
×
7146
         output[1] = input[1] * f1;
×
7147
         output[2] = input[2] * f1;
×
7148
      }
7149
      if (req_comp == 2) output[1] = 1;
×
7150
      if (req_comp == 4) output[3] = 1;
×
7151
   } else {
7152
      switch (req_comp) {
×
7153
         case 4: output[3] = 1; /* fallthrough */
×
7154
         case 3: output[0] = output[1] = output[2] = 0;
×
7155
                 break;
×
7156
         case 2: output[1] = 1; /* fallthrough */
×
7157
         case 1: output[0] = 0;
×
7158
                 break;
×
7159
      }
7160
   }
7161
}
×
7162

7163
static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
×
7164
{
7165
   char buffer[STBI__HDR_BUFLEN];
×
7166
   char *token;
×
7167
   int valid = 0;
×
7168
   int width, height;
×
7169
   stbi_uc *scanline;
×
7170
   float *hdr_data;
×
7171
   int len;
×
7172
   unsigned char count, value;
×
7173
   int i, j, k, c1,c2, z;
×
7174
   const char *headerToken;
×
7175
   STBI_NOTUSED(ri);
×
7176

7177
   // Check identifier
7178
   headerToken = stbi__hdr_gettoken(s,buffer);
×
7179
   if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0)
×
7180
      return stbi__errpf("not HDR", "Corrupt HDR image");
×
7181

7182
   // Parse header
7183
   for(;;) {
×
7184
      token = stbi__hdr_gettoken(s,buffer);
×
7185
      if (token[0] == 0) break;
×
7186
      if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
×
7187
   }
7188

7189
   if (!valid)    return stbi__errpf("unsupported format", "Unsupported HDR format");
×
7190

7191
   // Parse width and height
7192
   // can't use sscanf() if we're not using stdio!
7193
   token = stbi__hdr_gettoken(s,buffer);
×
7194
   if (strncmp(token, "-Y ", 3))  return stbi__errpf("unsupported data layout", "Unsupported HDR format");
×
7195
   token += 3;
×
7196
   height = (int) strtol(token, &token, 10);
×
7197
   while (*token == ' ') ++token;
×
7198
   if (strncmp(token, "+X ", 3))  return stbi__errpf("unsupported data layout", "Unsupported HDR format");
×
7199
   token += 3;
×
7200
   width = (int) strtol(token, NULL, 10);
×
7201

7202
   if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)");
×
7203
   if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)");
×
7204

7205
   *x = width;
×
7206
   *y = height;
×
7207

7208
   if (comp) *comp = 3;
×
7209
   if (req_comp == 0) req_comp = 3;
×
7210

7211
   if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))
×
7212
      return stbi__errpf("too large", "HDR image is too large");
×
7213

7214
   // Read data
7215
   hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);
×
7216
   if (!hdr_data)
×
7217
      return stbi__errpf("outofmem", "Out of memory");
×
7218

7219
   // Load image data
7220
   // image data is stored as some number of sca
7221
   if ( width < 8 || width >= 32768) {
×
7222
      // Read flat data
7223
      for (j=0; j < height; ++j) {
×
7224
         for (i=0; i < width; ++i) {
×
7225
            stbi_uc rgbe[4];
×
7226
           main_decode_loop:
×
7227
            stbi__getn(s, rgbe, 4);
×
7228
            stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
×
7229
         }
7230
      }
7231
   } else {
7232
      // Read RLE-encoded data
7233
      scanline = NULL;
7234

7235
      for (j = 0; j < height; ++j) {
×
7236
         c1 = stbi__get8(s);
×
7237
         c2 = stbi__get8(s);
×
7238
         len = stbi__get8(s);
×
7239
         if (c1 != 2 || c2 != 2 || (len & 0x80)) {
×
7240
            // not run-length encoded, so we have to actually use THIS data as a decoded
7241
            // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
7242
            stbi_uc rgbe[4];
×
7243
            rgbe[0] = (stbi_uc) c1;
×
7244
            rgbe[1] = (stbi_uc) c2;
×
7245
            rgbe[2] = (stbi_uc) len;
×
7246
            rgbe[3] = (stbi_uc) stbi__get8(s);
×
7247
            stbi__hdr_convert(hdr_data, rgbe, req_comp);
×
7248
            i = 1;
×
7249
            j = 0;
×
7250
            STBI_FREE(scanline);
×
7251
            goto main_decode_loop; // yes, this makes no sense
×
7252
         }
7253
         len <<= 8;
×
7254
         len |= stbi__get8(s);
×
7255
         if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
×
7256
         if (scanline == NULL) {
×
7257
            scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);
×
7258
            if (!scanline) {
×
7259
               STBI_FREE(hdr_data);
×
7260
               return stbi__errpf("outofmem", "Out of memory");
×
7261
            }
7262
         }
7263

7264
         for (k = 0; k < 4; ++k) {
×
7265
            int nleft;
7266
            i = 0;
7267
            while ((nleft = width - i) > 0) {
×
7268
               count = stbi__get8(s);
×
7269
               if (count > 128) {
×
7270
                  // Run
7271
                  value = stbi__get8(s);
×
7272
                  count -= 128;
×
7273
                  if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
×
7274
                  for (z = 0; z < count; ++z)
×
7275
                     scanline[i++ * 4 + k] = value;
×
7276
               } else {
7277
                  // Dump
7278
                  if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }
×
7279
                  for (z = 0; z < count; ++z)
×
7280
                     scanline[i++ * 4 + k] = stbi__get8(s);
×
7281
               }
7282
            }
7283
         }
×
7284
         for (i=0; i < width; ++i)
×
7285
            stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
×
7286
      }
7287
      if (scanline)
×
7288
         STBI_FREE(scanline);
×
7289
   }
7290

7291
   return hdr_data;
7292
}
7293

7294
static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
×
7295
{
7296
   char buffer[STBI__HDR_BUFLEN];
×
7297
   char *token;
×
7298
   int valid = 0;
×
7299
   int dummy;
×
7300

7301
   if (!x) x = &dummy;
×
7302
   if (!y) y = &dummy;
×
7303
   if (!comp) comp = &dummy;
×
7304

7305
   if (stbi__hdr_test(s) == 0) {
×
7306
       stbi__rewind( s );
×
7307
       return 0;
×
7308
   }
7309

7310
   for(;;) {
×
7311
      token = stbi__hdr_gettoken(s,buffer);
×
7312
      if (token[0] == 0) break;
×
7313
      if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
×
7314
   }
7315

7316
   if (!valid) {
×
7317
       stbi__rewind( s );
×
7318
       return 0;
×
7319
   }
7320
   token = stbi__hdr_gettoken(s,buffer);
×
7321
   if (strncmp(token, "-Y ", 3)) {
×
7322
       stbi__rewind( s );
×
7323
       return 0;
×
7324
   }
7325
   token += 3;
×
7326
   *y = (int) strtol(token, &token, 10);
×
7327
   while (*token == ' ') ++token;
×
7328
   if (strncmp(token, "+X ", 3)) {
×
7329
       stbi__rewind( s );
×
7330
       return 0;
×
7331
   }
7332
   token += 3;
×
7333
   *x = (int) strtol(token, NULL, 10);
×
7334
   *comp = 3;
×
7335
   return 1;
×
7336
}
7337
#endif // STBI_NO_HDR
7338

7339
#ifndef STBI_NO_BMP
7340
static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
×
7341
{
7342
   void *p;
×
7343
   stbi__bmp_data info;
×
7344

7345
   info.all_a = 255;
×
7346
   p = stbi__bmp_parse_header(s, &info);
×
7347
   if (p == NULL) {
×
7348
      stbi__rewind( s );
×
7349
      return 0;
×
7350
   }
7351
   if (x) *x = s->img_x;
×
7352
   if (y) *y = s->img_y;
×
7353
   if (comp) {
×
7354
      if (info.bpp == 24 && info.ma == 0xff000000)
×
7355
         *comp = 3;
×
7356
      else
7357
         *comp = info.ma ? 4 : 3;
×
7358
   }
7359
   return 1;
7360
}
7361
#endif
7362

7363
#ifndef STBI_NO_PSD
7364
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
×
7365
{
7366
   int channelCount, dummy, depth;
×
7367
   if (!x) x = &dummy;
×
7368
   if (!y) y = &dummy;
×
7369
   if (!comp) comp = &dummy;
×
7370
   if (stbi__get32be(s) != 0x38425053) {
×
7371
       stbi__rewind( s );
×
7372
       return 0;
×
7373
   }
7374
   if (stbi__get16be(s) != 1) {
×
7375
       stbi__rewind( s );
×
7376
       return 0;
×
7377
   }
7378
   stbi__skip(s, 6);
×
7379
   channelCount = stbi__get16be(s);
×
7380
   if (channelCount < 0 || channelCount > 16) {
×
7381
       stbi__rewind( s );
×
7382
       return 0;
×
7383
   }
7384
   *y = stbi__get32be(s);
×
7385
   *x = stbi__get32be(s);
×
7386
   depth = stbi__get16be(s);
×
7387
   if (depth != 8 && depth != 16) {
×
7388
       stbi__rewind( s );
×
7389
       return 0;
×
7390
   }
7391
   if (stbi__get16be(s) != 3) {
×
7392
       stbi__rewind( s );
×
7393
       return 0;
×
7394
   }
7395
   *comp = 4;
×
7396
   return 1;
×
7397
}
7398

7399
static int stbi__psd_is16(stbi__context *s)
×
7400
{
7401
   int channelCount, depth;
×
7402
   if (stbi__get32be(s) != 0x38425053) {
×
7403
       stbi__rewind( s );
×
7404
       return 0;
×
7405
   }
7406
   if (stbi__get16be(s) != 1) {
×
7407
       stbi__rewind( s );
×
7408
       return 0;
×
7409
   }
7410
   stbi__skip(s, 6);
×
7411
   channelCount = stbi__get16be(s);
×
7412
   if (channelCount < 0 || channelCount > 16) {
×
7413
       stbi__rewind( s );
×
7414
       return 0;
×
7415
   }
7416
   STBI_NOTUSED(stbi__get32be(s));
×
7417
   STBI_NOTUSED(stbi__get32be(s));
×
7418
   depth = stbi__get16be(s);
×
7419
   if (depth != 16) {
×
7420
       stbi__rewind( s );
×
7421
       return 0;
×
7422
   }
7423
   return 1;
7424
}
7425
#endif
7426

7427
#ifndef STBI_NO_PIC
7428
static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
×
7429
{
7430
   int act_comp=0,num_packets=0,chained,dummy;
×
7431
   stbi__pic_packet packets[10];
×
7432

7433
   if (!x) x = &dummy;
×
7434
   if (!y) y = &dummy;
×
7435
   if (!comp) comp = &dummy;
×
7436

7437
   if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
×
7438
      stbi__rewind(s);
×
7439
      return 0;
×
7440
   }
7441

7442
   stbi__skip(s, 88);
×
7443

7444
   *x = stbi__get16be(s);
×
7445
   *y = stbi__get16be(s);
×
7446
   if (stbi__at_eof(s)) {
×
7447
      stbi__rewind( s);
×
7448
      return 0;
×
7449
   }
7450
   if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
×
7451
      stbi__rewind( s );
×
7452
      return 0;
×
7453
   }
7454

7455
   stbi__skip(s, 8);
×
7456

7457
   do {
×
7458
      stbi__pic_packet *packet;
×
7459

7460
      if (num_packets==sizeof(packets)/sizeof(packets[0]))
×
7461
         return 0;
7462

7463
      packet = &packets[num_packets++];
×
7464
      chained = stbi__get8(s);
×
7465
      packet->size    = stbi__get8(s);
×
7466
      packet->type    = stbi__get8(s);
×
7467
      packet->channel = stbi__get8(s);
×
7468
      act_comp |= packet->channel;
×
7469

7470
      if (stbi__at_eof(s)) {
×
7471
          stbi__rewind( s );
×
7472
          return 0;
×
7473
      }
7474
      if (packet->size != 8) {
×
7475
          stbi__rewind( s );
×
7476
          return 0;
×
7477
      }
7478
   } while (chained);
×
7479

7480
   *comp = (act_comp & 0x10 ? 4 : 3);
×
7481

7482
   return 1;
×
7483
}
7484
#endif
7485

7486
// *************************************************************************************************
7487
// Portable Gray Map and Portable Pixel Map loader
7488
// by Ken Miller
7489
//
7490
// PGM: http://netpbm.sourceforge.net/doc/pgm.html
7491
// PPM: http://netpbm.sourceforge.net/doc/ppm.html
7492
//
7493
// Known limitations:
7494
//    Does not support comments in the header section
7495
//    Does not support ASCII image data (formats P2 and P3)
7496

7497
#ifndef STBI_NO_PNM
7498

7499
static int      stbi__pnm_test(stbi__context *s)
7500
{
7501
   char p, t;
7502
   p = (char) stbi__get8(s);
7503
   t = (char) stbi__get8(s);
7504
   if (p != 'P' || (t != '5' && t != '6')) {
7505
       stbi__rewind( s );
7506
       return 0;
7507
   }
7508
   return 1;
7509
}
7510

7511
static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)
7512
{
7513
   stbi_uc *out;
7514
   STBI_NOTUSED(ri);
7515

7516
   ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n);
7517
   if (ri->bits_per_channel == 0)
7518
      return 0;
7519

7520
   if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
7521
   if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)");
7522

7523
   *x = s->img_x;
7524
   *y = s->img_y;
7525
   if (comp) *comp = s->img_n;
7526

7527
   if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0))
7528
      return stbi__errpuc("too large", "PNM too large");
7529

7530
   out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0);
7531
   if (!out) return stbi__errpuc("outofmem", "Out of memory");
7532
   if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) {
7533
      STBI_FREE(out);
7534
      return stbi__errpuc("bad PNM", "PNM file truncated");
7535
   }
7536

7537
   if (req_comp && req_comp != s->img_n) {
7538
      if (ri->bits_per_channel == 16) {
7539
         out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y);
7540
      } else {
7541
         out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
7542
      }
7543
      if (out == NULL) return out; // stbi__convert_format frees input on failure
7544
   }
7545
   return out;
7546
}
7547

7548
static int      stbi__pnm_isspace(char c)
7549
{
7550
   return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
7551
}
7552

7553
static void     stbi__pnm_skip_whitespace(stbi__context *s, char *c)
7554
{
7555
   for (;;) {
7556
      while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
7557
         *c = (char) stbi__get8(s);
7558

7559
      if (stbi__at_eof(s) || *c != '#')
7560
         break;
7561

7562
      while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' )
7563
         *c = (char) stbi__get8(s);
7564
   }
7565
}
7566

7567
static int      stbi__pnm_isdigit(char c)
7568
{
7569
   return c >= '0' && c <= '9';
7570
}
7571

7572
static int      stbi__pnm_getinteger(stbi__context *s, char *c)
7573
{
7574
   int value = 0;
7575

7576
   while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
7577
      value = value*10 + (*c - '0');
7578
      *c = (char) stbi__get8(s);
7579
      if((value > 214748364) || (value == 214748364 && *c > '7'))
7580
          return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int");
7581
   }
7582

7583
   return value;
7584
}
7585

7586
static int      stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
7587
{
7588
   int maxv, dummy;
7589
   char c, p, t;
7590

7591
   if (!x) x = &dummy;
7592
   if (!y) y = &dummy;
7593
   if (!comp) comp = &dummy;
7594

7595
   stbi__rewind(s);
7596

7597
   // Get identifier
7598
   p = (char) stbi__get8(s);
7599
   t = (char) stbi__get8(s);
7600
   if (p != 'P' || (t != '5' && t != '6')) {
7601
       stbi__rewind(s);
7602
       return 0;
7603
   }
7604

7605
   *comp = (t == '6') ? 3 : 1;  // '5' is 1-component .pgm; '6' is 3-component .ppm
7606

7607
   c = (char) stbi__get8(s);
7608
   stbi__pnm_skip_whitespace(s, &c);
7609

7610
   *x = stbi__pnm_getinteger(s, &c); // read width
7611
   if(*x == 0)
7612
       return stbi__err("invalid width", "PPM image header had zero or overflowing width");
7613
   stbi__pnm_skip_whitespace(s, &c);
7614

7615
   *y = stbi__pnm_getinteger(s, &c); // read height
7616
   if (*y == 0)
7617
       return stbi__err("invalid width", "PPM image header had zero or overflowing width");
7618
   stbi__pnm_skip_whitespace(s, &c);
7619

7620
   maxv = stbi__pnm_getinteger(s, &c);  // read max value
7621
   if (maxv > 65535)
7622
      return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images");
7623
   else if (maxv > 255)
7624
      return 16;
7625
   else
7626
      return 8;
7627
}
7628

7629
static int stbi__pnm_is16(stbi__context *s)
7630
{
7631
   if (stbi__pnm_info(s, NULL, NULL, NULL) == 16)
7632
           return 1;
7633
   return 0;
7634
}
7635
#endif
7636

7637
static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
×
7638
{
7639
   #ifndef STBI_NO_JPEG
7640
   if (stbi__jpeg_info(s, x, y, comp)) return 1;
×
7641
   #endif
7642

7643
   #ifndef STBI_NO_PNG
7644
   if (stbi__png_info(s, x, y, comp))  return 1;
×
7645
   #endif
7646

7647
   #ifndef STBI_NO_GIF
7648
   if (stbi__gif_info(s, x, y, comp))  return 1;
7649
   #endif
7650

7651
   #ifndef STBI_NO_BMP
7652
   if (stbi__bmp_info(s, x, y, comp))  return 1;
×
7653
   #endif
7654

7655
   #ifndef STBI_NO_PSD
7656
   if (stbi__psd_info(s, x, y, comp))  return 1;
×
7657
   #endif
7658

7659
   #ifndef STBI_NO_PIC
7660
   if (stbi__pic_info(s, x, y, comp))  return 1;
×
7661
   #endif
7662

7663
   #ifndef STBI_NO_PNM
7664
   if (stbi__pnm_info(s, x, y, comp))  return 1;
7665
   #endif
7666

7667
   #ifndef STBI_NO_HDR
7668
   if (stbi__hdr_info(s, x, y, comp))  return 1;
×
7669
   #endif
7670

7671
   // test tga last because it's a crappy test!
7672
   #ifndef STBI_NO_TGA
7673
   if (stbi__tga_info(s, x, y, comp))
×
7674
       return 1;
7675
   #endif
7676
   return stbi__err("unknown image type", "Image not of any known type, or corrupt");
×
7677
}
7678

7679
static int stbi__is_16_main(stbi__context *s)
×
7680
{
7681
   #ifndef STBI_NO_PNG
7682
   if (stbi__png_is16(s))  return 1;
×
7683
   #endif
7684

7685
   #ifndef STBI_NO_PSD
7686
   if (stbi__psd_is16(s))  return 1;
×
7687
   #endif
7688

7689
   #ifndef STBI_NO_PNM
7690
   if (stbi__pnm_is16(s))  return 1;
7691
   #endif
7692
   return 0;
7693
}
7694

7695
#ifndef STBI_NO_STDIO
7696
STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
7697
{
7698
    FILE *f = stbi__fopen(filename, "rb");
7699
    int result;
7700
    if (!f) return stbi__err("can't fopen", "Unable to open file");
7701
    result = stbi_info_from_file(f, x, y, comp);
7702
    fclose(f);
7703
    return result;
7704
}
7705

7706
STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
7707
{
7708
   int r;
7709
   stbi__context s;
7710
   long pos = ftell(f);
7711
   stbi__start_file(&s, f);
7712
   r = stbi__info_main(&s,x,y,comp);
7713
   fseek(f,pos,SEEK_SET);
7714
   return r;
7715
}
7716

7717
STBIDEF int stbi_is_16_bit(char const *filename)
7718
{
7719
    FILE *f = stbi__fopen(filename, "rb");
7720
    int result;
7721
    if (!f) return stbi__err("can't fopen", "Unable to open file");
7722
    result = stbi_is_16_bit_from_file(f);
7723
    fclose(f);
7724
    return result;
7725
}
7726

7727
STBIDEF int stbi_is_16_bit_from_file(FILE *f)
7728
{
7729
   int r;
7730
   stbi__context s;
7731
   long pos = ftell(f);
7732
   stbi__start_file(&s, f);
7733
   r = stbi__is_16_main(&s);
7734
   fseek(f,pos,SEEK_SET);
7735
   return r;
7736
}
7737
#endif // !STBI_NO_STDIO
7738

7739
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
×
7740
{
7741
   stbi__context s;
×
7742
   stbi__start_mem(&s,buffer,len);
×
7743
   return stbi__info_main(&s,x,y,comp);
×
7744
}
7745

7746
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)
×
7747
{
7748
   stbi__context s;
×
7749
   stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
×
7750
   return stbi__info_main(&s,x,y,comp);
×
7751
}
7752

7753
STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)
×
7754
{
7755
   stbi__context s;
×
7756
   stbi__start_mem(&s,buffer,len);
×
7757
   return stbi__is_16_main(&s);
×
7758
}
7759

7760
STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user)
×
7761
{
7762
   stbi__context s;
×
7763
   stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
×
7764
   return stbi__is_16_main(&s);
×
7765
}
7766

7767
#endif // STB_IMAGE_IMPLEMENTATION
7768

7769
/*
7770
   revision history:
7771
      2.20  (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs
7772
      2.19  (2018-02-11) fix warning
7773
      2.18  (2018-01-30) fix warnings
7774
      2.17  (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug
7775
                         1-bit BMP
7776
                         *_is_16_bit api
7777
                         avoid warnings
7778
      2.16  (2017-07-23) all functions have 16-bit variants;
7779
                         STBI_NO_STDIO works again;
7780
                         compilation fixes;
7781
                         fix rounding in unpremultiply;
7782
                         optimize vertical flip;
7783
                         disable raw_len validation;
7784
                         documentation fixes
7785
      2.15  (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;
7786
                         warning fixes; disable run-time SSE detection on gcc;
7787
                         uniform handling of optional "return" values;
7788
                         thread-safe initialization of zlib tables
7789
      2.14  (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
7790
      2.13  (2016-11-29) add 16-bit API, only supported for PNG right now
7791
      2.12  (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
7792
      2.11  (2016-04-02) allocate large structures on the stack
7793
                         remove white matting for transparent PSD
7794
                         fix reported channel count for PNG & BMP
7795
                         re-enable SSE2 in non-gcc 64-bit
7796
                         support RGB-formatted JPEG
7797
                         read 16-bit PNGs (only as 8-bit)
7798
      2.10  (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED
7799
      2.09  (2016-01-16) allow comments in PNM files
7800
                         16-bit-per-pixel TGA (not bit-per-component)
7801
                         info() for TGA could break due to .hdr handling
7802
                         info() for BMP to shares code instead of sloppy parse
7803
                         can use STBI_REALLOC_SIZED if allocator doesn't support realloc
7804
                         code cleanup
7805
      2.08  (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
7806
      2.07  (2015-09-13) fix compiler warnings
7807
                         partial animated GIF support
7808
                         limited 16-bpc PSD support
7809
                         #ifdef unused functions
7810
                         bug with < 92 byte PIC,PNM,HDR,TGA
7811
      2.06  (2015-04-19) fix bug where PSD returns wrong '*comp' value
7812
      2.05  (2015-04-19) fix bug in progressive JPEG handling, fix warning
7813
      2.04  (2015-04-15) try to re-enable SIMD on MinGW 64-bit
7814
      2.03  (2015-04-12) extra corruption checking (mmozeiko)
7815
                         stbi_set_flip_vertically_on_load (nguillemot)
7816
                         fix NEON support; fix mingw support
7817
      2.02  (2015-01-19) fix incorrect assert, fix warning
7818
      2.01  (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2
7819
      2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
7820
      2.00  (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)
7821
                         progressive JPEG (stb)
7822
                         PGM/PPM support (Ken Miller)
7823
                         STBI_MALLOC,STBI_REALLOC,STBI_FREE
7824
                         GIF bugfix -- seemingly never worked
7825
                         STBI_NO_*, STBI_ONLY_*
7826
      1.48  (2014-12-14) fix incorrectly-named assert()
7827
      1.47  (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)
7828
                         optimize PNG (ryg)
7829
                         fix bug in interlaced PNG with user-specified channel count (stb)
7830
      1.46  (2014-08-26)
7831
              fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG
7832
      1.45  (2014-08-16)
7833
              fix MSVC-ARM internal compiler error by wrapping malloc
7834
      1.44  (2014-08-07)
7835
              various warning fixes from Ronny Chevalier
7836
      1.43  (2014-07-15)
7837
              fix MSVC-only compiler problem in code changed in 1.42
7838
      1.42  (2014-07-09)
7839
              don't define _CRT_SECURE_NO_WARNINGS (affects user code)
7840
              fixes to stbi__cleanup_jpeg path
7841
              added STBI_ASSERT to avoid requiring assert.h
7842
      1.41  (2014-06-25)
7843
              fix search&replace from 1.36 that messed up comments/error messages
7844
      1.40  (2014-06-22)
7845
              fix gcc struct-initialization warning
7846
      1.39  (2014-06-15)
7847
              fix to TGA optimization when req_comp != number of components in TGA;
7848
              fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)
7849
              add support for BMP version 5 (more ignored fields)
7850
      1.38  (2014-06-06)
7851
              suppress MSVC warnings on integer casts truncating values
7852
              fix accidental rename of 'skip' field of I/O
7853
      1.37  (2014-06-04)
7854
              remove duplicate typedef
7855
      1.36  (2014-06-03)
7856
              convert to header file single-file library
7857
              if de-iphone isn't set, load iphone images color-swapped instead of returning NULL
7858
      1.35  (2014-05-27)
7859
              various warnings
7860
              fix broken STBI_SIMD path
7861
              fix bug where stbi_load_from_file no longer left file pointer in correct place
7862
              fix broken non-easy path for 32-bit BMP (possibly never used)
7863
              TGA optimization by Arseny Kapoulkine
7864
      1.34  (unknown)
7865
              use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case
7866
      1.33  (2011-07-14)
7867
              make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements
7868
      1.32  (2011-07-13)
7869
              support for "info" function for all supported filetypes (SpartanJ)
7870
      1.31  (2011-06-20)
7871
              a few more leak fixes, bug in PNG handling (SpartanJ)
7872
      1.30  (2011-06-11)
7873
              added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)
7874
              removed deprecated format-specific test/load functions
7875
              removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway
7876
              error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)
7877
              fix inefficiency in decoding 32-bit BMP (David Woo)
7878
      1.29  (2010-08-16)
7879
              various warning fixes from Aurelien Pocheville
7880
      1.28  (2010-08-01)
7881
              fix bug in GIF palette transparency (SpartanJ)
7882
      1.27  (2010-08-01)
7883
              cast-to-stbi_uc to fix warnings
7884
      1.26  (2010-07-24)
7885
              fix bug in file buffering for PNG reported by SpartanJ
7886
      1.25  (2010-07-17)
7887
              refix trans_data warning (Won Chun)
7888
      1.24  (2010-07-12)
7889
              perf improvements reading from files on platforms with lock-heavy fgetc()
7890
              minor perf improvements for jpeg
7891
              deprecated type-specific functions so we'll get feedback if they're needed
7892
              attempt to fix trans_data warning (Won Chun)
7893
      1.23    fixed bug in iPhone support
7894
      1.22  (2010-07-10)
7895
              removed image *writing* support
7896
              stbi_info support from Jetro Lauha
7897
              GIF support from Jean-Marc Lienher
7898
              iPhone PNG-extensions from James Brown
7899
              warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)
7900
      1.21    fix use of 'stbi_uc' in header (reported by jon blow)
7901
      1.20    added support for Softimage PIC, by Tom Seddon
7902
      1.19    bug in interlaced PNG corruption check (found by ryg)
7903
      1.18  (2008-08-02)
7904
              fix a threading bug (local mutable static)
7905
      1.17    support interlaced PNG
7906
      1.16    major bugfix - stbi__convert_format converted one too many pixels
7907
      1.15    initialize some fields for thread safety
7908
      1.14    fix threadsafe conversion bug
7909
              header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
7910
      1.13    threadsafe
7911
      1.12    const qualifiers in the API
7912
      1.11    Support installable IDCT, colorspace conversion routines
7913
      1.10    Fixes for 64-bit (don't use "unsigned long")
7914
              optimized upsampling by Fabian "ryg" Giesen
7915
      1.09    Fix format-conversion for PSD code (bad global variables!)
7916
      1.08    Thatcher Ulrich's PSD code integrated by Nicolas Schulz
7917
      1.07    attempt to fix C++ warning/errors again
7918
      1.06    attempt to fix C++ warning/errors again
7919
      1.05    fix TGA loading to return correct *comp and use good luminance calc
7920
      1.04    default float alpha is 1, not 255; use 'void *' for stbi_image_free
7921
      1.03    bugfixes to STBI_NO_STDIO, STBI_NO_HDR
7922
      1.02    support for (subset of) HDR files, float interface for preferred access to them
7923
      1.01    fix bug: possible bug in handling right-side up bmps... not sure
7924
              fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all
7925
      1.00    interface to zlib that skips zlib header
7926
      0.99    correct handling of alpha in palette
7927
      0.98    TGA loader by lonesock; dynamically add loaders (untested)
7928
      0.97    jpeg errors on too large a file; also catch another malloc failure
7929
      0.96    fix detection of invalid v value - particleman@mollyrocket forum
7930
      0.95    during header scan, seek to markers in case of padding
7931
      0.94    STBI_NO_STDIO to disable stdio usage; rename all #defines the same
7932
      0.93    handle jpegtran output; verbose errors
7933
      0.92    read 4,8,16,24,32-bit BMP files of several formats
7934
      0.91    output 24-bit Windows 3.0 BMP files
7935
      0.90    fix a few more warnings; bump version number to approach 1.0
7936
      0.61    bugfixes due to Marc LeBlanc, Christopher Lloyd
7937
      0.60    fix compiling as c++
7938
      0.59    fix warnings: merge Dave Moore's -Wall fixes
7939
      0.58    fix bug: zlib uncompressed mode len/nlen was wrong endian
7940
      0.57    fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available
7941
      0.56    fix bug: zlib uncompressed mode len vs. nlen
7942
      0.55    fix bug: restart_interval not initialized to 0
7943
      0.54    allow NULL for 'int *comp'
7944
      0.53    fix bug in png 3->4; speedup png decoding
7945
      0.52    png handles req_comp=3,4 directly; minor cleanup; jpeg comments
7946
      0.51    obey req_comp requests, 1-component jpegs return as 1-component,
7947
              on 'test' only check type, not whether we support this variant
7948
      0.50  (2006-11-19)
7949
              first released version
7950
*/
7951

7952

7953
/*
7954
------------------------------------------------------------------------------
7955
This software is available under 2 licenses -- choose whichever you prefer.
7956
------------------------------------------------------------------------------
7957
ALTERNATIVE A - MIT License
7958
Copyright (c) 2017 Sean Barrett
7959
Permission is hereby granted, free of charge, to any person obtaining a copy of
7960
this software and associated documentation files (the "Software"), to deal in
7961
the Software without restriction, including without limitation the rights to
7962
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies
7963
of the Software, and to permit persons to whom the Software is furnished to do
7964
so, subject to the following conditions:
7965
The above copyright notice and this permission notice shall be included in all
7966
copies or substantial portions of the Software.
7967
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7968
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7969
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7970
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
7971
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
7972
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
7973
SOFTWARE.
7974
------------------------------------------------------------------------------
7975
ALTERNATIVE B - Public Domain (www.unlicense.org)
7976
This is free and unencumbered software released into the public domain.
7977
Anyone is free to copy, modify, publish, use, compile, sell, or distribute this
7978
software, either in source code form or as a compiled binary, for any purpose,
7979
commercial or non-commercial, and by any means.
7980
In jurisdictions that recognize copyright laws, the author or authors of this
7981
software dedicate any and all copyright interest in the software to the public
7982
domain. We make this dedication for the benefit of the public at large and to
7983
the detriment of our heirs and successors. We intend this dedication to be an
7984
overt act of relinquishment in perpetuity of all present and future rights to
7985
this software under copyright law.
7986
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
7987
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
7988
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
7989
AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
7990
ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
7991
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
7992
------------------------------------------------------------------------------
7993
*/
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2026 Coveralls, Inc