Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
emscripten-core
GitHub Repository: emscripten-core/emscripten
Path: blob/main/third_party/stb_image.h
4129 views
1
/* stb_image - v2.08 - public domain image loader - http://nothings.org/stb_image.h
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-bit-per-channel (16 bpc not supported)
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
Revision 2.00 release notes:
46
47
- Progressive JPEG is now supported.
48
49
- PPM and PGM binary formats are now supported, thanks to Ken Miller.
50
51
- x86 platforms now make use of SSE2 SIMD instructions for
52
JPEG decoding, and ARM platforms can use NEON SIMD if requested.
53
This work was done by Fabian "ryg" Giesen. SSE2 is used by
54
default, but NEON must be enabled explicitly; see docs.
55
56
With other JPEG optimizations included in this version, we see
57
2x speedup on a JPEG on an x86 machine, and a 1.5x speedup
58
on a JPEG on an ARM machine, relative to previous versions of this
59
library. The same results will not obtain for all JPGs and for all
60
x86/ARM machines. (Note that progressive JPEGs are significantly
61
slower to decode than regular JPEGs.) This doesn't mean that this
62
is the fastest JPEG decoder in the land; rather, it brings it
63
closer to parity with standard libraries. If you want the fastest
64
decode, look elsewhere. (See "Philosophy" section of docs below.)
65
66
See final bullet items below for more info on SIMD.
67
68
- Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing
69
the memory allocator. Unlike other STBI libraries, these macros don't
70
support a context parameter, so if you need to pass a context in to
71
the allocator, you'll have to store it in a global or a thread-local
72
variable.
73
74
- Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and
75
STBI_NO_LINEAR.
76
STBI_NO_HDR: suppress implementation of .hdr reader format
77
STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API
78
79
- You can suppress implementation of any of the decoders to reduce
80
your code footprint by #defining one or more of the following
81
symbols before creating the implementation.
82
83
STBI_NO_JPEG
84
STBI_NO_PNG
85
STBI_NO_BMP
86
STBI_NO_PSD
87
STBI_NO_TGA
88
STBI_NO_GIF
89
STBI_NO_HDR
90
STBI_NO_PIC
91
STBI_NO_PNM (.ppm and .pgm)
92
93
- You can request *only* certain decoders and suppress all other ones
94
(this will be more forward-compatible, as addition of new decoders
95
doesn't require you to disable them explicitly):
96
97
STBI_ONLY_JPEG
98
STBI_ONLY_PNG
99
STBI_ONLY_BMP
100
STBI_ONLY_PSD
101
STBI_ONLY_TGA
102
STBI_ONLY_GIF
103
STBI_ONLY_HDR
104
STBI_ONLY_PIC
105
STBI_ONLY_PNM (.ppm and .pgm)
106
107
Note that you can define multiples of these, and you will get all
108
of them ("only x" and "only y" is interpreted to mean "only x&y").
109
110
- If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
111
want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
112
113
- Compilation of all SIMD code can be suppressed with
114
#define STBI_NO_SIMD
115
It should not be necessary to disable SIMD unless you have issues
116
compiling (e.g. using an x86 compiler which doesn't support SSE
117
intrinsics or that doesn't support the method used to detect
118
SSE2 support at run-time), and even those can be reported as
119
bugs so I can refine the built-in compile-time checking to be
120
smarter.
121
122
- The old STBI_SIMD system which allowed installing a user-defined
123
IDCT etc. has been removed. If you need this, don't upgrade. My
124
assumption is that almost nobody was doing this, and those who
125
were will find the built-in SIMD more satisfactory anyway.
126
127
- RGB values computed for JPEG images are slightly different from
128
previous versions of stb_image. (This is due to using less
129
integer precision in SIMD.) The C code has been adjusted so
130
that the same RGB values will be computed regardless of whether
131
SIMD support is available, so your app should always produce
132
consistent results. But these results are slightly different from
133
previous versions. (Specifically, about 3% of available YCbCr values
134
will compute different RGB results from pre-1.49 versions by +-1;
135
most of the deviating values are one smaller in the G channel.)
136
137
- If you must produce consistent results with previous versions of
138
stb_image, #define STBI_JPEG_OLD and you will get the same results
139
you used to; however, you will not get the SIMD speedups for
140
the YCbCr-to-RGB conversion step (although you should still see
141
significant JPEG speedup from the other changes).
142
143
Please note that STBI_JPEG_OLD is a temporary feature; it will be
144
removed in future versions of the library. It is only intended for
145
near-term back-compatibility use.
146
147
148
Latest revision history:
149
2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
150
2.07 (2015-09-13) partial animated GIF support
151
limited 16-bit PSD support
152
minor bugs, code cleanup, and compiler warnings
153
2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value
154
2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning
155
2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit
156
2.03 (2015-04-12) additional corruption checking
157
stbi_set_flip_vertically_on_load
158
fix NEON support; fix mingw support
159
2.02 (2015-01-19) fix incorrect assert, fix warning
160
2.01 (2015-01-17) fix various warnings
161
2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
162
2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD
163
progressive JPEG
164
PGM/PPM support
165
STBI_MALLOC,STBI_REALLOC,STBI_FREE
166
STBI_NO_*, STBI_ONLY_*
167
GIF bugfix
168
1.48 (2014-12-14) fix incorrectly-named assert()
169
1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted)
170
optimize PNG
171
fix bug in interlaced PNG with user-specified channel count
172
173
See end of file for full revision history.
174
175
176
============================ Contributors =========================
177
178
Image formats Bug fixes & warning fixes
179
Sean Barrett (jpeg, png, bmp) Marc LeBlanc
180
Nicolas Schulz (hdr, psd) Christpher Lloyd
181
Jonathan Dummer (tga) Dave Moore
182
Jean-Marc Lienher (gif) Won Chun
183
Tom Seddon (pic) the Horde3D community
184
Thatcher Ulrich (psd) Janez Zemva
185
Ken Miller (pgm, ppm) Jonathan Blow
186
urraka@github (animated gif) Laurent Gomila
187
Aruelien Pocheville
188
Ryamond Barbiero
189
David Woo
190
Extensions, features Martin Golini
191
Jetro Lauha (stbi_info) Roy Eltham
192
Martin "SpartanJ" Golini (stbi_info) Luke Graham
193
James "moose2000" Brown (iPhone PNG) Thomas Ruf
194
Ben "Disch" Wenger (io callbacks) John Bartholomew
195
Omar Cornut (1/2/4-bit PNG) Ken Hamada
196
Nicolas Guillemot (vertical flip) Cort Stratton
197
Richard Mitton (16-bit PSD) Blazej Dariusz Roszkowski
198
Thibault Reuille
199
Paul Du Bois
200
Guillaume George
201
Jerry Jansson
202
Hayaki Saito
203
Johan Duparc
204
Ronny Chevalier
205
Optimizations & bugfixes Michal Cichon
206
Fabian "ryg" Giesen Tero Hanninen
207
Arseny Kapoulkine Sergio Gonzalez
208
Cass Everitt
209
Engin Manap
210
If your name should be here but Martins Mozeiko
211
isn't, let Sean know. Joseph Thomson
212
Phil Jordan
213
Nathan Reed
214
Michaelangel007@github
215
Nick Verigakis
216
217
LICENSE
218
219
This software is in the public domain. Where that dedication is not
220
recognized, you are granted a perpetual, irrevocable license to copy,
221
distribute, and modify this file as you see fit.
222
223
*/
224
225
#ifndef STBI_INCLUDE_STB_IMAGE_H
226
#define STBI_INCLUDE_STB_IMAGE_H
227
228
// DOCUMENTATION
229
//
230
// Limitations:
231
// - no 16-bit-per-channel PNG
232
// - no 12-bit-per-channel JPEG
233
// - no JPEGs with arithmetic coding
234
// - no 1-bit BMP
235
// - GIF always returns *comp=4
236
//
237
// Basic usage (see HDR discussion below for HDR usage):
238
// int x,y,n;
239
// unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
240
// // ... process data if not NULL ...
241
// // ... x = width, y = height, n = # 8-bit components per pixel ...
242
// // ... replace '0' with '1'..'4' to force that many components per pixel
243
// // ... but 'n' will always be the number that it would have been if you said 0
244
// stbi_image_free(data)
245
//
246
// Standard parameters:
247
// int *x -- outputs image width in pixels
248
// int *y -- outputs image height in pixels
249
// int *comp -- outputs # of image components in image file
250
// int req_comp -- if non-zero, # of image components requested in result
251
//
252
// The return value from an image loader is an 'unsigned char *' which points
253
// to the pixel data, or NULL on an allocation failure or if the image is
254
// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,
255
// with each pixel consisting of N interleaved 8-bit components; the first
256
// pixel pointed to is top-left-most in the image. There is no padding between
257
// image scanlines or between pixels, regardless of format. The number of
258
// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.
259
// If req_comp is non-zero, *comp has the number of components that _would_
260
// have been output otherwise. E.g. if you set req_comp to 4, you will always
261
// get RGBA output, but you can check *comp to see if it's trivially opaque
262
// because e.g. there were only 3 channels in the source image.
263
//
264
// An output image with N components has the following components interleaved
265
// in this order in each pixel:
266
//
267
// N=#comp components
268
// 1 grey
269
// 2 grey, alpha
270
// 3 red, green, blue
271
// 4 red, green, blue, alpha
272
//
273
// If image loading fails for any reason, the return value will be NULL,
274
// and *x, *y, *comp will be unchanged. The function stbi_failure_reason()
275
// can be queried for an extremely brief, end-user unfriendly explanation
276
// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid
277
// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
278
// more user-friendly ones.
279
//
280
// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
281
//
282
// ===========================================================================
283
//
284
// Philosophy
285
//
286
// stb libraries are designed with the following priorities:
287
//
288
// 1. easy to use
289
// 2. easy to maintain
290
// 3. good performance
291
//
292
// Sometimes I let "good performance" creep up in priority over "easy to maintain",
293
// and for best performance I may provide less-easy-to-use APIs that give higher
294
// performance, in addition to the easy to use ones. Nevertheless, it's important
295
// to keep in mind that from the standpoint of you, a client of this library,
296
// all you care about is #1 and #3, and stb libraries do not emphasize #3 above all.
297
//
298
// Some secondary priorities arise directly from the first two, some of which
299
// make more explicit reasons why performance can't be emphasized.
300
//
301
// - Portable ("ease of use")
302
// - Small footprint ("easy to maintain")
303
// - No dependencies ("ease of use")
304
//
305
// ===========================================================================
306
//
307
// I/O callbacks
308
//
309
// I/O callbacks allow you to read from arbitrary sources, like packaged
310
// files or some other source. Data read from callbacks are processed
311
// through a small internal buffer (currently 128 bytes) to try to reduce
312
// overhead.
313
//
314
// The three functions you must define are "read" (reads some bytes of data),
315
// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
316
//
317
// ===========================================================================
318
//
319
// SIMD support
320
//
321
// The JPEG decoder will try to automatically use SIMD kernels on x86 when
322
// supported by the compiler. For ARM Neon support, you must explicitly
323
// request it.
324
//
325
// (The old do-it-yourself SIMD API is no longer supported in the current
326
// code.)
327
//
328
// On x86, SSE2 will automatically be used when available based on a run-time
329
// test; if not, the generic C versions are used as a fall-back. On ARM targets,
330
// the typical path is to have separate builds for NEON and non-NEON devices
331
// (at least this is true for iOS and Android). Therefore, the NEON support is
332
// toggled by a build flag: define STBI_NEON to get NEON loops.
333
//
334
// The output of the JPEG decoder is slightly different from versions where
335
// SIMD support was introduced (that is, for versions before 1.49). The
336
// difference is only +-1 in the 8-bit RGB channels, and only on a small
337
// fraction of pixels. You can force the pre-1.49 behavior by defining
338
// STBI_JPEG_OLD, but this will disable some of the SIMD decoding path
339
// and hence cost some performance.
340
//
341
// If for some reason you do not want to use any of SIMD code, or if
342
// you have issues compiling it, you can disable it entirely by
343
// defining STBI_NO_SIMD.
344
//
345
// ===========================================================================
346
//
347
// HDR image support (disable by defining STBI_NO_HDR)
348
//
349
// stb_image now supports loading HDR images in general, and currently
350
// the Radiance .HDR file format, although the support is provided
351
// generically. You can still load any file through the existing interface;
352
// if you attempt to load an HDR file, it will be automatically remapped to
353
// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
354
// both of these constants can be reconfigured through this interface:
355
//
356
// stbi_hdr_to_ldr_gamma(2.2f);
357
// stbi_hdr_to_ldr_scale(1.0f);
358
//
359
// (note, do not use _inverse_ constants; stbi_image will invert them
360
// appropriately).
361
//
362
// Additionally, there is a new, parallel interface for loading files as
363
// (linear) floats to preserve the full dynamic range:
364
//
365
// float *data = stbi_loadf(filename, &x, &y, &n, 0);
366
//
367
// If you load LDR images through this interface, those images will
368
// be promoted to floating point values, run through the inverse of
369
// constants corresponding to the above:
370
//
371
// stbi_ldr_to_hdr_scale(1.0f);
372
// stbi_ldr_to_hdr_gamma(2.2f);
373
//
374
// Finally, given a filename (or an open file or memory block--see header
375
// file for details) containing image data, you can query for the "most
376
// appropriate" interface to use (that is, whether the image is HDR or
377
// not), using:
378
//
379
// stbi_is_hdr(char *filename);
380
//
381
// ===========================================================================
382
//
383
// iPhone PNG support:
384
//
385
// By default we convert iphone-formatted PNGs back to RGB, even though
386
// they are internally encoded differently. You can disable this conversion
387
// by by calling stbi_convert_iphone_png_to_rgb(0), in which case
388
// you will always just get the native iphone "format" through (which
389
// is BGR stored in RGB).
390
//
391
// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
392
// pixel to remove any premultiplied alpha *only* if the image file explicitly
393
// says there's premultiplied data (currently only happens in iPhone images,
394
// and only if iPhone convert-to-rgb processing is on).
395
//
396
397
398
#ifndef STBI_NO_STDIO
399
#include <stdio.h>
400
#endif // STBI_NO_STDIO
401
402
#define STBI_VERSION 1
403
404
enum
405
{
406
STBI_default = 0, // only used for req_comp
407
408
STBI_grey = 1,
409
STBI_grey_alpha = 2,
410
STBI_rgb = 3,
411
STBI_rgb_alpha = 4
412
};
413
414
typedef unsigned char stbi_uc;
415
416
#ifdef __cplusplus
417
extern "C" {
418
#endif
419
420
#ifdef STB_IMAGE_STATIC
421
#define STBIDEF static
422
#else
423
#define STBIDEF extern
424
#endif
425
426
//////////////////////////////////////////////////////////////////////////////
427
//
428
// PRIMARY API - works on images of any type
429
//
430
431
//
432
// load image by filename, open file, or memory buffer
433
//
434
435
typedef struct
436
{
437
int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read
438
void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
439
int (*eof) (void *user); // returns nonzero if we are at end of file/data
440
} stbi_io_callbacks;
441
442
STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp);
443
STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp);
444
STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp);
445
446
#ifndef STBI_NO_STDIO
447
STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
448
// for stbi_load_from_file, file pointer is left pointing immediately after image
449
#endif
450
451
#ifndef STBI_NO_LINEAR
452
STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp);
453
STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
454
STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);
455
456
#ifndef STBI_NO_STDIO
457
STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
458
#endif
459
#endif
460
461
#ifndef STBI_NO_HDR
462
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);
463
STBIDEF void stbi_hdr_to_ldr_scale(float scale);
464
#endif
465
466
#ifndef STBI_NO_LINEAR
467
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);
468
STBIDEF void stbi_ldr_to_hdr_scale(float scale);
469
#endif // STBI_NO_HDR
470
471
// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
472
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
473
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
474
#ifndef STBI_NO_STDIO
475
STBIDEF int stbi_is_hdr (char const *filename);
476
STBIDEF int stbi_is_hdr_from_file(FILE *f);
477
#endif // STBI_NO_STDIO
478
479
480
// get a VERY brief reason for failure
481
// NOT THREADSAFE
482
STBIDEF const char *stbi_failure_reason (void);
483
484
// free the loaded image -- this is just free()
485
STBIDEF void stbi_image_free (void *retval_from_stbi_load);
486
487
// get image dimensions & components without fully decoding
488
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
489
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
490
491
#ifndef STBI_NO_STDIO
492
STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp);
493
STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
494
495
#endif
496
497
498
499
// for image formats that explicitly notate that they have premultiplied alpha,
500
// we just return the colors as stored in the file. set this flag to force
501
// unpremultiplication. results are undefined if the unpremultiply overflow.
502
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
503
504
// indicate whether we should process iphone images back to canonical format,
505
// or just pass them through "as-is"
506
STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
507
508
// flip the image vertically, so the first pixel in the output array is the bottom left
509
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);
510
511
// ZLIB client - used by PNG, available for other purposes
512
513
STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
514
STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
515
STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
516
STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
517
518
STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
519
STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
520
521
522
#ifdef __cplusplus
523
}
524
#endif
525
526
//
527
//
528
//// end header file /////////////////////////////////////////////////////
529
#endif // STBI_INCLUDE_STB_IMAGE_H
530
531
#ifdef STB_IMAGE_IMPLEMENTATION
532
533
#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
534
|| defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
535
|| defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
536
|| defined(STBI_ONLY_ZLIB)
537
#ifndef STBI_ONLY_JPEG
538
#define STBI_NO_JPEG
539
#endif
540
#ifndef STBI_ONLY_PNG
541
#define STBI_NO_PNG
542
#endif
543
#ifndef STBI_ONLY_BMP
544
#define STBI_NO_BMP
545
#endif
546
#ifndef STBI_ONLY_PSD
547
#define STBI_NO_PSD
548
#endif
549
#ifndef STBI_ONLY_TGA
550
#define STBI_NO_TGA
551
#endif
552
#ifndef STBI_ONLY_GIF
553
#define STBI_NO_GIF
554
#endif
555
#ifndef STBI_ONLY_HDR
556
#define STBI_NO_HDR
557
#endif
558
#ifndef STBI_ONLY_PIC
559
#define STBI_NO_PIC
560
#endif
561
#ifndef STBI_ONLY_PNM
562
#define STBI_NO_PNM
563
#endif
564
#endif
565
566
#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
567
#define STBI_NO_ZLIB
568
#endif
569
570
571
#include <stdarg.h>
572
#include <stddef.h> // ptrdiff_t on osx
573
#include <stdlib.h>
574
#include <string.h>
575
576
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
577
#include <math.h> // ldexp
578
#endif
579
580
#ifndef STBI_NO_STDIO
581
#include <stdio.h>
582
#endif
583
584
#ifndef STBI_ASSERT
585
#include <assert.h>
586
#define STBI_ASSERT(x) assert(x)
587
#endif
588
589
590
#ifndef _MSC_VER
591
#ifdef __cplusplus
592
#define stbi_inline inline
593
#else
594
#define stbi_inline
595
#endif
596
#else
597
#define stbi_inline __forceinline
598
#endif
599
600
601
#ifdef _MSC_VER
602
typedef unsigned short stbi__uint16;
603
typedef signed short stbi__int16;
604
typedef unsigned int stbi__uint32;
605
typedef signed int stbi__int32;
606
#else
607
#include <stdint.h>
608
typedef uint16_t stbi__uint16;
609
typedef int16_t stbi__int16;
610
typedef uint32_t stbi__uint32;
611
typedef int32_t stbi__int32;
612
#endif
613
614
// should produce compiler error if size is wrong
615
typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
616
617
#ifdef _MSC_VER
618
#define STBI_NOTUSED(v) (void)(v)
619
#else
620
#define STBI_NOTUSED(v) (void)sizeof(v)
621
#endif
622
623
#ifdef _MSC_VER
624
#define STBI_HAS_LROTL
625
#endif
626
627
#ifdef STBI_HAS_LROTL
628
#define stbi_lrot(x,y) _lrotl(x,y)
629
#else
630
#define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
631
#endif
632
633
#if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC)
634
// ok
635
#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC)
636
// ok
637
#else
638
#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC."
639
#endif
640
641
#ifndef STBI_MALLOC
642
#define STBI_MALLOC(sz) malloc(sz)
643
#define STBI_REALLOC(p,sz) realloc(p,sz)
644
#define STBI_FREE(p) free(p)
645
#endif
646
647
// x86/x64 detection
648
#if defined(__x86_64__) || defined(_M_X64)
649
#define STBI__X64_TARGET
650
#elif defined(__i386) || defined(_M_IX86)
651
#define STBI__X86_TARGET
652
#endif
653
654
#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
655
// NOTE: not clear do we actually need this for the 64-bit path?
656
// gcc doesn't support sse2 intrinsics unless you compile with -msse2,
657
// (but compiling with -msse2 allows the compiler to use SSE2 everywhere;
658
// this is just broken and gcc are jerks for not fixing it properly
659
// http://www.virtualdub.org/blog/pivot/entry.php?id=363 )
660
#define STBI_NO_SIMD
661
#endif
662
663
#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)
664
// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET
665
//
666
// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the
667
// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.
668
// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not
669
// simultaneously enabling "-mstackrealign".
670
//
671
// See https://github.com/nothings/stb/issues/81 for more information.
672
//
673
// So default to no SSE2 on 32-bit MinGW. If you've read this far and added
674
// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.
675
#define STBI_NO_SIMD
676
#endif
677
678
#if !defined(STBI_NO_SIMD) && defined(STBI__X86_TARGET)
679
#define STBI_SSE2
680
#include <emmintrin.h>
681
682
#ifdef _MSC_VER
683
684
#if _MSC_VER >= 1400 // not VC6
685
#include <intrin.h> // __cpuid
686
static int stbi__cpuid3(void)
687
{
688
int info[4];
689
__cpuid(info,1);
690
return info[3];
691
}
692
#else
693
static int stbi__cpuid3(void)
694
{
695
int res;
696
__asm {
697
mov eax,1
698
cpuid
699
mov res,edx
700
}
701
return res;
702
}
703
#endif
704
705
#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
706
707
static int stbi__sse2_available()
708
{
709
int info3 = stbi__cpuid3();
710
return ((info3 >> 26) & 1) != 0;
711
}
712
#else // assume GCC-style if not VC++
713
#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
714
715
static int stbi__sse2_available()
716
{
717
#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later
718
// GCC 4.8+ has a nice way to do this
719
return __builtin_cpu_supports("sse2");
720
#else
721
// portable way to do this, preferably without using GCC inline ASM?
722
// just bail for now.
723
return 0;
724
#endif
725
}
726
#endif
727
#endif
728
729
// ARM NEON
730
#if defined(STBI_NO_SIMD) && defined(STBI_NEON)
731
#undef STBI_NEON
732
#endif
733
734
#ifdef STBI_NEON
735
#include <arm_neon.h>
736
// assume GCC or Clang on ARM targets
737
#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
738
#endif
739
740
#ifndef STBI_SIMD_ALIGN
741
#define STBI_SIMD_ALIGN(type, name) type name
742
#endif
743
744
///////////////////////////////////////////////
745
//
746
// stbi__context struct and start_xxx functions
747
748
// stbi__context structure is our basic context used by all images, so it
749
// contains all the IO context, plus some basic image information
750
typedef struct
751
{
752
stbi__uint32 img_x, img_y;
753
int img_n, img_out_n;
754
755
stbi_io_callbacks io;
756
void *io_user_data;
757
758
int read_from_callbacks;
759
int buflen;
760
stbi_uc buffer_start[128];
761
762
stbi_uc *img_buffer, *img_buffer_end;
763
stbi_uc *img_buffer_original, *img_buffer_original_end;
764
} stbi__context;
765
766
767
static void stbi__refill_buffer(stbi__context *s);
768
769
// initialize a memory-decode context
770
static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)
771
{
772
s->io.read = NULL;
773
s->read_from_callbacks = 0;
774
s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
775
s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;
776
}
777
778
// initialize a callback-based context
779
static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)
780
{
781
s->io = *c;
782
s->io_user_data = user;
783
s->buflen = sizeof(s->buffer_start);
784
s->read_from_callbacks = 1;
785
s->img_buffer_original = s->buffer_start;
786
stbi__refill_buffer(s);
787
s->img_buffer_original_end = s->img_buffer_end;
788
}
789
790
#ifndef STBI_NO_STDIO
791
792
static int stbi__stdio_read(void *user, char *data, int size)
793
{
794
return (int) fread(data,1,size,(FILE*) user);
795
}
796
797
static void stbi__stdio_skip(void *user, int n)
798
{
799
fseek((FILE*) user, n, SEEK_CUR);
800
}
801
802
static int stbi__stdio_eof(void *user)
803
{
804
return feof((FILE*) user);
805
}
806
807
static stbi_io_callbacks stbi__stdio_callbacks =
808
{
809
stbi__stdio_read,
810
stbi__stdio_skip,
811
stbi__stdio_eof,
812
};
813
814
static void stbi__start_file(stbi__context *s, FILE *f)
815
{
816
stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);
817
}
818
819
//static void stop_file(stbi__context *s) { }
820
821
#endif // !STBI_NO_STDIO
822
823
static void stbi__rewind(stbi__context *s)
824
{
825
// conceptually rewind SHOULD rewind to the beginning of the stream,
826
// but we just rewind to the beginning of the initial buffer, because
827
// we only use it after doing 'test', which only ever looks at at most 92 bytes
828
s->img_buffer = s->img_buffer_original;
829
s->img_buffer_end = s->img_buffer_original_end;
830
}
831
832
#ifndef STBI_NO_JPEG
833
static int stbi__jpeg_test(stbi__context *s);
834
static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
835
static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
836
#endif
837
838
#ifndef STBI_NO_PNG
839
static int stbi__png_test(stbi__context *s);
840
static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
841
static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
842
#endif
843
844
#ifndef STBI_NO_BMP
845
static int stbi__bmp_test(stbi__context *s);
846
static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
847
static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);
848
#endif
849
850
#ifndef STBI_NO_TGA
851
static int stbi__tga_test(stbi__context *s);
852
static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
853
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
854
#endif
855
856
#ifndef STBI_NO_PSD
857
static int stbi__psd_test(stbi__context *s);
858
static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
859
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
860
#endif
861
862
#ifndef STBI_NO_HDR
863
static int stbi__hdr_test(stbi__context *s);
864
static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
865
static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);
866
#endif
867
868
#ifndef STBI_NO_PIC
869
static int stbi__pic_test(stbi__context *s);
870
static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
871
static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
872
#endif
873
874
#ifndef STBI_NO_GIF
875
static int stbi__gif_test(stbi__context *s);
876
static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
877
static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
878
#endif
879
880
#ifndef STBI_NO_PNM
881
static int stbi__pnm_test(stbi__context *s);
882
static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
883
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
884
#endif
885
886
// this is not threadsafe
887
static const char *stbi__g_failure_reason;
888
889
STBIDEF const char *stbi_failure_reason(void)
890
{
891
return stbi__g_failure_reason;
892
}
893
894
static int stbi__err(const char *str)
895
{
896
stbi__g_failure_reason = str;
897
return 0;
898
}
899
900
static void *stbi__malloc(size_t size)
901
{
902
return STBI_MALLOC(size);
903
}
904
905
// stbi__err - error
906
// stbi__errpf - error returning pointer to float
907
// stbi__errpuc - error returning pointer to unsigned char
908
909
#ifdef STBI_NO_FAILURE_STRINGS
910
#define stbi__err(x,y) 0
911
#elif defined(STBI_FAILURE_USERMSG)
912
#define stbi__err(x,y) stbi__err(y)
913
#else
914
#define stbi__err(x,y) stbi__err(x)
915
#endif
916
917
#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))
918
#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))
919
920
STBIDEF void stbi_image_free(void *retval_from_stbi_load)
921
{
922
STBI_FREE(retval_from_stbi_load);
923
}
924
925
#ifndef STBI_NO_LINEAR
926
static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
927
#endif
928
929
#ifndef STBI_NO_HDR
930
static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp);
931
#endif
932
933
static int stbi__vertically_flip_on_load = 0;
934
935
STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)
936
{
937
stbi__vertically_flip_on_load = flag_true_if_should_flip;
938
}
939
940
static unsigned char *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
941
{
942
#ifndef STBI_NO_JPEG
943
if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp);
944
#endif
945
#ifndef STBI_NO_PNG
946
if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp);
947
#endif
948
#ifndef STBI_NO_BMP
949
if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp);
950
#endif
951
#ifndef STBI_NO_GIF
952
if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp);
953
#endif
954
#ifndef STBI_NO_PSD
955
if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp);
956
#endif
957
#ifndef STBI_NO_PIC
958
if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp);
959
#endif
960
#ifndef STBI_NO_PNM
961
if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp);
962
#endif
963
964
#ifndef STBI_NO_HDR
965
if (stbi__hdr_test(s)) {
966
float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);
967
return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
968
}
969
#endif
970
971
#ifndef STBI_NO_TGA
972
// test tga last because it's a crappy test!
973
if (stbi__tga_test(s))
974
return stbi__tga_load(s,x,y,comp,req_comp);
975
#endif
976
977
return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
978
}
979
980
static unsigned char *stbi__load_flip(stbi__context *s, int *x, int *y, int *comp, int req_comp)
981
{
982
unsigned char *result = stbi__load_main(s, x, y, comp, req_comp);
983
984
if (stbi__vertically_flip_on_load && result != NULL) {
985
int w = *x, h = *y;
986
int depth = req_comp ? req_comp : *comp;
987
int row,col,z;
988
stbi_uc temp;
989
990
// @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once
991
for (row = 0; row < (h>>1); row++) {
992
for (col = 0; col < w; col++) {
993
for (z = 0; z < depth; z++) {
994
temp = result[(row * w + col) * depth + z];
995
result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
996
result[((h - row - 1) * w + col) * depth + z] = temp;
997
}
998
}
999
}
1000
}
1001
1002
return result;
1003
}
1004
1005
#ifndef STBI_NO_HDR
1006
static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)
1007
{
1008
if (stbi__vertically_flip_on_load && result != NULL) {
1009
int w = *x, h = *y;
1010
int depth = req_comp ? req_comp : *comp;
1011
int row,col,z;
1012
float temp;
1013
1014
// @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once
1015
for (row = 0; row < (h>>1); row++) {
1016
for (col = 0; col < w; col++) {
1017
for (z = 0; z < depth; z++) {
1018
temp = result[(row * w + col) * depth + z];
1019
result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z];
1020
result[((h - row - 1) * w + col) * depth + z] = temp;
1021
}
1022
}
1023
}
1024
}
1025
}
1026
#endif
1027
1028
#ifndef STBI_NO_STDIO
1029
1030
static FILE *stbi__fopen(char const *filename, char const *mode)
1031
{
1032
FILE *f;
1033
#if defined(_MSC_VER) && _MSC_VER >= 1400
1034
if (0 != fopen_s(&f, filename, mode))
1035
f=0;
1036
#else
1037
f = fopen(filename, mode);
1038
#endif
1039
return f;
1040
}
1041
1042
1043
STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
1044
{
1045
FILE *f = stbi__fopen(filename, "rb");
1046
unsigned char *result;
1047
if (!f) return stbi__errpuc("can't fopen", "Unable to open file");
1048
result = stbi_load_from_file(f,x,y,comp,req_comp);
1049
fclose(f);
1050
return result;
1051
}
1052
1053
STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
1054
{
1055
unsigned char *result;
1056
stbi__context s;
1057
stbi__start_file(&s,f);
1058
result = stbi__load_flip(&s,x,y,comp,req_comp);
1059
if (result) {
1060
// need to 'unget' all the characters in the IO buffer
1061
fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
1062
}
1063
return result;
1064
}
1065
#endif //!STBI_NO_STDIO
1066
1067
STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
1068
{
1069
stbi__context s;
1070
stbi__start_mem(&s,buffer,len);
1071
return stbi__load_flip(&s,x,y,comp,req_comp);
1072
}
1073
1074
STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
1075
{
1076
stbi__context s;
1077
stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
1078
return stbi__load_flip(&s,x,y,comp,req_comp);
1079
}
1080
1081
#ifndef STBI_NO_LINEAR
1082
static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
1083
{
1084
unsigned char *data;
1085
#ifndef STBI_NO_HDR
1086
if (stbi__hdr_test(s)) {
1087
float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp);
1088
if (hdr_data)
1089
stbi__float_postprocess(hdr_data,x,y,comp,req_comp);
1090
return hdr_data;
1091
}
1092
#endif
1093
data = stbi__load_flip(s, x, y, comp, req_comp);
1094
if (data)
1095
return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
1096
return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");
1097
}
1098
1099
STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
1100
{
1101
stbi__context s;
1102
stbi__start_mem(&s,buffer,len);
1103
return stbi__loadf_main(&s,x,y,comp,req_comp);
1104
}
1105
1106
STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
1107
{
1108
stbi__context s;
1109
stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
1110
return stbi__loadf_main(&s,x,y,comp,req_comp);
1111
}
1112
1113
#ifndef STBI_NO_STDIO
1114
STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
1115
{
1116
float *result;
1117
FILE *f = stbi__fopen(filename, "rb");
1118
if (!f) return stbi__errpf("can't fopen", "Unable to open file");
1119
result = stbi_loadf_from_file(f,x,y,comp,req_comp);
1120
fclose(f);
1121
return result;
1122
}
1123
1124
STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
1125
{
1126
stbi__context s;
1127
stbi__start_file(&s,f);
1128
return stbi__loadf_main(&s,x,y,comp,req_comp);
1129
}
1130
#endif // !STBI_NO_STDIO
1131
1132
#endif // !STBI_NO_LINEAR
1133
1134
// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is
1135
// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always
1136
// reports false!
1137
1138
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
1139
{
1140
#ifndef STBI_NO_HDR
1141
stbi__context s;
1142
stbi__start_mem(&s,buffer,len);
1143
return stbi__hdr_test(&s);
1144
#else
1145
STBI_NOTUSED(buffer);
1146
STBI_NOTUSED(len);
1147
return 0;
1148
#endif
1149
}
1150
1151
#ifndef STBI_NO_STDIO
1152
STBIDEF int stbi_is_hdr (char const *filename)
1153
{
1154
FILE *f = stbi__fopen(filename, "rb");
1155
int result=0;
1156
if (f) {
1157
result = stbi_is_hdr_from_file(f);
1158
fclose(f);
1159
}
1160
return result;
1161
}
1162
1163
STBIDEF int stbi_is_hdr_from_file(FILE *f)
1164
{
1165
#ifndef STBI_NO_HDR
1166
stbi__context s;
1167
stbi__start_file(&s,f);
1168
return stbi__hdr_test(&s);
1169
#else
1170
STBI_NOTUSED(f);
1171
return 0;
1172
#endif
1173
}
1174
#endif // !STBI_NO_STDIO
1175
1176
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
1177
{
1178
#ifndef STBI_NO_HDR
1179
stbi__context s;
1180
stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
1181
return stbi__hdr_test(&s);
1182
#else
1183
STBI_NOTUSED(clbk);
1184
STBI_NOTUSED(user);
1185
return 0;
1186
#endif
1187
}
1188
1189
static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
1190
static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
1191
1192
#ifndef STBI_NO_LINEAR
1193
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
1194
STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
1195
#endif
1196
1197
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
1198
STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
1199
1200
1201
//////////////////////////////////////////////////////////////////////////////
1202
//
1203
// Common code used by all image loaders
1204
//
1205
1206
enum
1207
{
1208
STBI__SCAN_load=0,
1209
STBI__SCAN_type,
1210
STBI__SCAN_header
1211
};
1212
1213
static void stbi__refill_buffer(stbi__context *s)
1214
{
1215
int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);
1216
if (n == 0) {
1217
// at end of file, treat same as if from memory, but need to handle case
1218
// where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file
1219
s->read_from_callbacks = 0;
1220
s->img_buffer = s->buffer_start;
1221
s->img_buffer_end = s->buffer_start+1;
1222
*s->img_buffer = 0;
1223
} else {
1224
s->img_buffer = s->buffer_start;
1225
s->img_buffer_end = s->buffer_start + n;
1226
}
1227
}
1228
1229
stbi_inline static stbi_uc stbi__get8(stbi__context *s)
1230
{
1231
if (s->img_buffer < s->img_buffer_end)
1232
return *s->img_buffer++;
1233
if (s->read_from_callbacks) {
1234
stbi__refill_buffer(s);
1235
return *s->img_buffer++;
1236
}
1237
return 0;
1238
}
1239
1240
stbi_inline static int stbi__at_eof(stbi__context *s)
1241
{
1242
if (s->io.read) {
1243
if (!(s->io.eof)(s->io_user_data)) return 0;
1244
// if feof() is true, check if buffer = end
1245
// special case: we've only got the special 0 character at the end
1246
if (s->read_from_callbacks == 0) return 1;
1247
}
1248
1249
return s->img_buffer >= s->img_buffer_end;
1250
}
1251
1252
static void stbi__skip(stbi__context *s, int n)
1253
{
1254
if (n < 0) {
1255
s->img_buffer = s->img_buffer_end;
1256
return;
1257
}
1258
if (s->io.read) {
1259
int blen = (int) (s->img_buffer_end - s->img_buffer);
1260
if (blen < n) {
1261
s->img_buffer = s->img_buffer_end;
1262
(s->io.skip)(s->io_user_data, n - blen);
1263
return;
1264
}
1265
}
1266
s->img_buffer += n;
1267
}
1268
1269
static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
1270
{
1271
if (s->io.read) {
1272
int blen = (int) (s->img_buffer_end - s->img_buffer);
1273
if (blen < n) {
1274
int res, count;
1275
1276
memcpy(buffer, s->img_buffer, blen);
1277
1278
count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);
1279
res = (count == (n-blen));
1280
s->img_buffer = s->img_buffer_end;
1281
return res;
1282
}
1283
}
1284
1285
if (s->img_buffer+n <= s->img_buffer_end) {
1286
memcpy(buffer, s->img_buffer, n);
1287
s->img_buffer += n;
1288
return 1;
1289
} else
1290
return 0;
1291
}
1292
1293
static int stbi__get16be(stbi__context *s)
1294
{
1295
int z = stbi__get8(s);
1296
return (z << 8) + stbi__get8(s);
1297
}
1298
1299
static stbi__uint32 stbi__get32be(stbi__context *s)
1300
{
1301
stbi__uint32 z = stbi__get16be(s);
1302
return (z << 16) + stbi__get16be(s);
1303
}
1304
1305
#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)
1306
// nothing
1307
#else
1308
static int stbi__get16le(stbi__context *s)
1309
{
1310
int z = stbi__get8(s);
1311
return z + (stbi__get8(s) << 8);
1312
}
1313
#endif
1314
1315
#ifndef STBI_NO_BMP
1316
static stbi__uint32 stbi__get32le(stbi__context *s)
1317
{
1318
stbi__uint32 z = stbi__get16le(s);
1319
return z + (stbi__get16le(s) << 16);
1320
}
1321
#endif
1322
1323
#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
1324
1325
1326
//////////////////////////////////////////////////////////////////////////////
1327
//
1328
// generic converter from built-in img_n to req_comp
1329
// individual types do this automatically as much as possible (e.g. jpeg
1330
// does all cases internally since it needs to colorspace convert anyway,
1331
// and it never has alpha, so very few cases ). png can automatically
1332
// interleave an alpha=255 channel, but falls back to this for other cases
1333
//
1334
// assume data buffer is malloced, so malloc a new one and free that one
1335
// only failure mode is malloc failing
1336
1337
static stbi_uc stbi__compute_y(int r, int g, int b)
1338
{
1339
return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
1340
}
1341
1342
static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
1343
{
1344
int i,j;
1345
unsigned char *good;
1346
1347
if (req_comp == img_n) return data;
1348
STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
1349
1350
good = (unsigned char *) stbi__malloc(req_comp * x * y);
1351
if (good == NULL) {
1352
STBI_FREE(data);
1353
return stbi__errpuc("outofmem", "Out of memory");
1354
}
1355
1356
for (j=0; j < (int) y; ++j) {
1357
unsigned char *src = data + j * x * img_n ;
1358
unsigned char *dest = good + j * x * req_comp;
1359
1360
#define COMBO(a,b) ((a)*8+(b))
1361
#define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1362
// convert source image with img_n components to one with req_comp components;
1363
// avoid switch per pixel, so use switch per scanline and massive macros
1364
switch (COMBO(img_n, req_comp)) {
1365
CASE(1,2) dest[0]=src[0], dest[1]=255; break;
1366
CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1367
CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
1368
CASE(2,1) dest[0]=src[0]; break;
1369
CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
1370
CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
1371
CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
1372
CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1373
CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
1374
CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
1375
CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
1376
CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
1377
default: STBI_ASSERT(0);
1378
}
1379
#undef CASE
1380
}
1381
1382
STBI_FREE(data);
1383
return good;
1384
}
1385
1386
#ifndef STBI_NO_LINEAR
1387
static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
1388
{
1389
int i,k,n;
1390
float *output = (float *) stbi__malloc(x * y * comp * sizeof(float));
1391
if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); }
1392
// compute number of non-alpha components
1393
if (comp & 1) n = comp; else n = comp-1;
1394
for (i=0; i < x*y; ++i) {
1395
for (k=0; k < n; ++k) {
1396
output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
1397
}
1398
if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
1399
}
1400
STBI_FREE(data);
1401
return output;
1402
}
1403
#endif
1404
1405
#ifndef STBI_NO_HDR
1406
#define stbi__float2int(x) ((int) (x))
1407
static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
1408
{
1409
int i,k,n;
1410
stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp);
1411
if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); }
1412
// compute number of non-alpha components
1413
if (comp & 1) n = comp; else n = comp-1;
1414
for (i=0; i < x*y; ++i) {
1415
for (k=0; k < n; ++k) {
1416
float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
1417
if (z < 0) z = 0;
1418
if (z > 255) z = 255;
1419
output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1420
}
1421
if (k < comp) {
1422
float z = data[i*comp+k] * 255 + 0.5f;
1423
if (z < 0) z = 0;
1424
if (z > 255) z = 255;
1425
output[i*comp + k] = (stbi_uc) stbi__float2int(z);
1426
}
1427
}
1428
STBI_FREE(data);
1429
return output;
1430
}
1431
#endif
1432
1433
//////////////////////////////////////////////////////////////////////////////
1434
//
1435
// "baseline" JPEG/JFIF decoder
1436
//
1437
// simple implementation
1438
// - doesn't support delayed output of y-dimension
1439
// - simple interface (only one output format: 8-bit interleaved RGB)
1440
// - doesn't try to recover corrupt jpegs
1441
// - doesn't allow partial loading, loading multiple at once
1442
// - still fast on x86 (copying globals into locals doesn't help x86)
1443
// - allocates lots of intermediate memory (full size of all components)
1444
// - non-interleaved case requires this anyway
1445
// - allows good upsampling (see next)
1446
// high-quality
1447
// - upsampled channels are bilinearly interpolated, even across blocks
1448
// - quality integer IDCT derived from IJG's 'slow'
1449
// performance
1450
// - fast huffman; reasonable integer IDCT
1451
// - some SIMD kernels for common paths on targets with SSE2/NEON
1452
// - uses a lot of intermediate memory, could cache poorly
1453
1454
#ifndef STBI_NO_JPEG
1455
1456
// huffman decoding acceleration
1457
#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
1458
1459
typedef struct
1460
{
1461
stbi_uc fast[1 << FAST_BITS];
1462
// weirdly, repacking this into AoS is a 10% speed loss, instead of a win
1463
stbi__uint16 code[256];
1464
stbi_uc values[256];
1465
stbi_uc size[257];
1466
unsigned int maxcode[18];
1467
int delta[17]; // old 'firstsymbol' - old 'firstcode'
1468
} stbi__huffman;
1469
1470
typedef struct
1471
{
1472
stbi__context *s;
1473
stbi__huffman huff_dc[4];
1474
stbi__huffman huff_ac[4];
1475
stbi_uc dequant[4][64];
1476
stbi__int16 fast_ac[4][1 << FAST_BITS];
1477
1478
// sizes for components, interleaved MCUs
1479
int img_h_max, img_v_max;
1480
int img_mcu_x, img_mcu_y;
1481
int img_mcu_w, img_mcu_h;
1482
1483
// definition of jpeg image component
1484
struct
1485
{
1486
int id;
1487
int h,v;
1488
int tq;
1489
int hd,ha;
1490
int dc_pred;
1491
1492
int x,y,w2,h2;
1493
stbi_uc *data;
1494
void *raw_data, *raw_coeff;
1495
stbi_uc *linebuf;
1496
short *coeff; // progressive only
1497
int coeff_w, coeff_h; // number of 8x8 coefficient blocks
1498
} img_comp[4];
1499
1500
stbi__uint32 code_buffer; // jpeg entropy-coded buffer
1501
int code_bits; // number of valid bits
1502
unsigned char marker; // marker seen while filling entropy buffer
1503
int nomore; // flag if we saw a marker so must stop
1504
1505
int progressive;
1506
int spec_start;
1507
int spec_end;
1508
int succ_high;
1509
int succ_low;
1510
int eob_run;
1511
1512
int scan_n, order[4];
1513
int restart_interval, todo;
1514
1515
// kernels
1516
void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);
1517
void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);
1518
stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);
1519
} stbi__jpeg;
1520
1521
static int stbi__build_huffman(stbi__huffman *h, int *count)
1522
{
1523
int i,j,k=0,code;
1524
// build size list for each symbol (from JPEG spec)
1525
for (i=0; i < 16; ++i)
1526
for (j=0; j < count[i]; ++j)
1527
h->size[k++] = (stbi_uc) (i+1);
1528
h->size[k] = 0;
1529
1530
// compute actual symbols (from jpeg spec)
1531
code = 0;
1532
k = 0;
1533
for(j=1; j <= 16; ++j) {
1534
// compute delta to add to code to compute symbol id
1535
h->delta[j] = k - code;
1536
if (h->size[k] == j) {
1537
while (h->size[k] == j)
1538
h->code[k++] = (stbi__uint16) (code++);
1539
if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG");
1540
}
1541
// compute largest code + 1 for this size, preshifted as needed later
1542
h->maxcode[j] = code << (16-j);
1543
code <<= 1;
1544
}
1545
h->maxcode[j] = 0xffffffff;
1546
1547
// build non-spec acceleration table; 255 is flag for not-accelerated
1548
memset(h->fast, 255, 1 << FAST_BITS);
1549
for (i=0; i < k; ++i) {
1550
int s = h->size[i];
1551
if (s <= FAST_BITS) {
1552
int c = h->code[i] << (FAST_BITS-s);
1553
int m = 1 << (FAST_BITS-s);
1554
for (j=0; j < m; ++j) {
1555
h->fast[c+j] = (stbi_uc) i;
1556
}
1557
}
1558
}
1559
return 1;
1560
}
1561
1562
// build a table that decodes both magnitude and value of small ACs in
1563
// one go.
1564
static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
1565
{
1566
int i;
1567
for (i=0; i < (1 << FAST_BITS); ++i) {
1568
stbi_uc fast = h->fast[i];
1569
fast_ac[i] = 0;
1570
if (fast < 255) {
1571
int rs = h->values[fast];
1572
int run = (rs >> 4) & 15;
1573
int magbits = rs & 15;
1574
int len = h->size[fast];
1575
1576
if (magbits && len + magbits <= FAST_BITS) {
1577
// magnitude code followed by receive_extend code
1578
int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
1579
int m = 1 << (magbits - 1);
1580
if (k < m) k += (-1 << magbits) + 1;
1581
// if the result is small enough, we can fit it in fast_ac table
1582
if (k >= -128 && k <= 127)
1583
fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
1584
}
1585
}
1586
}
1587
}
1588
1589
static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
1590
{
1591
do {
1592
int b = j->nomore ? 0 : stbi__get8(j->s);
1593
if (b == 0xff) {
1594
int c = stbi__get8(j->s);
1595
if (c != 0) {
1596
j->marker = (unsigned char) c;
1597
j->nomore = 1;
1598
return;
1599
}
1600
}
1601
j->code_buffer |= b << (24 - j->code_bits);
1602
j->code_bits += 8;
1603
} while (j->code_bits <= 24);
1604
}
1605
1606
// (1 << n) - 1
1607
static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1608
1609
// decode a jpeg huffman value from the bitstream
1610
stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
1611
{
1612
unsigned int temp;
1613
int c,k;
1614
1615
if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1616
1617
// look at the top FAST_BITS and determine what symbol ID it is,
1618
// if the code is <= FAST_BITS
1619
c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1620
k = h->fast[c];
1621
if (k < 255) {
1622
int s = h->size[k];
1623
if (s > j->code_bits)
1624
return -1;
1625
j->code_buffer <<= s;
1626
j->code_bits -= s;
1627
return h->values[k];
1628
}
1629
1630
// naive test is to shift the code_buffer down so k bits are
1631
// valid, then test against maxcode. To speed this up, we've
1632
// preshifted maxcode left so that it has (16-k) 0s at the
1633
// end; in other words, regardless of the number of bits, it
1634
// wants to be compared against something shifted to have 16;
1635
// that way we don't need to shift inside the loop.
1636
temp = j->code_buffer >> 16;
1637
for (k=FAST_BITS+1 ; ; ++k)
1638
if (temp < h->maxcode[k])
1639
break;
1640
if (k == 17) {
1641
// error! code not found
1642
j->code_bits -= 16;
1643
return -1;
1644
}
1645
1646
if (k > j->code_bits)
1647
return -1;
1648
1649
// convert the huffman code to the symbol id
1650
c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
1651
STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
1652
1653
// convert the id to a symbol
1654
j->code_bits -= k;
1655
j->code_buffer <<= k;
1656
return h->values[c];
1657
}
1658
1659
// bias[n] = (-1<<n) + 1
1660
static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
1661
1662
// combined JPEG 'receive' and JPEG 'extend', since baseline
1663
// always extends everything it receives.
1664
stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
1665
{
1666
unsigned int k;
1667
int sgn;
1668
if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1669
1670
sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB
1671
k = stbi_lrot(j->code_buffer, n);
1672
STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask)));
1673
j->code_buffer = k & ~stbi__bmask[n];
1674
k &= stbi__bmask[n];
1675
j->code_bits -= n;
1676
return k + (stbi__jbias[n] & ~sgn);
1677
}
1678
1679
// get some unsigned bits
1680
stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)
1681
{
1682
unsigned int k;
1683
if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
1684
k = stbi_lrot(j->code_buffer, n);
1685
j->code_buffer = k & ~stbi__bmask[n];
1686
k &= stbi__bmask[n];
1687
j->code_bits -= n;
1688
return k;
1689
}
1690
1691
stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
1692
{
1693
unsigned int k;
1694
if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
1695
k = j->code_buffer;
1696
j->code_buffer <<= 1;
1697
--j->code_bits;
1698
return k & 0x80000000;
1699
}
1700
1701
// given a value that's at position X in the zigzag stream,
1702
// where does it appear in the 8x8 matrix coded as row-major?
1703
static stbi_uc stbi__jpeg_dezigzag[64+15] =
1704
{
1705
0, 1, 8, 16, 9, 2, 3, 10,
1706
17, 24, 32, 25, 18, 11, 4, 5,
1707
12, 19, 26, 33, 40, 48, 41, 34,
1708
27, 20, 13, 6, 7, 14, 21, 28,
1709
35, 42, 49, 56, 57, 50, 43, 36,
1710
29, 22, 15, 23, 30, 37, 44, 51,
1711
58, 59, 52, 45, 38, 31, 39, 46,
1712
53, 60, 61, 54, 47, 55, 62, 63,
1713
// let corrupt input sample past end
1714
63, 63, 63, 63, 63, 63, 63, 63,
1715
63, 63, 63, 63, 63, 63, 63
1716
};
1717
1718
// decode one 64-entry block--
1719
static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi_uc *dequant)
1720
{
1721
int diff,dc,k;
1722
int t;
1723
1724
if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1725
t = stbi__jpeg_huff_decode(j, hdc);
1726
if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG");
1727
1728
// 0 all the ac values now so we can do it 32-bits at a time
1729
memset(data,0,64*sizeof(data[0]));
1730
1731
diff = t ? stbi__extend_receive(j, t) : 0;
1732
dc = j->img_comp[b].dc_pred + diff;
1733
j->img_comp[b].dc_pred = dc;
1734
data[0] = (short) (dc * dequant[0]);
1735
1736
// decode AC components, see JPEG spec
1737
k = 1;
1738
do {
1739
unsigned int zig;
1740
int c,r,s;
1741
if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1742
c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1743
r = fac[c];
1744
if (r) { // fast-AC path
1745
k += (r >> 4) & 15; // run
1746
s = r & 15; // combined length
1747
j->code_buffer <<= s;
1748
j->code_bits -= s;
1749
// decode into unzigzag'd location
1750
zig = stbi__jpeg_dezigzag[k++];
1751
data[zig] = (short) ((r >> 8) * dequant[zig]);
1752
} else {
1753
int rs = stbi__jpeg_huff_decode(j, hac);
1754
if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
1755
s = rs & 15;
1756
r = rs >> 4;
1757
if (s == 0) {
1758
if (rs != 0xf0) break; // end block
1759
k += 16;
1760
} else {
1761
k += r;
1762
// decode into unzigzag'd location
1763
zig = stbi__jpeg_dezigzag[k++];
1764
data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
1765
}
1766
}
1767
} while (k < 64);
1768
return 1;
1769
}
1770
1771
static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)
1772
{
1773
int diff,dc;
1774
int t;
1775
if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
1776
1777
if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1778
1779
if (j->succ_high == 0) {
1780
// first scan for DC coefficient, must be first
1781
memset(data,0,64*sizeof(data[0])); // 0 all the ac values now
1782
t = stbi__jpeg_huff_decode(j, hdc);
1783
diff = t ? stbi__extend_receive(j, t) : 0;
1784
1785
dc = j->img_comp[b].dc_pred + diff;
1786
j->img_comp[b].dc_pred = dc;
1787
data[0] = (short) (dc << j->succ_low);
1788
} else {
1789
// refinement scan for DC coefficient
1790
if (stbi__jpeg_get_bit(j))
1791
data[0] += (short) (1 << j->succ_low);
1792
}
1793
return 1;
1794
}
1795
1796
// @OPTIMIZE: store non-zigzagged during the decode passes,
1797
// and only de-zigzag when dequantizing
1798
static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)
1799
{
1800
int k;
1801
if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
1802
1803
if (j->succ_high == 0) {
1804
int shift = j->succ_low;
1805
1806
if (j->eob_run) {
1807
--j->eob_run;
1808
return 1;
1809
}
1810
1811
k = j->spec_start;
1812
do {
1813
unsigned int zig;
1814
int c,r,s;
1815
if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
1816
c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1817
r = fac[c];
1818
if (r) { // fast-AC path
1819
k += (r >> 4) & 15; // run
1820
s = r & 15; // combined length
1821
j->code_buffer <<= s;
1822
j->code_bits -= s;
1823
zig = stbi__jpeg_dezigzag[k++];
1824
data[zig] = (short) ((r >> 8) << shift);
1825
} else {
1826
int rs = stbi__jpeg_huff_decode(j, hac);
1827
if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
1828
s = rs & 15;
1829
r = rs >> 4;
1830
if (s == 0) {
1831
if (r < 15) {
1832
j->eob_run = (1 << r);
1833
if (r)
1834
j->eob_run += stbi__jpeg_get_bits(j, r);
1835
--j->eob_run;
1836
break;
1837
}
1838
k += 16;
1839
} else {
1840
k += r;
1841
zig = stbi__jpeg_dezigzag[k++];
1842
data[zig] = (short) (stbi__extend_receive(j,s) << shift);
1843
}
1844
}
1845
} while (k <= j->spec_end);
1846
} else {
1847
// refinement scan for these AC coefficients
1848
1849
short bit = (short) (1 << j->succ_low);
1850
1851
if (j->eob_run) {
1852
--j->eob_run;
1853
for (k = j->spec_start; k <= j->spec_end; ++k) {
1854
short *p = &data[stbi__jpeg_dezigzag[k]];
1855
if (*p != 0)
1856
if (stbi__jpeg_get_bit(j))
1857
if ((*p & bit)==0) {
1858
if (*p > 0)
1859
*p += bit;
1860
else
1861
*p -= bit;
1862
}
1863
}
1864
} else {
1865
k = j->spec_start;
1866
do {
1867
int r,s;
1868
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
1869
if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
1870
s = rs & 15;
1871
r = rs >> 4;
1872
if (s == 0) {
1873
if (r < 15) {
1874
j->eob_run = (1 << r) - 1;
1875
if (r)
1876
j->eob_run += stbi__jpeg_get_bits(j, r);
1877
r = 64; // force end of block
1878
} else {
1879
// r=15 s=0 should write 16 0s, so we just do
1880
// a run of 15 0s and then write s (which is 0),
1881
// so we don't have to do anything special here
1882
}
1883
} else {
1884
if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG");
1885
// sign bit
1886
if (stbi__jpeg_get_bit(j))
1887
s = bit;
1888
else
1889
s = -bit;
1890
}
1891
1892
// advance by r
1893
while (k <= j->spec_end) {
1894
short *p = &data[stbi__jpeg_dezigzag[k++]];
1895
if (*p != 0) {
1896
if (stbi__jpeg_get_bit(j))
1897
if ((*p & bit)==0) {
1898
if (*p > 0)
1899
*p += bit;
1900
else
1901
*p -= bit;
1902
}
1903
} else {
1904
if (r == 0) {
1905
*p = (short) s;
1906
break;
1907
}
1908
--r;
1909
}
1910
}
1911
} while (k <= j->spec_end);
1912
}
1913
}
1914
return 1;
1915
}
1916
1917
// take a -128..127 value and stbi__clamp it and convert to 0..255
1918
stbi_inline static stbi_uc stbi__clamp(int x)
1919
{
1920
// trick to use a single test to catch both cases
1921
if ((unsigned int) x > 255) {
1922
if (x < 0) return 0;
1923
if (x > 255) return 255;
1924
}
1925
return (stbi_uc) x;
1926
}
1927
1928
#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
1929
#define stbi__fsh(x) ((x) << 12)
1930
1931
// derived from jidctint -- DCT_ISLOW
1932
#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
1933
int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
1934
p2 = s2; \
1935
p3 = s6; \
1936
p1 = (p2+p3) * stbi__f2f(0.5411961f); \
1937
t2 = p1 + p3*stbi__f2f(-1.847759065f); \
1938
t3 = p1 + p2*stbi__f2f( 0.765366865f); \
1939
p2 = s0; \
1940
p3 = s4; \
1941
t0 = stbi__fsh(p2+p3); \
1942
t1 = stbi__fsh(p2-p3); \
1943
x0 = t0+t3; \
1944
x3 = t0-t3; \
1945
x1 = t1+t2; \
1946
x2 = t1-t2; \
1947
t0 = s7; \
1948
t1 = s5; \
1949
t2 = s3; \
1950
t3 = s1; \
1951
p3 = t0+t2; \
1952
p4 = t1+t3; \
1953
p1 = t0+t3; \
1954
p2 = t1+t2; \
1955
p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
1956
t0 = t0*stbi__f2f( 0.298631336f); \
1957
t1 = t1*stbi__f2f( 2.053119869f); \
1958
t2 = t2*stbi__f2f( 3.072711026f); \
1959
t3 = t3*stbi__f2f( 1.501321110f); \
1960
p1 = p5 + p1*stbi__f2f(-0.899976223f); \
1961
p2 = p5 + p2*stbi__f2f(-2.562915447f); \
1962
p3 = p3*stbi__f2f(-1.961570560f); \
1963
p4 = p4*stbi__f2f(-0.390180644f); \
1964
t3 += p1+p4; \
1965
t2 += p2+p3; \
1966
t1 += p2+p4; \
1967
t0 += p1+p3;
1968
1969
static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
1970
{
1971
int i,val[64],*v=val;
1972
stbi_uc *o;
1973
short *d = data;
1974
1975
// columns
1976
for (i=0; i < 8; ++i,++d, ++v) {
1977
// if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
1978
if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
1979
&& d[40]==0 && d[48]==0 && d[56]==0) {
1980
// no shortcut 0 seconds
1981
// (1|2|3|4|5|6|7)==0 0 seconds
1982
// all separate -0.047 seconds
1983
// 1 && 2|3 && 4|5 && 6|7: -0.047 seconds
1984
int dcterm = d[0] << 2;
1985
v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1986
} else {
1987
STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
1988
// constants scaled things up by 1<<12; let's bring them back
1989
// down, but keep 2 extra bits of precision
1990
x0 += 512; x1 += 512; x2 += 512; x3 += 512;
1991
v[ 0] = (x0+t3) >> 10;
1992
v[56] = (x0-t3) >> 10;
1993
v[ 8] = (x1+t2) >> 10;
1994
v[48] = (x1-t2) >> 10;
1995
v[16] = (x2+t1) >> 10;
1996
v[40] = (x2-t1) >> 10;
1997
v[24] = (x3+t0) >> 10;
1998
v[32] = (x3-t0) >> 10;
1999
}
2000
}
2001
2002
for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
2003
// no fast case since the first 1D IDCT spread components out
2004
STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
2005
// constants scaled things up by 1<<12, plus we had 1<<2 from first
2006
// loop, plus horizontal and vertical each scale by sqrt(8) so together
2007
// we've got an extra 1<<3, so 1<<17 total we need to remove.
2008
// so we want to round that, which means adding 0.5 * 1<<17,
2009
// aka 65536. Also, we'll end up with -128 to 127 that we want
2010
// to encode as 0..255 by adding 128, so we'll add that before the shift
2011
x0 += 65536 + (128<<17);
2012
x1 += 65536 + (128<<17);
2013
x2 += 65536 + (128<<17);
2014
x3 += 65536 + (128<<17);
2015
// tried computing the shifts into temps, or'ing the temps to see
2016
// if any were out of range, but that was slower
2017
o[0] = stbi__clamp((x0+t3) >> 17);
2018
o[7] = stbi__clamp((x0-t3) >> 17);
2019
o[1] = stbi__clamp((x1+t2) >> 17);
2020
o[6] = stbi__clamp((x1-t2) >> 17);
2021
o[2] = stbi__clamp((x2+t1) >> 17);
2022
o[5] = stbi__clamp((x2-t1) >> 17);
2023
o[3] = stbi__clamp((x3+t0) >> 17);
2024
o[4] = stbi__clamp((x3-t0) >> 17);
2025
}
2026
}
2027
2028
#ifdef STBI_SSE2
2029
// sse2 integer IDCT. not the fastest possible implementation but it
2030
// produces bit-identical results to the generic C version so it's
2031
// fully "transparent".
2032
static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
2033
{
2034
// This is constructed to match our regular (generic) integer IDCT exactly.
2035
__m128i row0, row1, row2, row3, row4, row5, row6, row7;
2036
__m128i tmp;
2037
2038
// dot product constant: even elems=x, odd elems=y
2039
#define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
2040
2041
// out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit)
2042
// out(1) = c1[even]*x + c1[odd]*y
2043
#define dct_rot(out0,out1, x,y,c0,c1) \
2044
__m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
2045
__m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
2046
__m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
2047
__m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
2048
__m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
2049
__m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
2050
2051
// out = in << 12 (in 16-bit, out 32-bit)
2052
#define dct_widen(out, in) \
2053
__m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
2054
__m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
2055
2056
// wide add
2057
#define dct_wadd(out, a, b) \
2058
__m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
2059
__m128i out##_h = _mm_add_epi32(a##_h, b##_h)
2060
2061
// wide sub
2062
#define dct_wsub(out, a, b) \
2063
__m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
2064
__m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
2065
2066
// butterfly a/b, add bias, then shift by "s" and pack
2067
#define dct_bfly32o(out0, out1, a,b,bias,s) \
2068
{ \
2069
__m128i abiased_l = _mm_add_epi32(a##_l, bias); \
2070
__m128i abiased_h = _mm_add_epi32(a##_h, bias); \
2071
dct_wadd(sum, abiased, b); \
2072
dct_wsub(dif, abiased, b); \
2073
out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
2074
out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
2075
}
2076
2077
// 8-bit interleave step (for transposes)
2078
#define dct_interleave8(a, b) \
2079
tmp = a; \
2080
a = _mm_unpacklo_epi8(a, b); \
2081
b = _mm_unpackhi_epi8(tmp, b)
2082
2083
// 16-bit interleave step (for transposes)
2084
#define dct_interleave16(a, b) \
2085
tmp = a; \
2086
a = _mm_unpacklo_epi16(a, b); \
2087
b = _mm_unpackhi_epi16(tmp, b)
2088
2089
#define dct_pass(bias,shift) \
2090
{ \
2091
/* even part */ \
2092
dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
2093
__m128i sum04 = _mm_add_epi16(row0, row4); \
2094
__m128i dif04 = _mm_sub_epi16(row0, row4); \
2095
dct_widen(t0e, sum04); \
2096
dct_widen(t1e, dif04); \
2097
dct_wadd(x0, t0e, t3e); \
2098
dct_wsub(x3, t0e, t3e); \
2099
dct_wadd(x1, t1e, t2e); \
2100
dct_wsub(x2, t1e, t2e); \
2101
/* odd part */ \
2102
dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
2103
dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
2104
__m128i sum17 = _mm_add_epi16(row1, row7); \
2105
__m128i sum35 = _mm_add_epi16(row3, row5); \
2106
dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
2107
dct_wadd(x4, y0o, y4o); \
2108
dct_wadd(x5, y1o, y5o); \
2109
dct_wadd(x6, y2o, y5o); \
2110
dct_wadd(x7, y3o, y4o); \
2111
dct_bfly32o(row0,row7, x0,x7,bias,shift); \
2112
dct_bfly32o(row1,row6, x1,x6,bias,shift); \
2113
dct_bfly32o(row2,row5, x2,x5,bias,shift); \
2114
dct_bfly32o(row3,row4, x3,x4,bias,shift); \
2115
}
2116
2117
__m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
2118
__m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
2119
__m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
2120
__m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
2121
__m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
2122
__m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
2123
__m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
2124
__m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
2125
2126
// rounding biases in column/row passes, see stbi__idct_block for explanation.
2127
__m128i bias_0 = _mm_set1_epi32(512);
2128
__m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
2129
2130
// load
2131
row0 = _mm_load_si128((const __m128i *) (data + 0*8));
2132
row1 = _mm_load_si128((const __m128i *) (data + 1*8));
2133
row2 = _mm_load_si128((const __m128i *) (data + 2*8));
2134
row3 = _mm_load_si128((const __m128i *) (data + 3*8));
2135
row4 = _mm_load_si128((const __m128i *) (data + 4*8));
2136
row5 = _mm_load_si128((const __m128i *) (data + 5*8));
2137
row6 = _mm_load_si128((const __m128i *) (data + 6*8));
2138
row7 = _mm_load_si128((const __m128i *) (data + 7*8));
2139
2140
// column pass
2141
dct_pass(bias_0, 10);
2142
2143
{
2144
// 16bit 8x8 transpose pass 1
2145
dct_interleave16(row0, row4);
2146
dct_interleave16(row1, row5);
2147
dct_interleave16(row2, row6);
2148
dct_interleave16(row3, row7);
2149
2150
// transpose pass 2
2151
dct_interleave16(row0, row2);
2152
dct_interleave16(row1, row3);
2153
dct_interleave16(row4, row6);
2154
dct_interleave16(row5, row7);
2155
2156
// transpose pass 3
2157
dct_interleave16(row0, row1);
2158
dct_interleave16(row2, row3);
2159
dct_interleave16(row4, row5);
2160
dct_interleave16(row6, row7);
2161
}
2162
2163
// row pass
2164
dct_pass(bias_1, 17);
2165
2166
{
2167
// pack
2168
__m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7
2169
__m128i p1 = _mm_packus_epi16(row2, row3);
2170
__m128i p2 = _mm_packus_epi16(row4, row5);
2171
__m128i p3 = _mm_packus_epi16(row6, row7);
2172
2173
// 8bit 8x8 transpose pass 1
2174
dct_interleave8(p0, p2); // a0e0a1e1...
2175
dct_interleave8(p1, p3); // c0g0c1g1...
2176
2177
// transpose pass 2
2178
dct_interleave8(p0, p1); // a0c0e0g0...
2179
dct_interleave8(p2, p3); // b0d0f0h0...
2180
2181
// transpose pass 3
2182
dct_interleave8(p0, p2); // a0b0c0d0...
2183
dct_interleave8(p1, p3); // a4b4c4d4...
2184
2185
// store
2186
_mm_storel_epi64((__m128i *) out, p0); out += out_stride;
2187
_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
2188
_mm_storel_epi64((__m128i *) out, p2); out += out_stride;
2189
_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
2190
_mm_storel_epi64((__m128i *) out, p1); out += out_stride;
2191
_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
2192
_mm_storel_epi64((__m128i *) out, p3); out += out_stride;
2193
_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
2194
}
2195
2196
#undef dct_const
2197
#undef dct_rot
2198
#undef dct_widen
2199
#undef dct_wadd
2200
#undef dct_wsub
2201
#undef dct_bfly32o
2202
#undef dct_interleave8
2203
#undef dct_interleave16
2204
#undef dct_pass
2205
}
2206
2207
#endif // STBI_SSE2
2208
2209
#ifdef STBI_NEON
2210
2211
// NEON integer IDCT. should produce bit-identical
2212
// results to the generic C version.
2213
static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
2214
{
2215
int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
2216
2217
int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
2218
int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
2219
int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
2220
int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
2221
int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
2222
int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
2223
int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
2224
int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
2225
int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
2226
int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
2227
int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
2228
int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
2229
2230
#define dct_long_mul(out, inq, coeff) \
2231
int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
2232
int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
2233
2234
#define dct_long_mac(out, acc, inq, coeff) \
2235
int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
2236
int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
2237
2238
#define dct_widen(out, inq) \
2239
int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
2240
int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
2241
2242
// wide add
2243
#define dct_wadd(out, a, b) \
2244
int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
2245
int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
2246
2247
// wide sub
2248
#define dct_wsub(out, a, b) \
2249
int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
2250
int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
2251
2252
// butterfly a/b, then shift using "shiftop" by "s" and pack
2253
#define dct_bfly32o(out0,out1, a,b,shiftop,s) \
2254
{ \
2255
dct_wadd(sum, a, b); \
2256
dct_wsub(dif, a, b); \
2257
out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
2258
out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
2259
}
2260
2261
#define dct_pass(shiftop, shift) \
2262
{ \
2263
/* even part */ \
2264
int16x8_t sum26 = vaddq_s16(row2, row6); \
2265
dct_long_mul(p1e, sum26, rot0_0); \
2266
dct_long_mac(t2e, p1e, row6, rot0_1); \
2267
dct_long_mac(t3e, p1e, row2, rot0_2); \
2268
int16x8_t sum04 = vaddq_s16(row0, row4); \
2269
int16x8_t dif04 = vsubq_s16(row0, row4); \
2270
dct_widen(t0e, sum04); \
2271
dct_widen(t1e, dif04); \
2272
dct_wadd(x0, t0e, t3e); \
2273
dct_wsub(x3, t0e, t3e); \
2274
dct_wadd(x1, t1e, t2e); \
2275
dct_wsub(x2, t1e, t2e); \
2276
/* odd part */ \
2277
int16x8_t sum15 = vaddq_s16(row1, row5); \
2278
int16x8_t sum17 = vaddq_s16(row1, row7); \
2279
int16x8_t sum35 = vaddq_s16(row3, row5); \
2280
int16x8_t sum37 = vaddq_s16(row3, row7); \
2281
int16x8_t sumodd = vaddq_s16(sum17, sum35); \
2282
dct_long_mul(p5o, sumodd, rot1_0); \
2283
dct_long_mac(p1o, p5o, sum17, rot1_1); \
2284
dct_long_mac(p2o, p5o, sum35, rot1_2); \
2285
dct_long_mul(p3o, sum37, rot2_0); \
2286
dct_long_mul(p4o, sum15, rot2_1); \
2287
dct_wadd(sump13o, p1o, p3o); \
2288
dct_wadd(sump24o, p2o, p4o); \
2289
dct_wadd(sump23o, p2o, p3o); \
2290
dct_wadd(sump14o, p1o, p4o); \
2291
dct_long_mac(x4, sump13o, row7, rot3_0); \
2292
dct_long_mac(x5, sump24o, row5, rot3_1); \
2293
dct_long_mac(x6, sump23o, row3, rot3_2); \
2294
dct_long_mac(x7, sump14o, row1, rot3_3); \
2295
dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
2296
dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
2297
dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
2298
dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
2299
}
2300
2301
// load
2302
row0 = vld1q_s16(data + 0*8);
2303
row1 = vld1q_s16(data + 1*8);
2304
row2 = vld1q_s16(data + 2*8);
2305
row3 = vld1q_s16(data + 3*8);
2306
row4 = vld1q_s16(data + 4*8);
2307
row5 = vld1q_s16(data + 5*8);
2308
row6 = vld1q_s16(data + 6*8);
2309
row7 = vld1q_s16(data + 7*8);
2310
2311
// add DC bias
2312
row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
2313
2314
// column pass
2315
dct_pass(vrshrn_n_s32, 10);
2316
2317
// 16bit 8x8 transpose
2318
{
2319
// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.
2320
// whether compilers actually get this is another story, sadly.
2321
#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
2322
#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]); }
2323
#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)); }
2324
2325
// pass 1
2326
dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
2327
dct_trn16(row2, row3);
2328
dct_trn16(row4, row5);
2329
dct_trn16(row6, row7);
2330
2331
// pass 2
2332
dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
2333
dct_trn32(row1, row3);
2334
dct_trn32(row4, row6);
2335
dct_trn32(row5, row7);
2336
2337
// pass 3
2338
dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
2339
dct_trn64(row1, row5);
2340
dct_trn64(row2, row6);
2341
dct_trn64(row3, row7);
2342
2343
#undef dct_trn16
2344
#undef dct_trn32
2345
#undef dct_trn64
2346
}
2347
2348
// row pass
2349
// vrshrn_n_s32 only supports shifts up to 16, we need
2350
// 17. so do a non-rounding shift of 16 first then follow
2351
// up with a rounding shift by 1.
2352
dct_pass(vshrn_n_s32, 16);
2353
2354
{
2355
// pack and round
2356
uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
2357
uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
2358
uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
2359
uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
2360
uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
2361
uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
2362
uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
2363
uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
2364
2365
// again, these can translate into one instruction, but often don't.
2366
#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
2367
#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]); }
2368
#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]); }
2369
2370
// sadly can't use interleaved stores here since we only write
2371
// 8 bytes to each scan line!
2372
2373
// 8x8 8-bit transpose pass 1
2374
dct_trn8_8(p0, p1);
2375
dct_trn8_8(p2, p3);
2376
dct_trn8_8(p4, p5);
2377
dct_trn8_8(p6, p7);
2378
2379
// pass 2
2380
dct_trn8_16(p0, p2);
2381
dct_trn8_16(p1, p3);
2382
dct_trn8_16(p4, p6);
2383
dct_trn8_16(p5, p7);
2384
2385
// pass 3
2386
dct_trn8_32(p0, p4);
2387
dct_trn8_32(p1, p5);
2388
dct_trn8_32(p2, p6);
2389
dct_trn8_32(p3, p7);
2390
2391
// store
2392
vst1_u8(out, p0); out += out_stride;
2393
vst1_u8(out, p1); out += out_stride;
2394
vst1_u8(out, p2); out += out_stride;
2395
vst1_u8(out, p3); out += out_stride;
2396
vst1_u8(out, p4); out += out_stride;
2397
vst1_u8(out, p5); out += out_stride;
2398
vst1_u8(out, p6); out += out_stride;
2399
vst1_u8(out, p7);
2400
2401
#undef dct_trn8_8
2402
#undef dct_trn8_16
2403
#undef dct_trn8_32
2404
}
2405
2406
#undef dct_long_mul
2407
#undef dct_long_mac
2408
#undef dct_widen
2409
#undef dct_wadd
2410
#undef dct_wsub
2411
#undef dct_bfly32o
2412
#undef dct_pass
2413
}
2414
2415
#endif // STBI_NEON
2416
2417
#define STBI__MARKER_none 0xff
2418
// if there's a pending marker from the entropy stream, return that
2419
// otherwise, fetch from the stream and get a marker. if there's no
2420
// marker, return 0xff, which is never a valid marker value
2421
static stbi_uc stbi__get_marker(stbi__jpeg *j)
2422
{
2423
stbi_uc x;
2424
if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
2425
x = stbi__get8(j->s);
2426
if (x != 0xff) return STBI__MARKER_none;
2427
while (x == 0xff)
2428
x = stbi__get8(j->s);
2429
return x;
2430
}
2431
2432
// in each scan, we'll have scan_n components, and the order
2433
// of the components is specified by order[]
2434
#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
2435
2436
// after a restart interval, stbi__jpeg_reset the entropy decoder and
2437
// the dc prediction
2438
static void stbi__jpeg_reset(stbi__jpeg *j)
2439
{
2440
j->code_bits = 0;
2441
j->code_buffer = 0;
2442
j->nomore = 0;
2443
j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
2444
j->marker = STBI__MARKER_none;
2445
j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
2446
j->eob_run = 0;
2447
// no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
2448
// since we don't even allow 1<<30 pixels
2449
}
2450
2451
static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
2452
{
2453
stbi__jpeg_reset(z);
2454
if (!z->progressive) {
2455
if (z->scan_n == 1) {
2456
int i,j;
2457
STBI_SIMD_ALIGN(short, data[64]);
2458
int n = z->order[0];
2459
// non-interleaved data, we just need to process one block at a time,
2460
// in trivial scanline order
2461
// number of blocks to do just depends on how many actual "pixels" this
2462
// component has, independent of interleaved MCU blocking and such
2463
int w = (z->img_comp[n].x+7) >> 3;
2464
int h = (z->img_comp[n].y+7) >> 3;
2465
for (j=0; j < h; ++j) {
2466
for (i=0; i < w; ++i) {
2467
int ha = z->img_comp[n].ha;
2468
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;
2469
z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2470
// every data block is an MCU, so countdown the restart interval
2471
if (--z->todo <= 0) {
2472
if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2473
// if it's NOT a restart, then just bail, so we get corrupt data
2474
// rather than no data
2475
if (!STBI__RESTART(z->marker)) return 1;
2476
stbi__jpeg_reset(z);
2477
}
2478
}
2479
}
2480
return 1;
2481
} else { // interleaved
2482
int i,j,k,x,y;
2483
STBI_SIMD_ALIGN(short, data[64]);
2484
for (j=0; j < z->img_mcu_y; ++j) {
2485
for (i=0; i < z->img_mcu_x; ++i) {
2486
// scan an interleaved mcu... process scan_n components in order
2487
for (k=0; k < z->scan_n; ++k) {
2488
int n = z->order[k];
2489
// scan out an mcu's worth of this component; that's just determined
2490
// by the basic H and V specified for the component
2491
for (y=0; y < z->img_comp[n].v; ++y) {
2492
for (x=0; x < z->img_comp[n].h; ++x) {
2493
int x2 = (i*z->img_comp[n].h + x)*8;
2494
int y2 = (j*z->img_comp[n].v + y)*8;
2495
int ha = z->img_comp[n].ha;
2496
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;
2497
z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
2498
}
2499
}
2500
}
2501
// after all interleaved components, that's an interleaved MCU,
2502
// so now count down the restart interval
2503
if (--z->todo <= 0) {
2504
if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2505
if (!STBI__RESTART(z->marker)) return 1;
2506
stbi__jpeg_reset(z);
2507
}
2508
}
2509
}
2510
return 1;
2511
}
2512
} else {
2513
if (z->scan_n == 1) {
2514
int i,j;
2515
int n = z->order[0];
2516
// non-interleaved data, we just need to process one block at a time,
2517
// in trivial scanline order
2518
// number of blocks to do just depends on how many actual "pixels" this
2519
// component has, independent of interleaved MCU blocking and such
2520
int w = (z->img_comp[n].x+7) >> 3;
2521
int h = (z->img_comp[n].y+7) >> 3;
2522
for (j=0; j < h; ++j) {
2523
for (i=0; i < w; ++i) {
2524
short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2525
if (z->spec_start == 0) {
2526
if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2527
return 0;
2528
} else {
2529
int ha = z->img_comp[n].ha;
2530
if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
2531
return 0;
2532
}
2533
// every data block is an MCU, so countdown the restart interval
2534
if (--z->todo <= 0) {
2535
if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2536
if (!STBI__RESTART(z->marker)) return 1;
2537
stbi__jpeg_reset(z);
2538
}
2539
}
2540
}
2541
return 1;
2542
} else { // interleaved
2543
int i,j,k,x,y;
2544
for (j=0; j < z->img_mcu_y; ++j) {
2545
for (i=0; i < z->img_mcu_x; ++i) {
2546
// scan an interleaved mcu... process scan_n components in order
2547
for (k=0; k < z->scan_n; ++k) {
2548
int n = z->order[k];
2549
// scan out an mcu's worth of this component; that's just determined
2550
// by the basic H and V specified for the component
2551
for (y=0; y < z->img_comp[n].v; ++y) {
2552
for (x=0; x < z->img_comp[n].h; ++x) {
2553
int x2 = (i*z->img_comp[n].h + x);
2554
int y2 = (j*z->img_comp[n].v + y);
2555
short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
2556
if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
2557
return 0;
2558
}
2559
}
2560
}
2561
// after all interleaved components, that's an interleaved MCU,
2562
// so now count down the restart interval
2563
if (--z->todo <= 0) {
2564
if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
2565
if (!STBI__RESTART(z->marker)) return 1;
2566
stbi__jpeg_reset(z);
2567
}
2568
}
2569
}
2570
return 1;
2571
}
2572
}
2573
}
2574
2575
static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant)
2576
{
2577
int i;
2578
for (i=0; i < 64; ++i)
2579
data[i] *= dequant[i];
2580
}
2581
2582
static void stbi__jpeg_finish(stbi__jpeg *z)
2583
{
2584
if (z->progressive) {
2585
// dequantize and idct the data
2586
int i,j,n;
2587
for (n=0; n < z->s->img_n; ++n) {
2588
int w = (z->img_comp[n].x+7) >> 3;
2589
int h = (z->img_comp[n].y+7) >> 3;
2590
for (j=0; j < h; ++j) {
2591
for (i=0; i < w; ++i) {
2592
short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
2593
stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
2594
z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
2595
}
2596
}
2597
}
2598
}
2599
}
2600
2601
static int stbi__process_marker(stbi__jpeg *z, int m)
2602
{
2603
int L;
2604
switch (m) {
2605
case STBI__MARKER_none: // no marker found
2606
return stbi__err("expected marker","Corrupt JPEG");
2607
2608
case 0xDD: // DRI - specify restart interval
2609
if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
2610
z->restart_interval = stbi__get16be(z->s);
2611
return 1;
2612
2613
case 0xDB: // DQT - define quantization table
2614
L = stbi__get16be(z->s)-2;
2615
while (L > 0) {
2616
int q = stbi__get8(z->s);
2617
int p = q >> 4;
2618
int t = q & 15,i;
2619
if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG");
2620
if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
2621
for (i=0; i < 64; ++i)
2622
z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
2623
L -= 65;
2624
}
2625
return L==0;
2626
2627
case 0xC4: // DHT - define huffman table
2628
L = stbi__get16be(z->s)-2;
2629
while (L > 0) {
2630
stbi_uc *v;
2631
int sizes[16],i,n=0;
2632
int q = stbi__get8(z->s);
2633
int tc = q >> 4;
2634
int th = q & 15;
2635
if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
2636
for (i=0; i < 16; ++i) {
2637
sizes[i] = stbi__get8(z->s);
2638
n += sizes[i];
2639
}
2640
L -= 17;
2641
if (tc == 0) {
2642
if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
2643
v = z->huff_dc[th].values;
2644
} else {
2645
if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
2646
v = z->huff_ac[th].values;
2647
}
2648
for (i=0; i < n; ++i)
2649
v[i] = stbi__get8(z->s);
2650
if (tc != 0)
2651
stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
2652
L -= n;
2653
}
2654
return L==0;
2655
}
2656
// check for comment block or APP blocks
2657
if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
2658
stbi__skip(z->s, stbi__get16be(z->s)-2);
2659
return 1;
2660
}
2661
return 0;
2662
}
2663
2664
// after we see SOS
2665
static int stbi__process_scan_header(stbi__jpeg *z)
2666
{
2667
int i;
2668
int Ls = stbi__get16be(z->s);
2669
z->scan_n = stbi__get8(z->s);
2670
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");
2671
if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG");
2672
for (i=0; i < z->scan_n; ++i) {
2673
int id = stbi__get8(z->s), which;
2674
int q = stbi__get8(z->s);
2675
for (which = 0; which < z->s->img_n; ++which)
2676
if (z->img_comp[which].id == id)
2677
break;
2678
if (which == z->s->img_n) return 0; // no match
2679
z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG");
2680
z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG");
2681
z->order[i] = which;
2682
}
2683
2684
{
2685
int aa;
2686
z->spec_start = stbi__get8(z->s);
2687
z->spec_end = stbi__get8(z->s); // should be 63, but might be 0
2688
aa = stbi__get8(z->s);
2689
z->succ_high = (aa >> 4);
2690
z->succ_low = (aa & 15);
2691
if (z->progressive) {
2692
if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
2693
return stbi__err("bad SOS", "Corrupt JPEG");
2694
} else {
2695
if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG");
2696
if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG");
2697
z->spec_end = 63;
2698
}
2699
}
2700
2701
return 1;
2702
}
2703
2704
static int stbi__process_frame_header(stbi__jpeg *z, int scan)
2705
{
2706
stbi__context *s = z->s;
2707
int Lf,p,i,q, h_max=1,v_max=1,c;
2708
Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG
2709
p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
2710
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
2711
s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
2712
c = stbi__get8(s);
2713
if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG"); // JFIF requires
2714
s->img_n = c;
2715
for (i=0; i < c; ++i) {
2716
z->img_comp[i].data = NULL;
2717
z->img_comp[i].linebuf = NULL;
2718
}
2719
2720
if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
2721
2722
for (i=0; i < s->img_n; ++i) {
2723
z->img_comp[i].id = stbi__get8(s);
2724
if (z->img_comp[i].id != i+1) // JFIF requires
2725
if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files!
2726
return stbi__err("bad component ID","Corrupt JPEG");
2727
q = stbi__get8(s);
2728
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");
2729
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");
2730
z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
2731
}
2732
2733
if (scan != STBI__SCAN_load) return 1;
2734
2735
if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
2736
2737
for (i=0; i < s->img_n; ++i) {
2738
if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
2739
if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
2740
}
2741
2742
// compute interleaved mcu info
2743
z->img_h_max = h_max;
2744
z->img_v_max = v_max;
2745
z->img_mcu_w = h_max * 8;
2746
z->img_mcu_h = v_max * 8;
2747
z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
2748
z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
2749
2750
for (i=0; i < s->img_n; ++i) {
2751
// number of effective pixels (e.g. for non-interleaved MCU)
2752
z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
2753
z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
2754
// to simplify generation, we'll allocate enough memory to decode
2755
// the bogus oversized data from using interleaved MCUs and their
2756
// big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
2757
// discard the extra data until colorspace conversion
2758
z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
2759
z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
2760
z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
2761
2762
if (z->img_comp[i].raw_data == NULL) {
2763
for(--i; i >= 0; --i) {
2764
STBI_FREE(z->img_comp[i].raw_data);
2765
z->img_comp[i].raw_data = NULL;
2766
}
2767
return stbi__err("outofmem", "Out of memory");
2768
}
2769
// align blocks for idct using mmx/sse
2770
z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
2771
z->img_comp[i].linebuf = NULL;
2772
if (z->progressive) {
2773
z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;
2774
z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
2775
z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15);
2776
z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
2777
} else {
2778
z->img_comp[i].coeff = 0;
2779
z->img_comp[i].raw_coeff = 0;
2780
}
2781
}
2782
2783
return 1;
2784
}
2785
2786
// use comparisons since in some cases we handle more than one case (e.g. SOF)
2787
#define stbi__DNL(x) ((x) == 0xdc)
2788
#define stbi__SOI(x) ((x) == 0xd8)
2789
#define stbi__EOI(x) ((x) == 0xd9)
2790
#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
2791
#define stbi__SOS(x) ((x) == 0xda)
2792
2793
#define stbi__SOF_progressive(x) ((x) == 0xc2)
2794
2795
static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
2796
{
2797
int m;
2798
z->marker = STBI__MARKER_none; // initialize cached marker to empty
2799
m = stbi__get_marker(z);
2800
if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
2801
if (scan == STBI__SCAN_type) return 1;
2802
m = stbi__get_marker(z);
2803
while (!stbi__SOF(m)) {
2804
if (!stbi__process_marker(z,m)) return 0;
2805
m = stbi__get_marker(z);
2806
while (m == STBI__MARKER_none) {
2807
// some files have extra padding after their blocks, so ok, we'll scan
2808
if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");
2809
m = stbi__get_marker(z);
2810
}
2811
}
2812
z->progressive = stbi__SOF_progressive(m);
2813
if (!stbi__process_frame_header(z, scan)) return 0;
2814
return 1;
2815
}
2816
2817
// decode image to YCbCr format
2818
static int stbi__decode_jpeg_image(stbi__jpeg *j)
2819
{
2820
int m;
2821
for (m = 0; m < 4; m++) {
2822
j->img_comp[m].raw_data = NULL;
2823
j->img_comp[m].raw_coeff = NULL;
2824
}
2825
j->restart_interval = 0;
2826
if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;
2827
m = stbi__get_marker(j);
2828
while (!stbi__EOI(m)) {
2829
if (stbi__SOS(m)) {
2830
if (!stbi__process_scan_header(j)) return 0;
2831
if (!stbi__parse_entropy_coded_data(j)) return 0;
2832
if (j->marker == STBI__MARKER_none ) {
2833
// handle 0s at the end of image data from IP Kamera 9060
2834
while (!stbi__at_eof(j->s)) {
2835
int x = stbi__get8(j->s);
2836
if (x == 255) {
2837
j->marker = stbi__get8(j->s);
2838
break;
2839
} else if (x != 0) {
2840
return stbi__err("junk before marker", "Corrupt JPEG");
2841
}
2842
}
2843
// if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
2844
}
2845
} else {
2846
if (!stbi__process_marker(j, m)) return 0;
2847
}
2848
m = stbi__get_marker(j);
2849
}
2850
if (j->progressive)
2851
stbi__jpeg_finish(j);
2852
return 1;
2853
}
2854
2855
// static jfif-centered resampling (across block boundaries)
2856
2857
typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
2858
int w, int hs);
2859
2860
#define stbi__div4(x) ((stbi_uc) ((x) >> 2))
2861
2862
static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
2863
{
2864
STBI_NOTUSED(out);
2865
STBI_NOTUSED(in_far);
2866
STBI_NOTUSED(w);
2867
STBI_NOTUSED(hs);
2868
return in_near;
2869
}
2870
2871
static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
2872
{
2873
// need to generate two samples vertically for every one in input
2874
int i;
2875
STBI_NOTUSED(hs);
2876
for (i=0; i < w; ++i)
2877
out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
2878
return out;
2879
}
2880
2881
static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
2882
{
2883
// need to generate two samples horizontally for every one in input
2884
int i;
2885
stbi_uc *input = in_near;
2886
2887
if (w == 1) {
2888
// if only one sample, can't do any interpolation
2889
out[0] = out[1] = input[0];
2890
return out;
2891
}
2892
2893
out[0] = input[0];
2894
out[1] = stbi__div4(input[0]*3 + input[1] + 2);
2895
for (i=1; i < w-1; ++i) {
2896
int n = 3*input[i]+2;
2897
out[i*2+0] = stbi__div4(n+input[i-1]);
2898
out[i*2+1] = stbi__div4(n+input[i+1]);
2899
}
2900
out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
2901
out[i*2+1] = input[w-1];
2902
2903
STBI_NOTUSED(in_far);
2904
STBI_NOTUSED(hs);
2905
2906
return out;
2907
}
2908
2909
#define stbi__div16(x) ((stbi_uc) ((x) >> 4))
2910
2911
static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
2912
{
2913
// need to generate 2x2 samples for every one in input
2914
int i,t0,t1;
2915
if (w == 1) {
2916
out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2917
return out;
2918
}
2919
2920
t1 = 3*in_near[0] + in_far[0];
2921
out[0] = stbi__div4(t1+2);
2922
for (i=1; i < w; ++i) {
2923
t0 = t1;
2924
t1 = 3*in_near[i]+in_far[i];
2925
out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
2926
out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
2927
}
2928
out[w*2-1] = stbi__div4(t1+2);
2929
2930
STBI_NOTUSED(hs);
2931
2932
return out;
2933
}
2934
2935
#if defined(STBI_SSE2) || defined(STBI_NEON)
2936
static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
2937
{
2938
// need to generate 2x2 samples for every one in input
2939
int i=0,t0,t1;
2940
2941
if (w == 1) {
2942
out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
2943
return out;
2944
}
2945
2946
t1 = 3*in_near[0] + in_far[0];
2947
// process groups of 8 pixels for as long as we can.
2948
// note we can't handle the last pixel in a row in this loop
2949
// because we need to handle the filter boundary conditions.
2950
for (; i < ((w-1) & ~7); i += 8) {
2951
#if defined(STBI_SSE2)
2952
// load and perform the vertical filtering pass
2953
// this uses 3*x + y = 4*x + (y - x)
2954
__m128i zero = _mm_setzero_si128();
2955
__m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
2956
__m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
2957
__m128i farw = _mm_unpacklo_epi8(farb, zero);
2958
__m128i nearw = _mm_unpacklo_epi8(nearb, zero);
2959
__m128i diff = _mm_sub_epi16(farw, nearw);
2960
__m128i nears = _mm_slli_epi16(nearw, 2);
2961
__m128i curr = _mm_add_epi16(nears, diff); // current row
2962
2963
// horizontal filter works the same based on shifted vers of current
2964
// row. "prev" is current row shifted right by 1 pixel; we need to
2965
// insert the previous pixel value (from t1).
2966
// "next" is current row shifted left by 1 pixel, with first pixel
2967
// of next block of 8 pixels added in.
2968
__m128i prv0 = _mm_slli_si128(curr, 2);
2969
__m128i nxt0 = _mm_srli_si128(curr, 2);
2970
__m128i prev = _mm_insert_epi16(prv0, t1, 0);
2971
__m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
2972
2973
// horizontal filter, polyphase implementation since it's convenient:
2974
// even pixels = 3*cur + prev = cur*4 + (prev - cur)
2975
// odd pixels = 3*cur + next = cur*4 + (next - cur)
2976
// note the shared term.
2977
__m128i bias = _mm_set1_epi16(8);
2978
__m128i curs = _mm_slli_epi16(curr, 2);
2979
__m128i prvd = _mm_sub_epi16(prev, curr);
2980
__m128i nxtd = _mm_sub_epi16(next, curr);
2981
__m128i curb = _mm_add_epi16(curs, bias);
2982
__m128i even = _mm_add_epi16(prvd, curb);
2983
__m128i odd = _mm_add_epi16(nxtd, curb);
2984
2985
// interleave even and odd pixels, then undo scaling.
2986
__m128i int0 = _mm_unpacklo_epi16(even, odd);
2987
__m128i int1 = _mm_unpackhi_epi16(even, odd);
2988
__m128i de0 = _mm_srli_epi16(int0, 4);
2989
__m128i de1 = _mm_srli_epi16(int1, 4);
2990
2991
// pack and write output
2992
__m128i outv = _mm_packus_epi16(de0, de1);
2993
_mm_storeu_si128((__m128i *) (out + i*2), outv);
2994
#elif defined(STBI_NEON)
2995
// load and perform the vertical filtering pass
2996
// this uses 3*x + y = 4*x + (y - x)
2997
uint8x8_t farb = vld1_u8(in_far + i);
2998
uint8x8_t nearb = vld1_u8(in_near + i);
2999
int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
3000
int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
3001
int16x8_t curr = vaddq_s16(nears, diff); // current row
3002
3003
// horizontal filter works the same based on shifted vers of current
3004
// row. "prev" is current row shifted right by 1 pixel; we need to
3005
// insert the previous pixel value (from t1).
3006
// "next" is current row shifted left by 1 pixel, with first pixel
3007
// of next block of 8 pixels added in.
3008
int16x8_t prv0 = vextq_s16(curr, curr, 7);
3009
int16x8_t nxt0 = vextq_s16(curr, curr, 1);
3010
int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
3011
int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
3012
3013
// horizontal filter, polyphase implementation since it's convenient:
3014
// even pixels = 3*cur + prev = cur*4 + (prev - cur)
3015
// odd pixels = 3*cur + next = cur*4 + (next - cur)
3016
// note the shared term.
3017
int16x8_t curs = vshlq_n_s16(curr, 2);
3018
int16x8_t prvd = vsubq_s16(prev, curr);
3019
int16x8_t nxtd = vsubq_s16(next, curr);
3020
int16x8_t even = vaddq_s16(curs, prvd);
3021
int16x8_t odd = vaddq_s16(curs, nxtd);
3022
3023
// undo scaling and round, then store with even/odd phases interleaved
3024
uint8x8x2_t o;
3025
o.val[0] = vqrshrun_n_s16(even, 4);
3026
o.val[1] = vqrshrun_n_s16(odd, 4);
3027
vst2_u8(out + i*2, o);
3028
#endif
3029
3030
// "previous" value for next iter
3031
t1 = 3*in_near[i+7] + in_far[i+7];
3032
}
3033
3034
t0 = t1;
3035
t1 = 3*in_near[i] + in_far[i];
3036
out[i*2] = stbi__div16(3*t1 + t0 + 8);
3037
3038
for (++i; i < w; ++i) {
3039
t0 = t1;
3040
t1 = 3*in_near[i]+in_far[i];
3041
out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
3042
out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
3043
}
3044
out[w*2-1] = stbi__div4(t1+2);
3045
3046
STBI_NOTUSED(hs);
3047
3048
return out;
3049
}
3050
#endif
3051
3052
static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
3053
{
3054
// resample with nearest-neighbor
3055
int i,j;
3056
STBI_NOTUSED(in_far);
3057
for (i=0; i < w; ++i)
3058
for (j=0; j < hs; ++j)
3059
out[i*hs+j] = in_near[i];
3060
return out;
3061
}
3062
3063
#ifdef STBI_JPEG_OLD
3064
// this is the same YCbCr-to-RGB calculation that stb_image has used
3065
// historically before the algorithm changes in 1.49
3066
#define float2fixed(x) ((int) ((x) * 65536 + 0.5))
3067
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)
3068
{
3069
int i;
3070
for (i=0; i < count; ++i) {
3071
int y_fixed = (y[i] << 16) + 32768; // rounding
3072
int r,g,b;
3073
int cr = pcr[i] - 128;
3074
int cb = pcb[i] - 128;
3075
r = y_fixed + cr*float2fixed(1.40200f);
3076
g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
3077
b = y_fixed + cb*float2fixed(1.77200f);
3078
r >>= 16;
3079
g >>= 16;
3080
b >>= 16;
3081
if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
3082
if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
3083
if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
3084
out[0] = (stbi_uc)r;
3085
out[1] = (stbi_uc)g;
3086
out[2] = (stbi_uc)b;
3087
out[3] = 255;
3088
out += step;
3089
}
3090
}
3091
#else
3092
// this is a reduced-precision calculation of YCbCr-to-RGB introduced
3093
// to make sure the code produces the same results in both SIMD and scalar
3094
#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
3095
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)
3096
{
3097
int i;
3098
for (i=0; i < count; ++i) {
3099
int y_fixed = (y[i] << 20) + (1<<19); // rounding
3100
int r,g,b;
3101
int cr = pcr[i] - 128;
3102
int cb = pcb[i] - 128;
3103
r = y_fixed + cr* float2fixed(1.40200f);
3104
g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3105
b = y_fixed + cb* float2fixed(1.77200f);
3106
r >>= 20;
3107
g >>= 20;
3108
b >>= 20;
3109
if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
3110
if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
3111
if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
3112
out[0] = (stbi_uc)r;
3113
out[1] = (stbi_uc)g;
3114
out[2] = (stbi_uc)b;
3115
out[3] = 255;
3116
out += step;
3117
}
3118
}
3119
#endif
3120
3121
#if defined(STBI_SSE2) || defined(STBI_NEON)
3122
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)
3123
{
3124
int i = 0;
3125
3126
#ifdef STBI_SSE2
3127
// step == 3 is pretty ugly on the final interleave, and i'm not convinced
3128
// it's useful in practice (you wouldn't use it for textures, for example).
3129
// so just accelerate step == 4 case.
3130
if (step == 4) {
3131
// this is a fairly straightforward implementation and not super-optimized.
3132
__m128i signflip = _mm_set1_epi8(-0x80);
3133
__m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f));
3134
__m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
3135
__m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
3136
__m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f));
3137
__m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
3138
__m128i xw = _mm_set1_epi16(255); // alpha channel
3139
3140
for (; i+7 < count; i += 8) {
3141
// load
3142
__m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
3143
__m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
3144
__m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
3145
__m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
3146
__m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128
3147
3148
// unpack to short (and left-shift cr, cb by 8)
3149
__m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
3150
__m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
3151
__m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
3152
3153
// color transform
3154
__m128i yws = _mm_srli_epi16(yw, 4);
3155
__m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
3156
__m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
3157
__m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
3158
__m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
3159
__m128i rws = _mm_add_epi16(cr0, yws);
3160
__m128i gwt = _mm_add_epi16(cb0, yws);
3161
__m128i bws = _mm_add_epi16(yws, cb1);
3162
__m128i gws = _mm_add_epi16(gwt, cr1);
3163
3164
// descale
3165
__m128i rw = _mm_srai_epi16(rws, 4);
3166
__m128i bw = _mm_srai_epi16(bws, 4);
3167
__m128i gw = _mm_srai_epi16(gws, 4);
3168
3169
// back to byte, set up for transpose
3170
__m128i brb = _mm_packus_epi16(rw, bw);
3171
__m128i gxb = _mm_packus_epi16(gw, xw);
3172
3173
// transpose to interleave channels
3174
__m128i t0 = _mm_unpacklo_epi8(brb, gxb);
3175
__m128i t1 = _mm_unpackhi_epi8(brb, gxb);
3176
__m128i o0 = _mm_unpacklo_epi16(t0, t1);
3177
__m128i o1 = _mm_unpackhi_epi16(t0, t1);
3178
3179
// store
3180
_mm_storeu_si128((__m128i *) (out + 0), o0);
3181
_mm_storeu_si128((__m128i *) (out + 16), o1);
3182
out += 32;
3183
}
3184
}
3185
#endif
3186
3187
#ifdef STBI_NEON
3188
// in this version, step=3 support would be easy to add. but is there demand?
3189
if (step == 4) {
3190
// this is a fairly straightforward implementation and not super-optimized.
3191
uint8x8_t signflip = vdup_n_u8(0x80);
3192
int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f));
3193
int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));
3194
int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));
3195
int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f));
3196
3197
for (; i+7 < count; i += 8) {
3198
// load
3199
uint8x8_t y_bytes = vld1_u8(y + i);
3200
uint8x8_t cr_bytes = vld1_u8(pcr + i);
3201
uint8x8_t cb_bytes = vld1_u8(pcb + i);
3202
int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
3203
int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
3204
3205
// expand to s16
3206
int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
3207
int16x8_t crw = vshll_n_s8(cr_biased, 7);
3208
int16x8_t cbw = vshll_n_s8(cb_biased, 7);
3209
3210
// color transform
3211
int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
3212
int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
3213
int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
3214
int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
3215
int16x8_t rws = vaddq_s16(yws, cr0);
3216
int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
3217
int16x8_t bws = vaddq_s16(yws, cb1);
3218
3219
// undo scaling, round, convert to byte
3220
uint8x8x4_t o;
3221
o.val[0] = vqrshrun_n_s16(rws, 4);
3222
o.val[1] = vqrshrun_n_s16(gws, 4);
3223
o.val[2] = vqrshrun_n_s16(bws, 4);
3224
o.val[3] = vdup_n_u8(255);
3225
3226
// store, interleaving r/g/b/a
3227
vst4_u8(out, o);
3228
out += 8*4;
3229
}
3230
}
3231
#endif
3232
3233
for (; i < count; ++i) {
3234
int y_fixed = (y[i] << 20) + (1<<19); // rounding
3235
int r,g,b;
3236
int cr = pcr[i] - 128;
3237
int cb = pcb[i] - 128;
3238
r = y_fixed + cr* float2fixed(1.40200f);
3239
g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
3240
b = y_fixed + cb* float2fixed(1.77200f);
3241
r >>= 20;
3242
g >>= 20;
3243
b >>= 20;
3244
if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
3245
if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
3246
if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
3247
out[0] = (stbi_uc)r;
3248
out[1] = (stbi_uc)g;
3249
out[2] = (stbi_uc)b;
3250
out[3] = 255;
3251
out += step;
3252
}
3253
}
3254
#endif
3255
3256
// set up the kernels
3257
static void stbi__setup_jpeg(stbi__jpeg *j)
3258
{
3259
j->idct_block_kernel = stbi__idct_block;
3260
j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
3261
j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
3262
3263
#ifdef STBI_SSE2
3264
if (stbi__sse2_available()) {
3265
j->idct_block_kernel = stbi__idct_simd;
3266
#ifndef STBI_JPEG_OLD
3267
j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3268
#endif
3269
j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3270
}
3271
#endif
3272
3273
#ifdef STBI_NEON
3274
j->idct_block_kernel = stbi__idct_simd;
3275
#ifndef STBI_JPEG_OLD
3276
j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
3277
#endif
3278
j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
3279
#endif
3280
}
3281
3282
// clean up the temporary component buffers
3283
static void stbi__cleanup_jpeg(stbi__jpeg *j)
3284
{
3285
int i;
3286
for (i=0; i < j->s->img_n; ++i) {
3287
if (j->img_comp[i].raw_data) {
3288
STBI_FREE(j->img_comp[i].raw_data);
3289
j->img_comp[i].raw_data = NULL;
3290
j->img_comp[i].data = NULL;
3291
}
3292
if (j->img_comp[i].raw_coeff) {
3293
STBI_FREE(j->img_comp[i].raw_coeff);
3294
j->img_comp[i].raw_coeff = 0;
3295
j->img_comp[i].coeff = 0;
3296
}
3297
if (j->img_comp[i].linebuf) {
3298
STBI_FREE(j->img_comp[i].linebuf);
3299
j->img_comp[i].linebuf = NULL;
3300
}
3301
}
3302
}
3303
3304
typedef struct
3305
{
3306
resample_row_func resample;
3307
stbi_uc *line0,*line1;
3308
int hs,vs; // expansion factor in each axis
3309
int w_lores; // horizontal pixels pre-expansion
3310
int ystep; // how far through vertical expansion we are
3311
int ypos; // which pre-expansion row we're on
3312
} stbi__resample;
3313
3314
static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
3315
{
3316
int n, decode_n;
3317
z->s->img_n = 0; // make stbi__cleanup_jpeg safe
3318
3319
// validate req_comp
3320
if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
3321
3322
// load a jpeg image from whichever source, but leave in YCbCr format
3323
if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
3324
3325
// determine actual number of components to generate
3326
n = req_comp ? req_comp : z->s->img_n;
3327
3328
if (z->s->img_n == 3 && n < 3)
3329
decode_n = 1;
3330
else
3331
decode_n = z->s->img_n;
3332
3333
// resample and color-convert
3334
{
3335
int k;
3336
unsigned int i,j;
3337
stbi_uc *output;
3338
stbi_uc *coutput[4];
3339
3340
stbi__resample res_comp[4];
3341
3342
for (k=0; k < decode_n; ++k) {
3343
stbi__resample *r = &res_comp[k];
3344
3345
// allocate line buffer big enough for upsampling off the edges
3346
// with upsample factor of 4
3347
z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
3348
if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
3349
3350
r->hs = z->img_h_max / z->img_comp[k].h;
3351
r->vs = z->img_v_max / z->img_comp[k].v;
3352
r->ystep = r->vs >> 1;
3353
r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
3354
r->ypos = 0;
3355
r->line0 = r->line1 = z->img_comp[k].data;
3356
3357
if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
3358
else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
3359
else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
3360
else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
3361
else r->resample = stbi__resample_row_generic;
3362
}
3363
3364
// can't error after this so, this is safe
3365
output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
3366
if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
3367
3368
// now go ahead and resample
3369
for (j=0; j < z->s->img_y; ++j) {
3370
stbi_uc *out = output + n * z->s->img_x * j;
3371
for (k=0; k < decode_n; ++k) {
3372
stbi__resample *r = &res_comp[k];
3373
int y_bot = r->ystep >= (r->vs >> 1);
3374
coutput[k] = r->resample(z->img_comp[k].linebuf,
3375
y_bot ? r->line1 : r->line0,
3376
y_bot ? r->line0 : r->line1,
3377
r->w_lores, r->hs);
3378
if (++r->ystep >= r->vs) {
3379
r->ystep = 0;
3380
r->line0 = r->line1;
3381
if (++r->ypos < z->img_comp[k].y)
3382
r->line1 += z->img_comp[k].w2;
3383
}
3384
}
3385
if (n >= 3) {
3386
stbi_uc *y = coutput[0];
3387
if (z->s->img_n == 3) {
3388
z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
3389
} else
3390
for (i=0; i < z->s->img_x; ++i) {
3391
out[0] = out[1] = out[2] = y[i];
3392
out[3] = 255; // not used if n==3
3393
out += n;
3394
}
3395
} else {
3396
stbi_uc *y = coutput[0];
3397
if (n == 1)
3398
for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
3399
else
3400
for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
3401
}
3402
}
3403
stbi__cleanup_jpeg(z);
3404
*out_x = z->s->img_x;
3405
*out_y = z->s->img_y;
3406
if (comp) *comp = z->s->img_n; // report original components, not output
3407
return output;
3408
}
3409
}
3410
3411
static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
3412
{
3413
stbi__jpeg j;
3414
j.s = s;
3415
stbi__setup_jpeg(&j);
3416
return load_jpeg_image(&j, x,y,comp,req_comp);
3417
}
3418
3419
static int stbi__jpeg_test(stbi__context *s)
3420
{
3421
int r;
3422
stbi__jpeg j;
3423
j.s = s;
3424
stbi__setup_jpeg(&j);
3425
r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
3426
stbi__rewind(s);
3427
return r;
3428
}
3429
3430
static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
3431
{
3432
if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
3433
stbi__rewind( j->s );
3434
return 0;
3435
}
3436
if (x) *x = j->s->img_x;
3437
if (y) *y = j->s->img_y;
3438
if (comp) *comp = j->s->img_n;
3439
return 1;
3440
}
3441
3442
static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
3443
{
3444
stbi__jpeg j;
3445
j.s = s;
3446
return stbi__jpeg_info_raw(&j, x, y, comp);
3447
}
3448
#endif
3449
3450
// public domain zlib decode v0.2 Sean Barrett 2006-11-18
3451
// simple implementation
3452
// - all input must be provided in an upfront buffer
3453
// - all output is written to a single output buffer (can malloc/realloc)
3454
// performance
3455
// - fast huffman
3456
3457
#ifndef STBI_NO_ZLIB
3458
3459
// fast-way is faster to check than jpeg huffman, but slow way is slower
3460
#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
3461
#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
3462
3463
// zlib-style huffman encoding
3464
// (jpegs packs from left, zlib from right, so can't share code)
3465
typedef struct
3466
{
3467
stbi__uint16 fast[1 << STBI__ZFAST_BITS];
3468
stbi__uint16 firstcode[16];
3469
int maxcode[17];
3470
stbi__uint16 firstsymbol[16];
3471
stbi_uc size[288];
3472
stbi__uint16 value[288];
3473
} stbi__zhuffman;
3474
3475
stbi_inline static int stbi__bitreverse16(int n)
3476
{
3477
n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
3478
n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
3479
n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
3480
n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
3481
return n;
3482
}
3483
3484
stbi_inline static int stbi__bit_reverse(int v, int bits)
3485
{
3486
STBI_ASSERT(bits <= 16);
3487
// to bit reverse n bits, reverse 16 and shift
3488
// e.g. 11 bits, bit reverse and shift away 5
3489
return stbi__bitreverse16(v) >> (16-bits);
3490
}
3491
3492
static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num)
3493
{
3494
int i,k=0;
3495
int code, next_code[16], sizes[17];
3496
3497
// DEFLATE spec for generating codes
3498
memset(sizes, 0, sizeof(sizes));
3499
memset(z->fast, 0, sizeof(z->fast));
3500
for (i=0; i < num; ++i)
3501
++sizes[sizelist[i]];
3502
sizes[0] = 0;
3503
for (i=1; i < 16; ++i)
3504
if (sizes[i] > (1 << i))
3505
return stbi__err("bad sizes", "Corrupt PNG");
3506
code = 0;
3507
for (i=1; i < 16; ++i) {
3508
next_code[i] = code;
3509
z->firstcode[i] = (stbi__uint16) code;
3510
z->firstsymbol[i] = (stbi__uint16) k;
3511
code = (code + sizes[i]);
3512
if (sizes[i])
3513
if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG");
3514
z->maxcode[i] = code << (16-i); // preshift for inner loop
3515
code <<= 1;
3516
k += sizes[i];
3517
}
3518
z->maxcode[16] = 0x10000; // sentinel
3519
for (i=0; i < num; ++i) {
3520
int s = sizelist[i];
3521
if (s) {
3522
int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
3523
stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
3524
z->size [c] = (stbi_uc ) s;
3525
z->value[c] = (stbi__uint16) i;
3526
if (s <= STBI__ZFAST_BITS) {
3527
int j = stbi__bit_reverse(next_code[s],s);
3528
while (j < (1 << STBI__ZFAST_BITS)) {
3529
z->fast[j] = fastv;
3530
j += (1 << s);
3531
}
3532
}
3533
++next_code[s];
3534
}
3535
}
3536
return 1;
3537
}
3538
3539
// zlib-from-memory implementation for PNG reading
3540
// because PNG allows splitting the zlib stream arbitrarily,
3541
// and it's annoying structurally to have PNG call ZLIB call PNG,
3542
// we require PNG read all the IDATs and combine them into a single
3543
// memory buffer
3544
3545
typedef struct
3546
{
3547
stbi_uc *zbuffer, *zbuffer_end;
3548
int num_bits;
3549
stbi__uint32 code_buffer;
3550
3551
char *zout;
3552
char *zout_start;
3553
char *zout_end;
3554
int z_expandable;
3555
3556
stbi__zhuffman z_length, z_distance;
3557
} stbi__zbuf;
3558
3559
stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)
3560
{
3561
if (z->zbuffer >= z->zbuffer_end) return 0;
3562
return *z->zbuffer++;
3563
}
3564
3565
static void stbi__fill_bits(stbi__zbuf *z)
3566
{
3567
do {
3568
STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
3569
z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;
3570
z->num_bits += 8;
3571
} while (z->num_bits <= 24);
3572
}
3573
3574
stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
3575
{
3576
unsigned int k;
3577
if (z->num_bits < n) stbi__fill_bits(z);
3578
k = z->code_buffer & ((1 << n) - 1);
3579
z->code_buffer >>= n;
3580
z->num_bits -= n;
3581
return k;
3582
}
3583
3584
static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
3585
{
3586
int b,s,k;
3587
// not resolved by fast table, so compute it the slow way
3588
// use jpeg approach, which requires MSbits at top
3589
k = stbi__bit_reverse(a->code_buffer, 16);
3590
for (s=STBI__ZFAST_BITS+1; ; ++s)
3591
if (k < z->maxcode[s])
3592
break;
3593
if (s == 16) return -1; // invalid code!
3594
// code size is s, so:
3595
b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
3596
STBI_ASSERT(z->size[b] == s);
3597
a->code_buffer >>= s;
3598
a->num_bits -= s;
3599
return z->value[b];
3600
}
3601
3602
stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
3603
{
3604
int b,s;
3605
if (a->num_bits < 16) stbi__fill_bits(a);
3606
b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
3607
if (b) {
3608
s = b >> 9;
3609
a->code_buffer >>= s;
3610
a->num_bits -= s;
3611
return b & 511;
3612
}
3613
return stbi__zhuffman_decode_slowpath(a, z);
3614
}
3615
3616
static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes
3617
{
3618
char *q;
3619
int cur, limit;
3620
z->zout = zout;
3621
if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");
3622
cur = (int) (z->zout - z->zout_start);
3623
limit = (int) (z->zout_end - z->zout_start);
3624
while (cur + n > limit)
3625
limit *= 2;
3626
q = (char *) STBI_REALLOC(z->zout_start, limit);
3627
if (q == NULL) return stbi__err("outofmem", "Out of memory");
3628
z->zout_start = q;
3629
z->zout = q + cur;
3630
z->zout_end = q + limit;
3631
return 1;
3632
}
3633
3634
static int stbi__zlength_base[31] = {
3635
3,4,5,6,7,8,9,10,11,13,
3636
15,17,19,23,27,31,35,43,51,59,
3637
67,83,99,115,131,163,195,227,258,0,0 };
3638
3639
static int stbi__zlength_extra[31]=
3640
{ 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 };
3641
3642
static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
3643
257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
3644
3645
static int stbi__zdist_extra[32] =
3646
{ 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};
3647
3648
static int stbi__parse_huffman_block(stbi__zbuf *a)
3649
{
3650
char *zout = a->zout;
3651
for(;;) {
3652
int z = stbi__zhuffman_decode(a, &a->z_length);
3653
if (z < 256) {
3654
if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes
3655
if (zout >= a->zout_end) {
3656
if (!stbi__zexpand(a, zout, 1)) return 0;
3657
zout = a->zout;
3658
}
3659
*zout++ = (char) z;
3660
} else {
3661
stbi_uc *p;
3662
int len,dist;
3663
if (z == 256) {
3664
a->zout = zout;
3665
return 1;
3666
}
3667
z -= 257;
3668
len = stbi__zlength_base[z];
3669
if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
3670
z = stbi__zhuffman_decode(a, &a->z_distance);
3671
if (z < 0) return stbi__err("bad huffman code","Corrupt PNG");
3672
dist = stbi__zdist_base[z];
3673
if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
3674
if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG");
3675
if (zout + len > a->zout_end) {
3676
if (!stbi__zexpand(a, zout, len)) return 0;
3677
zout = a->zout;
3678
}
3679
p = (stbi_uc *) (zout - dist);
3680
if (dist == 1) { // run of one byte; common in images.
3681
stbi_uc v = *p;
3682
if (len) { do *zout++ = v; while (--len); }
3683
} else {
3684
if (len) { do *zout++ = *p++; while (--len); }
3685
}
3686
}
3687
}
3688
}
3689
3690
static int stbi__compute_huffman_codes(stbi__zbuf *a)
3691
{
3692
static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
3693
stbi__zhuffman z_codelength;
3694
stbi_uc lencodes[286+32+137];//padding for maximum single op
3695
stbi_uc codelength_sizes[19];
3696
int i,n;
3697
3698
int hlit = stbi__zreceive(a,5) + 257;
3699
int hdist = stbi__zreceive(a,5) + 1;
3700
int hclen = stbi__zreceive(a,4) + 4;
3701
3702
memset(codelength_sizes, 0, sizeof(codelength_sizes));
3703
for (i=0; i < hclen; ++i) {
3704
int s = stbi__zreceive(a,3);
3705
codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
3706
}
3707
if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
3708
3709
n = 0;
3710
while (n < hlit + hdist) {
3711
int c = stbi__zhuffman_decode(a, &z_codelength);
3712
if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG");
3713
if (c < 16)
3714
lencodes[n++] = (stbi_uc) c;
3715
else if (c == 16) {
3716
c = stbi__zreceive(a,2)+3;
3717
memset(lencodes+n, lencodes[n-1], c);
3718
n += c;
3719
} else if (c == 17) {
3720
c = stbi__zreceive(a,3)+3;
3721
memset(lencodes+n, 0, c);
3722
n += c;
3723
} else {
3724
STBI_ASSERT(c == 18);
3725
c = stbi__zreceive(a,7)+11;
3726
memset(lencodes+n, 0, c);
3727
n += c;
3728
}
3729
}
3730
if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG");
3731
if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
3732
if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
3733
return 1;
3734
}
3735
3736
static int stbi__parse_uncomperssed_block(stbi__zbuf *a)
3737
{
3738
stbi_uc header[4];
3739
int len,nlen,k;
3740
if (a->num_bits & 7)
3741
stbi__zreceive(a, a->num_bits & 7); // discard
3742
// drain the bit-packed data into header
3743
k = 0;
3744
while (a->num_bits > 0) {
3745
header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check
3746
a->code_buffer >>= 8;
3747
a->num_bits -= 8;
3748
}
3749
STBI_ASSERT(a->num_bits == 0);
3750
// now fill header the normal way
3751
while (k < 4)
3752
header[k++] = stbi__zget8(a);
3753
len = header[1] * 256 + header[0];
3754
nlen = header[3] * 256 + header[2];
3755
if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG");
3756
if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG");
3757
if (a->zout + len > a->zout_end)
3758
if (!stbi__zexpand(a, a->zout, len)) return 0;
3759
memcpy(a->zout, a->zbuffer, len);
3760
a->zbuffer += len;
3761
a->zout += len;
3762
return 1;
3763
}
3764
3765
static int stbi__parse_zlib_header(stbi__zbuf *a)
3766
{
3767
int cmf = stbi__zget8(a);
3768
int cm = cmf & 15;
3769
/* int cinfo = cmf >> 4; */
3770
int flg = stbi__zget8(a);
3771
if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
3772
if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
3773
if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png
3774
// window = 1 << (8 + cinfo)... but who cares, we fully buffer output
3775
return 1;
3776
}
3777
3778
// @TODO: should statically initialize these for optimal thread safety
3779
static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
3780
static void stbi__init_zdefaults(void)
3781
{
3782
int i; // use <= to match clearly with spec
3783
for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
3784
for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
3785
for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
3786
for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
3787
3788
for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
3789
}
3790
3791
static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
3792
{
3793
int final, type;
3794
if (parse_header)
3795
if (!stbi__parse_zlib_header(a)) return 0;
3796
a->num_bits = 0;
3797
a->code_buffer = 0;
3798
do {
3799
final = stbi__zreceive(a,1);
3800
type = stbi__zreceive(a,2);
3801
if (type == 0) {
3802
if (!stbi__parse_uncomperssed_block(a)) return 0;
3803
} else if (type == 3) {
3804
return 0;
3805
} else {
3806
if (type == 1) {
3807
// use fixed code lengths
3808
if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
3809
if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0;
3810
if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0;
3811
} else {
3812
if (!stbi__compute_huffman_codes(a)) return 0;
3813
}
3814
if (!stbi__parse_huffman_block(a)) return 0;
3815
}
3816
} while (!final);
3817
return 1;
3818
}
3819
3820
static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)
3821
{
3822
a->zout_start = obuf;
3823
a->zout = obuf;
3824
a->zout_end = obuf + olen;
3825
a->z_expandable = exp;
3826
3827
return stbi__parse_zlib(a, parse_header);
3828
}
3829
3830
STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
3831
{
3832
stbi__zbuf a;
3833
char *p = (char *) stbi__malloc(initial_size);
3834
if (p == NULL) return NULL;
3835
a.zbuffer = (stbi_uc *) buffer;
3836
a.zbuffer_end = (stbi_uc *) buffer + len;
3837
if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
3838
if (outlen) *outlen = (int) (a.zout - a.zout_start);
3839
return a.zout_start;
3840
} else {
3841
STBI_FREE(a.zout_start);
3842
return NULL;
3843
}
3844
}
3845
3846
STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
3847
{
3848
return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
3849
}
3850
3851
STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
3852
{
3853
stbi__zbuf a;
3854
char *p = (char *) stbi__malloc(initial_size);
3855
if (p == NULL) return NULL;
3856
a.zbuffer = (stbi_uc *) buffer;
3857
a.zbuffer_end = (stbi_uc *) buffer + len;
3858
if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
3859
if (outlen) *outlen = (int) (a.zout - a.zout_start);
3860
return a.zout_start;
3861
} else {
3862
STBI_FREE(a.zout_start);
3863
return NULL;
3864
}
3865
}
3866
3867
STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
3868
{
3869
stbi__zbuf a;
3870
a.zbuffer = (stbi_uc *) ibuffer;
3871
a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
3872
if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
3873
return (int) (a.zout - a.zout_start);
3874
else
3875
return -1;
3876
}
3877
3878
STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
3879
{
3880
stbi__zbuf a;
3881
char *p = (char *) stbi__malloc(16384);
3882
if (p == NULL) return NULL;
3883
a.zbuffer = (stbi_uc *) buffer;
3884
a.zbuffer_end = (stbi_uc *) buffer+len;
3885
if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
3886
if (outlen) *outlen = (int) (a.zout - a.zout_start);
3887
return a.zout_start;
3888
} else {
3889
STBI_FREE(a.zout_start);
3890
return NULL;
3891
}
3892
}
3893
3894
STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
3895
{
3896
stbi__zbuf a;
3897
a.zbuffer = (stbi_uc *) ibuffer;
3898
a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
3899
if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
3900
return (int) (a.zout - a.zout_start);
3901
else
3902
return -1;
3903
}
3904
#endif
3905
3906
// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18
3907
// simple implementation
3908
// - only 8-bit samples
3909
// - no CRC checking
3910
// - allocates lots of intermediate memory
3911
// - avoids problem of streaming data between subsystems
3912
// - avoids explicit window management
3913
// performance
3914
// - uses stb_zlib, a PD zlib implementation with fast huffman decoding
3915
3916
#ifndef STBI_NO_PNG
3917
typedef struct
3918
{
3919
stbi__uint32 length;
3920
stbi__uint32 type;
3921
} stbi__pngchunk;
3922
3923
static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
3924
{
3925
stbi__pngchunk c;
3926
c.length = stbi__get32be(s);
3927
c.type = stbi__get32be(s);
3928
return c;
3929
}
3930
3931
static int stbi__check_png_header(stbi__context *s)
3932
{
3933
static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
3934
int i;
3935
for (i=0; i < 8; ++i)
3936
if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
3937
return 1;
3938
}
3939
3940
typedef struct
3941
{
3942
stbi__context *s;
3943
stbi_uc *idata, *expanded, *out;
3944
} stbi__png;
3945
3946
3947
enum {
3948
STBI__F_none=0,
3949
STBI__F_sub=1,
3950
STBI__F_up=2,
3951
STBI__F_avg=3,
3952
STBI__F_paeth=4,
3953
// synthetic filters used for first scanline to avoid needing a dummy row of 0s
3954
STBI__F_avg_first,
3955
STBI__F_paeth_first
3956
};
3957
3958
static stbi_uc first_row_filter[5] =
3959
{
3960
STBI__F_none,
3961
STBI__F_sub,
3962
STBI__F_none,
3963
STBI__F_avg_first,
3964
STBI__F_paeth_first
3965
};
3966
3967
static int stbi__paeth(int a, int b, int c)
3968
{
3969
int p = a + b - c;
3970
int pa = abs(p-a);
3971
int pb = abs(p-b);
3972
int pc = abs(p-c);
3973
if (pa <= pb && pa <= pc) return a;
3974
if (pb <= pc) return b;
3975
return c;
3976
}
3977
3978
static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
3979
3980
// create the png data from post-deflated data
3981
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)
3982
{
3983
stbi__context *s = a->s;
3984
stbi__uint32 i,j,stride = x*out_n;
3985
stbi__uint32 img_len, img_width_bytes;
3986
int k;
3987
int img_n = s->img_n; // copy it into a local for later
3988
3989
STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
3990
a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into
3991
if (!a->out) return stbi__err("outofmem", "Out of memory");
3992
3993
img_width_bytes = (((img_n * x * depth) + 7) >> 3);
3994
img_len = (img_width_bytes + 1) * y;
3995
if (s->img_x == x && s->img_y == y) {
3996
if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG");
3997
} else { // interlaced:
3998
if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
3999
}
4000
4001
for (j=0; j < y; ++j) {
4002
stbi_uc *cur = a->out + stride*j;
4003
stbi_uc *prior = cur - stride;
4004
int filter = *raw++;
4005
int filter_bytes = img_n;
4006
int width = x;
4007
if (filter > 4)
4008
return stbi__err("invalid filter","Corrupt PNG");
4009
4010
if (depth < 8) {
4011
STBI_ASSERT(img_width_bytes <= x);
4012
cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place
4013
filter_bytes = 1;
4014
width = img_width_bytes;
4015
}
4016
4017
// if first row, use special filter that doesn't sample previous row
4018
if (j == 0) filter = first_row_filter[filter];
4019
4020
// handle first byte explicitly
4021
for (k=0; k < filter_bytes; ++k) {
4022
switch (filter) {
4023
case STBI__F_none : cur[k] = raw[k]; break;
4024
case STBI__F_sub : cur[k] = raw[k]; break;
4025
case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
4026
case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break;
4027
case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break;
4028
case STBI__F_avg_first : cur[k] = raw[k]; break;
4029
case STBI__F_paeth_first: cur[k] = raw[k]; break;
4030
}
4031
}
4032
4033
if (depth == 8) {
4034
if (img_n != out_n)
4035
cur[img_n] = 255; // first pixel
4036
raw += img_n;
4037
cur += out_n;
4038
prior += out_n;
4039
} else {
4040
raw += 1;
4041
cur += 1;
4042
prior += 1;
4043
}
4044
4045
// this is a little gross, so that we don't switch per-pixel or per-component
4046
if (depth < 8 || img_n == out_n) {
4047
int nk = (width - 1)*img_n;
4048
#define CASE(f) \
4049
case f: \
4050
for (k=0; k < nk; ++k)
4051
switch (filter) {
4052
// "none" filter turns into a memcpy here; make that explicit.
4053
case STBI__F_none: memcpy(cur, raw, nk); break;
4054
CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break;
4055
CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
4056
CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break;
4057
CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break;
4058
CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break;
4059
CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break;
4060
}
4061
#undef CASE
4062
raw += nk;
4063
} else {
4064
STBI_ASSERT(img_n+1 == out_n);
4065
#define CASE(f) \
4066
case f: \
4067
for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
4068
for (k=0; k < img_n; ++k)
4069
switch (filter) {
4070
CASE(STBI__F_none) cur[k] = raw[k]; break;
4071
CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break;
4072
CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
4073
CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break;
4074
CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;
4075
CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break;
4076
CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break;
4077
}
4078
#undef CASE
4079
}
4080
}
4081
4082
// we make a separate pass to expand bits to pixels; for performance,
4083
// this could run two scanlines behind the above code, so it won't
4084
// intefere with filtering but will still be in the cache.
4085
if (depth < 8) {
4086
for (j=0; j < y; ++j) {
4087
stbi_uc *cur = a->out + stride*j;
4088
stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
4089
// unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit
4090
// png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop
4091
stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range
4092
4093
// note that the final byte might overshoot and write more data than desired.
4094
// we can allocate enough data that this never writes out of memory, but it
4095
// could also overwrite the next scanline. can it overwrite non-empty data
4096
// on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel.
4097
// so we need to explicitly clamp the final ones
4098
4099
if (depth == 4) {
4100
for (k=x*img_n; k >= 2; k-=2, ++in) {
4101
*cur++ = scale * ((*in >> 4) );
4102
*cur++ = scale * ((*in ) & 0x0f);
4103
}
4104
if (k > 0) *cur++ = scale * ((*in >> 4) );
4105
} else if (depth == 2) {
4106
for (k=x*img_n; k >= 4; k-=4, ++in) {
4107
*cur++ = scale * ((*in >> 6) );
4108
*cur++ = scale * ((*in >> 4) & 0x03);
4109
*cur++ = scale * ((*in >> 2) & 0x03);
4110
*cur++ = scale * ((*in ) & 0x03);
4111
}
4112
if (k > 0) *cur++ = scale * ((*in >> 6) );
4113
if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
4114
if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
4115
} else if (depth == 1) {
4116
for (k=x*img_n; k >= 8; k-=8, ++in) {
4117
*cur++ = scale * ((*in >> 7) );
4118
*cur++ = scale * ((*in >> 6) & 0x01);
4119
*cur++ = scale * ((*in >> 5) & 0x01);
4120
*cur++ = scale * ((*in >> 4) & 0x01);
4121
*cur++ = scale * ((*in >> 3) & 0x01);
4122
*cur++ = scale * ((*in >> 2) & 0x01);
4123
*cur++ = scale * ((*in >> 1) & 0x01);
4124
*cur++ = scale * ((*in ) & 0x01);
4125
}
4126
if (k > 0) *cur++ = scale * ((*in >> 7) );
4127
if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
4128
if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
4129
if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
4130
if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
4131
if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
4132
if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
4133
}
4134
if (img_n != out_n) {
4135
int q;
4136
// insert alpha = 255
4137
cur = a->out + stride*j;
4138
if (img_n == 1) {
4139
for (q=x-1; q >= 0; --q) {
4140
cur[q*2+1] = 255;
4141
cur[q*2+0] = cur[q];
4142
}
4143
} else {
4144
STBI_ASSERT(img_n == 3);
4145
for (q=x-1; q >= 0; --q) {
4146
cur[q*4+3] = 255;
4147
cur[q*4+2] = cur[q*3+2];
4148
cur[q*4+1] = cur[q*3+1];
4149
cur[q*4+0] = cur[q*3+0];
4150
}
4151
}
4152
}
4153
}
4154
}
4155
4156
return 1;
4157
}
4158
4159
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)
4160
{
4161
stbi_uc *final;
4162
int p;
4163
if (!interlaced)
4164
return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
4165
4166
// de-interlacing
4167
final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
4168
for (p=0; p < 7; ++p) {
4169
int xorig[] = { 0,4,0,2,0,1,0 };
4170
int yorig[] = { 0,0,4,0,2,0,1 };
4171
int xspc[] = { 8,8,4,4,2,2,1 };
4172
int yspc[] = { 8,8,8,4,4,2,2 };
4173
int i,j,x,y;
4174
// pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
4175
x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
4176
y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
4177
if (x && y) {
4178
stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
4179
if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
4180
STBI_FREE(final);
4181
return 0;
4182
}
4183
for (j=0; j < y; ++j) {
4184
for (i=0; i < x; ++i) {
4185
int out_y = j*yspc[p]+yorig[p];
4186
int out_x = i*xspc[p]+xorig[p];
4187
memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n,
4188
a->out + (j*x+i)*out_n, out_n);
4189
}
4190
}
4191
STBI_FREE(a->out);
4192
image_data += img_len;
4193
image_data_len -= img_len;
4194
}
4195
}
4196
a->out = final;
4197
4198
return 1;
4199
}
4200
4201
static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)
4202
{
4203
stbi__context *s = z->s;
4204
stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4205
stbi_uc *p = z->out;
4206
4207
// compute color-based transparency, assuming we've
4208
// already got 255 as the alpha value in the output
4209
STBI_ASSERT(out_n == 2 || out_n == 4);
4210
4211
if (out_n == 2) {
4212
for (i=0; i < pixel_count; ++i) {
4213
p[1] = (p[0] == tc[0] ? 0 : 255);
4214
p += 2;
4215
}
4216
} else {
4217
for (i=0; i < pixel_count; ++i) {
4218
if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
4219
p[3] = 0;
4220
p += 4;
4221
}
4222
}
4223
return 1;
4224
}
4225
4226
static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)
4227
{
4228
stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
4229
stbi_uc *p, *temp_out, *orig = a->out;
4230
4231
p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
4232
if (p == NULL) return stbi__err("outofmem", "Out of memory");
4233
4234
// between here and free(out) below, exitting would leak
4235
temp_out = p;
4236
4237
if (pal_img_n == 3) {
4238
for (i=0; i < pixel_count; ++i) {
4239
int n = orig[i]*4;
4240
p[0] = palette[n ];
4241
p[1] = palette[n+1];
4242
p[2] = palette[n+2];
4243
p += 3;
4244
}
4245
} else {
4246
for (i=0; i < pixel_count; ++i) {
4247
int n = orig[i]*4;
4248
p[0] = palette[n ];
4249
p[1] = palette[n+1];
4250
p[2] = palette[n+2];
4251
p[3] = palette[n+3];
4252
p += 4;
4253
}
4254
}
4255
STBI_FREE(a->out);
4256
a->out = temp_out;
4257
4258
STBI_NOTUSED(len);
4259
4260
return 1;
4261
}
4262
4263
static int stbi__unpremultiply_on_load = 0;
4264
static int stbi__de_iphone_flag = 0;
4265
4266
STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
4267
{
4268
stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
4269
}
4270
4271
STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
4272
{
4273
stbi__de_iphone_flag = flag_true_if_should_convert;
4274
}
4275
4276
static void stbi__de_iphone(stbi__png *z)
4277
{
4278
stbi__context *s = z->s;
4279
stbi__uint32 i, pixel_count = s->img_x * s->img_y;
4280
stbi_uc *p = z->out;
4281
4282
if (s->img_out_n == 3) { // convert bgr to rgb
4283
for (i=0; i < pixel_count; ++i) {
4284
stbi_uc t = p[0];
4285
p[0] = p[2];
4286
p[2] = t;
4287
p += 3;
4288
}
4289
} else {
4290
STBI_ASSERT(s->img_out_n == 4);
4291
if (stbi__unpremultiply_on_load) {
4292
// convert bgr to rgb and unpremultiply
4293
for (i=0; i < pixel_count; ++i) {
4294
stbi_uc a = p[3];
4295
stbi_uc t = p[0];
4296
if (a) {
4297
p[0] = p[2] * 255 / a;
4298
p[1] = p[1] * 255 / a;
4299
p[2] = t * 255 / a;
4300
} else {
4301
p[0] = p[2];
4302
p[2] = t;
4303
}
4304
p += 4;
4305
}
4306
} else {
4307
// convert bgr to rgb
4308
for (i=0; i < pixel_count; ++i) {
4309
stbi_uc t = p[0];
4310
p[0] = p[2];
4311
p[2] = t;
4312
p += 4;
4313
}
4314
}
4315
}
4316
}
4317
4318
#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
4319
4320
static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
4321
{
4322
stbi_uc palette[1024], pal_img_n=0;
4323
stbi_uc has_trans=0, tc[3];
4324
stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
4325
int first=1,k,interlace=0, color=0, depth=0, is_iphone=0;
4326
stbi__context *s = z->s;
4327
4328
z->expanded = NULL;
4329
z->idata = NULL;
4330
z->out = NULL;
4331
4332
if (!stbi__check_png_header(s)) return 0;
4333
4334
if (scan == STBI__SCAN_type) return 1;
4335
4336
for (;;) {
4337
stbi__pngchunk c = stbi__get_chunk_header(s);
4338
switch (c.type) {
4339
case STBI__PNG_TYPE('C','g','B','I'):
4340
is_iphone = 1;
4341
stbi__skip(s, c.length);
4342
break;
4343
case STBI__PNG_TYPE('I','H','D','R'): {
4344
int comp,filter;
4345
if (!first) return stbi__err("multiple IHDR","Corrupt PNG");
4346
first = 0;
4347
if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");
4348
s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
4349
s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
4350
depth = stbi__get8(s); if (depth != 1 && depth != 2 && depth != 4 && depth != 8) return stbi__err("1/2/4/8-bit only","PNG not supported: 1/2/4/8-bit only");
4351
color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG");
4352
if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");
4353
comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG");
4354
filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG");
4355
interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG");
4356
if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG");
4357
if (!pal_img_n) {
4358
s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
4359
if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
4360
if (scan == STBI__SCAN_header) return 1;
4361
} else {
4362
// if paletted, then pal_n is our final components, and
4363
// img_n is # components to decompress/filter.
4364
s->img_n = 1;
4365
if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG");
4366
// if SCAN_header, have to scan to see if we have a tRNS
4367
}
4368
break;
4369
}
4370
4371
case STBI__PNG_TYPE('P','L','T','E'): {
4372
if (first) return stbi__err("first not IHDR", "Corrupt PNG");
4373
if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG");
4374
pal_len = c.length / 3;
4375
if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG");
4376
for (i=0; i < pal_len; ++i) {
4377
palette[i*4+0] = stbi__get8(s);
4378
palette[i*4+1] = stbi__get8(s);
4379
palette[i*4+2] = stbi__get8(s);
4380
palette[i*4+3] = 255;
4381
}
4382
break;
4383
}
4384
4385
case STBI__PNG_TYPE('t','R','N','S'): {
4386
if (first) return stbi__err("first not IHDR", "Corrupt PNG");
4387
if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG");
4388
if (pal_img_n) {
4389
if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }
4390
if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG");
4391
if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG");
4392
pal_img_n = 4;
4393
for (i=0; i < c.length; ++i)
4394
palette[i*4+3] = stbi__get8(s);
4395
} else {
4396
if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
4397
if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
4398
has_trans = 1;
4399
for (k=0; k < s->img_n; ++k)
4400
tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger
4401
}
4402
break;
4403
}
4404
4405
case STBI__PNG_TYPE('I','D','A','T'): {
4406
if (first) return stbi__err("first not IHDR", "Corrupt PNG");
4407
if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG");
4408
if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; }
4409
if ((int)(ioff + c.length) < (int)ioff) return 0;
4410
if (ioff + c.length > idata_limit) {
4411
stbi_uc *p;
4412
if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
4413
while (ioff + c.length > idata_limit)
4414
idata_limit *= 2;
4415
p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
4416
z->idata = p;
4417
}
4418
if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");
4419
ioff += c.length;
4420
break;
4421
}
4422
4423
case STBI__PNG_TYPE('I','E','N','D'): {
4424
stbi__uint32 raw_len, bpl;
4425
if (first) return stbi__err("first not IHDR", "Corrupt PNG");
4426
if (scan != STBI__SCAN_load) return 1;
4427
if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");
4428
// initial guess for decoded data size to avoid unnecessary reallocs
4429
bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component
4430
raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
4431
z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);
4432
if (z->expanded == NULL) return 0; // zlib should set error
4433
STBI_FREE(z->idata); z->idata = NULL;
4434
if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
4435
s->img_out_n = s->img_n+1;
4436
else
4437
s->img_out_n = s->img_n;
4438
if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0;
4439
if (has_trans)
4440
if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
4441
if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
4442
stbi__de_iphone(z);
4443
if (pal_img_n) {
4444
// pal_img_n == 3 or 4
4445
s->img_n = pal_img_n; // record the actual colors we had
4446
s->img_out_n = pal_img_n;
4447
if (req_comp >= 3) s->img_out_n = req_comp;
4448
if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
4449
return 0;
4450
}
4451
STBI_FREE(z->expanded); z->expanded = NULL;
4452
return 1;
4453
}
4454
4455
default:
4456
// if critical, fail
4457
if (first) return stbi__err("first not IHDR", "Corrupt PNG");
4458
if ((c.type & (1 << 29)) == 0) {
4459
#ifndef STBI_NO_FAILURE_STRINGS
4460
// not threadsafe
4461
static char invalid_chunk[] = "XXXX PNG chunk not known";
4462
invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
4463
invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
4464
invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
4465
invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
4466
#endif
4467
return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type");
4468
}
4469
stbi__skip(s, c.length);
4470
break;
4471
}
4472
// end of PNG chunk, read and skip CRC
4473
stbi__get32be(s);
4474
}
4475
}
4476
4477
static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp)
4478
{
4479
unsigned char *result=NULL;
4480
if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
4481
if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
4482
result = p->out;
4483
p->out = NULL;
4484
if (req_comp && req_comp != p->s->img_out_n) {
4485
result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
4486
p->s->img_out_n = req_comp;
4487
if (result == NULL) return result;
4488
}
4489
*x = p->s->img_x;
4490
*y = p->s->img_y;
4491
if (n) *n = p->s->img_out_n;
4492
}
4493
STBI_FREE(p->out); p->out = NULL;
4494
STBI_FREE(p->expanded); p->expanded = NULL;
4495
STBI_FREE(p->idata); p->idata = NULL;
4496
4497
return result;
4498
}
4499
4500
static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
4501
{
4502
stbi__png p;
4503
p.s = s;
4504
return stbi__do_png(&p, x,y,comp,req_comp);
4505
}
4506
4507
static int stbi__png_test(stbi__context *s)
4508
{
4509
int r;
4510
r = stbi__check_png_header(s);
4511
stbi__rewind(s);
4512
return r;
4513
}
4514
4515
static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
4516
{
4517
if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
4518
stbi__rewind( p->s );
4519
return 0;
4520
}
4521
if (x) *x = p->s->img_x;
4522
if (y) *y = p->s->img_y;
4523
if (comp) *comp = p->s->img_n;
4524
return 1;
4525
}
4526
4527
static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
4528
{
4529
stbi__png p;
4530
p.s = s;
4531
return stbi__png_info_raw(&p, x, y, comp);
4532
}
4533
#endif
4534
4535
// Microsoft/Windows BMP image
4536
4537
#ifndef STBI_NO_BMP
4538
static int stbi__bmp_test_raw(stbi__context *s)
4539
{
4540
int r;
4541
int sz;
4542
if (stbi__get8(s) != 'B') return 0;
4543
if (stbi__get8(s) != 'M') return 0;
4544
stbi__get32le(s); // discard filesize
4545
stbi__get16le(s); // discard reserved
4546
stbi__get16le(s); // discard reserved
4547
stbi__get32le(s); // discard data offset
4548
sz = stbi__get32le(s);
4549
r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
4550
return r;
4551
}
4552
4553
static int stbi__bmp_test(stbi__context *s)
4554
{
4555
int r = stbi__bmp_test_raw(s);
4556
stbi__rewind(s);
4557
return r;
4558
}
4559
4560
4561
// returns 0..31 for the highest set bit
4562
static int stbi__high_bit(unsigned int z)
4563
{
4564
int n=0;
4565
if (z == 0) return -1;
4566
if (z >= 0x10000) n += 16, z >>= 16;
4567
if (z >= 0x00100) n += 8, z >>= 8;
4568
if (z >= 0x00010) n += 4, z >>= 4;
4569
if (z >= 0x00004) n += 2, z >>= 2;
4570
if (z >= 0x00002) n += 1, z >>= 1;
4571
return n;
4572
}
4573
4574
static int stbi__bitcount(unsigned int a)
4575
{
4576
a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
4577
a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
4578
a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
4579
a = (a + (a >> 8)); // max 16 per 8 bits
4580
a = (a + (a >> 16)); // max 32 per 8 bits
4581
return a & 0xff;
4582
}
4583
4584
static int stbi__shiftsigned(int v, int shift, int bits)
4585
{
4586
int result;
4587
int z=0;
4588
4589
if (shift < 0) v <<= -shift;
4590
else v >>= shift;
4591
result = v;
4592
4593
z = bits;
4594
while (z < 8) {
4595
result += v >> z;
4596
z += bits;
4597
}
4598
return result;
4599
}
4600
4601
static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
4602
{
4603
stbi_uc *out;
4604
unsigned int mr=0,mg=0,mb=0,ma=0, all_a=255;
4605
stbi_uc pal[256][4];
4606
int psize=0,i,j,compress=0,width;
4607
int bpp, flip_vertically, pad, target, offset, hsz;
4608
if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
4609
stbi__get32le(s); // discard filesize
4610
stbi__get16le(s); // discard reserved
4611
stbi__get16le(s); // discard reserved
4612
offset = stbi__get32le(s);
4613
hsz = stbi__get32le(s);
4614
if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
4615
if (hsz == 12) {
4616
s->img_x = stbi__get16le(s);
4617
s->img_y = stbi__get16le(s);
4618
} else {
4619
s->img_x = stbi__get32le(s);
4620
s->img_y = stbi__get32le(s);
4621
}
4622
if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
4623
bpp = stbi__get16le(s);
4624
if (bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit");
4625
flip_vertically = ((int) s->img_y) > 0;
4626
s->img_y = abs((int) s->img_y);
4627
if (hsz == 12) {
4628
if (bpp < 24)
4629
psize = (offset - 14 - 24) / 3;
4630
} else {
4631
compress = stbi__get32le(s);
4632
if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
4633
stbi__get32le(s); // discard sizeof
4634
stbi__get32le(s); // discard hres
4635
stbi__get32le(s); // discard vres
4636
stbi__get32le(s); // discard colorsused
4637
stbi__get32le(s); // discard max important
4638
if (hsz == 40 || hsz == 56) {
4639
if (hsz == 56) {
4640
stbi__get32le(s);
4641
stbi__get32le(s);
4642
stbi__get32le(s);
4643
stbi__get32le(s);
4644
}
4645
if (bpp == 16 || bpp == 32) {
4646
mr = mg = mb = 0;
4647
if (compress == 0) {
4648
if (bpp == 32) {
4649
mr = 0xffu << 16;
4650
mg = 0xffu << 8;
4651
mb = 0xffu << 0;
4652
ma = 0xffu << 24;
4653
all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0
4654
} else {
4655
mr = 31u << 10;
4656
mg = 31u << 5;
4657
mb = 31u << 0;
4658
}
4659
} else if (compress == 3) {
4660
mr = stbi__get32le(s);
4661
mg = stbi__get32le(s);
4662
mb = stbi__get32le(s);
4663
// not documented, but generated by photoshop and handled by mspaint
4664
if (mr == mg && mg == mb) {
4665
// ?!?!?
4666
return stbi__errpuc("bad BMP", "bad BMP");
4667
}
4668
} else
4669
return stbi__errpuc("bad BMP", "bad BMP");
4670
}
4671
} else {
4672
STBI_ASSERT(hsz == 108 || hsz == 124);
4673
mr = stbi__get32le(s);
4674
mg = stbi__get32le(s);
4675
mb = stbi__get32le(s);
4676
ma = stbi__get32le(s);
4677
stbi__get32le(s); // discard color space
4678
for (i=0; i < 12; ++i)
4679
stbi__get32le(s); // discard color space parameters
4680
if (hsz == 124) {
4681
stbi__get32le(s); // discard rendering intent
4682
stbi__get32le(s); // discard offset of profile data
4683
stbi__get32le(s); // discard size of profile data
4684
stbi__get32le(s); // discard reserved
4685
}
4686
}
4687
if (bpp < 16)
4688
psize = (offset - 14 - hsz) >> 2;
4689
}
4690
s->img_n = ma ? 4 : 3;
4691
if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
4692
target = req_comp;
4693
else
4694
target = s->img_n; // if they want monochrome, we'll post-convert
4695
out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);
4696
if (!out) return stbi__errpuc("outofmem", "Out of memory");
4697
if (bpp < 16) {
4698
int z=0;
4699
if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
4700
for (i=0; i < psize; ++i) {
4701
pal[i][2] = stbi__get8(s);
4702
pal[i][1] = stbi__get8(s);
4703
pal[i][0] = stbi__get8(s);
4704
if (hsz != 12) stbi__get8(s);
4705
pal[i][3] = 255;
4706
}
4707
stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
4708
if (bpp == 4) width = (s->img_x + 1) >> 1;
4709
else if (bpp == 8) width = s->img_x;
4710
else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
4711
pad = (-width)&3;
4712
for (j=0; j < (int) s->img_y; ++j) {
4713
for (i=0; i < (int) s->img_x; i += 2) {
4714
int v=stbi__get8(s),v2=0;
4715
if (bpp == 4) {
4716
v2 = v & 15;
4717
v >>= 4;
4718
}
4719
out[z++] = pal[v][0];
4720
out[z++] = pal[v][1];
4721
out[z++] = pal[v][2];
4722
if (target == 4) out[z++] = 255;
4723
if (i+1 == (int) s->img_x) break;
4724
v = (bpp == 8) ? stbi__get8(s) : v2;
4725
out[z++] = pal[v][0];
4726
out[z++] = pal[v][1];
4727
out[z++] = pal[v][2];
4728
if (target == 4) out[z++] = 255;
4729
}
4730
stbi__skip(s, pad);
4731
}
4732
} else {
4733
int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
4734
int z = 0;
4735
int easy=0;
4736
stbi__skip(s, offset - 14 - hsz);
4737
if (bpp == 24) width = 3 * s->img_x;
4738
else if (bpp == 16) width = 2*s->img_x;
4739
else /* bpp = 32 and pad = 0 */ width=0;
4740
pad = (-width) & 3;
4741
if (bpp == 24) {
4742
easy = 1;
4743
} else if (bpp == 32) {
4744
if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
4745
easy = 2;
4746
}
4747
if (!easy) {
4748
if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
4749
// right shift amt to put high bit in position #7
4750
rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
4751
gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
4752
bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
4753
ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
4754
}
4755
for (j=0; j < (int) s->img_y; ++j) {
4756
if (easy) {
4757
for (i=0; i < (int) s->img_x; ++i) {
4758
unsigned char a;
4759
out[z+2] = stbi__get8(s);
4760
out[z+1] = stbi__get8(s);
4761
out[z+0] = stbi__get8(s);
4762
z += 3;
4763
a = (easy == 2 ? stbi__get8(s) : 255);
4764
all_a |= a;
4765
if (target == 4) out[z++] = a;
4766
}
4767
} else {
4768
for (i=0; i < (int) s->img_x; ++i) {
4769
stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));
4770
int a;
4771
out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
4772
out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
4773
out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
4774
a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
4775
all_a |= a;
4776
if (target == 4) out[z++] = STBI__BYTECAST(a);
4777
}
4778
}
4779
stbi__skip(s, pad);
4780
}
4781
}
4782
4783
// if alpha channel is all 0s, replace with all 255s
4784
if (target == 4 && all_a == 0)
4785
for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)
4786
out[i] = 255;
4787
4788
if (flip_vertically) {
4789
stbi_uc t;
4790
for (j=0; j < (int) s->img_y>>1; ++j) {
4791
stbi_uc *p1 = out + j *s->img_x*target;
4792
stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
4793
for (i=0; i < (int) s->img_x*target; ++i) {
4794
t = p1[i], p1[i] = p2[i], p2[i] = t;
4795
}
4796
}
4797
}
4798
4799
if (req_comp && req_comp != target) {
4800
out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
4801
if (out == NULL) return out; // stbi__convert_format frees input on failure
4802
}
4803
4804
*x = s->img_x;
4805
*y = s->img_y;
4806
if (comp) *comp = s->img_n;
4807
return out;
4808
}
4809
#endif
4810
4811
// Targa Truevision - TGA
4812
// by Jonathan Dummer
4813
#ifndef STBI_NO_TGA
4814
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
4815
{
4816
int tga_w, tga_h, tga_comp;
4817
int sz;
4818
stbi__get8(s); // discard Offset
4819
sz = stbi__get8(s); // color type
4820
if( sz > 1 ) {
4821
stbi__rewind(s);
4822
return 0; // only RGB or indexed allowed
4823
}
4824
sz = stbi__get8(s); // image type
4825
// only RGB or grey allowed, +/- RLE
4826
if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;
4827
stbi__skip(s,9);
4828
tga_w = stbi__get16le(s);
4829
if( tga_w < 1 ) {
4830
stbi__rewind(s);
4831
return 0; // test width
4832
}
4833
tga_h = stbi__get16le(s);
4834
if( tga_h < 1 ) {
4835
stbi__rewind(s);
4836
return 0; // test height
4837
}
4838
sz = stbi__get8(s); // bits per pixel
4839
// only RGB or RGBA or grey allowed
4840
if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
4841
stbi__rewind(s);
4842
return 0;
4843
}
4844
tga_comp = sz;
4845
if (x) *x = tga_w;
4846
if (y) *y = tga_h;
4847
if (comp) *comp = tga_comp / 8;
4848
return 1; // seems to have passed everything
4849
}
4850
4851
static int stbi__tga_test(stbi__context *s)
4852
{
4853
int res;
4854
int sz;
4855
stbi__get8(s); // discard Offset
4856
sz = stbi__get8(s); // color type
4857
if ( sz > 1 ) return 0; // only RGB or indexed allowed
4858
sz = stbi__get8(s); // image type
4859
if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE
4860
stbi__get16be(s); // discard palette start
4861
stbi__get16be(s); // discard palette length
4862
stbi__get8(s); // discard bits per palette color entry
4863
stbi__get16be(s); // discard x origin
4864
stbi__get16be(s); // discard y origin
4865
if ( stbi__get16be(s) < 1 ) return 0; // test width
4866
if ( stbi__get16be(s) < 1 ) return 0; // test height
4867
sz = stbi__get8(s); // bits per pixel
4868
if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )
4869
res = 0;
4870
else
4871
res = 1;
4872
stbi__rewind(s);
4873
return res;
4874
}
4875
4876
static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
4877
{
4878
// read in the TGA header stuff
4879
int tga_offset = stbi__get8(s);
4880
int tga_indexed = stbi__get8(s);
4881
int tga_image_type = stbi__get8(s);
4882
int tga_is_RLE = 0;
4883
int tga_palette_start = stbi__get16le(s);
4884
int tga_palette_len = stbi__get16le(s);
4885
int tga_palette_bits = stbi__get8(s);
4886
int tga_x_origin = stbi__get16le(s);
4887
int tga_y_origin = stbi__get16le(s);
4888
int tga_width = stbi__get16le(s);
4889
int tga_height = stbi__get16le(s);
4890
int tga_bits_per_pixel = stbi__get8(s);
4891
int tga_comp = tga_bits_per_pixel / 8;
4892
int tga_inverted = stbi__get8(s);
4893
// image data
4894
unsigned char *tga_data;
4895
unsigned char *tga_palette = NULL;
4896
int i, j;
4897
unsigned char raw_data[4];
4898
int RLE_count = 0;
4899
int RLE_repeating = 0;
4900
int read_next_pixel = 1;
4901
4902
// do a tiny bit of precessing
4903
if ( tga_image_type >= 8 )
4904
{
4905
tga_image_type -= 8;
4906
tga_is_RLE = 1;
4907
}
4908
/* int tga_alpha_bits = tga_inverted & 15; */
4909
tga_inverted = 1 - ((tga_inverted >> 5) & 1);
4910
4911
// error check
4912
if ( //(tga_indexed) ||
4913
(tga_width < 1) || (tga_height < 1) ||
4914
(tga_image_type < 1) || (tga_image_type > 3) ||
4915
((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
4916
(tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
4917
)
4918
{
4919
return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA
4920
}
4921
4922
// If I'm paletted, then I'll use the number of bits from the palette
4923
if ( tga_indexed )
4924
{
4925
tga_comp = tga_palette_bits / 8;
4926
}
4927
4928
// tga info
4929
*x = tga_width;
4930
*y = tga_height;
4931
if (comp) *comp = tga_comp;
4932
4933
tga_data = (unsigned char*)stbi__malloc( (size_t)tga_width * tga_height * tga_comp );
4934
if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
4935
4936
// skip to the data's starting position (offset usually = 0)
4937
stbi__skip(s, tga_offset );
4938
4939
if ( !tga_indexed && !tga_is_RLE) {
4940
for (i=0; i < tga_height; ++i) {
4941
int row = tga_inverted ? tga_height -i - 1 : i;
4942
stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;
4943
stbi__getn(s, tga_row, tga_width * tga_comp);
4944
}
4945
} else {
4946
// do I need to load a palette?
4947
if ( tga_indexed)
4948
{
4949
// any data to skip? (offset usually = 0)
4950
stbi__skip(s, tga_palette_start );
4951
// load the palette
4952
tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );
4953
if (!tga_palette) {
4954
STBI_FREE(tga_data);
4955
return stbi__errpuc("outofmem", "Out of memory");
4956
}
4957
if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
4958
STBI_FREE(tga_data);
4959
STBI_FREE(tga_palette);
4960
return stbi__errpuc("bad palette", "Corrupt TGA");
4961
}
4962
}
4963
// load the data
4964
for (i=0; i < tga_width * tga_height; ++i)
4965
{
4966
// if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
4967
if ( tga_is_RLE )
4968
{
4969
if ( RLE_count == 0 )
4970
{
4971
// yep, get the next byte as a RLE command
4972
int RLE_cmd = stbi__get8(s);
4973
RLE_count = 1 + (RLE_cmd & 127);
4974
RLE_repeating = RLE_cmd >> 7;
4975
read_next_pixel = 1;
4976
} else if ( !RLE_repeating )
4977
{
4978
read_next_pixel = 1;
4979
}
4980
} else
4981
{
4982
read_next_pixel = 1;
4983
}
4984
// OK, if I need to read a pixel, do it now
4985
if ( read_next_pixel )
4986
{
4987
// load however much data we did have
4988
if ( tga_indexed )
4989
{
4990
// read in 1 byte, then perform the lookup
4991
int pal_idx = stbi__get8(s);
4992
if ( pal_idx >= tga_palette_len )
4993
{
4994
// invalid index
4995
pal_idx = 0;
4996
}
4997
pal_idx *= tga_bits_per_pixel / 8;
4998
for (j = 0; j*8 < tga_bits_per_pixel; ++j)
4999
{
5000
raw_data[j] = tga_palette[pal_idx+j];
5001
}
5002
} else
5003
{
5004
// read in the data raw
5005
for (j = 0; j*8 < tga_bits_per_pixel; ++j)
5006
{
5007
raw_data[j] = stbi__get8(s);
5008
}
5009
}
5010
// clear the reading flag for the next pixel
5011
read_next_pixel = 0;
5012
} // end of reading a pixel
5013
5014
// copy data
5015
for (j = 0; j < tga_comp; ++j)
5016
tga_data[i*tga_comp+j] = raw_data[j];
5017
5018
// in case we're in RLE mode, keep counting down
5019
--RLE_count;
5020
}
5021
// do I need to invert the image?
5022
if ( tga_inverted )
5023
{
5024
for (j = 0; j*2 < tga_height; ++j)
5025
{
5026
int index1 = j * tga_width * tga_comp;
5027
int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
5028
for (i = tga_width * tga_comp; i > 0; --i)
5029
{
5030
unsigned char temp = tga_data[index1];
5031
tga_data[index1] = tga_data[index2];
5032
tga_data[index2] = temp;
5033
++index1;
5034
++index2;
5035
}
5036
}
5037
}
5038
// clear my palette, if I had one
5039
if ( tga_palette != NULL )
5040
{
5041
STBI_FREE( tga_palette );
5042
}
5043
}
5044
5045
// swap RGB
5046
if (tga_comp >= 3)
5047
{
5048
unsigned char* tga_pixel = tga_data;
5049
for (i=0; i < tga_width * tga_height; ++i)
5050
{
5051
unsigned char temp = tga_pixel[0];
5052
tga_pixel[0] = tga_pixel[2];
5053
tga_pixel[2] = temp;
5054
tga_pixel += tga_comp;
5055
}
5056
}
5057
5058
// convert to target component count
5059
if (req_comp && req_comp != tga_comp)
5060
tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
5061
5062
// the things I do to get rid of an error message, and yet keep
5063
// Microsoft's C compilers happy... [8^(
5064
tga_palette_start = tga_palette_len = tga_palette_bits =
5065
tga_x_origin = tga_y_origin = 0;
5066
// OK, done
5067
return tga_data;
5068
}
5069
#endif
5070
5071
// *************************************************************************************************
5072
// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
5073
5074
#ifndef STBI_NO_PSD
5075
static int stbi__psd_test(stbi__context *s)
5076
{
5077
int r = (stbi__get32be(s) == 0x38425053);
5078
stbi__rewind(s);
5079
return r;
5080
}
5081
5082
static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
5083
{
5084
int pixelCount;
5085
int channelCount, compression;
5086
int channel, i, count, len;
5087
int bitdepth;
5088
int w,h;
5089
stbi_uc *out;
5090
5091
// Check identifier
5092
if (stbi__get32be(s) != 0x38425053) // "8BPS"
5093
return stbi__errpuc("not PSD", "Corrupt PSD image");
5094
5095
// Check file type version.
5096
if (stbi__get16be(s) != 1)
5097
return stbi__errpuc("wrong version", "Unsupported version of PSD image");
5098
5099
// Skip 6 reserved bytes.
5100
stbi__skip(s, 6 );
5101
5102
// Read the number of channels (R, G, B, A, etc).
5103
channelCount = stbi__get16be(s);
5104
if (channelCount < 0 || channelCount > 16)
5105
return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image");
5106
5107
// Read the rows and columns of the image.
5108
h = stbi__get32be(s);
5109
w = stbi__get32be(s);
5110
5111
// Make sure the depth is 8 bits.
5112
bitdepth = stbi__get16be(s);
5113
if (bitdepth != 8 && bitdepth != 16)
5114
return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit");
5115
5116
// Make sure the color mode is RGB.
5117
// Valid options are:
5118
// 0: Bitmap
5119
// 1: Grayscale
5120
// 2: Indexed color
5121
// 3: RGB color
5122
// 4: CMYK color
5123
// 7: Multichannel
5124
// 8: Duotone
5125
// 9: Lab color
5126
if (stbi__get16be(s) != 3)
5127
return stbi__errpuc("wrong color format", "PSD is not in RGB color format");
5128
5129
// Skip the Mode Data. (It's the palette for indexed color; other info for other modes.)
5130
stbi__skip(s,stbi__get32be(s) );
5131
5132
// Skip the image resources. (resolution, pen tool paths, etc)
5133
stbi__skip(s, stbi__get32be(s) );
5134
5135
// Skip the reserved data.
5136
stbi__skip(s, stbi__get32be(s) );
5137
5138
// Find out if the data is compressed.
5139
// Known values:
5140
// 0: no compression
5141
// 1: RLE compressed
5142
compression = stbi__get16be(s);
5143
if (compression > 1)
5144
return stbi__errpuc("bad compression", "PSD has an unknown compression format");
5145
5146
// Create the destination image.
5147
out = (stbi_uc *) stbi__malloc(4 * w*h);
5148
if (!out) return stbi__errpuc("outofmem", "Out of memory");
5149
pixelCount = w*h;
5150
5151
// Initialize the data to zero.
5152
//memset( out, 0, pixelCount * 4 );
5153
5154
// Finally, the image data.
5155
if (compression) {
5156
// RLE as used by .PSD and .TIFF
5157
// Loop until you get the number of unpacked bytes you are expecting:
5158
// Read the next source byte into n.
5159
// If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
5160
// Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
5161
// Else if n is 128, noop.
5162
// Endloop
5163
5164
// The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,
5165
// which we're going to just skip.
5166
stbi__skip(s, h * channelCount * 2 );
5167
5168
// Read the RLE data by channel.
5169
for (channel = 0; channel < 4; channel++) {
5170
stbi_uc *p;
5171
5172
p = out+channel;
5173
if (channel >= channelCount) {
5174
// Fill this channel with default data.
5175
for (i = 0; i < pixelCount; i++, p += 4)
5176
*p = (channel == 3 ? 255 : 0);
5177
} else {
5178
// Read the RLE data.
5179
count = 0;
5180
while (count < pixelCount) {
5181
len = stbi__get8(s);
5182
if (len == 128) {
5183
// No-op.
5184
} else if (len < 128) {
5185
// Copy next len+1 bytes literally.
5186
len++;
5187
count += len;
5188
while (len) {
5189
*p = stbi__get8(s);
5190
p += 4;
5191
len--;
5192
}
5193
} else if (len > 128) {
5194
stbi_uc val;
5195
// Next -len+1 bytes in the dest are replicated from next source byte.
5196
// (Interpret len as a negative 8-bit int.)
5197
len ^= 0x0FF;
5198
len += 2;
5199
val = stbi__get8(s);
5200
count += len;
5201
while (len) {
5202
*p = val;
5203
p += 4;
5204
len--;
5205
}
5206
}
5207
}
5208
}
5209
}
5210
5211
} else {
5212
// We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...)
5213
// where each channel consists of an 8-bit value for each pixel in the image.
5214
5215
// Read the data by channel.
5216
for (channel = 0; channel < 4; channel++) {
5217
stbi_uc *p;
5218
5219
p = out + channel;
5220
if (channel >= channelCount) {
5221
// Fill this channel with default data.
5222
stbi_uc val = channel == 3 ? 255 : 0;
5223
for (i = 0; i < pixelCount; i++, p += 4)
5224
*p = val;
5225
} else {
5226
// Read the data.
5227
if (bitdepth == 16) {
5228
for (i = 0; i < pixelCount; i++, p += 4)
5229
*p = (stbi_uc) (stbi__get16be(s) >> 8);
5230
} else {
5231
for (i = 0; i < pixelCount; i++, p += 4)
5232
*p = stbi__get8(s);
5233
}
5234
}
5235
}
5236
}
5237
5238
if (req_comp && req_comp != 4) {
5239
out = stbi__convert_format(out, 4, req_comp, w, h);
5240
if (out == NULL) return out; // stbi__convert_format frees input on failure
5241
}
5242
5243
if (comp) *comp = 4;
5244
*y = h;
5245
*x = w;
5246
5247
return out;
5248
}
5249
#endif
5250
5251
// *************************************************************************************************
5252
// Softimage PIC loader
5253
// by Tom Seddon
5254
//
5255
// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
5256
// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
5257
5258
#ifndef STBI_NO_PIC
5259
static int stbi__pic_is4(stbi__context *s,const char *str)
5260
{
5261
int i;
5262
for (i=0; i<4; ++i)
5263
if (stbi__get8(s) != (stbi_uc)str[i])
5264
return 0;
5265
5266
return 1;
5267
}
5268
5269
static int stbi__pic_test_core(stbi__context *s)
5270
{
5271
int i;
5272
5273
if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
5274
return 0;
5275
5276
for(i=0;i<84;++i)
5277
stbi__get8(s);
5278
5279
if (!stbi__pic_is4(s,"PICT"))
5280
return 0;
5281
5282
return 1;
5283
}
5284
5285
typedef struct
5286
{
5287
stbi_uc size,type,channel;
5288
} stbi__pic_packet;
5289
5290
static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)
5291
{
5292
int mask=0x80, i;
5293
5294
for (i=0; i<4; ++i, mask>>=1) {
5295
if (channel & mask) {
5296
if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short");
5297
dest[i]=stbi__get8(s);
5298
}
5299
}
5300
5301
return dest;
5302
}
5303
5304
static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)
5305
{
5306
int mask=0x80,i;
5307
5308
for (i=0;i<4; ++i, mask>>=1)
5309
if (channel&mask)
5310
dest[i]=src[i];
5311
}
5312
5313
static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)
5314
{
5315
int act_comp=0,num_packets=0,y,chained;
5316
stbi__pic_packet packets[10];
5317
5318
// this will (should...) cater for even some bizarre stuff like having data
5319
// for the same channel in multiple packets.
5320
do {
5321
stbi__pic_packet *packet;
5322
5323
if (num_packets==sizeof(packets)/sizeof(packets[0]))
5324
return stbi__errpuc("bad format","too many packets");
5325
5326
packet = &packets[num_packets++];
5327
5328
chained = stbi__get8(s);
5329
packet->size = stbi__get8(s);
5330
packet->type = stbi__get8(s);
5331
packet->channel = stbi__get8(s);
5332
5333
act_comp |= packet->channel;
5334
5335
if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)");
5336
if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp");
5337
} while (chained);
5338
5339
*comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
5340
5341
for(y=0; y<height; ++y) {
5342
int packet_idx;
5343
5344
for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
5345
stbi__pic_packet *packet = &packets[packet_idx];
5346
stbi_uc *dest = result+y*width*4;
5347
5348
switch (packet->type) {
5349
default:
5350
return stbi__errpuc("bad format","packet has bad compression type");
5351
5352
case 0: {//uncompressed
5353
int x;
5354
5355
for(x=0;x<width;++x, dest+=4)
5356
if (!stbi__readval(s,packet->channel,dest))
5357
return 0;
5358
break;
5359
}
5360
5361
case 1://Pure RLE
5362
{
5363
int left=width, i;
5364
5365
while (left>0) {
5366
stbi_uc count,value[4];
5367
5368
count=stbi__get8(s);
5369
if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)");
5370
5371
if (count > left)
5372
count = (stbi_uc) left;
5373
5374
if (!stbi__readval(s,packet->channel,value)) return 0;
5375
5376
for(i=0; i<count; ++i,dest+=4)
5377
stbi__copyval(packet->channel,dest,value);
5378
left -= count;
5379
}
5380
}
5381
break;
5382
5383
case 2: {//Mixed RLE
5384
int left=width;
5385
while (left>0) {
5386
int count = stbi__get8(s), i;
5387
if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)");
5388
5389
if (count >= 128) { // Repeated
5390
stbi_uc value[4];
5391
5392
if (count==128)
5393
count = stbi__get16be(s);
5394
else
5395
count -= 127;
5396
if (count > left)
5397
return stbi__errpuc("bad file","scanline overrun");
5398
5399
if (!stbi__readval(s,packet->channel,value))
5400
return 0;
5401
5402
for(i=0;i<count;++i, dest += 4)
5403
stbi__copyval(packet->channel,dest,value);
5404
} else { // Raw
5405
++count;
5406
if (count>left) return stbi__errpuc("bad file","scanline overrun");
5407
5408
for(i=0;i<count;++i, dest+=4)
5409
if (!stbi__readval(s,packet->channel,dest))
5410
return 0;
5411
}
5412
left-=count;
5413
}
5414
break;
5415
}
5416
}
5417
}
5418
}
5419
5420
return result;
5421
}
5422
5423
static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp)
5424
{
5425
stbi_uc *result;
5426
int i, x,y;
5427
5428
for (i=0; i<92; ++i)
5429
stbi__get8(s);
5430
5431
x = stbi__get16be(s);
5432
y = stbi__get16be(s);
5433
if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)");
5434
if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to decode");
5435
5436
stbi__get32be(s); //skip `ratio'
5437
stbi__get16be(s); //skip `fields'
5438
stbi__get16be(s); //skip `pad'
5439
5440
// intermediate buffer is RGBA
5441
result = (stbi_uc *) stbi__malloc(x*y*4);
5442
memset(result, 0xff, x*y*4);
5443
5444
if (!stbi__pic_load_core(s,x,y,comp, result)) {
5445
STBI_FREE(result);
5446
result=0;
5447
}
5448
*px = x;
5449
*py = y;
5450
if (req_comp == 0) req_comp = *comp;
5451
result=stbi__convert_format(result,4,req_comp,x,y);
5452
5453
return result;
5454
}
5455
5456
static int stbi__pic_test(stbi__context *s)
5457
{
5458
int r = stbi__pic_test_core(s);
5459
stbi__rewind(s);
5460
return r;
5461
}
5462
#endif
5463
5464
// *************************************************************************************************
5465
// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
5466
5467
#ifndef STBI_NO_GIF
5468
typedef struct
5469
{
5470
stbi__int16 prefix;
5471
stbi_uc first;
5472
stbi_uc suffix;
5473
} stbi__gif_lzw;
5474
5475
typedef struct
5476
{
5477
int w,h;
5478
stbi_uc *out, *old_out; // output buffer (always 4 components)
5479
int flags, bgindex, ratio, transparent, eflags, delay;
5480
stbi_uc pal[256][4];
5481
stbi_uc lpal[256][4];
5482
stbi__gif_lzw codes[4096];
5483
stbi_uc *color_table;
5484
int parse, step;
5485
int lflags;
5486
int start_x, start_y;
5487
int max_x, max_y;
5488
int cur_x, cur_y;
5489
int line_size;
5490
} stbi__gif;
5491
5492
static int stbi__gif_test_raw(stbi__context *s)
5493
{
5494
int sz;
5495
if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
5496
sz = stbi__get8(s);
5497
if (sz != '9' && sz != '7') return 0;
5498
if (stbi__get8(s) != 'a') return 0;
5499
return 1;
5500
}
5501
5502
static int stbi__gif_test(stbi__context *s)
5503
{
5504
int r = stbi__gif_test_raw(s);
5505
stbi__rewind(s);
5506
return r;
5507
}
5508
5509
static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
5510
{
5511
int i;
5512
for (i=0; i < num_entries; ++i) {
5513
pal[i][2] = stbi__get8(s);
5514
pal[i][1] = stbi__get8(s);
5515
pal[i][0] = stbi__get8(s);
5516
pal[i][3] = transp == i ? 0 : 255;
5517
}
5518
}
5519
5520
static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
5521
{
5522
stbi_uc version;
5523
if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
5524
return stbi__err("not GIF", "Corrupt GIF");
5525
5526
version = stbi__get8(s);
5527
if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF");
5528
if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF");
5529
5530
stbi__g_failure_reason = "";
5531
g->w = stbi__get16le(s);
5532
g->h = stbi__get16le(s);
5533
g->flags = stbi__get8(s);
5534
g->bgindex = stbi__get8(s);
5535
g->ratio = stbi__get8(s);
5536
g->transparent = -1;
5537
5538
if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments
5539
5540
if (is_info) return 1;
5541
5542
if (g->flags & 0x80)
5543
stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
5544
5545
return 1;
5546
}
5547
5548
static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
5549
{
5550
stbi__gif g;
5551
if (!stbi__gif_header(s, &g, comp, 1)) {
5552
stbi__rewind( s );
5553
return 0;
5554
}
5555
if (x) *x = g.w;
5556
if (y) *y = g.h;
5557
return 1;
5558
}
5559
5560
static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
5561
{
5562
stbi_uc *p, *c;
5563
5564
// recurse to decode the prefixes, since the linked-list is backwards,
5565
// and working backwards through an interleaved image would be nasty
5566
if (g->codes[code].prefix >= 0)
5567
stbi__out_gif_code(g, g->codes[code].prefix);
5568
5569
if (g->cur_y >= g->max_y) return;
5570
5571
p = &g->out[g->cur_x + g->cur_y];
5572
c = &g->color_table[g->codes[code].suffix * 4];
5573
5574
if (c[3] >= 128) {
5575
p[0] = c[2];
5576
p[1] = c[1];
5577
p[2] = c[0];
5578
p[3] = c[3];
5579
}
5580
g->cur_x += 4;
5581
5582
if (g->cur_x >= g->max_x) {
5583
g->cur_x = g->start_x;
5584
g->cur_y += g->step;
5585
5586
while (g->cur_y >= g->max_y && g->parse > 0) {
5587
g->step = (1 << g->parse) * g->line_size;
5588
g->cur_y = g->start_y + (g->step >> 1);
5589
--g->parse;
5590
}
5591
}
5592
}
5593
5594
static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
5595
{
5596
stbi_uc lzw_cs;
5597
stbi__int32 len, init_code;
5598
stbi__uint32 first;
5599
stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
5600
stbi__gif_lzw *p;
5601
5602
lzw_cs = stbi__get8(s);
5603
if (lzw_cs > 12) return NULL;
5604
clear = 1 << lzw_cs;
5605
first = 1;
5606
codesize = lzw_cs + 1;
5607
codemask = (1 << codesize) - 1;
5608
bits = 0;
5609
valid_bits = 0;
5610
for (init_code = 0; init_code < clear; init_code++) {
5611
g->codes[init_code].prefix = -1;
5612
g->codes[init_code].first = (stbi_uc) init_code;
5613
g->codes[init_code].suffix = (stbi_uc) init_code;
5614
}
5615
5616
// support no starting clear code
5617
avail = clear+2;
5618
oldcode = -1;
5619
5620
len = 0;
5621
for(;;) {
5622
if (valid_bits < codesize) {
5623
if (len == 0) {
5624
len = stbi__get8(s); // start new block
5625
if (len == 0)
5626
return g->out;
5627
}
5628
--len;
5629
bits |= (stbi__int32) stbi__get8(s) << valid_bits;
5630
valid_bits += 8;
5631
} else {
5632
stbi__int32 code = bits & codemask;
5633
bits >>= codesize;
5634
valid_bits -= codesize;
5635
// @OPTIMIZE: is there some way we can accelerate the non-clear path?
5636
if (code == clear) { // clear code
5637
codesize = lzw_cs + 1;
5638
codemask = (1 << codesize) - 1;
5639
avail = clear + 2;
5640
oldcode = -1;
5641
first = 0;
5642
} else if (code == clear + 1) { // end of stream code
5643
stbi__skip(s, len);
5644
while ((len = stbi__get8(s)) > 0)
5645
stbi__skip(s,len);
5646
return g->out;
5647
} else if (code <= avail) {
5648
if (first) return stbi__errpuc("no clear code", "Corrupt GIF");
5649
5650
if (oldcode >= 0) {
5651
p = &g->codes[avail++];
5652
if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF");
5653
p->prefix = (stbi__int16) oldcode;
5654
p->first = g->codes[oldcode].first;
5655
p->suffix = (code == avail) ? p->first : g->codes[code].first;
5656
} else if (code == avail)
5657
return stbi__errpuc("illegal code in raster", "Corrupt GIF");
5658
5659
stbi__out_gif_code(g, (stbi__uint16) code);
5660
5661
if ((avail & codemask) == 0 && avail <= 0x0FFF) {
5662
codesize++;
5663
codemask = (1 << codesize) - 1;
5664
}
5665
5666
oldcode = code;
5667
} else {
5668
return stbi__errpuc("illegal code in raster", "Corrupt GIF");
5669
}
5670
}
5671
}
5672
}
5673
5674
static void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1)
5675
{
5676
int x, y;
5677
stbi_uc *c = g->pal[g->bgindex];
5678
for (y = y0; y < y1; y += 4 * g->w) {
5679
for (x = x0; x < x1; x += 4) {
5680
stbi_uc *p = &g->out[y + x];
5681
p[0] = c[2];
5682
p[1] = c[1];
5683
p[2] = c[0];
5684
p[3] = 0;
5685
}
5686
}
5687
}
5688
5689
// this function is designed to support animated gifs, although stb_image doesn't support it
5690
static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp)
5691
{
5692
int i;
5693
stbi_uc *prev_out = 0;
5694
5695
if (g->out == 0 && !stbi__gif_header(s, g, comp,0))
5696
return 0; // stbi__g_failure_reason set by stbi__gif_header
5697
5698
prev_out = g->out;
5699
g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
5700
if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory");
5701
5702
switch ((g->eflags & 0x1C) >> 2) {
5703
case 0: // unspecified (also always used on 1st frame)
5704
stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h);
5705
break;
5706
case 1: // do not dispose
5707
if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
5708
g->old_out = prev_out;
5709
break;
5710
case 2: // dispose to background
5711
if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h);
5712
stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y);
5713
break;
5714
case 3: // dispose to previous
5715
if (g->old_out) {
5716
for (i = g->start_y; i < g->max_y; i += 4 * g->w)
5717
memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x);
5718
}
5719
break;
5720
}
5721
5722
for (;;) {
5723
switch (stbi__get8(s)) {
5724
case 0x2C: /* Image Descriptor */
5725
{
5726
int prev_trans = -1;
5727
stbi__int32 x, y, w, h;
5728
stbi_uc *o;
5729
5730
x = stbi__get16le(s);
5731
y = stbi__get16le(s);
5732
w = stbi__get16le(s);
5733
h = stbi__get16le(s);
5734
if (((x + w) > (g->w)) || ((y + h) > (g->h)))
5735
return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
5736
5737
g->line_size = g->w * 4;
5738
g->start_x = x * 4;
5739
g->start_y = y * g->line_size;
5740
g->max_x = g->start_x + w * 4;
5741
g->max_y = g->start_y + h * g->line_size;
5742
g->cur_x = g->start_x;
5743
g->cur_y = g->start_y;
5744
5745
g->lflags = stbi__get8(s);
5746
5747
if (g->lflags & 0x40) {
5748
g->step = 8 * g->line_size; // first interlaced spacing
5749
g->parse = 3;
5750
} else {
5751
g->step = g->line_size;
5752
g->parse = 0;
5753
}
5754
5755
if (g->lflags & 0x80) {
5756
stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
5757
g->color_table = (stbi_uc *) g->lpal;
5758
} else if (g->flags & 0x80) {
5759
if (g->transparent >= 0 && (g->eflags & 0x01)) {
5760
prev_trans = g->pal[g->transparent][3];
5761
g->pal[g->transparent][3] = 0;
5762
}
5763
g->color_table = (stbi_uc *) g->pal;
5764
} else
5765
return stbi__errpuc("missing color table", "Corrupt GIF");
5766
5767
o = stbi__process_gif_raster(s, g);
5768
if (o == NULL) return NULL;
5769
5770
if (prev_trans != -1)
5771
g->pal[g->transparent][3] = (stbi_uc) prev_trans;
5772
5773
return o;
5774
}
5775
5776
case 0x21: // Comment Extension.
5777
{
5778
int len;
5779
if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.
5780
len = stbi__get8(s);
5781
if (len == 4) {
5782
g->eflags = stbi__get8(s);
5783
g->delay = stbi__get16le(s);
5784
g->transparent = stbi__get8(s);
5785
} else {
5786
stbi__skip(s, len);
5787
break;
5788
}
5789
}
5790
while ((len = stbi__get8(s)) != 0)
5791
stbi__skip(s, len);
5792
break;
5793
}
5794
5795
case 0x3B: // gif stream termination code
5796
return (stbi_uc *) s; // using '1' causes warning on some compilers
5797
5798
default:
5799
return stbi__errpuc("unknown code", "Corrupt GIF");
5800
}
5801
}
5802
5803
STBI_NOTUSED(req_comp);
5804
}
5805
5806
static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
5807
{
5808
stbi_uc *u = 0;
5809
stbi__gif g;
5810
memset(&g, 0, sizeof(g));
5811
5812
u = stbi__gif_load_next(s, &g, comp, req_comp);
5813
if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
5814
if (u) {
5815
*x = g.w;
5816
*y = g.h;
5817
if (req_comp && req_comp != 4)
5818
u = stbi__convert_format(u, 4, req_comp, g.w, g.h);
5819
}
5820
else if (g.out)
5821
STBI_FREE(g.out);
5822
5823
return u;
5824
}
5825
5826
static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
5827
{
5828
return stbi__gif_info_raw(s,x,y,comp);
5829
}
5830
#endif
5831
5832
// *************************************************************************************************
5833
// Radiance RGBE HDR loader
5834
// originally by Nicolas Schulz
5835
#ifndef STBI_NO_HDR
5836
static int stbi__hdr_test_core(stbi__context *s)
5837
{
5838
const char *signature = "#?RADIANCE\n";
5839
int i;
5840
for (i=0; signature[i]; ++i)
5841
if (stbi__get8(s) != signature[i])
5842
return 0;
5843
return 1;
5844
}
5845
5846
static int stbi__hdr_test(stbi__context* s)
5847
{
5848
int r = stbi__hdr_test_core(s);
5849
stbi__rewind(s);
5850
return r;
5851
}
5852
5853
#define STBI__HDR_BUFLEN 1024
5854
static char *stbi__hdr_gettoken(stbi__context *z, char *buffer)
5855
{
5856
int len=0;
5857
char c = '\0';
5858
5859
c = (char) stbi__get8(z);
5860
5861
while (!stbi__at_eof(z) && c != '\n') {
5862
buffer[len++] = c;
5863
if (len == STBI__HDR_BUFLEN-1) {
5864
// flush to end of line
5865
while (!stbi__at_eof(z) && stbi__get8(z) != '\n')
5866
;
5867
break;
5868
}
5869
c = (char) stbi__get8(z);
5870
}
5871
5872
buffer[len] = 0;
5873
return buffer;
5874
}
5875
5876
static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
5877
{
5878
if ( input[3] != 0 ) {
5879
float f1;
5880
// Exponent
5881
f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
5882
if (req_comp <= 2)
5883
output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
5884
else {
5885
output[0] = input[0] * f1;
5886
output[1] = input[1] * f1;
5887
output[2] = input[2] * f1;
5888
}
5889
if (req_comp == 2) output[1] = 1;
5890
if (req_comp == 4) output[3] = 1;
5891
} else {
5892
switch (req_comp) {
5893
case 4: output[3] = 1; /* fallthrough */
5894
case 3: output[0] = output[1] = output[2] = 0;
5895
break;
5896
case 2: output[1] = 1; /* fallthrough */
5897
case 1: output[0] = 0;
5898
break;
5899
}
5900
}
5901
}
5902
5903
static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
5904
{
5905
char buffer[STBI__HDR_BUFLEN];
5906
char *token;
5907
int valid = 0;
5908
int width, height;
5909
stbi_uc *scanline;
5910
float *hdr_data;
5911
int len;
5912
unsigned char count, value;
5913
int i, j, k, c1,c2, z;
5914
5915
5916
// Check identifier
5917
if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0)
5918
return stbi__errpf("not HDR", "Corrupt HDR image");
5919
5920
// Parse header
5921
for(;;) {
5922
token = stbi__hdr_gettoken(s,buffer);
5923
if (token[0] == 0) break;
5924
if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
5925
}
5926
5927
if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format");
5928
5929
// Parse width and height
5930
// can't use sscanf() if we're not using stdio!
5931
token = stbi__hdr_gettoken(s,buffer);
5932
if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
5933
token += 3;
5934
height = (int) strtol(token, &token, 10);
5935
while (*token == ' ') ++token;
5936
if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
5937
token += 3;
5938
width = (int) strtol(token, NULL, 10);
5939
5940
*x = width;
5941
*y = height;
5942
5943
if (comp) *comp = 3;
5944
if (req_comp == 0) req_comp = 3;
5945
5946
// Read data
5947
hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float));
5948
5949
// Load image data
5950
// image data is stored as some number of sca
5951
if ( width < 8 || width >= 32768) {
5952
// Read flat data
5953
for (j=0; j < height; ++j) {
5954
for (i=0; i < width; ++i) {
5955
stbi_uc rgbe[4];
5956
main_decode_loop:
5957
stbi__getn(s, rgbe, 4);
5958
stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
5959
}
5960
}
5961
} else {
5962
// Read RLE-encoded data
5963
scanline = NULL;
5964
5965
for (j = 0; j < height; ++j) {
5966
c1 = stbi__get8(s);
5967
c2 = stbi__get8(s);
5968
len = stbi__get8(s);
5969
if (c1 != 2 || c2 != 2 || (len & 0x80)) {
5970
// not run-length encoded, so we have to actually use THIS data as a decoded
5971
// pixel (note this can't be a valid pixel--one of RGB must be >= 128)
5972
stbi_uc rgbe[4];
5973
rgbe[0] = (stbi_uc) c1;
5974
rgbe[1] = (stbi_uc) c2;
5975
rgbe[2] = (stbi_uc) len;
5976
rgbe[3] = (stbi_uc) stbi__get8(s);
5977
stbi__hdr_convert(hdr_data, rgbe, req_comp);
5978
i = 1;
5979
j = 0;
5980
STBI_FREE(scanline);
5981
goto main_decode_loop; // yes, this makes no sense
5982
}
5983
len <<= 8;
5984
len |= stbi__get8(s);
5985
if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
5986
if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4);
5987
5988
for (k = 0; k < 4; ++k) {
5989
i = 0;
5990
while (i < width) {
5991
count = stbi__get8(s);
5992
if (count > 128) {
5993
// Run
5994
value = stbi__get8(s);
5995
count -= 128;
5996
for (z = 0; z < count; ++z)
5997
scanline[i++ * 4 + k] = value;
5998
} else {
5999
// Dump
6000
for (z = 0; z < count; ++z)
6001
scanline[i++ * 4 + k] = stbi__get8(s);
6002
}
6003
}
6004
}
6005
for (i=0; i < width; ++i)
6006
stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
6007
}
6008
STBI_FREE(scanline);
6009
}
6010
6011
return hdr_data;
6012
}
6013
6014
static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
6015
{
6016
char buffer[STBI__HDR_BUFLEN];
6017
char *token;
6018
int valid = 0;
6019
6020
if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) {
6021
stbi__rewind( s );
6022
return 0;
6023
}
6024
6025
for(;;) {
6026
token = stbi__hdr_gettoken(s,buffer);
6027
if (token[0] == 0) break;
6028
if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
6029
}
6030
6031
if (!valid) {
6032
stbi__rewind( s );
6033
return 0;
6034
}
6035
token = stbi__hdr_gettoken(s,buffer);
6036
if (strncmp(token, "-Y ", 3)) {
6037
stbi__rewind( s );
6038
return 0;
6039
}
6040
token += 3;
6041
*y = (int) strtol(token, &token, 10);
6042
while (*token == ' ') ++token;
6043
if (strncmp(token, "+X ", 3)) {
6044
stbi__rewind( s );
6045
return 0;
6046
}
6047
token += 3;
6048
*x = (int) strtol(token, NULL, 10);
6049
*comp = 3;
6050
return 1;
6051
}
6052
#endif // STBI_NO_HDR
6053
6054
#ifndef STBI_NO_BMP
6055
static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
6056
{
6057
int hsz;
6058
if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') {
6059
stbi__rewind( s );
6060
return 0;
6061
}
6062
stbi__skip(s,12);
6063
hsz = stbi__get32le(s);
6064
if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
6065
stbi__rewind( s );
6066
return 0;
6067
}
6068
if (hsz == 12) {
6069
*x = stbi__get16le(s);
6070
*y = stbi__get16le(s);
6071
} else {
6072
*x = stbi__get32le(s);
6073
*y = stbi__get32le(s);
6074
}
6075
if (stbi__get16le(s) != 1) {
6076
stbi__rewind( s );
6077
return 0;
6078
}
6079
*comp = stbi__get16le(s) / 8;
6080
return 1;
6081
}
6082
#endif
6083
6084
#ifndef STBI_NO_PSD
6085
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
6086
{
6087
int channelCount;
6088
if (stbi__get32be(s) != 0x38425053) {
6089
stbi__rewind( s );
6090
return 0;
6091
}
6092
if (stbi__get16be(s) != 1) {
6093
stbi__rewind( s );
6094
return 0;
6095
}
6096
stbi__skip(s, 6);
6097
channelCount = stbi__get16be(s);
6098
if (channelCount < 0 || channelCount > 16) {
6099
stbi__rewind( s );
6100
return 0;
6101
}
6102
*y = stbi__get32be(s);
6103
*x = stbi__get32be(s);
6104
if (stbi__get16be(s) != 8) {
6105
stbi__rewind( s );
6106
return 0;
6107
}
6108
if (stbi__get16be(s) != 3) {
6109
stbi__rewind( s );
6110
return 0;
6111
}
6112
*comp = 4;
6113
return 1;
6114
}
6115
#endif
6116
6117
#ifndef STBI_NO_PIC
6118
static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
6119
{
6120
int act_comp=0,num_packets=0,chained;
6121
stbi__pic_packet packets[10];
6122
6123
if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {
6124
stbi__rewind(s);
6125
return 0;
6126
}
6127
6128
stbi__skip(s, 88);
6129
6130
*x = stbi__get16be(s);
6131
*y = stbi__get16be(s);
6132
if (stbi__at_eof(s)) {
6133
stbi__rewind( s);
6134
return 0;
6135
}
6136
if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
6137
stbi__rewind( s );
6138
return 0;
6139
}
6140
6141
stbi__skip(s, 8);
6142
6143
do {
6144
stbi__pic_packet *packet;
6145
6146
if (num_packets==sizeof(packets)/sizeof(packets[0]))
6147
return 0;
6148
6149
packet = &packets[num_packets++];
6150
chained = stbi__get8(s);
6151
packet->size = stbi__get8(s);
6152
packet->type = stbi__get8(s);
6153
packet->channel = stbi__get8(s);
6154
act_comp |= packet->channel;
6155
6156
if (stbi__at_eof(s)) {
6157
stbi__rewind( s );
6158
return 0;
6159
}
6160
if (packet->size != 8) {
6161
stbi__rewind( s );
6162
return 0;
6163
}
6164
} while (chained);
6165
6166
*comp = (act_comp & 0x10 ? 4 : 3);
6167
6168
return 1;
6169
}
6170
#endif
6171
6172
// *************************************************************************************************
6173
// Portable Gray Map and Portable Pixel Map loader
6174
// by Ken Miller
6175
//
6176
// PGM: http://netpbm.sourceforge.net/doc/pgm.html
6177
// PPM: http://netpbm.sourceforge.net/doc/ppm.html
6178
//
6179
// Known limitations:
6180
// Does not support comments in the header section
6181
// Does not support ASCII image data (formats P2 and P3)
6182
// Does not support 16-bit-per-channel
6183
6184
#ifndef STBI_NO_PNM
6185
6186
static int stbi__pnm_test(stbi__context *s)
6187
{
6188
char p, t;
6189
p = (char) stbi__get8(s);
6190
t = (char) stbi__get8(s);
6191
if (p != 'P' || (t != '5' && t != '6')) {
6192
stbi__rewind( s );
6193
return 0;
6194
}
6195
return 1;
6196
}
6197
6198
static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
6199
{
6200
stbi_uc *out;
6201
if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n))
6202
return 0;
6203
*x = s->img_x;
6204
*y = s->img_y;
6205
*comp = s->img_n;
6206
6207
out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y);
6208
if (!out) return stbi__errpuc("outofmem", "Out of memory");
6209
stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
6210
6211
if (req_comp && req_comp != s->img_n) {
6212
out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
6213
if (out == NULL) return out; // stbi__convert_format frees input on failure
6214
}
6215
return out;
6216
}
6217
6218
static int stbi__pnm_isspace(char c)
6219
{
6220
return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
6221
}
6222
6223
static void stbi__pnm_skip_whitespace(stbi__context *s, char *c)
6224
{
6225
while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
6226
*c = (char) stbi__get8(s);
6227
}
6228
6229
static int stbi__pnm_isdigit(char c)
6230
{
6231
return c >= '0' && c <= '9';
6232
}
6233
6234
static int stbi__pnm_getinteger(stbi__context *s, char *c)
6235
{
6236
int value = 0;
6237
6238
while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
6239
value = value*10 + (*c - '0');
6240
*c = (char) stbi__get8(s);
6241
}
6242
6243
return value;
6244
}
6245
6246
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
6247
{
6248
int maxv;
6249
char c, p, t;
6250
6251
stbi__rewind( s );
6252
6253
// Get identifier
6254
p = (char) stbi__get8(s);
6255
t = (char) stbi__get8(s);
6256
if (p != 'P' || (t != '5' && t != '6')) {
6257
stbi__rewind( s );
6258
return 0;
6259
}
6260
6261
*comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm
6262
6263
c = (char) stbi__get8(s);
6264
stbi__pnm_skip_whitespace(s, &c);
6265
6266
*x = stbi__pnm_getinteger(s, &c); // read width
6267
stbi__pnm_skip_whitespace(s, &c);
6268
6269
*y = stbi__pnm_getinteger(s, &c); // read height
6270
stbi__pnm_skip_whitespace(s, &c);
6271
6272
maxv = stbi__pnm_getinteger(s, &c); // read max value
6273
6274
if (maxv > 255)
6275
return stbi__err("max value > 255", "PPM image not 8-bit");
6276
else
6277
return 1;
6278
}
6279
#endif
6280
6281
static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
6282
{
6283
#ifndef STBI_NO_JPEG
6284
if (stbi__jpeg_info(s, x, y, comp)) return 1;
6285
#endif
6286
6287
#ifndef STBI_NO_PNG
6288
if (stbi__png_info(s, x, y, comp)) return 1;
6289
#endif
6290
6291
#ifndef STBI_NO_GIF
6292
if (stbi__gif_info(s, x, y, comp)) return 1;
6293
#endif
6294
6295
#ifndef STBI_NO_BMP
6296
if (stbi__bmp_info(s, x, y, comp)) return 1;
6297
#endif
6298
6299
#ifndef STBI_NO_PSD
6300
if (stbi__psd_info(s, x, y, comp)) return 1;
6301
#endif
6302
6303
#ifndef STBI_NO_PIC
6304
if (stbi__pic_info(s, x, y, comp)) return 1;
6305
#endif
6306
6307
#ifndef STBI_NO_PNM
6308
if (stbi__pnm_info(s, x, y, comp)) return 1;
6309
#endif
6310
6311
#ifndef STBI_NO_HDR
6312
if (stbi__hdr_info(s, x, y, comp)) return 1;
6313
#endif
6314
6315
// test tga last because it's a crappy test!
6316
#ifndef STBI_NO_TGA
6317
if (stbi__tga_info(s, x, y, comp))
6318
return 1;
6319
#endif
6320
return stbi__err("unknown image type", "Image not of any known type, or corrupt");
6321
}
6322
6323
#ifndef STBI_NO_STDIO
6324
STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
6325
{
6326
FILE *f = stbi__fopen(filename, "rb");
6327
int result;
6328
if (!f) return stbi__err("can't fopen", "Unable to open file");
6329
result = stbi_info_from_file(f, x, y, comp);
6330
fclose(f);
6331
return result;
6332
}
6333
6334
STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
6335
{
6336
int r;
6337
stbi__context s;
6338
long pos = ftell(f);
6339
stbi__start_file(&s, f);
6340
r = stbi__info_main(&s,x,y,comp);
6341
fseek(f,pos,SEEK_SET);
6342
return r;
6343
}
6344
#endif // !STBI_NO_STDIO
6345
6346
STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
6347
{
6348
stbi__context s;
6349
stbi__start_mem(&s,buffer,len);
6350
return stbi__info_main(&s,x,y,comp);
6351
}
6352
6353
STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)
6354
{
6355
stbi__context s;
6356
stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
6357
return stbi__info_main(&s,x,y,comp);
6358
}
6359
6360
#endif // STB_IMAGE_IMPLEMENTATION
6361
6362
/*
6363
revision history:
6364
2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
6365
2.07 (2015-09-13) fix compiler warnings
6366
partial animated GIF support
6367
limited 16-bit PSD support
6368
#ifdef unused functions
6369
bug with < 92 byte PIC,PNM,HDR,TGA
6370
2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value
6371
2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning
6372
2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit
6373
2.03 (2015-04-12) extra corruption checking (mmozeiko)
6374
stbi_set_flip_vertically_on_load (nguillemot)
6375
fix NEON support; fix mingw support
6376
2.02 (2015-01-19) fix incorrect assert, fix warning
6377
2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2
6378
2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
6379
2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)
6380
progressive JPEG (stb)
6381
PGM/PPM support (Ken Miller)
6382
STBI_MALLOC,STBI_REALLOC,STBI_FREE
6383
GIF bugfix -- seemingly never worked
6384
STBI_NO_*, STBI_ONLY_*
6385
1.48 (2014-12-14) fix incorrectly-named assert()
6386
1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)
6387
optimize PNG (ryg)
6388
fix bug in interlaced PNG with user-specified channel count (stb)
6389
1.46 (2014-08-26)
6390
fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG
6391
1.45 (2014-08-16)
6392
fix MSVC-ARM internal compiler error by wrapping malloc
6393
1.44 (2014-08-07)
6394
various warning fixes from Ronny Chevalier
6395
1.43 (2014-07-15)
6396
fix MSVC-only compiler problem in code changed in 1.42
6397
1.42 (2014-07-09)
6398
don't define _CRT_SECURE_NO_WARNINGS (affects user code)
6399
fixes to stbi__cleanup_jpeg path
6400
added STBI_ASSERT to avoid requiring assert.h
6401
1.41 (2014-06-25)
6402
fix search&replace from 1.36 that messed up comments/error messages
6403
1.40 (2014-06-22)
6404
fix gcc struct-initialization warning
6405
1.39 (2014-06-15)
6406
fix to TGA optimization when req_comp != number of components in TGA;
6407
fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)
6408
add support for BMP version 5 (more ignored fields)
6409
1.38 (2014-06-06)
6410
suppress MSVC warnings on integer casts truncating values
6411
fix accidental rename of 'skip' field of I/O
6412
1.37 (2014-06-04)
6413
remove duplicate typedef
6414
1.36 (2014-06-03)
6415
convert to header file single-file library
6416
if de-iphone isn't set, load iphone images color-swapped instead of returning NULL
6417
1.35 (2014-05-27)
6418
various warnings
6419
fix broken STBI_SIMD path
6420
fix bug where stbi_load_from_file no longer left file pointer in correct place
6421
fix broken non-easy path for 32-bit BMP (possibly never used)
6422
TGA optimization by Arseny Kapoulkine
6423
1.34 (unknown)
6424
use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case
6425
1.33 (2011-07-14)
6426
make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements
6427
1.32 (2011-07-13)
6428
support for "info" function for all supported filetypes (SpartanJ)
6429
1.31 (2011-06-20)
6430
a few more leak fixes, bug in PNG handling (SpartanJ)
6431
1.30 (2011-06-11)
6432
added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)
6433
removed deprecated format-specific test/load functions
6434
removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway
6435
error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)
6436
fix inefficiency in decoding 32-bit BMP (David Woo)
6437
1.29 (2010-08-16)
6438
various warning fixes from Aurelien Pocheville
6439
1.28 (2010-08-01)
6440
fix bug in GIF palette transparency (SpartanJ)
6441
1.27 (2010-08-01)
6442
cast-to-stbi_uc to fix warnings
6443
1.26 (2010-07-24)
6444
fix bug in file buffering for PNG reported by SpartanJ
6445
1.25 (2010-07-17)
6446
refix trans_data warning (Won Chun)
6447
1.24 (2010-07-12)
6448
perf improvements reading from files on platforms with lock-heavy fgetc()
6449
minor perf improvements for jpeg
6450
deprecated type-specific functions so we'll get feedback if they're needed
6451
attempt to fix trans_data warning (Won Chun)
6452
1.23 fixed bug in iPhone support
6453
1.22 (2010-07-10)
6454
removed image *writing* support
6455
stbi_info support from Jetro Lauha
6456
GIF support from Jean-Marc Lienher
6457
iPhone PNG-extensions from James Brown
6458
warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)
6459
1.21 fix use of 'stbi_uc' in header (reported by jon blow)
6460
1.20 added support for Softimage PIC, by Tom Seddon
6461
1.19 bug in interlaced PNG corruption check (found by ryg)
6462
1.18 (2008-08-02)
6463
fix a threading bug (local mutable static)
6464
1.17 support interlaced PNG
6465
1.16 major bugfix - stbi__convert_format converted one too many pixels
6466
1.15 initialize some fields for thread safety
6467
1.14 fix threadsafe conversion bug
6468
header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
6469
1.13 threadsafe
6470
1.12 const qualifiers in the API
6471
1.11 Support installable IDCT, colorspace conversion routines
6472
1.10 Fixes for 64-bit (don't use "unsigned long")
6473
optimized upsampling by Fabian "ryg" Giesen
6474
1.09 Fix format-conversion for PSD code (bad global variables!)
6475
1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz
6476
1.07 attempt to fix C++ warning/errors again
6477
1.06 attempt to fix C++ warning/errors again
6478
1.05 fix TGA loading to return correct *comp and use good luminance calc
6479
1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free
6480
1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR
6481
1.02 support for (subset of) HDR files, float interface for preferred access to them
6482
1.01 fix bug: possible bug in handling right-side up bmps... not sure
6483
fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all
6484
1.00 interface to zlib that skips zlib header
6485
0.99 correct handling of alpha in palette
6486
0.98 TGA loader by lonesock; dynamically add loaders (untested)
6487
0.97 jpeg errors on too large a file; also catch another malloc failure
6488
0.96 fix detection of invalid v value - particleman@mollyrocket forum
6489
0.95 during header scan, seek to markers in case of padding
6490
0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same
6491
0.93 handle jpegtran output; verbose errors
6492
0.92 read 4,8,16,24,32-bit BMP files of several formats
6493
0.91 output 24-bit Windows 3.0 BMP files
6494
0.90 fix a few more warnings; bump version number to approach 1.0
6495
0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd
6496
0.60 fix compiling as c++
6497
0.59 fix warnings: merge Dave Moore's -Wall fixes
6498
0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian
6499
0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available
6500
0.56 fix bug: zlib uncompressed mode len vs. nlen
6501
0.55 fix bug: restart_interval not initialized to 0
6502
0.54 allow NULL for 'int *comp'
6503
0.53 fix bug in png 3->4; speedup png decoding
6504
0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments
6505
0.51 obey req_comp requests, 1-component jpegs return as 1-component,
6506
on 'test' only check type, not whether we support this variant
6507
0.50 (2006-11-19)
6508
first released version
6509
*/
6510
6511