annotate src/stb_image.c @ 893:83a8881c782b

Import newer version of stb_image.
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 05 Feb 2015 04:21:30 +0200
parents 2711f99b40e5
children 63fd1801f983
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1 /* stb_image - v2.02 - public domain image loader - http://nothings.org/stb_image.h
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2 no warranty implied; use at your own risk
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4 Do this:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5 #define STB_IMAGE_IMPLEMENTATION
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6 before you include this file in *one* C or C++ file to create the implementation.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
7
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
8 // i.e. it should look like this:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
9 #include ...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
10 #include ...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
11 #include ...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
12 #define STB_IMAGE_IMPLEMENTATION
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
13 #include "stb_image.h"
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
14
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
15 You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
16 And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
17
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
18
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
19 QUICK NOTES:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
20 Primarily of interest to game developers and other people who can
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
21 avoid problematic images and only need the trivial interface
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
22
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
23 JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
24 PNG 1/2/4/8-bit-per-channel (16 bpc not supported)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
25
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
26 TGA (not sure what subset, if a subset)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
27 BMP non-1bpp, non-RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
28 PSD (composited view only, no extra channels)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
29
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
30 GIF (*comp always reports as 4-channel)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
31 HDR (radiance rgbE format)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
32 PIC (Softimage PIC)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
33 PNM (PPM and PGM binary only)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
34
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
35 - decode from memory or through FILE (define STBI_NO_STDIO to remove code)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
36 - decode from arbitrary I/O callbacks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
37 - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
38
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
39 Full documentation under "DOCUMENTATION" below.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
40
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
41
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
42 Revision 2.00 release notes:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
43
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
44 - Progressive JPEG is now supported.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
45
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
46 - PPM and PGM binary formats are now supported, thanks to Ken Miller.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
47
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
48 - x86 platforms now make use of SSE2 SIMD instructions for
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
49 JPEG decoding, and ARM platforms can use NEON SIMD if requested.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
50 This work was done by Fabian "ryg" Giesen. SSE2 is used by
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
51 default, but NEON must be enabled explicitly; see docs.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
52
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
53 With other JPEG optimizations included in this version, we see
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
54 2x speedup on a JPEG on an x86 machine, and a 1.5x speedup
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
55 on a JPEG on an ARM machine, relative to previous versions of this
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
56 library. The same results will not obtain for all JPGs and for all
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
57 x86/ARM machines. (Note that progressive JPEGs are significantly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
58 slower to decode than regular JPEGs.) This doesn't mean that this
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
59 is the fastest JPEG decoder in the land; rather, it brings it
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
60 closer to parity with standard libraries. If you want the fastest
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
61 decode, look elsewhere. (See "Philosophy" section of docs below.)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
62
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
63 See final bullet items below for more info on SIMD.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
64
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
65 - Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
66 the memory allocator. Unlike other STBI libraries, these macros don't
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
67 support a context parameter, so if you need to pass a context in to
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
68 the allocator, you'll have to store it in a global or a thread-local
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
69 variable.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
70
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
71 - Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
72 STBI_NO_LINEAR.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
73 STBI_NO_HDR: suppress implementation of .hdr reader format
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
74 STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
75
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
76 - You can suppress implementation of any of the decoders to reduce
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
77 your code footprint by #defining one or more of the following
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
78 symbols before creating the implementation.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
79
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
80 STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
81 STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
82 STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
83 STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
84 STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
85 STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
86 STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
87 STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
88 STBI_NO_PNM (.ppm and .pgm)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
89
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
90 - You can request *only* certain decoders and suppress all other ones
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
91 (this will be more forward-compatible, as addition of new decoders
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
92 doesn't require you to disable them explicitly):
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
93
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
94 STBI_ONLY_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
95 STBI_ONLY_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
96 STBI_ONLY_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
97 STBI_ONLY_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
98 STBI_ONLY_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
99 STBI_ONLY_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
100 STBI_ONLY_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
101 STBI_ONLY_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
102 STBI_ONLY_PNM (.ppm and .pgm)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
103
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
104 Note that you can define multiples of these, and you will get all
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
105 of them ("only x" and "only y" is interpreted to mean "only x&y").
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
106
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
107 - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
108 want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
109
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
110 - Compilation of all SIMD code can be suppressed with
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
111 #define STBI_NO_SIMD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
112 It should not be necessary to disable SIMD unless you have issues
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
113 compiling (e.g. using an x86 compiler which doesn't support SSE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
114 intrinsics or that doesn't support the method used to detect
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
115 SSE2 support at run-time), and even those can be reported as
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
116 bugs so I can refine the built-in compile-time checking to be
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
117 smarter.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
118
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
119 - The old STBI_SIMD system which allowed installing a user-defined
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
120 IDCT etc. has been removed. If you need this, don't upgrade. My
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
121 assumption is that almost nobody was doing this, and those who
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
122 were will find the built-in SIMD more satisfactory anyway.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
123
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
124 - RGB values computed for JPEG images are slightly different from
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
125 previous versions of stb_image. (This is due to using less
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
126 integer precision in SIMD.) The C code has been adjusted so
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
127 that the same RGB values will be computed regardless of whether
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
128 SIMD support is available, so your app should always produce
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
129 consistent results. But these results are slightly different from
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
130 previous versions. (Specifically, about 3% of available YCbCr values
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
131 will compute different RGB results from pre-1.49 versions by +-1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
132 most of the deviating values are one smaller in the G channel.)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
133
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
134 - If you must produce consistent results with previous versions of
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
135 stb_image, #define STBI_JPEG_OLD and you will get the same results
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
136 you used to; however, you will not get the SIMD speedups for
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
137 the YCbCr-to-RGB conversion step (although you should still see
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
138 significant JPEG speedup from the other changes).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
139
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
140 Please note that STBI_JPEG_OLD is a temporary feature; it will be
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
141 removed in future versions of the library. It is only intended for
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
142 near-term back-compatibility use.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
143
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
144
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
145 Latest revision history:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
146 2.02 (2015-01-19) fix incorrect assert, fix warning
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
147 2.01 (2015-01-17) fix various warnings
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
148 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
149 2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
150 progressive JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
151 PGM/PPM support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
152 STBI_MALLOC,STBI_REALLOC,STBI_FREE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
153 STBI_NO_*, STBI_ONLY_*
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
154 GIF bugfix
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
155 1.48 (2014-12-14) fix incorrectly-named assert()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
156 1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
157 optimize PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
158 fix bug in interlaced PNG with user-specified channel count
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
159 1.46 (2014-08-26) fix broken tRNS chunk in non-paletted PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
160 1.45 (2014-08-16) workaround MSVC-ARM internal compiler error by wrapping malloc
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
161
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
162 See end of file for full revision history.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
163
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
164
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
165 ============================ Contributors =========================
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
166
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
167 Image formats Bug fixes & warning fixes
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
168 Sean Barrett (jpeg, png, bmp) Marc LeBlanc
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
169 Nicolas Schulz (hdr, psd) Christpher Lloyd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
170 Jonathan Dummer (tga) Dave Moore
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
171 Jean-Marc Lienher (gif) Won Chun
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
172 Tom Seddon (pic) the Horde3D community
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
173 Thatcher Ulrich (psd) Janez Zemva
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
174 Ken Miller (pgm, ppm) Jonathan Blow
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
175 Laurent Gomila
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
176 Aruelien Pocheville
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
177 Extensions, features Ryamond Barbiero
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
178 Jetro Lauha (stbi_info) David Woo
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
179 Martin "SpartanJ" Golini (stbi_info) Martin Golini
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
180 James "moose2000" Brown (iPhone PNG) Roy Eltham
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
181 Ben "Disch" Wenger (io callbacks) Luke Graham
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
182 Omar Cornut (1/2/4-bit PNG) Thomas Ruf
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
183 John Bartholomew
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
184 Ken Hamada
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
185 Optimizations & bugfixes Cort Stratton
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
186 Fabian "ryg" Giesen Blazej Dariusz Roszkowski
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
187 Arseny Kapoulkine Thibault Reuille
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
188 Paul Du Bois
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
189 Guillaume George
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
190 If your name should be here but Jerry Jansson
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
191 isn't, let Sean know. Hayaki Saito
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
192 Johan Duparc
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
193 Ronny Chevalier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
194 Michal Cichon
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
195 Tero Hanninen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
196 Sergio Gonzalez
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
197 Cass Everitt
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
198 Engin Manap
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
199
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
200 License:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
201 This software is in the public domain. Where that dedication is not
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
202 recognized, you are granted a perpetual, irrevocable license to copy
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
203 and modify this file however you want.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
204
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
205 */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
206
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
207 #ifndef STBI_INCLUDE_STB_IMAGE_H
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
208 #define STBI_INCLUDE_STB_IMAGE_H
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
209
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
210 // DOCUMENTATION
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
211 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
212 // Limitations:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
213 // - no 16-bit-per-channel PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
214 // - no 12-bit-per-channel JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
215 // - no JPEGs with arithmetic coding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
216 // - no 1-bit BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
217 // - GIF always returns *comp=4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
218 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
219 // Basic usage (see HDR discussion below for HDR usage):
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
220 // int x,y,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
221 // unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
222 // // ... process data if not NULL ...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
223 // // ... x = width, y = height, n = # 8-bit components per pixel ...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
224 // // ... replace '0' with '1'..'4' to force that many components per pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
225 // // ... but 'n' will always be the number that it would have been if you said 0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
226 // stbi_image_free(data)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
227 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
228 // Standard parameters:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
229 // int *x -- outputs image width in pixels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
230 // int *y -- outputs image height in pixels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
231 // int *comp -- outputs # of image components in image file
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
232 // int req_comp -- if non-zero, # of image components requested in result
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
233 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
234 // The return value from an image loader is an 'unsigned char *' which points
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
235 // to the pixel data, or NULL on an allocation failure or if the image is
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
236 // corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
237 // with each pixel consisting of N interleaved 8-bit components; the first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
238 // pixel pointed to is top-left-most in the image. There is no padding between
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
239 // image scanlines or between pixels, regardless of format. The number of
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
240 // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
241 // If req_comp is non-zero, *comp has the number of components that _would_
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
242 // have been output otherwise. E.g. if you set req_comp to 4, you will always
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
243 // get RGBA output, but you can check *comp to see if it's trivially opaque
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
244 // because e.g. there were only 3 channels in the source image.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
245 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
246 // An output image with N components has the following components interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
247 // in this order in each pixel:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
248 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
249 // N=#comp components
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
250 // 1 grey
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
251 // 2 grey, alpha
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
252 // 3 red, green, blue
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
253 // 4 red, green, blue, alpha
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
254 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
255 // If image loading fails for any reason, the return value will be NULL,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
256 // and *x, *y, *comp will be unchanged. The function stbi_failure_reason()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
257 // can be queried for an extremely brief, end-user unfriendly explanation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
258 // of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
259 // compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
260 // more user-friendly ones.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
261 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
262 // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
263 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
264 // ===========================================================================
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
265 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
266 // Philosophy
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
267 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
268 // stb libraries are designed with the following priorities:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
269 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
270 // 1. easy to use
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
271 // 2. easy to maintain
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
272 // 3. good performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
273 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
274 // Sometimes I let "good performance" creep up in priority over "easy to maintain",
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
275 // and for best performance I may provide less-easy-to-use APIs that give higher
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
276 // performance, in addition to the easy to use ones. Nevertheless, it's important
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
277 // to keep in mind that from the standpoint of you, a client of this library,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
278 // all you care about is #1 and #3, and stb libraries do not emphasize #3 above all.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
279 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
280 // Some secondary priorities arise directly from the first two, some of which
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
281 // make more explicit reasons why performance can't be emphasized.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
282 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
283 // - Portable ("ease of use")
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
284 // - Small footprint ("easy to maintain")
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
285 // - No dependencies ("ease of use")
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
286 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
287 // ===========================================================================
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
288 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
289 // I/O callbacks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
290 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
291 // I/O callbacks allow you to read from arbitrary sources, like packaged
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
292 // files or some other source. Data read from callbacks are processed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
293 // through a small internal buffer (currently 128 bytes) to try to reduce
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
294 // overhead.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
295 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
296 // The three functions you must define are "read" (reads some bytes of data),
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
297 // "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
298 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
299 // ===========================================================================
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
300 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
301 // SIMD support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
302 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
303 // The JPEG decoder will try to automatically use SIMD kernels on x86 when
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
304 // supported by the compiler. For ARM Neon support, you must explicitly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
305 // request it.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
306 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
307 // (The old do-it-yourself SIMD API is no longer supported in the current
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
308 // code.)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
309 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
310 // On x86, SSE2 will automatically be used when available based on a run-time
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
311 // test; if not, the generic C versions are used as a fall-back. On ARM targets,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
312 // the typical path is to have separate builds for NEON and non-NEON devices
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
313 // (at least this is true for iOS and Android). Therefore, the NEON support is
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
314 // toggled by a build flag: define STBI_NEON to get NEON loops.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
315 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
316 // The output of the JPEG decoder is slightly different from versions where
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
317 // SIMD support was introduced (that is, for versions before 1.49). The
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
318 // difference is only +-1 in the 8-bit RGB channels, and only on a small
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
319 // fraction of pixels. You can force the pre-1.49 behavior by defining
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
320 // STBI_JPEG_OLD, but this will disable some of the SIMD decoding path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
321 // and hence cost some performance.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
322 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
323 // If for some reason you do not want to use any of SIMD code, or if
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
324 // you have issues compiling it, you can disable it entirely by
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
325 // defining STBI_NO_SIMD.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
326 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
327 // ===========================================================================
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
328 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
329 // HDR image support (disable by defining STBI_NO_HDR)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
330 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
331 // stb_image now supports loading HDR images in general, and currently
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
332 // the Radiance .HDR file format, although the support is provided
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
333 // generically. You can still load any file through the existing interface;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
334 // if you attempt to load an HDR file, it will be automatically remapped to
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
335 // LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
336 // both of these constants can be reconfigured through this interface:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
337 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
338 // stbi_hdr_to_ldr_gamma(2.2f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
339 // stbi_hdr_to_ldr_scale(1.0f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
340 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
341 // (note, do not use _inverse_ constants; stbi_image will invert them
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
342 // appropriately).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
343 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
344 // Additionally, there is a new, parallel interface for loading files as
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
345 // (linear) floats to preserve the full dynamic range:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
346 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
347 // float *data = stbi_loadf(filename, &x, &y, &n, 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
348 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
349 // If you load LDR images through this interface, those images will
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
350 // be promoted to floating point values, run through the inverse of
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
351 // constants corresponding to the above:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
352 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
353 // stbi_ldr_to_hdr_scale(1.0f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
354 // stbi_ldr_to_hdr_gamma(2.2f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
355 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
356 // Finally, given a filename (or an open file or memory block--see header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
357 // file for details) containing image data, you can query for the "most
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
358 // appropriate" interface to use (that is, whether the image is HDR or
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
359 // not), using:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
360 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
361 // stbi_is_hdr(char *filename);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
362 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
363 // ===========================================================================
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
364 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
365 // iPhone PNG support:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
366 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
367 // By default we convert iphone-formatted PNGs back to RGB, even though
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
368 // they are internally encoded differently. You can disable this conversion
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
369 // by by calling stbi_convert_iphone_png_to_rgb(0), in which case
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
370 // you will always just get the native iphone "format" through (which
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
371 // is BGR stored in RGB).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
372 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
373 // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
374 // pixel to remove any premultiplied alpha *only* if the image file explicitly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
375 // says there's premultiplied data (currently only happens in iPhone images,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
376 // and only if iPhone convert-to-rgb processing is on).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
377 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
378
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
379
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
380 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
381 #include <stdio.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
382 #endif // STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
383
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
384 #define STBI_VERSION 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
385
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
386 enum
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
387 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
388 STBI_default = 0, // only used for req_comp
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
389
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
390 STBI_grey = 1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
391 STBI_grey_alpha = 2,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
392 STBI_rgb = 3,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
393 STBI_rgb_alpha = 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
394 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
395
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
396 typedef unsigned char stbi_uc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
397
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
398 #ifdef __cplusplus
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
399 extern "C" {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
400 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
401
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
402 #ifdef STB_IMAGE_STATIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
403 #define STBIDEF static
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
404 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
405 #define STBIDEF extern
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
406 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
407
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
408 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
409 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
410 // PRIMARY API - works on images of any type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
411 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
412
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
413 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
414 // load image by filename, open file, or memory buffer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
415 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
416
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
417 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
418 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
419 int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
420 void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
421 int (*eof) (void *user); // returns nonzero if we are at end of file/data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
422 } stbi_io_callbacks;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
423
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
424 STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
425 STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
426 STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
427
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
428 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
429 STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
430 // for stbi_load_from_file, file pointer is left pointing immediately after image
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
431 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
432
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
433 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
434 STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
435 STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
436 STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
437
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
438 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
439 STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
440 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
441 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
442
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
443 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
444 STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
445 STBIDEF void stbi_hdr_to_ldr_scale(float scale);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
446 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
447
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
448 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
449 STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
450 STBIDEF void stbi_ldr_to_hdr_scale(float scale);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
451 #endif // STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
452
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
453 // stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
454 STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
455 STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
456 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
457 STBIDEF int stbi_is_hdr (char const *filename);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
458 STBIDEF int stbi_is_hdr_from_file(FILE *f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
459 #endif // STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
460
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
461
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
462 // get a VERY brief reason for failure
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
463 // NOT THREADSAFE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
464 STBIDEF const char *stbi_failure_reason (void);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
465
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
466 // free the loaded image -- this is just free()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
467 STBIDEF void stbi_image_free (void *retval_from_stbi_load);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
468
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
469 // get image dimensions & components without fully decoding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
470 STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
471 STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
472
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
473 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
474 STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
475 STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
476
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
477 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
478
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
479
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
480
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
481 // for image formats that explicitly notate that they have premultiplied alpha,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
482 // we just return the colors as stored in the file. set this flag to force
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
483 // unpremultiplication. results are undefined if the unpremultiply overflow.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
484 STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
485
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
486 // indicate whether we should process iphone images back to canonical format,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
487 // or just pass them through "as-is"
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
488 STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
489
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
490
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
491 // ZLIB client - used by PNG, available for other purposes
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
492
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
493 STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
494 STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
495 STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
496 STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
497
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
498 STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
499 STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
500
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
501
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
502 #ifdef __cplusplus
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
503 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
504 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
505
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
506 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
507 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
508 //// end header file /////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
509 #endif // STBI_INCLUDE_STB_IMAGE_H
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
510
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
511 #ifdef STB_IMAGE_IMPLEMENTATION
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
512
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
513 #if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
514 || defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
515 || defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
516 || defined(STBI_ONLY_ZLIB)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
517 #ifndef STBI_ONLY_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
518 #define STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
519 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
520 #ifndef STBI_ONLY_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
521 #define STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
522 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
523 #ifndef STBI_ONLY_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
524 #define STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
525 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
526 #ifndef STBI_ONLY_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
527 #define STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
528 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
529 #ifndef STBI_ONLY_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
530 #define STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
531 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
532 #ifndef STBI_ONLY_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
533 #define STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
534 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
535 #ifndef STBI_ONLY_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
536 #define STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
537 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
538 #ifndef STBI_ONLY_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
539 #define STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
540 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
541 #ifndef STBI_ONLY_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
542 #define STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
543 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
544 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
545
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
546 #if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
547 #define STBI_NO_ZLIB
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
548 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
549
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
550
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
551 #include <stdarg.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
552 #include <stddef.h> // ptrdiff_t on osx
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
553 #include <stdlib.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
554 #include <string.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
555
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
556 #if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
557 #include <math.h> // ldexp
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
558 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
559
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
560 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
561 #include <stdio.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
562 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
563
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
564 #ifndef STBI_ASSERT
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
565 #include <assert.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
566 #define STBI_ASSERT(x) assert(x)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
567 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
568
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
569
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
570 #ifndef _MSC_VER
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
571 #ifdef __cplusplus
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
572 #define stbi_inline inline
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
573 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
574 #define stbi_inline
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
575 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
576 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
577 #define stbi_inline __forceinline
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
578 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
579
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
580
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
581 #ifdef _MSC_VER
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
582 typedef unsigned short stbi__uint16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
583 typedef signed short stbi__int16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
584 typedef unsigned int stbi__uint32;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
585 typedef signed int stbi__int32;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
586 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
587 #include <stdint.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
588 typedef uint16_t stbi__uint16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
589 typedef int16_t stbi__int16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
590 typedef uint32_t stbi__uint32;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
591 typedef int32_t stbi__int32;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
592 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
593
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
594 // should produce compiler error if size is wrong
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
595 typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
596
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
597 #ifdef _MSC_VER
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
598 #define STBI_NOTUSED(v) (void)(v)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
599 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
600 #define STBI_NOTUSED(v) (void)sizeof(v)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
601 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
602
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
603 #ifdef _MSC_VER
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
604 #define STBI_HAS_LROTL
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
605 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
606
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
607 #ifdef STBI_HAS_LROTL
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
608 #define stbi_lrot(x,y) _lrotl(x,y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
609 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
610 #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
611 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
612
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
613 #if defined(STBI_MALLOC) && defined(STBI_FREE) && defined(STBI_REALLOC)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
614 // ok
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
615 #elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
616 // ok
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
617 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
618 #error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC."
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
619 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
620
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
621 #ifndef STBI_MALLOC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
622 #define STBI_MALLOC(sz) malloc(sz)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
623 #define STBI_REALLOC(p,sz) realloc(p,sz)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
624 #define STBI_FREE(p) free(p)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
625 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
626
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
627 #if defined(__GNUC__) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
628 // gcc doesn't support sse2 intrinsics unless you compile with -msse2,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
629 // (but compiling with -msse2 allows the compiler to use SSE2 everywhere;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
630 // this is just broken and gcc are jerks for not fixing it properly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
631 // http://www.virtualdub.org/blog/pivot/entry.php?id=363 )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
632 #define STBI_NO_SIMD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
633 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
634
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
635 #if !defined(STBI_NO_SIMD) && (defined(__x86_64__) || defined(_M_X64) || defined(__i386) || defined(_M_IX86))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
636 #define STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
637 #include <emmintrin.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
638
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
639 #ifdef _MSC_VER
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
640
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
641 #if _MSC_VER >= 1400 // not VC6
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
642 #include <intrin.h> // __cpuid
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
643 static int stbi__cpuid3(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
644 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
645 int info[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
646 __cpuid(info,1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
647 return info[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
648 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
649 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
650 static int stbi__cpuid3(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
651 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
652 int res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
653 __asm {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
654 mov eax,1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
655 cpuid
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
656 mov res,edx
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
657 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
658 return res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
659 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
660 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
661
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
662 #define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
663
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
664 static int stbi__sse2_available()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
665 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
666 int info3 = stbi__cpuid3();
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
667 return ((info3 >> 26) & 1) != 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
668 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
669 #else // assume GCC-style if not VC++
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
670 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
671
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
672 static int stbi__sse2_available()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
673 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
674 #if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
675 // GCC 4.8+ has a nice way to do this
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
676 return __builtin_cpu_supports("sse2");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
677 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
678 // portable way to do this, preferably without using GCC inline ASM?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
679 // just bail for now.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
680 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
681 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
682 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
683 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
684 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
685
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
686 // ARM NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
687 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
688 #undef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
689 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
690
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
691 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
692 #include <arm_neon.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
693 // assume GCC or Clang on ARM targets
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
694 #define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
695 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
696
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
697 #ifndef STBI_SIMD_ALIGN
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
698 #define STBI_SIMD_ALIGN(type, name) type name
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
699 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
700
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
701 ///////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
702 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
703 // stbi__context struct and start_xxx functions
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
704
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
705 // stbi__context structure is our basic context used by all images, so it
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
706 // contains all the IO context, plus some basic image information
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
707 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
708 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
709 stbi__uint32 img_x, img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
710 int img_n, img_out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
711
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
712 stbi_io_callbacks io;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
713 void *io_user_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
714
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
715 int read_from_callbacks;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
716 int buflen;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
717 stbi_uc buffer_start[128];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
718
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
719 stbi_uc *img_buffer, *img_buffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
720 stbi_uc *img_buffer_original;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
721 } stbi__context;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
722
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
723
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
724 static void stbi__refill_buffer(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
725
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
726 // initialize a memory-decode context
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
727 static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
728 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
729 s->io.read = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
730 s->read_from_callbacks = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
731 s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
732 s->img_buffer_end = (stbi_uc *) buffer+len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
733 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
734
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
735 // initialize a callback-based context
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
736 static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
737 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
738 s->io = *c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
739 s->io_user_data = user;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
740 s->buflen = sizeof(s->buffer_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
741 s->read_from_callbacks = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
742 s->img_buffer_original = s->buffer_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
743 stbi__refill_buffer(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
744 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
745
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
746 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
747
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
748 static int stbi__stdio_read(void *user, char *data, int size)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
749 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
750 return (int) fread(data,1,size,(FILE*) user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
751 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
752
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
753 static void stbi__stdio_skip(void *user, int n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
754 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
755 fseek((FILE*) user, n, SEEK_CUR);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
756 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
757
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
758 static int stbi__stdio_eof(void *user)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
759 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
760 return feof((FILE*) user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
761 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
762
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
763 static stbi_io_callbacks stbi__stdio_callbacks =
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
764 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
765 stbi__stdio_read,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
766 stbi__stdio_skip,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
767 stbi__stdio_eof,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
768 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
769
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
770 static void stbi__start_file(stbi__context *s, FILE *f)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
771 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
772 stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
773 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
774
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
775 //static void stop_file(stbi__context *s) { }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
776
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
777 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
778
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
779 static void stbi__rewind(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
780 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
781 // conceptually rewind SHOULD rewind to the beginning of the stream,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
782 // but we just rewind to the beginning of the initial buffer, because
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
783 // we only use it after doing 'test', which only ever looks at at most 92 bytes
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
784 s->img_buffer = s->img_buffer_original;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
785 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
786
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
787 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
788 static int stbi__jpeg_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
789 static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
790 static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
791 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
792
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
793 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
794 static int stbi__png_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
795 static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
796 static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
797 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
798
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
799 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
800 static int stbi__bmp_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
801 static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
802 static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
803 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
804
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
805 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
806 static int stbi__tga_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
807 static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
808 static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
809 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
810
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
811 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
812 static int stbi__psd_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
813 static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
814 static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
815 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
816
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
817 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
818 static int stbi__hdr_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
819 static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
820 static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
821 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
822
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
823 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
824 static int stbi__pic_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
825 static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
826 static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
827 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
828
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
829 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
830 static int stbi__gif_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
831 static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
832 static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
833 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
834
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
835 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
836 static int stbi__pnm_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
837 static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
838 static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
839 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
840
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
841 // this is not threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
842 static const char *stbi__g_failure_reason;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
843
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
844 STBIDEF const char *stbi_failure_reason(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
845 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
846 return stbi__g_failure_reason;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
847 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
848
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
849 static int stbi__err(const char *str)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
850 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
851 stbi__g_failure_reason = str;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
852 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
853 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
854
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
855 static void *stbi__malloc(size_t size)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
856 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
857 return STBI_MALLOC(size);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
858 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
859
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
860 // stbi__err - error
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
861 // stbi__errpf - error returning pointer to float
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
862 // stbi__errpuc - error returning pointer to unsigned char
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
863
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
864 #ifdef STBI_NO_FAILURE_STRINGS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
865 #define stbi__err(x,y) 0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
866 #elif defined(STBI_FAILURE_USERMSG)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
867 #define stbi__err(x,y) stbi__err(y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
868 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
869 #define stbi__err(x,y) stbi__err(x)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
870 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
871
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
872 #define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
873 #define stbi__errpuc(x,y) ((unsigned char *) (stbi__err(x,y)?NULL:NULL))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
874
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
875 STBIDEF void stbi_image_free(void *retval_from_stbi_load)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
876 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
877 STBI_FREE(retval_from_stbi_load);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
878 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
879
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
880 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
881 static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
882 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
883
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
884 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
885 static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
886 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
887
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
888 static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
889 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
890 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
891 if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
892 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
893 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
894 if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
895 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
896 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
897 if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
898 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
899 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
900 if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
901 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
902 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
903 if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
904 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
905 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
906 if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
907 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
908 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
909 if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
910 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
911
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
912 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
913 if (stbi__hdr_test(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
914 float *hdr = stbi__hdr_load(s, x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
915 return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
916 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
917 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
918
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
919 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
920 // test tga last because it's a crappy test!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
921 if (stbi__tga_test(s))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
922 return stbi__tga_load(s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
923 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
924
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
925 return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
926 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
927
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
928 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
929
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
930 static FILE *stbi__fopen(char const *filename, char const *mode)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
931 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
932 FILE *f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
933 #if defined(_MSC_VER) && _MSC_VER >= 1400
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
934 if (0 != fopen_s(&f, filename, mode))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
935 f=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
936 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
937 f = fopen(filename, mode);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
938 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
939 return f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
940 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
941
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
942
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
943 STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
944 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
945 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
946 unsigned char *result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
947 if (!f) return stbi__errpuc("can't fopen", "Unable to open file");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
948 result = stbi_load_from_file(f,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
949 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
950 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
951 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
952
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
953 STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
954 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
955 unsigned char *result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
956 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
957 stbi__start_file(&s,f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
958 result = stbi_load_main(&s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
959 if (result) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
960 // need to 'unget' all the characters in the IO buffer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
961 fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
962 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
963 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
964 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
965 #endif //!STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
966
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
967 STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
968 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
969 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
970 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
971 return stbi_load_main(&s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
972 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
973
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
974 STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
975 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
976 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
977 stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
978 return stbi_load_main(&s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
979 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
980
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
981 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
982 static float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
983 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
984 unsigned char *data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
985 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
986 if (stbi__hdr_test(s))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
987 return stbi__hdr_load(s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
988 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
989 data = stbi_load_main(s, x, y, comp, req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
990 if (data)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
991 return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
992 return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
993 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
994
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
995 STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
996 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
997 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
998 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
999 return stbi_loadf_main(&s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1000 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1001
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1002 STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1003 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1004 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1005 stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1006 return stbi_loadf_main(&s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1007 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1008
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1009 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1010 STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1011 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1012 float *result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1013 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1014 if (!f) return stbi__errpf("can't fopen", "Unable to open file");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1015 result = stbi_loadf_from_file(f,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1016 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1017 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1018 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1019
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1020 STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1021 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1022 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1023 stbi__start_file(&s,f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1024 return stbi_loadf_main(&s,x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1025 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1026 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1027
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1028 #endif // !STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1029
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1030 // these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1031 // defined, for API simplicity; if STBI_NO_LINEAR is defined, it always
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1032 // reports false!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1033
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1034 STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1035 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1036 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1037 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1038 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1039 return stbi__hdr_test(&s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1040 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1041 STBI_NOTUSED(buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1042 STBI_NOTUSED(len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1043 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1044 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1045 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1046
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1047 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1048 STBIDEF int stbi_is_hdr (char const *filename)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1049 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1050 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1051 int result=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1052 if (f) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1053 result = stbi_is_hdr_from_file(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1054 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1055 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1056 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1057 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1058
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1059 STBIDEF int stbi_is_hdr_from_file(FILE *f)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1060 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1061 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1062 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1063 stbi__start_file(&s,f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1064 return stbi__hdr_test(&s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1065 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1066 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1067 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1068 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1069 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1070
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1071 STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1072 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1073 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1074 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1075 stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1076 return stbi__hdr_test(&s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1077 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1078 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1079 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1080 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1081
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1082 static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1083 static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1084
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1085 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1086 STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1087 STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1088 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1089
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1090 STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1091 STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1092
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1093
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1094 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1095 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1096 // Common code used by all image loaders
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1097 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1098
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1099 enum
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1100 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1101 STBI__SCAN_load=0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1102 STBI__SCAN_type,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1103 STBI__SCAN_header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1104 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1105
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1106 static void stbi__refill_buffer(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1107 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1108 int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1109 if (n == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1110 // at end of file, treat same as if from memory, but need to handle case
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1111 // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1112 s->read_from_callbacks = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1113 s->img_buffer = s->buffer_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1114 s->img_buffer_end = s->buffer_start+1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1115 *s->img_buffer = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1116 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1117 s->img_buffer = s->buffer_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1118 s->img_buffer_end = s->buffer_start + n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1119 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1120 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1121
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1122 stbi_inline static stbi_uc stbi__get8(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1123 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1124 if (s->img_buffer < s->img_buffer_end)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1125 return *s->img_buffer++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1126 if (s->read_from_callbacks) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1127 stbi__refill_buffer(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1128 return *s->img_buffer++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1129 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1130 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1131 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1132
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1133 stbi_inline static int stbi__at_eof(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1134 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1135 if (s->io.read) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1136 if (!(s->io.eof)(s->io_user_data)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1137 // if feof() is true, check if buffer = end
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1138 // special case: we've only got the special 0 character at the end
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1139 if (s->read_from_callbacks == 0) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1140 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1141
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1142 return s->img_buffer >= s->img_buffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1143 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1144
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1145 static void stbi__skip(stbi__context *s, int n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1146 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1147 if (s->io.read) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1148 int blen = (int) (s->img_buffer_end - s->img_buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1149 if (blen < n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1150 s->img_buffer = s->img_buffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1151 (s->io.skip)(s->io_user_data, n - blen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1152 return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1153 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1154 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1155 s->img_buffer += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1156 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1157
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1158 static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1159 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1160 if (s->io.read) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1161 int blen = (int) (s->img_buffer_end - s->img_buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1162 if (blen < n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1163 int res, count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1164
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1165 memcpy(buffer, s->img_buffer, blen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1166
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1167 count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1168 res = (count == (n-blen));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1169 s->img_buffer = s->img_buffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1170 return res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1171 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1172 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1173
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1174 if (s->img_buffer+n <= s->img_buffer_end) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1175 memcpy(buffer, s->img_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1176 s->img_buffer += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1177 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1178 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1179 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1180 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1181
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1182 static int stbi__get16be(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1183 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1184 int z = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1185 return (z << 8) + stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1186 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1187
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1188 static stbi__uint32 stbi__get32be(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1189 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1190 stbi__uint32 z = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1191 return (z << 16) + stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1192 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1193
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1194 static int stbi__get16le(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1195 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1196 int z = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1197 return z + (stbi__get8(s) << 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1198 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1199
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1200 static stbi__uint32 stbi__get32le(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1201 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1202 stbi__uint32 z = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1203 return z + (stbi__get16le(s) << 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1204 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1205
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1206 #define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1207
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1208
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1209 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1210 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1211 // generic converter from built-in img_n to req_comp
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1212 // individual types do this automatically as much as possible (e.g. jpeg
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1213 // does all cases internally since it needs to colorspace convert anyway,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1214 // and it never has alpha, so very few cases ). png can automatically
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1215 // interleave an alpha=255 channel, but falls back to this for other cases
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1216 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1217 // assume data buffer is malloced, so malloc a new one and free that one
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1218 // only failure mode is malloc failing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1219
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1220 static stbi_uc stbi__compute_y(int r, int g, int b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1221 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1222 return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1223 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1224
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1225 static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1226 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1227 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1228 unsigned char *good;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1229
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1230 if (req_comp == img_n) return data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1231 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1232
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1233 good = (unsigned char *) stbi__malloc(req_comp * x * y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1234 if (good == NULL) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1235 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1236 return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1237 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1238
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1239 for (j=0; j < (int) y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1240 unsigned char *src = data + j * x * img_n ;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1241 unsigned char *dest = good + j * x * req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1242
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1243 #define COMBO(a,b) ((a)*8+(b))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1244 #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1245 // convert source image with img_n components to one with req_comp components;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1246 // avoid switch per pixel, so use switch per scanline and massive macros
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1247 switch (COMBO(img_n, req_comp)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1248 CASE(1,2) dest[0]=src[0], dest[1]=255; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1249 CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1250 CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1251 CASE(2,1) dest[0]=src[0]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1252 CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1253 CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1254 CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1255 CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1256 CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1257 CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1258 CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1259 CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1260 default: STBI_ASSERT(0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1261 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1262 #undef CASE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1263 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1264
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1265 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1266 return good;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1267 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1268
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1269 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1270 static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1271 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1272 int i,k,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1273 float *output = (float *) stbi__malloc(x * y * comp * sizeof(float));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1274 if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1275 // compute number of non-alpha components
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1276 if (comp & 1) n = comp; else n = comp-1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1277 for (i=0; i < x*y; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1278 for (k=0; k < n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1279 output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1280 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1281 if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1282 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1283 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1284 return output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1285 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1286 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1287
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1288 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1289 #define stbi__float2int(x) ((int) (x))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1290 static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1291 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1292 int i,k,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1293 stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1294 if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1295 // compute number of non-alpha components
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1296 if (comp & 1) n = comp; else n = comp-1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1297 for (i=0; i < x*y; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1298 for (k=0; k < n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1299 float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1300 if (z < 0) z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1301 if (z > 255) z = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1302 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1303 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1304 if (k < comp) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1305 float z = data[i*comp+k] * 255 + 0.5f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1306 if (z < 0) z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1307 if (z > 255) z = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1308 output[i*comp + k] = (stbi_uc) stbi__float2int(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1309 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1310 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1311 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1312 return output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1313 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1314 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1315
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1316 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1317 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1318 // "baseline" JPEG/JFIF decoder
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1319 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1320 // simple implementation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1321 // - doesn't support delayed output of y-dimension
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1322 // - simple interface (only one output format: 8-bit interleaved RGB)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1323 // - doesn't try to recover corrupt jpegs
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1324 // - doesn't allow partial loading, loading multiple at once
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1325 // - still fast on x86 (copying globals into locals doesn't help x86)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1326 // - allocates lots of intermediate memory (full size of all components)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1327 // - non-interleaved case requires this anyway
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1328 // - allows good upsampling (see next)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1329 // high-quality
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1330 // - upsampled channels are bilinearly interpolated, even across blocks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1331 // - quality integer IDCT derived from IJG's 'slow'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1332 // performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1333 // - fast huffman; reasonable integer IDCT
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1334 // - some SIMD kernels for common paths on targets with SSE2/NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1335 // - uses a lot of intermediate memory, could cache poorly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1336
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1337 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1338
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1339 // huffman decoding acceleration
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1340 #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1341
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1342 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1343 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1344 stbi_uc fast[1 << FAST_BITS];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1345 // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1346 stbi__uint16 code[256];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1347 stbi_uc values[256];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1348 stbi_uc size[257];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1349 unsigned int maxcode[18];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1350 int delta[17]; // old 'firstsymbol' - old 'firstcode'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1351 } stbi__huffman;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1352
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1353 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1354 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1355 stbi__context *s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1356 stbi__huffman huff_dc[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1357 stbi__huffman huff_ac[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1358 stbi_uc dequant[4][64];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1359 stbi__int16 fast_ac[4][1 << FAST_BITS];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1360
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1361 // sizes for components, interleaved MCUs
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1362 int img_h_max, img_v_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1363 int img_mcu_x, img_mcu_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1364 int img_mcu_w, img_mcu_h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1365
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1366 // definition of jpeg image component
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1367 struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1368 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1369 int id;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1370 int h,v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1371 int tq;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1372 int hd,ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1373 int dc_pred;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1374
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1375 int x,y,w2,h2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1376 stbi_uc *data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1377 void *raw_data, *raw_coeff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1378 stbi_uc *linebuf;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1379 short *coeff; // progressive only
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1380 int coeff_w, coeff_h; // number of 8x8 coefficient blocks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1381 } img_comp[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1382
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1383 stbi__uint32 code_buffer; // jpeg entropy-coded buffer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1384 int code_bits; // number of valid bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1385 unsigned char marker; // marker seen while filling entropy buffer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1386 int nomore; // flag if we saw a marker so must stop
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1387
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1388 int progressive;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1389 int spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1390 int spec_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1391 int succ_high;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1392 int succ_low;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1393 int eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1394
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1395 int scan_n, order[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1396 int restart_interval, todo;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1397
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1398 // kernels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1399 void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1400 void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1401 stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1402 } stbi__jpeg;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1403
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1404 static int stbi__build_huffman(stbi__huffman *h, int *count)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1405 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1406 int i,j,k=0,code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1407 // build size list for each symbol (from JPEG spec)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1408 for (i=0; i < 16; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1409 for (j=0; j < count[i]; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1410 h->size[k++] = (stbi_uc) (i+1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1411 h->size[k] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1412
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1413 // compute actual symbols (from jpeg spec)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1414 code = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1415 k = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1416 for(j=1; j <= 16; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1417 // compute delta to add to code to compute symbol id
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1418 h->delta[j] = k - code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1419 if (h->size[k] == j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1420 while (h->size[k] == j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1421 h->code[k++] = (stbi__uint16) (code++);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1422 if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1423 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1424 // compute largest code + 1 for this size, preshifted as needed later
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1425 h->maxcode[j] = code << (16-j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1426 code <<= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1427 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1428 h->maxcode[j] = 0xffffffff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1429
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1430 // build non-spec acceleration table; 255 is flag for not-accelerated
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1431 memset(h->fast, 255, 1 << FAST_BITS);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1432 for (i=0; i < k; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1433 int s = h->size[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1434 if (s <= FAST_BITS) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1435 int c = h->code[i] << (FAST_BITS-s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1436 int m = 1 << (FAST_BITS-s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1437 for (j=0; j < m; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1438 h->fast[c+j] = (stbi_uc) i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1439 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1440 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1441 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1442 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1443 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1444
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1445 // build a table that decodes both magnitude and value of small ACs in
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1446 // one go.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1447 static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1448 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1449 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1450 for (i=0; i < (1 << FAST_BITS); ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1451 stbi_uc fast = h->fast[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1452 fast_ac[i] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1453 if (fast < 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1454 int rs = h->values[fast];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1455 int run = (rs >> 4) & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1456 int magbits = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1457 int len = h->size[fast];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1458
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1459 if (magbits && len + magbits <= FAST_BITS) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1460 // magnitude code followed by receive_extend code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1461 int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1462 int m = 1 << (magbits - 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1463 if (k < m) k += (-1 << magbits) + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1464 // if the result is small enough, we can fit it in fast_ac table
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1465 if (k >= -128 && k <= 127)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1466 fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1467 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1468 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1469 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1470 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1471
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1472 static void stbi__grow_buffer_unsafe(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1473 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1474 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1475 int b = j->nomore ? 0 : stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1476 if (b == 0xff) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1477 int c = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1478 if (c != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1479 j->marker = (unsigned char) c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1480 j->nomore = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1481 return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1482 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1483 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1484 j->code_buffer |= b << (24 - j->code_bits);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1485 j->code_bits += 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1486 } while (j->code_bits <= 24);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1487 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1488
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1489 // (1 << n) - 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1490 static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1491
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1492 // decode a jpeg huffman value from the bitstream
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1493 stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1494 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1495 unsigned int temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1496 int c,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1497
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1498 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1499
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1500 // look at the top FAST_BITS and determine what symbol ID it is,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1501 // if the code is <= FAST_BITS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1502 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1503 k = h->fast[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1504 if (k < 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1505 int s = h->size[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1506 if (s > j->code_bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1507 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1508 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1509 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1510 return h->values[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1511 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1512
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1513 // naive test is to shift the code_buffer down so k bits are
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1514 // valid, then test against maxcode. To speed this up, we've
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1515 // preshifted maxcode left so that it has (16-k) 0s at the
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1516 // end; in other words, regardless of the number of bits, it
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1517 // wants to be compared against something shifted to have 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1518 // that way we don't need to shift inside the loop.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1519 temp = j->code_buffer >> 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1520 for (k=FAST_BITS+1 ; ; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1521 if (temp < h->maxcode[k])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1522 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1523 if (k == 17) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1524 // error! code not found
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1525 j->code_bits -= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1526 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1527 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1528
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1529 if (k > j->code_bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1530 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1531
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1532 // convert the huffman code to the symbol id
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1533 c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1534 STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1535
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1536 // convert the id to a symbol
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1537 j->code_bits -= k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1538 j->code_buffer <<= k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1539 return h->values[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1540 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1541
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1542 // bias[n] = (-1<<n) + 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1543 static int const stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1544
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1545 // combined JPEG 'receive' and JPEG 'extend', since baseline
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1546 // always extends everything it receives.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1547 stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1548 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1549 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1550 int sgn;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1551 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1552
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1553 sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1554 k = stbi_lrot(j->code_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1555 j->code_buffer = k & ~stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1556 k &= stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1557 j->code_bits -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1558 return k + (stbi__jbias[n] & ~sgn);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1559 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1560
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1561 // get some unsigned bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1562 stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1563 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1564 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1565 if (j->code_bits < n) stbi__grow_buffer_unsafe(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1566 k = stbi_lrot(j->code_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1567 j->code_buffer = k & ~stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1568 k &= stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1569 j->code_bits -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1570 return k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1571 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1572
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1573 stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1574 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1575 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1576 if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1577 k = j->code_buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1578 j->code_buffer <<= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1579 --j->code_bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1580 return k & 0x80000000;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1581 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1582
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1583 // given a value that's at position X in the zigzag stream,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1584 // where does it appear in the 8x8 matrix coded as row-major?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1585 static stbi_uc stbi__jpeg_dezigzag[64+15] =
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1586 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1587 0, 1, 8, 16, 9, 2, 3, 10,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1588 17, 24, 32, 25, 18, 11, 4, 5,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1589 12, 19, 26, 33, 40, 48, 41, 34,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1590 27, 20, 13, 6, 7, 14, 21, 28,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1591 35, 42, 49, 56, 57, 50, 43, 36,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1592 29, 22, 15, 23, 30, 37, 44, 51,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1593 58, 59, 52, 45, 38, 31, 39, 46,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1594 53, 60, 61, 54, 47, 55, 62, 63,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1595 // let corrupt input sample past end
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1596 63, 63, 63, 63, 63, 63, 63, 63,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1597 63, 63, 63, 63, 63, 63, 63
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1598 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1599
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1600 // decode one 64-entry block--
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1601 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)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1602 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1603 int diff,dc,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1604 int t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1605
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1606 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1607 t = stbi__jpeg_huff_decode(j, hdc);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1608 if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1609
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1610 // 0 all the ac values now so we can do it 32-bits at a time
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1611 memset(data,0,64*sizeof(data[0]));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1612
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1613 diff = t ? stbi__extend_receive(j, t) : 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1614 dc = j->img_comp[b].dc_pred + diff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1615 j->img_comp[b].dc_pred = dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1616 data[0] = (short) (dc * dequant[0]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1617
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1618 // decode AC components, see JPEG spec
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1619 k = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1620 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1621 unsigned int zig;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1622 int c,r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1623 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1624 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1625 r = fac[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1626 if (r) { // fast-AC path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1627 k += (r >> 4) & 15; // run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1628 s = r & 15; // combined length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1629 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1630 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1631 // decode into unzigzag'd location
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1632 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1633 data[zig] = (short) ((r >> 8) * dequant[zig]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1634 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1635 int rs = stbi__jpeg_huff_decode(j, hac);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1636 if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1637 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1638 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1639 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1640 if (rs != 0xf0) break; // end block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1641 k += 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1642 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1643 k += r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1644 // decode into unzigzag'd location
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1645 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1646 data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1647 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1648 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1649 } while (k < 64);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1650 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1651 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1652
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1653 static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1654 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1655 int diff,dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1656 int t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1657 if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1658
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1659 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1660
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1661 if (j->succ_high == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1662 // first scan for DC coefficient, must be first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1663 memset(data,0,64*sizeof(data[0])); // 0 all the ac values now
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1664 t = stbi__jpeg_huff_decode(j, hdc);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1665 diff = t ? stbi__extend_receive(j, t) : 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1666
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1667 dc = j->img_comp[b].dc_pred + diff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1668 j->img_comp[b].dc_pred = dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1669 data[0] = (short) (dc << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1670 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1671 // refinement scan for DC coefficient
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1672 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1673 data[0] += (short) (1 << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1674 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1675 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1676 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1677
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1678 // @OPTIMIZE: store non-zigzagged during the decode passes,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1679 // and only de-zigzag when dequantizing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1680 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1681 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1682 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1683 if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1684
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1685 if (j->succ_high == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1686 int shift = j->succ_low;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1687
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1688 if (j->eob_run) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1689 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1690 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1691 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1692
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1693 k = j->spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1694 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1695 unsigned int zig;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1696 int c,r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1697 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1698 c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1699 r = fac[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1700 if (r) { // fast-AC path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1701 k += (r >> 4) & 15; // run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1702 s = r & 15; // combined length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1703 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1704 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1705 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1706 data[zig] = (short) ((r >> 8) << shift);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1707 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1708 int rs = stbi__jpeg_huff_decode(j, hac);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1709 if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1710 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1711 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1712 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1713 if (r < 15) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1714 j->eob_run = (1 << r);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1715 if (r)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1716 j->eob_run += stbi__jpeg_get_bits(j, r);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1717 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1718 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1719 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1720 k += 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1721 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1722 k += r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1723 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1724 data[zig] = (short) (stbi__extend_receive(j,s) << shift);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1725 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1726 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1727 } while (k <= j->spec_end);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1728 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1729 // refinement scan for these AC coefficients
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1730
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1731 short bit = (short) (1 << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1732
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1733 if (j->eob_run) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1734 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1735 for (k = j->spec_start; k <= j->spec_end; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1736 short *p = &data[stbi__jpeg_dezigzag[k]];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1737 if (*p != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1738 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1739 if ((*p & bit)==0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1740 if (*p > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1741 *p += bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1742 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1743 *p -= bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1744 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1745 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1746 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1747 k = j->spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1748 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1749 int r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1750 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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1751 if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1752 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1753 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1754 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1755 if (r < 15) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1756 j->eob_run = (1 << r) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1757 if (r)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1758 j->eob_run += stbi__jpeg_get_bits(j, r);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1759 r = 64; // force end of block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1760 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1761 r = 16; // r=15 is the code for 16 0s
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1762 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1763 if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1764 // sign bit
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1765 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1766 s = bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1767 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1768 s = -bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1769 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1770
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1771 // advance by r
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1772 while (k <= j->spec_end) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1773 short *p = &data[stbi__jpeg_dezigzag[k]];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1774 if (*p != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1775 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1776 if ((*p & bit)==0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1777 if (*p > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1778 *p += bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1779 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1780 *p -= bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1781 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1782 ++k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1783 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1784 if (r == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1785 if (s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1786 data[stbi__jpeg_dezigzag[k++]] = (short) s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1787 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1788 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1789 --r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1790 ++k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1791 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1792 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1793 } while (k <= j->spec_end);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1794 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1795 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1796 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1797 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1798
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1799 // take a -128..127 value and stbi__clamp it and convert to 0..255
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1800 stbi_inline static stbi_uc stbi__clamp(int x)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1801 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1802 // trick to use a single test to catch both cases
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1803 if ((unsigned int) x > 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1804 if (x < 0) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1805 if (x > 255) return 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1806 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1807 return (stbi_uc) x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1808 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1809
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1810 #define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1811 #define stbi__fsh(x) ((x) << 12)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1812
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1813 // derived from jidctint -- DCT_ISLOW
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1814 #define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1815 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1816 p2 = s2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1817 p3 = s6; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1818 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1819 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1820 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1821 p2 = s0; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1822 p3 = s4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1823 t0 = stbi__fsh(p2+p3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1824 t1 = stbi__fsh(p2-p3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1825 x0 = t0+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1826 x3 = t0-t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1827 x1 = t1+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1828 x2 = t1-t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1829 t0 = s7; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1830 t1 = s5; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1831 t2 = s3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1832 t3 = s1; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1833 p3 = t0+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1834 p4 = t1+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1835 p1 = t0+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1836 p2 = t1+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1837 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1838 t0 = t0*stbi__f2f( 0.298631336f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1839 t1 = t1*stbi__f2f( 2.053119869f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1840 t2 = t2*stbi__f2f( 3.072711026f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1841 t3 = t3*stbi__f2f( 1.501321110f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1842 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1843 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1844 p3 = p3*stbi__f2f(-1.961570560f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1845 p4 = p4*stbi__f2f(-0.390180644f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1846 t3 += p1+p4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1847 t2 += p2+p3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1848 t1 += p2+p4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1849 t0 += p1+p3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1850
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1851 static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1852 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1853 int i,val[64],*v=val;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1854 stbi_uc *o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1855 short *d = data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1856
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1857 // columns
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1858 for (i=0; i < 8; ++i,++d, ++v) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1859 // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1860 if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1861 && d[40]==0 && d[48]==0 && d[56]==0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1862 // no shortcut 0 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1863 // (1|2|3|4|5|6|7)==0 0 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1864 // all separate -0.047 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1865 // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1866 int dcterm = d[0] << 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1867 v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1868 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1869 STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1870 // constants scaled things up by 1<<12; let's bring them back
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1871 // down, but keep 2 extra bits of precision
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1872 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1873 v[ 0] = (x0+t3) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1874 v[56] = (x0-t3) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1875 v[ 8] = (x1+t2) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1876 v[48] = (x1-t2) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1877 v[16] = (x2+t1) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1878 v[40] = (x2-t1) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1879 v[24] = (x3+t0) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1880 v[32] = (x3-t0) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1881 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1882 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1883
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1884 for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1885 // no fast case since the first 1D IDCT spread components out
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1886 STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1887 // constants scaled things up by 1<<12, plus we had 1<<2 from first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1888 // loop, plus horizontal and vertical each scale by sqrt(8) so together
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1889 // we've got an extra 1<<3, so 1<<17 total we need to remove.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1890 // so we want to round that, which means adding 0.5 * 1<<17,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1891 // aka 65536. Also, we'll end up with -128 to 127 that we want
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1892 // to encode as 0..255 by adding 128, so we'll add that before the shift
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1893 x0 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1894 x1 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1895 x2 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1896 x3 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1897 // tried computing the shifts into temps, or'ing the temps to see
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1898 // if any were out of range, but that was slower
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1899 o[0] = stbi__clamp((x0+t3) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1900 o[7] = stbi__clamp((x0-t3) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1901 o[1] = stbi__clamp((x1+t2) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1902 o[6] = stbi__clamp((x1-t2) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1903 o[2] = stbi__clamp((x2+t1) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1904 o[5] = stbi__clamp((x2-t1) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1905 o[3] = stbi__clamp((x3+t0) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1906 o[4] = stbi__clamp((x3-t0) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1907 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1908 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1909
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1910 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1911 // sse2 integer IDCT. not the fastest possible implementation but it
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1912 // produces bit-identical results to the generic C version so it's
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1913 // fully "transparent".
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1914 static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1915 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1916 // This is constructed to match our regular (generic) integer IDCT exactly.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1917 __m128i row0, row1, row2, row3, row4, row5, row6, row7;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1918 __m128i tmp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1919
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1920 // dot product constant: even elems=x, odd elems=y
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1921 #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1922
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1923 // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1924 // out(1) = c1[even]*x + c1[odd]*y
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1925 #define dct_rot(out0,out1, x,y,c0,c1) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1926 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1927 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1928 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1929 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1930 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1931 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1932
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1933 // out = in << 12 (in 16-bit, out 32-bit)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1934 #define dct_widen(out, in) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1935 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1936 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1937
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1938 // wide add
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1939 #define dct_wadd(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1940 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1941 __m128i out##_h = _mm_add_epi32(a##_h, b##_h)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1942
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1943 // wide sub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1944 #define dct_wsub(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1945 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1946 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1947
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1948 // butterfly a/b, add bias, then shift by "s" and pack
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1949 #define dct_bfly32o(out0, out1, a,b,bias,s) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1950 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1951 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1952 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1953 dct_wadd(sum, abiased, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1954 dct_wsub(dif, abiased, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1955 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1956 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1957 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1958
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1959 // 8-bit interleave step (for transposes)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1960 #define dct_interleave8(a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1961 tmp = a; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1962 a = _mm_unpacklo_epi8(a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1963 b = _mm_unpackhi_epi8(tmp, b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1964
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1965 // 16-bit interleave step (for transposes)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1966 #define dct_interleave16(a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1967 tmp = a; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1968 a = _mm_unpacklo_epi16(a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1969 b = _mm_unpackhi_epi16(tmp, b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1970
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1971 #define dct_pass(bias,shift) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1972 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1973 /* even part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1974 dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1975 __m128i sum04 = _mm_add_epi16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1976 __m128i dif04 = _mm_sub_epi16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1977 dct_widen(t0e, sum04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1978 dct_widen(t1e, dif04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1979 dct_wadd(x0, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1980 dct_wsub(x3, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1981 dct_wadd(x1, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1982 dct_wsub(x2, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1983 /* odd part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1984 dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1985 dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1986 __m128i sum17 = _mm_add_epi16(row1, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1987 __m128i sum35 = _mm_add_epi16(row3, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1988 dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1989 dct_wadd(x4, y0o, y4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1990 dct_wadd(x5, y1o, y5o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1991 dct_wadd(x6, y2o, y5o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1992 dct_wadd(x7, y3o, y4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1993 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1994 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1995 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1996 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1997 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1998
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1999 __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2000 __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2001 __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2002 __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2003 __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2004 __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2005 __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2006 __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2007
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2008 // rounding biases in column/row passes, see stbi__idct_block for explanation.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2009 __m128i bias_0 = _mm_set1_epi32(512);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2010 __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2011
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2012 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2013 row0 = _mm_load_si128((const __m128i *) (data + 0*8));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2014 row1 = _mm_load_si128((const __m128i *) (data + 1*8));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2015 row2 = _mm_load_si128((const __m128i *) (data + 2*8));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2016 row3 = _mm_load_si128((const __m128i *) (data + 3*8));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2017 row4 = _mm_load_si128((const __m128i *) (data + 4*8));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2018 row5 = _mm_load_si128((const __m128i *) (data + 5*8));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2019 row6 = _mm_load_si128((const __m128i *) (data + 6*8));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2020 row7 = _mm_load_si128((const __m128i *) (data + 7*8));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2021
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2022 // column pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2023 dct_pass(bias_0, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2024
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2025 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2026 // 16bit 8x8 transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2027 dct_interleave16(row0, row4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2028 dct_interleave16(row1, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2029 dct_interleave16(row2, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2030 dct_interleave16(row3, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2031
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2032 // transpose pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2033 dct_interleave16(row0, row2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2034 dct_interleave16(row1, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2035 dct_interleave16(row4, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2036 dct_interleave16(row5, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2037
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2038 // transpose pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2039 dct_interleave16(row0, row1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2040 dct_interleave16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2041 dct_interleave16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2042 dct_interleave16(row6, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2043 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2044
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2045 // row pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2046 dct_pass(bias_1, 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2047
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2048 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2049 // pack
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2050 __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2051 __m128i p1 = _mm_packus_epi16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2052 __m128i p2 = _mm_packus_epi16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2053 __m128i p3 = _mm_packus_epi16(row6, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2054
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2055 // 8bit 8x8 transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2056 dct_interleave8(p0, p2); // a0e0a1e1...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2057 dct_interleave8(p1, p3); // c0g0c1g1...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2058
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2059 // transpose pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2060 dct_interleave8(p0, p1); // a0c0e0g0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2061 dct_interleave8(p2, p3); // b0d0f0h0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2062
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2063 // transpose pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2064 dct_interleave8(p0, p2); // a0b0c0d0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2065 dct_interleave8(p1, p3); // a4b4c4d4...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2066
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2067 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2068 _mm_storel_epi64((__m128i *) out, p0); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2069 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2070 _mm_storel_epi64((__m128i *) out, p2); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2071 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2072 _mm_storel_epi64((__m128i *) out, p1); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2073 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2074 _mm_storel_epi64((__m128i *) out, p3); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2075 _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2076 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2077
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2078 #undef dct_const
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2079 #undef dct_rot
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2080 #undef dct_widen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2081 #undef dct_wadd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2082 #undef dct_wsub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2083 #undef dct_bfly32o
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2084 #undef dct_interleave8
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2085 #undef dct_interleave16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2086 #undef dct_pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2087 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2088
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2089 #endif // STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2090
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2091 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2092
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2093 // NEON integer IDCT. should produce bit-identical
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2094 // results to the generic C version.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2095 static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2096 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2097 int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2098
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2099 int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2100 int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2101 int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2102 int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2103 int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2104 int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2105 int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2106 int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2107 int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2108 int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2109 int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2110 int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2111
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2112 #define dct_long_mul(out, inq, coeff) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2113 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2114 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2115
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2116 #define dct_long_mac(out, acc, inq, coeff) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2117 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2118 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2119
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2120 #define dct_widen(out, inq) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2121 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2122 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2123
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2124 // wide add
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2125 #define dct_wadd(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2126 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2127 int32x4_t out##_h = vaddq_s32(a##_h, b##_h)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2128
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2129 // wide sub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2130 #define dct_wsub(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2131 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2132 int32x4_t out##_h = vsubq_s32(a##_h, b##_h)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2133
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2134 // butterfly a/b, then shift using "shiftop" by "s" and pack
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2135 #define dct_bfly32o(out0,out1, a,b,shiftop,s) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2136 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2137 dct_wadd(sum, a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2138 dct_wsub(dif, a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2139 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2140 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2141 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2142
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2143 #define dct_pass(shiftop, shift) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2144 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2145 /* even part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2146 int16x8_t sum26 = vaddq_s16(row2, row6); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2147 dct_long_mul(p1e, sum26, rot0_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2148 dct_long_mac(t2e, p1e, row6, rot0_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2149 dct_long_mac(t3e, p1e, row2, rot0_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2150 int16x8_t sum04 = vaddq_s16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2151 int16x8_t dif04 = vsubq_s16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2152 dct_widen(t0e, sum04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2153 dct_widen(t1e, dif04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2154 dct_wadd(x0, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2155 dct_wsub(x3, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2156 dct_wadd(x1, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2157 dct_wsub(x2, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2158 /* odd part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2159 int16x8_t sum15 = vaddq_s16(row1, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2160 int16x8_t sum17 = vaddq_s16(row1, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2161 int16x8_t sum35 = vaddq_s16(row3, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2162 int16x8_t sum37 = vaddq_s16(row3, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2163 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2164 dct_long_mul(p5o, sumodd, rot1_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2165 dct_long_mac(p1o, p5o, sum17, rot1_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2166 dct_long_mac(p2o, p5o, sum35, rot1_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2167 dct_long_mul(p3o, sum37, rot2_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2168 dct_long_mul(p4o, sum15, rot2_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2169 dct_wadd(sump13o, p1o, p3o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2170 dct_wadd(sump24o, p2o, p4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2171 dct_wadd(sump23o, p2o, p3o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2172 dct_wadd(sump14o, p1o, p4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2173 dct_long_mac(x4, sump13o, row7, rot3_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2174 dct_long_mac(x5, sump24o, row5, rot3_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2175 dct_long_mac(x6, sump23o, row3, rot3_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2176 dct_long_mac(x7, sump14o, row1, rot3_3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2177 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2178 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2179 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2180 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2181 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2182
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2183 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2184 row0 = vld1q_s16(data + 0*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2185 row1 = vld1q_s16(data + 1*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2186 row2 = vld1q_s16(data + 2*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2187 row3 = vld1q_s16(data + 3*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2188 row4 = vld1q_s16(data + 4*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2189 row5 = vld1q_s16(data + 5*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2190 row6 = vld1q_s16(data + 6*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2191 row7 = vld1q_s16(data + 7*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2192
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2193 // add DC bias
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2194 row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2195
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2196 // column pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2197 dct_pass(vrshrn_n_s32, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2198
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2199 // 16bit 8x8 transpose
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2200 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2201 // these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2202 // whether compilers actually get this is another story, sadly.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2203 #define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2204 #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]); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2205 #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)); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2206
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2207 // pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2208 dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2209 dct_trn16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2210 dct_trn16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2211 dct_trn16(row6, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2212
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2213 // pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2214 dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2215 dct_trn32(row1, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2216 dct_trn32(row4, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2217 dct_trn32(row5, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2218
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2219 // pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2220 dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2221 dct_trn64(row1, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2222 dct_trn64(row2, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2223 dct_trn64(row3, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2224
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2225 #undef dct_trn16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2226 #undef dct_trn32
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2227 #undef dct_trn64
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2228 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2229
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2230 // row pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2231 // vrshrn_n_s32 only supports shifts up to 16, we need
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2232 // 17. so do a non-rounding shift of 16 first then follow
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2233 // up with a rounding shift by 1.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2234 dct_pass(vshrn_n_s32, 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2235
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2236 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2237 // pack and round
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2238 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2239 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2240 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2241 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2242 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2243 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2244 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2245 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2246
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2247 // again, these can translate into one instruction, but often don't.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2248 #define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2249 #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]); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2250 #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]); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2251
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2252 // sadly can't use interleaved stores here since we only write
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2253 // 8 bytes to each scan line!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2254
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2255 // 8x8 8-bit transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2256 dct_trn8_8(p0, p1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2257 dct_trn8_8(p2, p3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2258 dct_trn8_8(p4, p5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2259 dct_trn8_8(p6, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2260
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2261 // pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2262 dct_trn8_16(p0, p2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2263 dct_trn8_16(p1, p3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2264 dct_trn8_16(p4, p6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2265 dct_trn8_16(p5, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2266
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2267 // pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2268 dct_trn8_32(p0, p4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2269 dct_trn8_32(p1, p5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2270 dct_trn8_32(p2, p6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2271 dct_trn8_32(p3, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2272
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2273 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2274 vst1_u8(out, p0); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2275 vst1_u8(out, p1); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2276 vst1_u8(out, p2); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2277 vst1_u8(out, p3); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2278 vst1_u8(out, p4); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2279 vst1_u8(out, p5); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2280 vst1_u8(out, p6); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2281 vst1_u8(out, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2282
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2283 #undef dct_trn8_8
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2284 #undef dct_trn8_16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2285 #undef dct_trn8_32
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2286 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2287
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2288 #undef dct_long_mul
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2289 #undef dct_long_mac
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2290 #undef dct_widen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2291 #undef dct_wadd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2292 #undef dct_wsub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2293 #undef dct_bfly32o
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2294 #undef dct_pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2295 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2296
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2297 #endif // STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2298
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2299 #define STBI__MARKER_none 0xff
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2300 // if there's a pending marker from the entropy stream, return that
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2301 // otherwise, fetch from the stream and get a marker. if there's no
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2302 // marker, return 0xff, which is never a valid marker value
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2303 static stbi_uc stbi__get_marker(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2304 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2305 stbi_uc x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2306 if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2307 x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2308 if (x != 0xff) return STBI__MARKER_none;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2309 while (x == 0xff)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2310 x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2311 return x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2312 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2313
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2314 // in each scan, we'll have scan_n components, and the order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2315 // of the components is specified by order[]
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2316 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2317
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2318 // after a restart interval, stbi__jpeg_reset the entropy decoder and
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2319 // the dc prediction
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2320 static void stbi__jpeg_reset(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2321 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2322 j->code_bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2323 j->code_buffer = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2324 j->nomore = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2325 j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2326 j->marker = STBI__MARKER_none;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2327 j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2328 j->eob_run = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2329 // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2330 // since we don't even allow 1<<30 pixels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2331 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2332
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2333 static int stbi__parse_entropy_coded_data(stbi__jpeg *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2334 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2335 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2336 if (!z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2337 if (z->scan_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2338 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2339 STBI_SIMD_ALIGN(short, data[64]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2340 int n = z->order[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2341 // non-interleaved data, we just need to process one block at a time,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2342 // in trivial scanline order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2343 // number of blocks to do just depends on how many actual "pixels" this
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2344 // component has, independent of interleaved MCU blocking and such
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2345 int w = (z->img_comp[n].x+7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2346 int h = (z->img_comp[n].y+7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2347 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2348 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2349 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2350 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;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2351 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2352 // every data block is an MCU, so countdown the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2353 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2354 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2355 // if it's NOT a restart, then just bail, so we get corrupt data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2356 // rather than no data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2357 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2358 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2359 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2360 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2361 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2362 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2363 } else { // interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2364 int i,j,k,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2365 STBI_SIMD_ALIGN(short, data[64]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2366 for (j=0; j < z->img_mcu_y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2367 for (i=0; i < z->img_mcu_x; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2368 // scan an interleaved mcu... process scan_n components in order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2369 for (k=0; k < z->scan_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2370 int n = z->order[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2371 // scan out an mcu's worth of this component; that's just determined
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2372 // by the basic H and V specified for the component
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2373 for (y=0; y < z->img_comp[n].v; ++y) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2374 for (x=0; x < z->img_comp[n].h; ++x) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2375 int x2 = (i*z->img_comp[n].h + x)*8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2376 int y2 = (j*z->img_comp[n].v + y)*8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2377 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2378 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;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2379 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2380 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2381 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2382 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2383 // after all interleaved components, that's an interleaved MCU,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2384 // so now count down the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2385 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2386 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2387 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2388 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2389 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2390 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2391 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2392 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2393 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2394 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2395 if (z->scan_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2396 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2397 int n = z->order[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2398 // non-interleaved data, we just need to process one block at a time,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2399 // in trivial scanline order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2400 // number of blocks to do just depends on how many actual "pixels" this
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2401 // component has, independent of interleaved MCU blocking and such
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2402 int w = (z->img_comp[n].x+7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2403 int h = (z->img_comp[n].y+7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2404 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2405 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2406 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2407 if (z->spec_start == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2408 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2409 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2410 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2411 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2412 if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2413 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2414 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2415 // every data block is an MCU, so countdown the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2416 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2417 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2418 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2419 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2420 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2421 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2422 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2423 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2424 } else { // interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2425 int i,j,k,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2426 for (j=0; j < z->img_mcu_y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2427 for (i=0; i < z->img_mcu_x; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2428 // scan an interleaved mcu... process scan_n components in order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2429 for (k=0; k < z->scan_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2430 int n = z->order[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2431 // scan out an mcu's worth of this component; that's just determined
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2432 // by the basic H and V specified for the component
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2433 for (y=0; y < z->img_comp[n].v; ++y) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2434 for (x=0; x < z->img_comp[n].h; ++x) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2435 int x2 = (i*z->img_comp[n].h + x);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2436 int y2 = (j*z->img_comp[n].v + y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2437 short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2438 if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2439 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2440 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2441 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2442 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2443 // after all interleaved components, that's an interleaved MCU,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2444 // so now count down the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2445 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2446 if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2447 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2448 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2449 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2450 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2451 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2452 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2453 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2454 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2455 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2456
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2457 static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2458 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2459 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2460 for (i=0; i < 64; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2461 data[i] *= dequant[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2462 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2463
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2464 static void stbi__jpeg_finish(stbi__jpeg *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2465 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2466 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2467 // dequantize and idct the data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2468 int i,j,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2469 for (n=0; n < z->s->img_n; ++n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2470 int w = (z->img_comp[n].x+7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2471 int h = (z->img_comp[n].y+7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2472 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2473 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2474 short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2475 stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2476 z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2477 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2478 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2479 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2480 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2481 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2482
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2483 static int stbi__process_marker(stbi__jpeg *z, int m)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2484 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2485 int L;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2486 switch (m) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2487 case STBI__MARKER_none: // no marker found
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2488 return stbi__err("expected marker","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2489
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2490 case 0xDD: // DRI - specify restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2491 if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2492 z->restart_interval = stbi__get16be(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2493 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2494
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2495 case 0xDB: // DQT - define quantization table
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2496 L = stbi__get16be(z->s)-2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2497 while (L > 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2498 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2499 int p = q >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2500 int t = q & 15,i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2501 if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2502 if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2503 for (i=0; i < 64; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2504 z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2505 L -= 65;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2506 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2507 return L==0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2508
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2509 case 0xC4: // DHT - define huffman table
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2510 L = stbi__get16be(z->s)-2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2511 while (L > 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2512 stbi_uc *v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2513 int sizes[16],i,n=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2514 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2515 int tc = q >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2516 int th = q & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2517 if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2518 for (i=0; i < 16; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2519 sizes[i] = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2520 n += sizes[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2521 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2522 L -= 17;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2523 if (tc == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2524 if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2525 v = z->huff_dc[th].values;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2526 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2527 if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2528 v = z->huff_ac[th].values;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2529 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2530 for (i=0; i < n; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2531 v[i] = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2532 if (tc != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2533 stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2534 L -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2535 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2536 return L==0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2537 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2538 // check for comment block or APP blocks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2539 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2540 stbi__skip(z->s, stbi__get16be(z->s)-2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2541 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2542 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2543 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2544 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2545
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2546 // after we see SOS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2547 static int stbi__process_scan_header(stbi__jpeg *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2548 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2549 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2550 int Ls = stbi__get16be(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2551 z->scan_n = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2552 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");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2553 if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2554 for (i=0; i < z->scan_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2555 int id = stbi__get8(z->s), which;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2556 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2557 for (which = 0; which < z->s->img_n; ++which)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2558 if (z->img_comp[which].id == id)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2559 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2560 if (which == z->s->img_n) return 0; // no match
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2561 z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2562 z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2563 z->order[i] = which;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2564 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2565
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2566 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2567 int aa;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2568 z->spec_start = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2569 z->spec_end = stbi__get8(z->s); // should be 63, but might be 0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2570 aa = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2571 z->succ_high = (aa >> 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2572 z->succ_low = (aa & 15);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2573 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2574 if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2575 return stbi__err("bad SOS", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2576 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2577 if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2578 if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2579 z->spec_end = 63;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2580 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2581 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2582
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2583 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2584 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2585
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2586 static int stbi__process_frame_header(stbi__jpeg *z, int scan)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2587 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2588 stbi__context *s = z->s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2589 int Lf,p,i,q, h_max=1,v_max=1,c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2590 Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2591 p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2592 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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2593 s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2594 c = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2595 if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG"); // JFIF requires
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2596 s->img_n = c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2597 for (i=0; i < c; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2598 z->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2599 z->img_comp[i].linebuf = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2600 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2601
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2602 if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2603
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2604 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2605 z->img_comp[i].id = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2606 if (z->img_comp[i].id != i+1) // JFIF requires
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2607 if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2608 return stbi__err("bad component ID","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2609 q = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2610 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");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2611 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");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2612 z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2613 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2614
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2615 if (scan != STBI__SCAN_load) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2616
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2617 if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2618
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2619 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2620 if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2621 if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2622 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2623
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2624 // compute interleaved mcu info
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2625 z->img_h_max = h_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2626 z->img_v_max = v_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2627 z->img_mcu_w = h_max * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2628 z->img_mcu_h = v_max * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2629 z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2630 z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2631
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2632 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2633 // number of effective pixels (e.g. for non-interleaved MCU)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2634 z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2635 z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2636 // to simplify generation, we'll allocate enough memory to decode
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2637 // the bogus oversized data from using interleaved MCUs and their
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2638 // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2639 // discard the extra data until colorspace conversion
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2640 z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2641 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2642 z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2643
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2644 if (z->img_comp[i].raw_data == NULL) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2645 for(--i; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2646 STBI_FREE(z->img_comp[i].raw_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2647 z->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2648 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2649 return stbi__err("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2650 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2651 // align blocks for idct using mmx/sse
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2652 z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2653 z->img_comp[i].linebuf = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2654 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2655 z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2656 z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2657 z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2658 z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2659 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2660 z->img_comp[i].coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2661 z->img_comp[i].raw_coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2662 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2663 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2664
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2665 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2666 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2667
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2668 // use comparisons since in some cases we handle more than one case (e.g. SOF)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2669 #define stbi__DNL(x) ((x) == 0xdc)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2670 #define stbi__SOI(x) ((x) == 0xd8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2671 #define stbi__EOI(x) ((x) == 0xd9)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2672 #define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2673 #define stbi__SOS(x) ((x) == 0xda)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2674
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2675 #define stbi__SOF_progressive(x) ((x) == 0xc2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2676
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2677 static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2678 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2679 int m;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2680 z->marker = STBI__MARKER_none; // initialize cached marker to empty
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2681 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2682 if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2683 if (scan == STBI__SCAN_type) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2684 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2685 while (!stbi__SOF(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2686 if (!stbi__process_marker(z,m)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2687 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2688 while (m == STBI__MARKER_none) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2689 // some files have extra padding after their blocks, so ok, we'll scan
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2690 if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2691 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2692 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2693 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2694 z->progressive = stbi__SOF_progressive(m);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2695 if (!stbi__process_frame_header(z, scan)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2696 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2697 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2698
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2699 // decode image to YCbCr format
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2700 static int stbi__decode_jpeg_image(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2701 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2702 int m;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2703 j->restart_interval = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2704 if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2705 m = stbi__get_marker(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2706 while (!stbi__EOI(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2707 if (stbi__SOS(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2708 if (!stbi__process_scan_header(j)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2709 if (!stbi__parse_entropy_coded_data(j)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2710 if (j->marker == STBI__MARKER_none ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2711 // handle 0s at the end of image data from IP Kamera 9060
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2712 while (!stbi__at_eof(j->s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2713 int x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2714 if (x == 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2715 j->marker = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2716 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2717 } else if (x != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2718 return stbi__err("junk before marker", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2719 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2720 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2721 // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2722 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2723 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2724 if (!stbi__process_marker(j, m)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2725 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2726 m = stbi__get_marker(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2727 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2728 if (j->progressive)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2729 stbi__jpeg_finish(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2730 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2731 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2732
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2733 // static jfif-centered resampling (across block boundaries)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2734
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2735 typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2736 int w, int hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2737
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2738 #define stbi__div4(x) ((stbi_uc) ((x) >> 2))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2739
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2740 static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2741 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2742 STBI_NOTUSED(out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2743 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2744 STBI_NOTUSED(w);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2745 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2746 return in_near;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2747 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2748
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2749 static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2750 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2751 // need to generate two samples vertically for every one in input
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2752 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2753 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2754 for (i=0; i < w; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2755 out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2756 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2757 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2758
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2759 static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2760 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2761 // need to generate two samples horizontally for every one in input
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2762 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2763 stbi_uc *input = in_near;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2764
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2765 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2766 // if only one sample, can't do any interpolation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2767 out[0] = out[1] = input[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2768 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2769 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2770
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2771 out[0] = input[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2772 out[1] = stbi__div4(input[0]*3 + input[1] + 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2773 for (i=1; i < w-1; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2774 int n = 3*input[i]+2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2775 out[i*2+0] = stbi__div4(n+input[i-1]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2776 out[i*2+1] = stbi__div4(n+input[i+1]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2777 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2778 out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2779 out[i*2+1] = input[w-1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2780
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2781 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2782 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2783
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2784 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2785 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2786
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2787 #define stbi__div16(x) ((stbi_uc) ((x) >> 4))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2788
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2789 static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2790 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2791 // need to generate 2x2 samples for every one in input
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2792 int i,t0,t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2793 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2794 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2795 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2796 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2797
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2798 t1 = 3*in_near[0] + in_far[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2799 out[0] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2800 for (i=1; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2801 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2802 t1 = 3*in_near[i]+in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2803 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2804 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2805 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2806 out[w*2-1] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2807
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2808 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2809
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2810 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2811 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2812
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2813 #if defined(STBI_SSE2) || defined(STBI_NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2814 static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2815 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2816 // need to generate 2x2 samples for every one in input
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2817 int i=0,t0,t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2818
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2819 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2820 out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2821 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2822 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2823
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2824 t1 = 3*in_near[0] + in_far[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2825 // process groups of 8 pixels for as long as we can.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2826 // note we can't handle the last pixel in a row in this loop
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2827 // because we need to handle the filter boundary conditions.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2828 for (; i < ((w-1) & ~7); i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2829 #if defined(STBI_SSE2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2830 // load and perform the vertical filtering pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2831 // this uses 3*x + y = 4*x + (y - x)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2832 __m128i zero = _mm_setzero_si128();
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2833 __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2834 __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2835 __m128i farw = _mm_unpacklo_epi8(farb, zero);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2836 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2837 __m128i diff = _mm_sub_epi16(farw, nearw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2838 __m128i nears = _mm_slli_epi16(nearw, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2839 __m128i curr = _mm_add_epi16(nears, diff); // current row
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2840
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2841 // horizontal filter works the same based on shifted vers of current
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2842 // row. "prev" is current row shifted right by 1 pixel; we need to
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2843 // insert the previous pixel value (from t1).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2844 // "next" is current row shifted left by 1 pixel, with first pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2845 // of next block of 8 pixels added in.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2846 __m128i prv0 = _mm_slli_si128(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2847 __m128i nxt0 = _mm_srli_si128(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2848 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2849 __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2850
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2851 // horizontal filter, polyphase implementation since it's convenient:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2852 // even pixels = 3*cur + prev = cur*4 + (prev - cur)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2853 // odd pixels = 3*cur + next = cur*4 + (next - cur)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2854 // note the shared term.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2855 __m128i bias = _mm_set1_epi16(8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2856 __m128i curs = _mm_slli_epi16(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2857 __m128i prvd = _mm_sub_epi16(prev, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2858 __m128i nxtd = _mm_sub_epi16(next, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2859 __m128i curb = _mm_add_epi16(curs, bias);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2860 __m128i even = _mm_add_epi16(prvd, curb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2861 __m128i odd = _mm_add_epi16(nxtd, curb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2862
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2863 // interleave even and odd pixels, then undo scaling.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2864 __m128i int0 = _mm_unpacklo_epi16(even, odd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2865 __m128i int1 = _mm_unpackhi_epi16(even, odd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2866 __m128i de0 = _mm_srli_epi16(int0, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2867 __m128i de1 = _mm_srli_epi16(int1, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2868
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2869 // pack and write output
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2870 __m128i outv = _mm_packus_epi16(de0, de1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2871 _mm_storeu_si128((__m128i *) (out + i*2), outv);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2872 #elif defined(STBI_NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2873 // load and perform the vertical filtering pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2874 // this uses 3*x + y = 4*x + (y - x)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2875 uint8x8_t farb = vld1_u8(in_far + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2876 uint8x8_t nearb = vld1_u8(in_near + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2877 int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2878 int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2879 int16x8_t curr = vaddq_s16(nears, diff); // current row
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2880
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2881 // horizontal filter works the same based on shifted vers of current
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2882 // row. "prev" is current row shifted right by 1 pixel; we need to
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2883 // insert the previous pixel value (from t1).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2884 // "next" is current row shifted left by 1 pixel, with first pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2885 // of next block of 8 pixels added in.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2886 int16x8_t prv0 = vextq_s16(curr, curr, 7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2887 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2888 int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2889 int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2890
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2891 // horizontal filter, polyphase implementation since it's convenient:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2892 // even pixels = 3*cur + prev = cur*4 + (prev - cur)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2893 // odd pixels = 3*cur + next = cur*4 + (next - cur)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2894 // note the shared term.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2895 int16x8_t curs = vshlq_n_s16(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2896 int16x8_t prvd = vsubq_s16(prev, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2897 int16x8_t nxtd = vsubq_s16(next, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2898 int16x8_t even = vaddq_s16(curs, prvd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2899 int16x8_t odd = vaddq_s16(curs, nxtd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2900
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2901 // undo scaling and round, then store with even/odd phases interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2902 uint8x8x2_t o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2903 o.val[0] = vqrshrun_n_s16(even, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2904 o.val[1] = vqrshrun_n_s16(odd, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2905 vst2_u8(out + i*2, o);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2906 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2907
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2908 // "previous" value for next iter
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2909 t1 = 3*in_near[i+7] + in_far[i+7];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2910 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2911
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2912 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2913 t1 = 3*in_near[i] + in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2914 out[i*2] = stbi__div16(3*t1 + t0 + 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2915
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2916 for (++i; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2917 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2918 t1 = 3*in_near[i]+in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2919 out[i*2-1] = stbi__div16(3*t0 + t1 + 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2920 out[i*2 ] = stbi__div16(3*t1 + t0 + 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2921 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2922 out[w*2-1] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2923
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2924 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2925
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2926 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2927 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2928 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2929
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2930 static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2931 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2932 // resample with nearest-neighbor
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2933 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2934 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2935 for (i=0; i < w; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2936 for (j=0; j < hs; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2937 out[i*hs+j] = in_near[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2938 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2939 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2940
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2941 #ifdef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2942 // this is the same YCbCr-to-RGB calculation that stb_image has used
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2943 // historically before the algorithm changes in 1.49
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2944 #define float2fixed(x) ((int) ((x) * 65536 + 0.5))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2945 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)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2946 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2947 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2948 for (i=0; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2949 int y_fixed = (y[i] << 16) + 32768; // rounding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2950 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2951 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2952 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2953 r = y_fixed + cr*float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2954 g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2955 b = y_fixed + cb*float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2956 r >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2957 g >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2958 b >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2959 if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2960 if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2961 if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2962 out[0] = (stbi_uc)r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2963 out[1] = (stbi_uc)g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2964 out[2] = (stbi_uc)b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2965 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2966 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2967 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2968 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2969 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2970 // this is a reduced-precision calculation of YCbCr-to-RGB introduced
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2971 // to make sure the code produces the same results in both SIMD and scalar
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2972 #define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2973 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)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2974 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2975 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2976 for (i=0; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2977 int y_fixed = (y[i] << 20) + (1<<19); // rounding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2978 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2979 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2980 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2981 r = y_fixed + cr* float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2982 g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2983 b = y_fixed + cb* float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2984 r >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2985 g >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2986 b >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2987 if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2988 if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2989 if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2990 out[0] = (stbi_uc)r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2991 out[1] = (stbi_uc)g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2992 out[2] = (stbi_uc)b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2993 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2994 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2995 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2996 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2997 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2998
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2999 #if defined(STBI_SSE2) || defined(STBI_NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3000 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)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3001 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3002 int i = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3003
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3004 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3005 // step == 3 is pretty ugly on the final interleave, and i'm not convinced
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3006 // it's useful in practice (you wouldn't use it for textures, for example).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3007 // so just accelerate step == 4 case.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3008 if (step == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3009 // this is a fairly straightforward implementation and not super-optimized.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3010 __m128i signflip = _mm_set1_epi8(-0x80);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3011 __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3012 __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3013 __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3014 __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3015 __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3016 __m128i xw = _mm_set1_epi16(255); // alpha channel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3017
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3018 for (; i+7 < count; i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3019 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3020 __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3021 __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3022 __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3023 __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3024 __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3025
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3026 // unpack to short (and left-shift cr, cb by 8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3027 __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3028 __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3029 __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3030
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3031 // color transform
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3032 __m128i yws = _mm_srli_epi16(yw, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3033 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3034 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3035 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3036 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3037 __m128i rws = _mm_add_epi16(cr0, yws);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3038 __m128i gwt = _mm_add_epi16(cb0, yws);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3039 __m128i bws = _mm_add_epi16(yws, cb1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3040 __m128i gws = _mm_add_epi16(gwt, cr1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3041
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3042 // descale
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3043 __m128i rw = _mm_srai_epi16(rws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3044 __m128i bw = _mm_srai_epi16(bws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3045 __m128i gw = _mm_srai_epi16(gws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3046
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3047 // back to byte, set up for transpose
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3048 __m128i brb = _mm_packus_epi16(rw, bw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3049 __m128i gxb = _mm_packus_epi16(gw, xw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3050
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3051 // transpose to interleave channels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3052 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3053 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3054 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3055 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3056
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3057 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3058 _mm_storeu_si128((__m128i *) (out + 0), o0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3059 _mm_storeu_si128((__m128i *) (out + 16), o1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3060 out += 32;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3061 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3062 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3063 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3064
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3065 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3066 // in this version, step=3 support would be easy to add. but is there demand?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3067 if (step == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3068 // this is a fairly straightforward implementation and not super-optimized.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3069 uint8x8_t signflip = vdup_n_u8(0x80);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3070 int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3071 int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3072 int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3073 int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3074
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3075 for (; i+7 < count; i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3076 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3077 uint8x8_t y_bytes = vld1_u8(y + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3078 uint8x8_t cr_bytes = vld1_u8(pcr + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3079 uint8x8_t cb_bytes = vld1_u8(pcb + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3080 int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3081 int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3082
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3083 // expand to s16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3084 int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3085 int16x8_t crw = vshll_n_s8(cr_biased, 7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3086 int16x8_t cbw = vshll_n_s8(cb_biased, 7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3087
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3088 // color transform
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3089 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3090 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3091 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3092 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3093 int16x8_t rws = vaddq_s16(yws, cr0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3094 int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3095 int16x8_t bws = vaddq_s16(yws, cb1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3096
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3097 // undo scaling, round, convert to byte
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3098 uint8x8x4_t o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3099 o.val[0] = vqrshrun_n_s16(rws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3100 o.val[1] = vqrshrun_n_s16(gws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3101 o.val[2] = vqrshrun_n_s16(bws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3102 o.val[3] = vdup_n_u8(255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3103
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3104 // store, interleaving r/g/b/a
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3105 vst4_u8(out, o);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3106 out += 8*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3107 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3108 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3109 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3110
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3111 for (; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3112 int y_fixed = (y[i] << 20) + (1<<19); // rounding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3113 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3114 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3115 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3116 r = y_fixed + cr* float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3117 g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3118 b = y_fixed + cb* float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3119 r >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3120 g >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3121 b >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3122 if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3123 if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3124 if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3125 out[0] = (stbi_uc)r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3126 out[1] = (stbi_uc)g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3127 out[2] = (stbi_uc)b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3128 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3129 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3130 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3131 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3132 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3133
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3134 // set up the kernels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3135 static void stbi__setup_jpeg(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3136 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3137 j->idct_block_kernel = stbi__idct_block;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3138 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3139 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3140
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3141 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3142 if (stbi__sse2_available()) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3143 j->idct_block_kernel = stbi__idct_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3144 #ifndef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3145 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3146 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3147 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3148 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3149 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3150
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3151 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3152 j->idct_block_kernel = stbi__idct_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3153 #ifndef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3154 j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3155 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3156 j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3157 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3158 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3159
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3160 // clean up the temporary component buffers
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3161 static void stbi__cleanup_jpeg(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3162 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3163 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3164 for (i=0; i < j->s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3165 if (j->img_comp[i].raw_data) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3166 STBI_FREE(j->img_comp[i].raw_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3167 j->img_comp[i].raw_data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3168 j->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3169 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3170 if (j->img_comp[i].raw_coeff) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3171 STBI_FREE(j->img_comp[i].raw_coeff);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3172 j->img_comp[i].raw_coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3173 j->img_comp[i].coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3174 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3175 if (j->img_comp[i].linebuf) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3176 STBI_FREE(j->img_comp[i].linebuf);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3177 j->img_comp[i].linebuf = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3178 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3179 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3180 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3181
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3182 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3183 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3184 resample_row_func resample;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3185 stbi_uc *line0,*line1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3186 int hs,vs; // expansion factor in each axis
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3187 int w_lores; // horizontal pixels pre-expansion
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3188 int ystep; // how far through vertical expansion we are
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3189 int ypos; // which pre-expansion row we're on
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3190 } stbi__resample;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3191
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3192 static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3193 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3194 int n, decode_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3195 z->s->img_n = 0; // make stbi__cleanup_jpeg safe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3196
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3197 // validate req_comp
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3198 if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3199
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3200 // load a jpeg image from whichever source, but leave in YCbCr format
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3201 if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3202
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3203 // determine actual number of components to generate
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3204 n = req_comp ? req_comp : z->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3205
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3206 if (z->s->img_n == 3 && n < 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3207 decode_n = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3208 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3209 decode_n = z->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3210
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3211 // resample and color-convert
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3212 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3213 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3214 unsigned int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3215 stbi_uc *output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3216 stbi_uc *coutput[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3217
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3218 stbi__resample res_comp[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3219
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3220 for (k=0; k < decode_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3221 stbi__resample *r = &res_comp[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3222
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3223 // allocate line buffer big enough for upsampling off the edges
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3224 // with upsample factor of 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3225 z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3226 if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3227
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3228 r->hs = z->img_h_max / z->img_comp[k].h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3229 r->vs = z->img_v_max / z->img_comp[k].v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3230 r->ystep = r->vs >> 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3231 r->w_lores = (z->s->img_x + r->hs-1) / r->hs;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3232 r->ypos = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3233 r->line0 = r->line1 = z->img_comp[k].data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3234
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3235 if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3236 else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3237 else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3238 else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3239 else r->resample = stbi__resample_row_generic;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3240 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3241
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3242 // can't error after this so, this is safe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3243 output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3244 if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3245
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3246 // now go ahead and resample
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3247 for (j=0; j < z->s->img_y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3248 stbi_uc *out = output + n * z->s->img_x * j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3249 for (k=0; k < decode_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3250 stbi__resample *r = &res_comp[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3251 int y_bot = r->ystep >= (r->vs >> 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3252 coutput[k] = r->resample(z->img_comp[k].linebuf,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3253 y_bot ? r->line1 : r->line0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3254 y_bot ? r->line0 : r->line1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3255 r->w_lores, r->hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3256 if (++r->ystep >= r->vs) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3257 r->ystep = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3258 r->line0 = r->line1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3259 if (++r->ypos < z->img_comp[k].y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3260 r->line1 += z->img_comp[k].w2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3261 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3262 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3263 if (n >= 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3264 stbi_uc *y = coutput[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3265 if (z->s->img_n == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3266 z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3267 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3268 for (i=0; i < z->s->img_x; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3269 out[0] = out[1] = out[2] = y[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3270 out[3] = 255; // not used if n==3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3271 out += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3272 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3273 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3274 stbi_uc *y = coutput[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3275 if (n == 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3276 for (i=0; i < z->s->img_x; ++i) out[i] = y[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3277 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3278 for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3279 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3280 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3281 stbi__cleanup_jpeg(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3282 *out_x = z->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3283 *out_y = z->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3284 if (comp) *comp = z->s->img_n; // report original components, not output
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3285 return output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3286 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3287 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3288
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3289 static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3290 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3291 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3292 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3293 stbi__setup_jpeg(&j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3294 return load_jpeg_image(&j, x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3295 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3296
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3297 static int stbi__jpeg_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3298 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3299 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3300 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3301 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3302 stbi__setup_jpeg(&j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3303 r = stbi__decode_jpeg_header(&j, STBI__SCAN_type);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3304 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3305 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3306 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3307
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3308 static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3309 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3310 if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3311 stbi__rewind( j->s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3312 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3313 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3314 if (x) *x = j->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3315 if (y) *y = j->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3316 if (comp) *comp = j->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3317 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3318 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3319
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3320 static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3321 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3322 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3323 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3324 return stbi__jpeg_info_raw(&j, x, y, comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3325 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3326 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3327
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3328 // public domain zlib decode v0.2 Sean Barrett 2006-11-18
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3329 // simple implementation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3330 // - all input must be provided in an upfront buffer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3331 // - all output is written to a single output buffer (can malloc/realloc)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3332 // performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3333 // - fast huffman
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3334
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3335 #ifndef STBI_NO_ZLIB
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3336
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3337 // fast-way is faster to check than jpeg huffman, but slow way is slower
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3338 #define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3339 #define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3340
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3341 // zlib-style huffman encoding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3342 // (jpegs packs from left, zlib from right, so can't share code)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3343 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3344 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3345 stbi__uint16 fast[1 << STBI__ZFAST_BITS];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3346 stbi__uint16 firstcode[16];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3347 int maxcode[17];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3348 stbi__uint16 firstsymbol[16];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3349 stbi_uc size[288];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3350 stbi__uint16 value[288];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3351 } stbi__zhuffman;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3352
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3353 stbi_inline static int stbi__bitreverse16(int n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3354 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3355 n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3356 n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3357 n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3358 n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3359 return n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3360 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3361
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3362 stbi_inline static int stbi__bit_reverse(int v, int bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3363 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3364 STBI_ASSERT(bits <= 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3365 // to bit reverse n bits, reverse 16 and shift
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3366 // e.g. 11 bits, bit reverse and shift away 5
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3367 return stbi__bitreverse16(v) >> (16-bits);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3368 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3369
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3370 static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3371 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3372 int i,k=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3373 int code, next_code[16], sizes[17];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3374
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3375 // DEFLATE spec for generating codes
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3376 memset(sizes, 0, sizeof(sizes));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3377 memset(z->fast, 0, sizeof(z->fast));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3378 for (i=0; i < num; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3379 ++sizes[sizelist[i]];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3380 sizes[0] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3381 for (i=1; i < 16; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3382 STBI_ASSERT(sizes[i] <= (1 << i));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3383 code = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3384 for (i=1; i < 16; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3385 next_code[i] = code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3386 z->firstcode[i] = (stbi__uint16) code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3387 z->firstsymbol[i] = (stbi__uint16) k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3388 code = (code + sizes[i]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3389 if (sizes[i])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3390 if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3391 z->maxcode[i] = code << (16-i); // preshift for inner loop
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3392 code <<= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3393 k += sizes[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3394 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3395 z->maxcode[16] = 0x10000; // sentinel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3396 for (i=0; i < num; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3397 int s = sizelist[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3398 if (s) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3399 int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3400 stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3401 z->size [c] = (stbi_uc ) s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3402 z->value[c] = (stbi__uint16) i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3403 if (s <= STBI__ZFAST_BITS) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3404 int k = stbi__bit_reverse(next_code[s],s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3405 while (k < (1 << STBI__ZFAST_BITS)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3406 z->fast[k] = fastv;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3407 k += (1 << s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3408 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3409 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3410 ++next_code[s];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3411 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3412 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3413 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3414 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3415
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3416 // zlib-from-memory implementation for PNG reading
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3417 // because PNG allows splitting the zlib stream arbitrarily,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3418 // and it's annoying structurally to have PNG call ZLIB call PNG,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3419 // we require PNG read all the IDATs and combine them into a single
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3420 // memory buffer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3421
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3422 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3423 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3424 stbi_uc *zbuffer, *zbuffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3425 int num_bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3426 stbi__uint32 code_buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3427
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3428 char *zout;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3429 char *zout_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3430 char *zout_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3431 int z_expandable;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3432
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3433 stbi__zhuffman z_length, z_distance;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3434 } stbi__zbuf;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3435
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3436 stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3437 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3438 if (z->zbuffer >= z->zbuffer_end) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3439 return *z->zbuffer++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3440 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3441
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3442 static void stbi__fill_bits(stbi__zbuf *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3443 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3444 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3445 STBI_ASSERT(z->code_buffer < (1U << z->num_bits));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3446 z->code_buffer |= stbi__zget8(z) << z->num_bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3447 z->num_bits += 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3448 } while (z->num_bits <= 24);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3449 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3450
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3451 stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3452 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3453 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3454 if (z->num_bits < n) stbi__fill_bits(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3455 k = z->code_buffer & ((1 << n) - 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3456 z->code_buffer >>= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3457 z->num_bits -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3458 return k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3459 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3460
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3461 static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3462 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3463 int b,s,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3464 // not resolved by fast table, so compute it the slow way
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3465 // use jpeg approach, which requires MSbits at top
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3466 k = stbi__bit_reverse(a->code_buffer, 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3467 for (s=STBI__ZFAST_BITS+1; ; ++s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3468 if (k < z->maxcode[s])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3469 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3470 if (s == 16) return -1; // invalid code!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3471 // code size is s, so:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3472 b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3473 STBI_ASSERT(z->size[b] == s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3474 a->code_buffer >>= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3475 a->num_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3476 return z->value[b];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3477 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3478
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3479 stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3480 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3481 int b,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3482 if (a->num_bits < 16) stbi__fill_bits(a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3483 b = z->fast[a->code_buffer & STBI__ZFAST_MASK];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3484 if (b) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3485 s = b >> 9;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3486 a->code_buffer >>= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3487 a->num_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3488 return b & 511;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3489 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3490 return stbi__zhuffman_decode_slowpath(a, z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3491 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3492
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3493 static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3494 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3495 char *q;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3496 int cur, limit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3497 z->zout = zout;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3498 if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3499 cur = (int) (z->zout - z->zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3500 limit = (int) (z->zout_end - z->zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3501 while (cur + n > limit)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3502 limit *= 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3503 q = (char *) STBI_REALLOC(z->zout_start, limit);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3504 if (q == NULL) return stbi__err("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3505 z->zout_start = q;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3506 z->zout = q + cur;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3507 z->zout_end = q + limit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3508 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3509 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3510
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3511 static int stbi__zlength_base[31] = {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3512 3,4,5,6,7,8,9,10,11,13,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3513 15,17,19,23,27,31,35,43,51,59,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3514 67,83,99,115,131,163,195,227,258,0,0 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3515
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3516 static int stbi__zlength_extra[31]=
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3517 { 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 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3518
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3519 static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3520 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3521
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3522 static int stbi__zdist_extra[32] =
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3523 { 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};
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3524
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3525 static int stbi__parse_huffman_block(stbi__zbuf *a)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3526 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3527 char *zout = a->zout;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3528 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3529 int z = stbi__zhuffman_decode(a, &a->z_length);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3530 if (z < 256) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3531 if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3532 if (zout >= a->zout_end) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3533 if (!stbi__zexpand(a, zout, 1)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3534 zout = a->zout;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3535 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3536 *zout++ = (char) z;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3537 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3538 stbi_uc *p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3539 int len,dist;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3540 if (z == 256) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3541 a->zout = zout;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3542 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3543 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3544 z -= 257;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3545 len = stbi__zlength_base[z];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3546 if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3547 z = stbi__zhuffman_decode(a, &a->z_distance);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3548 if (z < 0) return stbi__err("bad huffman code","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3549 dist = stbi__zdist_base[z];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3550 if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3551 if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3552 if (zout + len > a->zout_end) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3553 if (!stbi__zexpand(a, zout, len)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3554 zout = a->zout;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3555 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3556 p = (stbi_uc *) (zout - dist);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3557 if (dist == 1) { // run of one byte; common in images.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3558 stbi_uc v = *p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3559 do *zout++ = v; while (--len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3560 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3561 do *zout++ = *p++; while (--len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3562 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3563 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3564 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3565 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3566
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3567 static int stbi__compute_huffman_codes(stbi__zbuf *a)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3568 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3569 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 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3570 stbi__zhuffman z_codelength;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3571 stbi_uc lencodes[286+32+137];//padding for maximum single op
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3572 stbi_uc codelength_sizes[19];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3573 int i,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3574
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3575 int hlit = stbi__zreceive(a,5) + 257;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3576 int hdist = stbi__zreceive(a,5) + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3577 int hclen = stbi__zreceive(a,4) + 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3578
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3579 memset(codelength_sizes, 0, sizeof(codelength_sizes));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3580 for (i=0; i < hclen; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3581 int s = stbi__zreceive(a,3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3582 codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3583 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3584 if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3585
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3586 n = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3587 while (n < hlit + hdist) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3588 int c = stbi__zhuffman_decode(a, &z_codelength);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3589 STBI_ASSERT(c >= 0 && c < 19);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3590 if (c < 16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3591 lencodes[n++] = (stbi_uc) c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3592 else if (c == 16) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3593 c = stbi__zreceive(a,2)+3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3594 memset(lencodes+n, lencodes[n-1], c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3595 n += c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3596 } else if (c == 17) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3597 c = stbi__zreceive(a,3)+3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3598 memset(lencodes+n, 0, c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3599 n += c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3600 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3601 STBI_ASSERT(c == 18);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3602 c = stbi__zreceive(a,7)+11;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3603 memset(lencodes+n, 0, c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3604 n += c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3605 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3606 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3607 if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3608 if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3609 if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3610 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3611 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3612
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3613 static int stbi__parse_uncomperssed_block(stbi__zbuf *a)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3614 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3615 stbi_uc header[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3616 int len,nlen,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3617 if (a->num_bits & 7)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3618 stbi__zreceive(a, a->num_bits & 7); // discard
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3619 // drain the bit-packed data into header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3620 k = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3621 while (a->num_bits > 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3622 header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3623 a->code_buffer >>= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3624 a->num_bits -= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3625 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3626 STBI_ASSERT(a->num_bits == 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3627 // now fill header the normal way
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3628 while (k < 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3629 header[k++] = stbi__zget8(a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3630 len = header[1] * 256 + header[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3631 nlen = header[3] * 256 + header[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3632 if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3633 if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3634 if (a->zout + len > a->zout_end)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3635 if (!stbi__zexpand(a, a->zout, len)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3636 memcpy(a->zout, a->zbuffer, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3637 a->zbuffer += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3638 a->zout += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3639 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3640 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3641
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3642 static int stbi__parse_zlib_header(stbi__zbuf *a)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3643 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3644 int cmf = stbi__zget8(a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3645 int cm = cmf & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3646 /* int cinfo = cmf >> 4; */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3647 int flg = stbi__zget8(a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3648 if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3649 if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3650 if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3651 // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3652 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3653 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3654
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3655 // @TODO: should statically initialize these for optimal thread safety
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3656 static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3657 static void stbi__init_zdefaults(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3658 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3659 int i; // use <= to match clearly with spec
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3660 for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3661 for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3662 for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3663 for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3664
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3665 for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3666 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3667
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3668 static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3669 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3670 int final, type;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3671 if (parse_header)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3672 if (!stbi__parse_zlib_header(a)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3673 a->num_bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3674 a->code_buffer = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3675 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3676 final = stbi__zreceive(a,1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3677 type = stbi__zreceive(a,2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3678 if (type == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3679 if (!stbi__parse_uncomperssed_block(a)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3680 } else if (type == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3681 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3682 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3683 if (type == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3684 // use fixed code lengths
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3685 if (!stbi__zdefault_distance[31]) stbi__init_zdefaults();
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3686 if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3687 if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3688 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3689 if (!stbi__compute_huffman_codes(a)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3690 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3691 if (!stbi__parse_huffman_block(a)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3692 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3693 } while (!final);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3694 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3695 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3696
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3697 static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3698 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3699 a->zout_start = obuf;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3700 a->zout = obuf;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3701 a->zout_end = obuf + olen;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3702 a->z_expandable = exp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3703
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3704 return stbi__parse_zlib(a, parse_header);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3705 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3706
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3707 STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3708 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3709 stbi__zbuf a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3710 char *p = (char *) stbi__malloc(initial_size);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3711 if (p == NULL) return NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3712 a.zbuffer = (stbi_uc *) buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3713 a.zbuffer_end = (stbi_uc *) buffer + len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3714 if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3715 if (outlen) *outlen = (int) (a.zout - a.zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3716 return a.zout_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3717 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3718 STBI_FREE(a.zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3719 return NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3720 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3721 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3722
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3723 STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3724 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3725 return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3726 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3727
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3728 STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3729 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3730 stbi__zbuf a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3731 char *p = (char *) stbi__malloc(initial_size);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3732 if (p == NULL) return NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3733 a.zbuffer = (stbi_uc *) buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3734 a.zbuffer_end = (stbi_uc *) buffer + len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3735 if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3736 if (outlen) *outlen = (int) (a.zout - a.zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3737 return a.zout_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3738 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3739 STBI_FREE(a.zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3740 return NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3741 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3742 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3743
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3744 STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3745 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3746 stbi__zbuf a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3747 a.zbuffer = (stbi_uc *) ibuffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3748 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3749 if (stbi__do_zlib(&a, obuffer, olen, 0, 1))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3750 return (int) (a.zout - a.zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3751 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3752 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3753 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3754
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3755 STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3756 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3757 stbi__zbuf a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3758 char *p = (char *) stbi__malloc(16384);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3759 if (p == NULL) return NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3760 a.zbuffer = (stbi_uc *) buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3761 a.zbuffer_end = (stbi_uc *) buffer+len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3762 if (stbi__do_zlib(&a, p, 16384, 1, 0)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3763 if (outlen) *outlen = (int) (a.zout - a.zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3764 return a.zout_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3765 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3766 STBI_FREE(a.zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3767 return NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3768 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3769 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3770
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3771 STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3772 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3773 stbi__zbuf a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3774 a.zbuffer = (stbi_uc *) ibuffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3775 a.zbuffer_end = (stbi_uc *) ibuffer + ilen;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3776 if (stbi__do_zlib(&a, obuffer, olen, 0, 0))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3777 return (int) (a.zout - a.zout_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3778 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3779 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3780 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3781 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3782
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3783 // public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3784 // simple implementation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3785 // - only 8-bit samples
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3786 // - no CRC checking
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3787 // - allocates lots of intermediate memory
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3788 // - avoids problem of streaming data between subsystems
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3789 // - avoids explicit window management
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3790 // performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3791 // - uses stb_zlib, a PD zlib implementation with fast huffman decoding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3792
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3793 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3794 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3795 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3796 stbi__uint32 length;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3797 stbi__uint32 type;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3798 } stbi__pngchunk;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3799
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3800 static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3801 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3802 stbi__pngchunk c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3803 c.length = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3804 c.type = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3805 return c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3806 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3807
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3808 static int stbi__check_png_header(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3809 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3810 static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3811 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3812 for (i=0; i < 8; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3813 if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3814 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3815 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3816
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3817 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3818 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3819 stbi__context *s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3820 stbi_uc *idata, *expanded, *out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3821 } stbi__png;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3822
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3823
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3824 enum {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3825 STBI__F_none=0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3826 STBI__F_sub=1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3827 STBI__F_up=2,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3828 STBI__F_avg=3,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3829 STBI__F_paeth=4,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3830 // synthetic filters used for first scanline to avoid needing a dummy row of 0s
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3831 STBI__F_avg_first,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3832 STBI__F_paeth_first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3833 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3834
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3835 static stbi_uc first_row_filter[5] =
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3836 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3837 STBI__F_none,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3838 STBI__F_sub,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3839 STBI__F_none,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3840 STBI__F_avg_first,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3841 STBI__F_paeth_first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3842 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3843
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3844 static int stbi__paeth(int a, int b, int c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3845 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3846 int p = a + b - c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3847 int pa = abs(p-a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3848 int pb = abs(p-b);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3849 int pc = abs(p-c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3850 if (pa <= pb && pa <= pc) return a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3851 if (pb <= pc) return b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3852 return c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3853 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3854
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3855 static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3856
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3857 // create the png data from post-deflated data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3858 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)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3859 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3860 stbi__context *s = a->s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3861 stbi__uint32 i,j,stride = x*out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3862 stbi__uint32 img_len, img_width_bytes;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3863 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3864 int img_n = s->img_n; // copy it into a local for later
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3865
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3866 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3867 a->out = (stbi_uc *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3868 if (!a->out) return stbi__err("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3869
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3870 img_width_bytes = (((img_n * x * depth) + 7) >> 3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3871 img_len = (img_width_bytes + 1) * y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3872 if (s->img_x == x && s->img_y == y) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3873 if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3874 } else { // interlaced:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3875 if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3876 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3877
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3878 for (j=0; j < y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3879 stbi_uc *cur = a->out + stride*j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3880 stbi_uc *prior = cur - stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3881 int filter = *raw++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3882 int filter_bytes = img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3883 int width = x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3884 if (filter > 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3885 return stbi__err("invalid filter","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3886
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3887 if (depth < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3888 STBI_ASSERT(img_width_bytes <= x);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3889 cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3890 filter_bytes = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3891 width = img_width_bytes;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3892 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3894 // if first row, use special filter that doesn't sample previous row
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3895 if (j == 0) filter = first_row_filter[filter];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3896
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3897 // handle first byte explicitly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3898 for (k=0; k < filter_bytes; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3899 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3900 case STBI__F_none : cur[k] = raw[k]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3901 case STBI__F_sub : cur[k] = raw[k]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3902 case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3903 case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3904 case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3905 case STBI__F_avg_first : cur[k] = raw[k]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3906 case STBI__F_paeth_first: cur[k] = raw[k]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3907 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3908 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3909
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3910 if (depth == 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3911 if (img_n != out_n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3912 cur[img_n] = 255; // first pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3913 raw += img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3914 cur += out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3915 prior += out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3916 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3917 raw += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3918 cur += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3919 prior += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3920 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3921
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3922 // this is a little gross, so that we don't switch per-pixel or per-component
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3923 if (depth < 8 || img_n == out_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3924 int nk = (width - 1)*img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3925 #define CASE(f) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3926 case f: \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3927 for (k=0; k < nk; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3928 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3929 // "none" filter turns into a memcpy here; make that explicit.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3930 case STBI__F_none: memcpy(cur, raw, nk); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3931 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3932 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3933 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3934 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3935 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3936 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3937 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3938 #undef CASE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3939 raw += nk;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3940 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3941 STBI_ASSERT(img_n+1 == out_n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3942 #define CASE(f) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3943 case f: \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3944 for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3945 for (k=0; k < img_n; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3946 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3947 CASE(STBI__F_none) cur[k] = raw[k]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3948 CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3949 CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3950 CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3951 CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3952 CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3953 CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3954 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3955 #undef CASE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3956 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3957 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3958
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3959 // we make a separate pass to expand bits to pixels; for performance,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3960 // this could run two scanlines behind the above code, so it won't
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3961 // intefere with filtering but will still be in the cache.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3962 if (depth < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3963 for (j=0; j < y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3964 stbi_uc *cur = a->out + stride*j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3965 stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3966 // 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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3967 // 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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3968 stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3969
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3970 // note that the final byte might overshoot and write more data than desired.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3971 // we can allocate enough data that this never writes out of memory, but it
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3972 // could also overwrite the next scanline. can it overwrite non-empty data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3973 // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3974 // so we need to explicitly clamp the final ones
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3975
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3976 if (depth == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3977 for (k=x*img_n; k >= 2; k-=2, ++in) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3978 *cur++ = scale * ((*in >> 4) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3979 *cur++ = scale * ((*in ) & 0x0f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3980 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3981 if (k > 0) *cur++ = scale * ((*in >> 4) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3982 } else if (depth == 2) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3983 for (k=x*img_n; k >= 4; k-=4, ++in) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3984 *cur++ = scale * ((*in >> 6) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3985 *cur++ = scale * ((*in >> 4) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3986 *cur++ = scale * ((*in >> 2) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3987 *cur++ = scale * ((*in ) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3988 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3989 if (k > 0) *cur++ = scale * ((*in >> 6) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3990 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3991 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3992 } else if (depth == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3993 for (k=x*img_n; k >= 8; k-=8, ++in) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3994 *cur++ = scale * ((*in >> 7) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3995 *cur++ = scale * ((*in >> 6) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3996 *cur++ = scale * ((*in >> 5) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3997 *cur++ = scale * ((*in >> 4) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3998 *cur++ = scale * ((*in >> 3) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3999 *cur++ = scale * ((*in >> 2) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4000 *cur++ = scale * ((*in >> 1) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4001 *cur++ = scale * ((*in ) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4002 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4003 if (k > 0) *cur++ = scale * ((*in >> 7) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4004 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4005 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4006 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4007 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4008 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4009 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4010 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4011 if (img_n != out_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4012 // insert alpha = 255
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4013 stbi_uc *cur = a->out + stride*j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4014 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4015 if (img_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4016 for (i=x-1; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4017 cur[i*2+1] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4018 cur[i*2+0] = cur[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4019 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4020 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4021 STBI_ASSERT(img_n == 3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4022 for (i=x-1; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4023 cur[i*4+3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4024 cur[i*4+2] = cur[i*3+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4025 cur[i*4+1] = cur[i*3+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4026 cur[i*4+0] = cur[i*3+0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4027 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4028 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4029 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4030 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4031 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4032
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4033 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4034 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4035
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4036 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)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4037 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4038 stbi_uc *final;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4039 int p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4040 if (!interlaced)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4041 return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4042
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4043 // de-interlacing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4044 final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4045 for (p=0; p < 7; ++p) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4046 int xorig[] = { 0,4,0,2,0,1,0 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4047 int yorig[] = { 0,0,4,0,2,0,1 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4048 int xspc[] = { 8,8,4,4,2,2,1 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4049 int yspc[] = { 8,8,8,4,4,2,2 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4050 int i,j,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4051 // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4052 x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4053 y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4054 if (x && y) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4055 stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4056 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4057 STBI_FREE(final);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4058 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4059 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4060 for (j=0; j < y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4061 for (i=0; i < x; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4062 int out_y = j*yspc[p]+yorig[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4063 int out_x = i*xspc[p]+xorig[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4064 memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4065 a->out + (j*x+i)*out_n, out_n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4066 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4067 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4068 STBI_FREE(a->out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4069 image_data += img_len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4070 image_data_len -= img_len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4071 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4072 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4073 a->out = final;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4074
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4075 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4076 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4077
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4078 static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4079 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4080 stbi__context *s = z->s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4081 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4082 stbi_uc *p = z->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4083
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4084 // compute color-based transparency, assuming we've
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4085 // already got 255 as the alpha value in the output
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4086 STBI_ASSERT(out_n == 2 || out_n == 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4087
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4088 if (out_n == 2) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4089 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4090 p[1] = (p[0] == tc[0] ? 0 : 255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4091 p += 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4092 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4093 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4094 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4095 if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4096 p[3] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4097 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4098 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4099 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4100 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4101 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4102
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4103 static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4104 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4105 stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4106 stbi_uc *p, *temp_out, *orig = a->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4107
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4108 p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4109 if (p == NULL) return stbi__err("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4110
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4111 // between here and free(out) below, exitting would leak
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4112 temp_out = p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4113
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4114 if (pal_img_n == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4115 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4116 int n = orig[i]*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4117 p[0] = palette[n ];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4118 p[1] = palette[n+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4119 p[2] = palette[n+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4120 p += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4121 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4122 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4123 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4124 int n = orig[i]*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4125 p[0] = palette[n ];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4126 p[1] = palette[n+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4127 p[2] = palette[n+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4128 p[3] = palette[n+3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4129 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4130 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4131 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4132 STBI_FREE(a->out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4133 a->out = temp_out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4134
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4135 STBI_NOTUSED(len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4136
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4137 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4138 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4139
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4140 static int stbi__unpremultiply_on_load = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4141 static int stbi__de_iphone_flag = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4142
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4143 STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4144 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4145 stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4146 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4147
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4148 STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4149 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4150 stbi__de_iphone_flag = flag_true_if_should_convert;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4151 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4152
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4153 static void stbi__de_iphone(stbi__png *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4154 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4155 stbi__context *s = z->s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4156 stbi__uint32 i, pixel_count = s->img_x * s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4157 stbi_uc *p = z->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4158
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4159 if (s->img_out_n == 3) { // convert bgr to rgb
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4160 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4161 stbi_uc t = p[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4162 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4163 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4164 p += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4165 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4166 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4167 STBI_ASSERT(s->img_out_n == 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4168 if (stbi__unpremultiply_on_load) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4169 // convert bgr to rgb and unpremultiply
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4170 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4171 stbi_uc a = p[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4172 stbi_uc t = p[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4173 if (a) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4174 p[0] = p[2] * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4175 p[1] = p[1] * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4176 p[2] = t * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4177 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4178 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4179 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4180 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4181 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4182 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4183 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4184 // convert bgr to rgb
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4185 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4186 stbi_uc t = p[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4187 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4188 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4189 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4190 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4191 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4192 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4193 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4194
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4195 #define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4196
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4197 static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4198 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4199 stbi_uc palette[1024], pal_img_n=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4200 stbi_uc has_trans=0, tc[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4201 stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4202 int first=1,k,interlace=0, color=0, depth=0, is_iphone=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4203 stbi__context *s = z->s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4204
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4205 z->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4206 z->idata = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4207 z->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4208
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4209 if (!stbi__check_png_header(s)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4210
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4211 if (scan == STBI__SCAN_type) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4212
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4213 for (;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4214 stbi__pngchunk c = stbi__get_chunk_header(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4215 switch (c.type) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4216 case STBI__PNG_TYPE('C','g','B','I'):
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4217 is_iphone = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4218 stbi__skip(s, c.length);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4219 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4220 case STBI__PNG_TYPE('I','H','D','R'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4221 int comp,filter;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4222 if (!first) return stbi__err("multiple IHDR","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4223 first = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4224 if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4225 s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4226 s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4227 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");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4228 color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4229 if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4230 comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4231 filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4232 interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4233 if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4234 if (!pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4235 s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4236 if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4237 if (scan == STBI__SCAN_header) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4238 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4239 // if paletted, then pal_n is our final components, and
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4240 // img_n is # components to decompress/filter.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4241 s->img_n = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4242 if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4243 // if SCAN_header, have to scan to see if we have a tRNS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4244 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4245 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4246 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4247
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4248 case STBI__PNG_TYPE('P','L','T','E'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4249 if (first) return stbi__err("first not IHDR", "Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4250 if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4251 pal_len = c.length / 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4252 if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4253 for (i=0; i < pal_len; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4254 palette[i*4+0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4255 palette[i*4+1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4256 palette[i*4+2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4257 palette[i*4+3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4258 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4259 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4260 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4261
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4262 case STBI__PNG_TYPE('t','R','N','S'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4263 if (first) return stbi__err("first not IHDR", "Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4264 if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4265 if (pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4266 if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4267 if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4268 if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4269 pal_img_n = 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4270 for (i=0; i < c.length; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4271 palette[i*4+3] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4272 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4273 if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4274 if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4275 has_trans = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4276 for (k=0; k < s->img_n; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4277 tc[k] = (stbi_uc) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4278 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4279 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4280 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4281
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4282 case STBI__PNG_TYPE('I','D','A','T'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4283 if (first) return stbi__err("first not IHDR", "Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4284 if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4285 if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4286 if (ioff + c.length > idata_limit) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4287 stbi_uc *p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4288 if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4289 while (ioff + c.length > idata_limit)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4290 idata_limit *= 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4291 p = (stbi_uc *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4292 z->idata = p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4293 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4294 if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4295 ioff += c.length;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4296 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4297 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4298
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4299 case STBI__PNG_TYPE('I','E','N','D'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4300 stbi__uint32 raw_len, bpl;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4301 if (first) return stbi__err("first not IHDR", "Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4302 if (scan != STBI__SCAN_load) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4303 if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4304 // initial guess for decoded data size to avoid unnecessary reallocs
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4305 bpl = (s->img_x * depth + 7) / 8; // bytes per line, per component
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4306 raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4307 z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4308 if (z->expanded == NULL) return 0; // zlib should set error
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4309 STBI_FREE(z->idata); z->idata = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4310 if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4311 s->img_out_n = s->img_n+1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4312 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4313 s->img_out_n = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4314 if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, depth, color, interlace)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4315 if (has_trans)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4316 if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4317 if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4318 stbi__de_iphone(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4319 if (pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4320 // pal_img_n == 3 or 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4321 s->img_n = pal_img_n; // record the actual colors we had
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4322 s->img_out_n = pal_img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4323 if (req_comp >= 3) s->img_out_n = req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4324 if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4325 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4326 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4327 STBI_FREE(z->expanded); z->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4328 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4329 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4330
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4331 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4332 // if critical, fail
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4333 if (first) return stbi__err("first not IHDR", "Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4334 if ((c.type & (1 << 29)) == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4335 #ifndef STBI_NO_FAILURE_STRINGS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4336 // not threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4337 static char invalid_chunk[] = "XXXX PNG chunk not known";
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4338 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4339 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4340 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4341 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4342 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4343 return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4344 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4345 stbi__skip(s, c.length);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4346 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4347 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4348 // end of PNG chunk, read and skip CRC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4349 stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4350 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4351 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4352
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4353 static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4354 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4355 unsigned char *result=NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4356 if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4357 if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4358 result = p->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4359 p->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4360 if (req_comp && req_comp != p->s->img_out_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4361 result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4362 p->s->img_out_n = req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4363 if (result == NULL) return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4364 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4365 *x = p->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4366 *y = p->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4367 if (n) *n = p->s->img_out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4368 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4369 STBI_FREE(p->out); p->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4370 STBI_FREE(p->expanded); p->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4371 STBI_FREE(p->idata); p->idata = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4372
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4373 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4374 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4375
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4376 static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4377 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4378 stbi__png p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4379 p.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4380 return stbi__do_png(&p, x,y,comp,req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4381 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4382
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4383 static int stbi__png_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4384 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4385 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4386 r = stbi__check_png_header(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4387 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4388 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4389 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4390
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4391 static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4392 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4393 if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4394 stbi__rewind( p->s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4395 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4396 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4397 if (x) *x = p->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4398 if (y) *y = p->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4399 if (comp) *comp = p->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4400 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4401 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4402
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4403 static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4404 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4405 stbi__png p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4406 p.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4407 return stbi__png_info_raw(&p, x, y, comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4408 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4409 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4410
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4411 // Microsoft/Windows BMP image
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4412
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4413 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4414 static int stbi__bmp_test_raw(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4415 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4416 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4417 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4418 if (stbi__get8(s) != 'B') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4419 if (stbi__get8(s) != 'M') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4420 stbi__get32le(s); // discard filesize
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4421 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4422 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4423 stbi__get32le(s); // discard data offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4424 sz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4425 r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4426 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4427 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4428
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4429 static int stbi__bmp_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4430 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4431 int r = stbi__bmp_test_raw(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4432 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4433 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4434 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4435
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4436
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4437 // returns 0..31 for the highest set bit
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4438 static int stbi__high_bit(unsigned int z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4439 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4440 int n=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4441 if (z == 0) return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4442 if (z >= 0x10000) n += 16, z >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4443 if (z >= 0x00100) n += 8, z >>= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4444 if (z >= 0x00010) n += 4, z >>= 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4445 if (z >= 0x00004) n += 2, z >>= 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4446 if (z >= 0x00002) n += 1, z >>= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4447 return n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4448 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4449
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4450 static int stbi__bitcount(unsigned int a)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4451 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4452 a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4453 a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4454 a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4455 a = (a + (a >> 8)); // max 16 per 8 bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4456 a = (a + (a >> 16)); // max 32 per 8 bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4457 return a & 0xff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4458 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4459
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4460 static int stbi__shiftsigned(int v, int shift, int bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4461 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4462 int result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4463 int z=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4464
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4465 if (shift < 0) v <<= -shift;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4466 else v >>= shift;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4467 result = v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4468
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4469 z = bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4470 while (z < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4471 result += v >> z;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4472 z += bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4473 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4474 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4475 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4476
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4477 static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4478 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4479 stbi_uc *out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4480 unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4481 stbi_uc pal[256][4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4482 int psize=0,i,j,compress=0,width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4483 int bpp, flip_vertically, pad, target, offset, hsz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4484 if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4485 stbi__get32le(s); // discard filesize
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4486 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4487 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4488 offset = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4489 hsz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4490 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4491 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4492 s->img_x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4493 s->img_y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4494 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4495 s->img_x = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4496 s->img_y = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4497 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4498 if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4499 bpp = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4500 if (bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4501 flip_vertically = ((int) s->img_y) > 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4502 s->img_y = abs((int) s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4503 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4504 if (bpp < 24)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4505 psize = (offset - 14 - 24) / 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4506 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4507 compress = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4508 if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4509 stbi__get32le(s); // discard sizeof
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4510 stbi__get32le(s); // discard hres
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4511 stbi__get32le(s); // discard vres
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4512 stbi__get32le(s); // discard colorsused
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4513 stbi__get32le(s); // discard max important
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4514 if (hsz == 40 || hsz == 56) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4515 if (hsz == 56) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4516 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4517 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4518 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4519 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4520 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4521 if (bpp == 16 || bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4522 mr = mg = mb = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4523 if (compress == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4524 if (bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4525 mr = 0xffu << 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4526 mg = 0xffu << 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4527 mb = 0xffu << 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4528 ma = 0xffu << 24;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4529 fake_a = 1; // @TODO: check for cases like alpha value is all 0 and switch it to 255
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4530 STBI_NOTUSED(fake_a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4531 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4532 mr = 31u << 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4533 mg = 31u << 5;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4534 mb = 31u << 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4535 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4536 } else if (compress == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4537 mr = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4538 mg = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4539 mb = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4540 // not documented, but generated by photoshop and handled by mspaint
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4541 if (mr == mg && mg == mb) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4542 // ?!?!?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4543 return stbi__errpuc("bad BMP", "bad BMP");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4544 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4545 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4546 return stbi__errpuc("bad BMP", "bad BMP");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4547 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4548 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4549 STBI_ASSERT(hsz == 108 || hsz == 124);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4550 mr = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4551 mg = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4552 mb = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4553 ma = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4554 stbi__get32le(s); // discard color space
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4555 for (i=0; i < 12; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4556 stbi__get32le(s); // discard color space parameters
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4557 if (hsz == 124) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4558 stbi__get32le(s); // discard rendering intent
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4559 stbi__get32le(s); // discard offset of profile data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4560 stbi__get32le(s); // discard size of profile data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4561 stbi__get32le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4562 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4563 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4564 if (bpp < 16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4565 psize = (offset - 14 - hsz) >> 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4566 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4567 s->img_n = ma ? 4 : 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4568 if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4569 target = req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4570 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4571 target = s->img_n; // if they want monochrome, we'll post-convert
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4572 out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4573 if (!out) return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4574 if (bpp < 16) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4575 int z=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4576 if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4577 for (i=0; i < psize; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4578 pal[i][2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4579 pal[i][1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4580 pal[i][0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4581 if (hsz != 12) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4582 pal[i][3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4583 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4584 stbi__skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4585 if (bpp == 4) width = (s->img_x + 1) >> 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4586 else if (bpp == 8) width = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4587 else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4588 pad = (-width)&3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4589 for (j=0; j < (int) s->img_y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4590 for (i=0; i < (int) s->img_x; i += 2) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4591 int v=stbi__get8(s),v2=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4592 if (bpp == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4593 v2 = v & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4594 v >>= 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4595 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4596 out[z++] = pal[v][0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4597 out[z++] = pal[v][1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4598 out[z++] = pal[v][2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4599 if (target == 4) out[z++] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4600 if (i+1 == (int) s->img_x) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4601 v = (bpp == 8) ? stbi__get8(s) : v2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4602 out[z++] = pal[v][0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4603 out[z++] = pal[v][1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4604 out[z++] = pal[v][2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4605 if (target == 4) out[z++] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4606 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4607 stbi__skip(s, pad);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4608 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4609 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4610 int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4611 int z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4612 int easy=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4613 stbi__skip(s, offset - 14 - hsz);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4614 if (bpp == 24) width = 3 * s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4615 else if (bpp == 16) width = 2*s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4616 else /* bpp = 32 and pad = 0 */ width=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4617 pad = (-width) & 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4618 if (bpp == 24) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4619 easy = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4620 } else if (bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4621 if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4622 easy = 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4623 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4624 if (!easy) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4625 if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4626 // right shift amt to put high bit in position #7
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4627 rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4628 gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4629 bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4630 ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4631 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4632 for (j=0; j < (int) s->img_y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4633 if (easy) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4634 for (i=0; i < (int) s->img_x; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4635 unsigned char a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4636 out[z+2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4637 out[z+1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4638 out[z+0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4639 z += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4640 a = (easy == 2 ? stbi__get8(s) : 255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4641 if (target == 4) out[z++] = a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4642 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4643 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4644 for (i=0; i < (int) s->img_x; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4645 stbi__uint32 v = (stbi__uint32) (bpp == 16 ? stbi__get16le(s) : stbi__get32le(s));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4646 int a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4647 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4648 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4649 out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4650 a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4651 if (target == 4) out[z++] = STBI__BYTECAST(a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4652 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4653 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4654 stbi__skip(s, pad);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4655 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4656 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4657 if (flip_vertically) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4658 stbi_uc t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4659 for (j=0; j < (int) s->img_y>>1; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4660 stbi_uc *p1 = out + j *s->img_x*target;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4661 stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4662 for (i=0; i < (int) s->img_x*target; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4663 t = p1[i], p1[i] = p2[i], p2[i] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4664 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4665 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4666 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4667
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4668 if (req_comp && req_comp != target) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4669 out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4670 if (out == NULL) return out; // stbi__convert_format frees input on failure
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4671 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4672
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4673 *x = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4674 *y = s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4675 if (comp) *comp = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4676 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4677 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4678 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4679
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4680 // Targa Truevision - TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4681 // by Jonathan Dummer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4682 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4683 static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4684 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4685 int tga_w, tga_h, tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4686 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4687 stbi__get8(s); // discard Offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4688 sz = stbi__get8(s); // color type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4689 if( sz > 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4690 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4691 return 0; // only RGB or indexed allowed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4692 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4693 sz = stbi__get8(s); // image type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4694 // only RGB or grey allowed, +/- RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4695 if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4696 stbi__skip(s,9);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4697 tga_w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4698 if( tga_w < 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4699 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4700 return 0; // test width
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4701 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4702 tga_h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4703 if( tga_h < 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4704 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4705 return 0; // test height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4706 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4707 sz = stbi__get8(s); // bits per pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4708 // only RGB or RGBA or grey allowed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4709 if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4710 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4711 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4712 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4713 tga_comp = sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4714 if (x) *x = tga_w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4715 if (y) *y = tga_h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4716 if (comp) *comp = tga_comp / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4717 return 1; // seems to have passed everything
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4718 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4719
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4720 static int stbi__tga_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4721 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4722 int res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4723 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4724 stbi__get8(s); // discard Offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4725 sz = stbi__get8(s); // color type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4726 if ( sz > 1 ) return 0; // only RGB or indexed allowed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4727 sz = stbi__get8(s); // image type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4728 if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4729 stbi__get16be(s); // discard palette start
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4730 stbi__get16be(s); // discard palette length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4731 stbi__get8(s); // discard bits per palette color entry
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4732 stbi__get16be(s); // discard x origin
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4733 stbi__get16be(s); // discard y origin
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4734 if ( stbi__get16be(s) < 1 ) return 0; // test width
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4735 if ( stbi__get16be(s) < 1 ) return 0; // test height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4736 sz = stbi__get8(s); // bits per pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4737 if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4738 res = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4739 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4740 res = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4741 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4742 return res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4743 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4744
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4745 static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4746 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4747 // read in the TGA header stuff
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4748 int tga_offset = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4749 int tga_indexed = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4750 int tga_image_type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4751 int tga_is_RLE = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4752 int tga_palette_start = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4753 int tga_palette_len = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4754 int tga_palette_bits = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4755 int tga_x_origin = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4756 int tga_y_origin = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4757 int tga_width = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4758 int tga_height = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4759 int tga_bits_per_pixel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4760 int tga_comp = tga_bits_per_pixel / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4761 int tga_inverted = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4762 // image data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4763 unsigned char *tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4764 unsigned char *tga_palette = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4765 int i, j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4766 unsigned char raw_data[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4767 int RLE_count = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4768 int RLE_repeating = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4769 int read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4770
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4771 // do a tiny bit of precessing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4772 if ( tga_image_type >= 8 )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4773 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4774 tga_image_type -= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4775 tga_is_RLE = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4776 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4777 /* int tga_alpha_bits = tga_inverted & 15; */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4778 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4779
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4780 // error check
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4781 if ( //(tga_indexed) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4782 (tga_width < 1) || (tga_height < 1) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4783 (tga_image_type < 1) || (tga_image_type > 3) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4784 ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4785 (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4786 )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4787 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4788 return NULL; // we don't report this as a bad TGA because we don't even know if it's TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4789 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4790
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4791 // If I'm paletted, then I'll use the number of bits from the palette
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4792 if ( tga_indexed )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4793 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4794 tga_comp = tga_palette_bits / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4795 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4796
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4797 // tga info
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4798 *x = tga_width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4799 *y = tga_height;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4800 if (comp) *comp = tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4801
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4802 tga_data = (unsigned char*)stbi__malloc( tga_width * tga_height * tga_comp );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4803 if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4804
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4805 // skip to the data's starting position (offset usually = 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4806 stbi__skip(s, tga_offset );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4807
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4808 if ( !tga_indexed && !tga_is_RLE) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4809 for (i=0; i < tga_height; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4810 int y = tga_inverted ? tga_height -i - 1 : i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4811 stbi_uc *tga_row = tga_data + y*tga_width*tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4812 stbi__getn(s, tga_row, tga_width * tga_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4813 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4814 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4815 // do I need to load a palette?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4816 if ( tga_indexed)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4817 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4818 // any data to skip? (offset usually = 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4819 stbi__skip(s, tga_palette_start );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4820 // load the palette
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4821 tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_palette_bits / 8 );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4822 if (!tga_palette) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4823 STBI_FREE(tga_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4824 return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4825 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4826 if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4827 STBI_FREE(tga_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4828 STBI_FREE(tga_palette);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4829 return stbi__errpuc("bad palette", "Corrupt TGA");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4830 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4831 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4832 // load the data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4833 for (i=0; i < tga_width * tga_height; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4834 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4835 // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4836 if ( tga_is_RLE )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4837 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4838 if ( RLE_count == 0 )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4839 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4840 // yep, get the next byte as a RLE command
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4841 int RLE_cmd = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4842 RLE_count = 1 + (RLE_cmd & 127);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4843 RLE_repeating = RLE_cmd >> 7;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4844 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4845 } else if ( !RLE_repeating )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4846 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4847 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4848 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4849 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4850 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4851 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4852 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4853 // OK, if I need to read a pixel, do it now
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4854 if ( read_next_pixel )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4855 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4856 // load however much data we did have
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4857 if ( tga_indexed )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4858 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4859 // read in 1 byte, then perform the lookup
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4860 int pal_idx = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4861 if ( pal_idx >= tga_palette_len )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4862 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4863 // invalid index
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4864 pal_idx = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4865 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4866 pal_idx *= tga_bits_per_pixel / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4867 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4868 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4869 raw_data[j] = tga_palette[pal_idx+j];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4870 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4871 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4872 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4873 // read in the data raw
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4874 for (j = 0; j*8 < tga_bits_per_pixel; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4875 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4876 raw_data[j] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4877 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4878 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4879 // clear the reading flag for the next pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4880 read_next_pixel = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4881 } // end of reading a pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4882
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4883 // copy data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4884 for (j = 0; j < tga_comp; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4885 tga_data[i*tga_comp+j] = raw_data[j];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4886
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4887 // in case we're in RLE mode, keep counting down
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4888 --RLE_count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4889 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4890 // do I need to invert the image?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4891 if ( tga_inverted )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4892 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4893 for (j = 0; j*2 < tga_height; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4894 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4895 int index1 = j * tga_width * tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4896 int index2 = (tga_height - 1 - j) * tga_width * tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4897 for (i = tga_width * tga_comp; i > 0; --i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4898 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4899 unsigned char temp = tga_data[index1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4900 tga_data[index1] = tga_data[index2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4901 tga_data[index2] = temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4902 ++index1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4903 ++index2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4904 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4905 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4906 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4907 // clear my palette, if I had one
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4908 if ( tga_palette != NULL )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4909 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4910 STBI_FREE( tga_palette );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4911 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4912 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4913
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4914 // swap RGB
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4915 if (tga_comp >= 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4916 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4917 unsigned char* tga_pixel = tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4918 for (i=0; i < tga_width * tga_height; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4919 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4920 unsigned char temp = tga_pixel[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4921 tga_pixel[0] = tga_pixel[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4922 tga_pixel[2] = temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4923 tga_pixel += tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4924 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4925 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4926
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4927 // convert to target component count
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4928 if (req_comp && req_comp != tga_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4929 tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4930
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4931 // the things I do to get rid of an error message, and yet keep
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4932 // Microsoft's C compilers happy... [8^(
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4933 tga_palette_start = tga_palette_len = tga_palette_bits =
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4934 tga_x_origin = tga_y_origin = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4935 // OK, done
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4936 return tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4937 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4938 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4939
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4940 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4941 // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4942
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4943 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4944 static int stbi__psd_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4945 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4946 int r = (stbi__get32be(s) == 0x38425053);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4947 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4948 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4949 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4950
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4951 static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4952 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4953 int pixelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4954 int channelCount, compression;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4955 int channel, i, count, len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4956 int w,h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4957 stbi_uc *out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4958
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4959 // Check identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4960 if (stbi__get32be(s) != 0x38425053) // "8BPS"
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4961 return stbi__errpuc("not PSD", "Corrupt PSD image");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4962
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4963 // Check file type version.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4964 if (stbi__get16be(s) != 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4965 return stbi__errpuc("wrong version", "Unsupported version of PSD image");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4966
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4967 // Skip 6 reserved bytes.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4968 stbi__skip(s, 6 );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4969
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4970 // Read the number of channels (R, G, B, A, etc).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4971 channelCount = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4972 if (channelCount < 0 || channelCount > 16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4973 return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4974
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4975 // Read the rows and columns of the image.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4976 h = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4977 w = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4978
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4979 // Make sure the depth is 8 bits.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4980 if (stbi__get16be(s) != 8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4981 return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 bit");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4982
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4983 // Make sure the color mode is RGB.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4984 // Valid options are:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4985 // 0: Bitmap
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4986 // 1: Grayscale
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4987 // 2: Indexed color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4988 // 3: RGB color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4989 // 4: CMYK color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4990 // 7: Multichannel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4991 // 8: Duotone
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4992 // 9: Lab color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4993 if (stbi__get16be(s) != 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4994 return stbi__errpuc("wrong color format", "PSD is not in RGB color format");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4995
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4996 // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4997 stbi__skip(s,stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4998
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4999 // Skip the image resources. (resolution, pen tool paths, etc)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5000 stbi__skip(s, stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5001
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5002 // Skip the reserved data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5003 stbi__skip(s, stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5004
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5005 // Find out if the data is compressed.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5006 // Known values:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5007 // 0: no compression
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5008 // 1: RLE compressed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5009 compression = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5010 if (compression > 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5011 return stbi__errpuc("bad compression", "PSD has an unknown compression format");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5012
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5013 // Create the destination image.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5014 out = (stbi_uc *) stbi__malloc(4 * w*h);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5015 if (!out) return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5016 pixelCount = w*h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5017
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5018 // Initialize the data to zero.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5019 //memset( out, 0, pixelCount * 4 );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5020
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5021 // Finally, the image data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5022 if (compression) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5023 // RLE as used by .PSD and .TIFF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5024 // Loop until you get the number of unpacked bytes you are expecting:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5025 // Read the next source byte into n.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5026 // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5027 // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5028 // Else if n is 128, noop.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5029 // Endloop
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5030
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5031 // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5032 // which we're going to just skip.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5033 stbi__skip(s, h * channelCount * 2 );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5034
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5035 // Read the RLE data by channel.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5036 for (channel = 0; channel < 4; channel++) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5037 stbi_uc *p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5038
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5039 p = out+channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5040 if (channel >= channelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5041 // Fill this channel with default data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5042 for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5043 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5044 // Read the RLE data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5045 count = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5046 while (count < pixelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5047 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5048 if (len == 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5049 // No-op.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5050 } else if (len < 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5051 // Copy next len+1 bytes literally.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5052 len++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5053 count += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5054 while (len) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5055 *p = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5056 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5057 len--;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5058 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5059 } else if (len > 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5060 stbi_uc val;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5061 // Next -len+1 bytes in the dest are replicated from next source byte.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5062 // (Interpret len as a negative 8-bit int.)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5063 len ^= 0x0FF;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5064 len += 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5065 val = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5066 count += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5067 while (len) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5068 *p = val;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5069 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5070 len--;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5071 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5072 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5073 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5074 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5075 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5076
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5077 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5078 // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5079 // where each channel consists of an 8-bit value for each pixel in the image.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5080
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5081 // Read the data by channel.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5082 for (channel = 0; channel < 4; channel++) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5083 stbi_uc *p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5084
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5085 p = out + channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5086 if (channel > channelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5087 // Fill this channel with default data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5088 for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5089 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5090 // Read the data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5091 for (i = 0; i < pixelCount; i++)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5092 *p = stbi__get8(s), p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5093 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5094 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5095 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5096
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5097 if (req_comp && req_comp != 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5098 out = stbi__convert_format(out, 4, req_comp, w, h);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5099 if (out == NULL) return out; // stbi__convert_format frees input on failure
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5100 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5101
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5102 if (comp) *comp = channelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5103 *y = h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5104 *x = w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5105
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5106 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5107 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5108 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5109
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5110 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5111 // Softimage PIC loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5112 // by Tom Seddon
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5113 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5114 // See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5115 // See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5116
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5117 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5118 static int stbi__pic_is4(stbi__context *s,const char *str)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5119 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5120 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5121 for (i=0; i<4; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5122 if (stbi__get8(s) != (stbi_uc)str[i])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5123 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5124
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5125 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5126 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5127
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5128 static int stbi__pic_test_core(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5129 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5130 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5131
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5132 if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5133 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5134
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5135 for(i=0;i<84;++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5136 stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5137
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5138 if (!stbi__pic_is4(s,"PICT"))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5139 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5140
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5141 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5142 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5143
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5144 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5145 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5146 stbi_uc size,type,channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5147 } stbi__pic_packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5148
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5149 static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5150 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5151 int mask=0x80, i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5152
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5153 for (i=0; i<4; ++i, mask>>=1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5154 if (channel & mask) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5155 if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5156 dest[i]=stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5157 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5158 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5159
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5160 return dest;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5161 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5162
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5163 static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5164 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5165 int mask=0x80,i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5166
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5167 for (i=0;i<4; ++i, mask>>=1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5168 if (channel&mask)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5169 dest[i]=src[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5170 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5171
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5172 static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5173 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5174 int act_comp=0,num_packets=0,y,chained;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5175 stbi__pic_packet packets[10];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5176
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5177 // this will (should...) cater for even some bizarre stuff like having data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5178 // for the same channel in multiple packets.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5179 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5180 stbi__pic_packet *packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5181
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5182 if (num_packets==sizeof(packets)/sizeof(packets[0]))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5183 return stbi__errpuc("bad format","too many packets");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5184
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5185 packet = &packets[num_packets++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5186
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5187 chained = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5188 packet->size = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5189 packet->type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5190 packet->channel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5191
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5192 act_comp |= packet->channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5193
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5194 if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5195 if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5196 } while (chained);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5197
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5198 *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5199
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5200 for(y=0; y<height; ++y) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5201 int packet_idx;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5202
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5203 for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5204 stbi__pic_packet *packet = &packets[packet_idx];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5205 stbi_uc *dest = result+y*width*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5206
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5207 switch (packet->type) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5208 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5209 return stbi__errpuc("bad format","packet has bad compression type");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5210
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5211 case 0: {//uncompressed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5212 int x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5213
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5214 for(x=0;x<width;++x, dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5215 if (!stbi__readval(s,packet->channel,dest))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5216 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5217 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5218 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5219
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5220 case 1://Pure RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5221 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5222 int left=width, i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5223
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5224 while (left>0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5225 stbi_uc count,value[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5226
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5227 count=stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5228 if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5229
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5230 if (count > left)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5231 count = (stbi_uc) left;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5232
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5233 if (!stbi__readval(s,packet->channel,value)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5234
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5235 for(i=0; i<count; ++i,dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5236 stbi__copyval(packet->channel,dest,value);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5237 left -= count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5238 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5239 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5240 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5241
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5242 case 2: {//Mixed RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5243 int left=width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5244 while (left>0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5245 int count = stbi__get8(s), i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5246 if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5247
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5248 if (count >= 128) { // Repeated
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5249 stbi_uc value[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5250 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5251
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5252 if (count==128)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5253 count = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5254 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5255 count -= 127;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5256 if (count > left)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5257 return stbi__errpuc("bad file","scanline overrun");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5258
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5259 if (!stbi__readval(s,packet->channel,value))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5260 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5261
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5262 for(i=0;i<count;++i, dest += 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5263 stbi__copyval(packet->channel,dest,value);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5264 } else { // Raw
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5265 ++count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5266 if (count>left) return stbi__errpuc("bad file","scanline overrun");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5267
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5268 for(i=0;i<count;++i, dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5269 if (!stbi__readval(s,packet->channel,dest))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5270 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5271 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5272 left-=count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5273 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5274 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5275 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5276 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5277 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5278 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5279
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5280 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5281 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5282
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5283 static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5284 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5285 stbi_uc *result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5286 int i, x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5287
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5288 for (i=0; i<92; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5289 stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5290
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5291 x = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5292 y = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5293 if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5294 if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to decode");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5295
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5296 stbi__get32be(s); //skip `ratio'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5297 stbi__get16be(s); //skip `fields'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5298 stbi__get16be(s); //skip `pad'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5299
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5300 // intermediate buffer is RGBA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5301 result = (stbi_uc *) stbi__malloc(x*y*4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5302 memset(result, 0xff, x*y*4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5303
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5304 if (!stbi__pic_load_core(s,x,y,comp, result)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5305 STBI_FREE(result);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5306 result=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5307 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5308 *px = x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5309 *py = y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5310 if (req_comp == 0) req_comp = *comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5311 result=stbi__convert_format(result,4,req_comp,x,y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5312
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5313 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5314 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5315
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5316 static int stbi__pic_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5317 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5318 int r = stbi__pic_test_core(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5319 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5320 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5321 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5322 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5323
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5324 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5325 // GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5326
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5327 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5328 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5329 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5330 stbi__int16 prefix;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5331 stbi_uc first;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5332 stbi_uc suffix;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5333 } stbi__gif_lzw;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5334
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5335 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5336 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5337 int w,h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5338 stbi_uc *out; // output buffer (always 4 components)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5339 int flags, bgindex, ratio, transparent, eflags;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5340 stbi_uc pal[256][4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5341 stbi_uc lpal[256][4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5342 stbi__gif_lzw codes[4096];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5343 stbi_uc *color_table;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5344 int parse, step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5345 int lflags;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5346 int start_x, start_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5347 int max_x, max_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5348 int cur_x, cur_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5349 int line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5350 } stbi__gif;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5351
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5352 static int stbi__gif_test_raw(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5353 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5354 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5355 if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5356 sz = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5357 if (sz != '9' && sz != '7') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5358 if (stbi__get8(s) != 'a') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5359 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5360 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5361
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5362 static int stbi__gif_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5363 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5364 int r = stbi__gif_test_raw(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5365 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5366 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5367 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5368
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5369 static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5370 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5371 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5372 for (i=0; i < num_entries; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5373 pal[i][2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5374 pal[i][1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5375 pal[i][0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5376 pal[i][3] = transp == i ? 0 : 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5377 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5378 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5379
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5380 static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5381 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5382 stbi_uc version;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5383 if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5384 return stbi__err("not GIF", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5385
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5386 version = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5387 if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5388 if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5389
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5390 stbi__g_failure_reason = "";
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5391 g->w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5392 g->h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5393 g->flags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5394 g->bgindex = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5395 g->ratio = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5396 g->transparent = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5397
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5398 if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5399
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5400 if (is_info) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5401
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5402 if (g->flags & 0x80)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5403 stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5404
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5405 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5406 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5407
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5408 static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5409 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5410 stbi__gif g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5411 if (!stbi__gif_header(s, &g, comp, 1)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5412 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5413 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5414 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5415 if (x) *x = g.w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5416 if (y) *y = g.h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5417 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5418 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5419
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5420 static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5421 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5422 stbi_uc *p, *c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5423
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5424 // recurse to decode the prefixes, since the linked-list is backwards,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5425 // and working backwards through an interleaved image would be nasty
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5426 if (g->codes[code].prefix >= 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5427 stbi__out_gif_code(g, g->codes[code].prefix);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5428
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5429 if (g->cur_y >= g->max_y) return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5430
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5431 p = &g->out[g->cur_x + g->cur_y];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5432 c = &g->color_table[g->codes[code].suffix * 4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5433
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5434 if (c[3] >= 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5435 p[0] = c[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5436 p[1] = c[1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5437 p[2] = c[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5438 p[3] = c[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5439 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5440 g->cur_x += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5441
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5442 if (g->cur_x >= g->max_x) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5443 g->cur_x = g->start_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5444 g->cur_y += g->step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5445
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5446 while (g->cur_y >= g->max_y && g->parse > 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5447 g->step = (1 << g->parse) * g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5448 g->cur_y = g->start_y + (g->step >> 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5449 --g->parse;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5450 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5451 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5452 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5453
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5454 static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5455 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5456 stbi_uc lzw_cs;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5457 stbi__int32 len, code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5458 stbi__uint32 first;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5459 stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5460 stbi__gif_lzw *p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5461
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5462 lzw_cs = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5463 clear = 1 << lzw_cs;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5464 first = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5465 codesize = lzw_cs + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5466 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5467 bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5468 valid_bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5469 for (code = 0; code < clear; code++) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5470 g->codes[code].prefix = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5471 g->codes[code].first = (stbi_uc) code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5472 g->codes[code].suffix = (stbi_uc) code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5473 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5474
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5475 // support no starting clear code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5476 avail = clear+2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5477 oldcode = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5478
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5479 len = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5480 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5481 if (valid_bits < codesize) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5482 if (len == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5483 len = stbi__get8(s); // start new block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5484 if (len == 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5485 return g->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5486 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5487 --len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5488 bits |= (stbi__int32) stbi__get8(s) << valid_bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5489 valid_bits += 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5490 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5491 stbi__int32 code = bits & codemask;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5492 bits >>= codesize;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5493 valid_bits -= codesize;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5494 // @OPTIMIZE: is there some way we can accelerate the non-clear path?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5495 if (code == clear) { // clear code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5496 codesize = lzw_cs + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5497 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5498 avail = clear + 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5499 oldcode = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5500 first = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5501 } else if (code == clear + 1) { // end of stream code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5502 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5503 while ((len = stbi__get8(s)) > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5504 stbi__skip(s,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5505 return g->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5506 } else if (code <= avail) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5507 if (first) return stbi__errpuc("no clear code", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5508
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5509 if (oldcode >= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5510 p = &g->codes[avail++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5511 if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5512 p->prefix = (stbi__int16) oldcode;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5513 p->first = g->codes[oldcode].first;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5514 p->suffix = (code == avail) ? p->first : g->codes[code].first;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5515 } else if (code == avail)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5516 return stbi__errpuc("illegal code in raster", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5517
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5518 stbi__out_gif_code(g, (stbi__uint16) code);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5519
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5520 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5521 codesize++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5522 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5523 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5524
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5525 oldcode = code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5526 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5527 return stbi__errpuc("illegal code in raster", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5528 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5529 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5530 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5531 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5532
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5533 static void stbi__fill_gif_background(stbi__gif *g)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5534 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5535 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5536 stbi_uc *c = g->pal[g->bgindex];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5537 // @OPTIMIZE: write a dword at a time
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5538 for (i = 0; i < g->w * g->h * 4; i += 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5539 stbi_uc *p = &g->out[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5540 p[0] = c[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5541 p[1] = c[1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5542 p[2] = c[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5543 p[3] = c[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5544 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5545 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5546
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5547 // this function is designed to support animated gifs, although stb_image doesn't support it
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5548 static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5549 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5550 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5551 stbi_uc *old_out = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5552
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5553 if (g->out == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5554 if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5555 g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5556 if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5557 stbi__fill_gif_background(g);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5558 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5559 // animated-gif-only path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5560 if (((g->eflags & 0x1C) >> 2) == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5561 old_out = g->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5562 g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5563 if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5564 memcpy(g->out, old_out, g->w*g->h*4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5565 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5566 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5567
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5568 for (;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5569 switch (stbi__get8(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5570 case 0x2C: /* Image Descriptor */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5571 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5572 stbi__int32 x, y, w, h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5573 stbi_uc *o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5574
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5575 x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5576 y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5577 w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5578 h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5579 if (((x + w) > (g->w)) || ((y + h) > (g->h)))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5580 return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5581
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5582 g->line_size = g->w * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5583 g->start_x = x * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5584 g->start_y = y * g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5585 g->max_x = g->start_x + w * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5586 g->max_y = g->start_y + h * g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5587 g->cur_x = g->start_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5588 g->cur_y = g->start_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5589
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5590 g->lflags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5591
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5592 if (g->lflags & 0x40) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5593 g->step = 8 * g->line_size; // first interlaced spacing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5594 g->parse = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5595 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5596 g->step = g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5597 g->parse = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5598 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5599
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5600 if (g->lflags & 0x80) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5601 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5602 g->color_table = (stbi_uc *) g->lpal;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5603 } else if (g->flags & 0x80) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5604 for (i=0; i < 256; ++i) // @OPTIMIZE: stbi__jpeg_reset only the previous transparent
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5605 g->pal[i][3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5606 if (g->transparent >= 0 && (g->eflags & 0x01))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5607 g->pal[g->transparent][3] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5608 g->color_table = (stbi_uc *) g->pal;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5609 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5610 return stbi__errpuc("missing color table", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5611
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5612 o = stbi__process_gif_raster(s, g);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5613 if (o == NULL) return NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5614
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5615 if (req_comp && req_comp != 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5616 o = stbi__convert_format(o, 4, req_comp, g->w, g->h);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5617 return o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5618 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5619
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5620 case 0x21: // Comment Extension.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5621 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5622 int len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5623 if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5624 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5625 if (len == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5626 g->eflags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5627 stbi__get16le(s); // delay
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5628 g->transparent = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5629 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5630 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5631 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5632 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5633 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5634 while ((len = stbi__get8(s)) != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5635 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5636 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5637 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5638
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5639 case 0x3B: // gif stream termination code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5640 return (stbi_uc *) s; // using '1' causes warning on some compilers
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5641
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5642 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5643 return stbi__errpuc("unknown code", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5644 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5645 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5646 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5647
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5648 static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5649 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5650 stbi_uc *u = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5651 stbi__gif g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5652 memset(&g, 0, sizeof(g));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5653
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5654 u = stbi__gif_load_next(s, &g, comp, req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5655 if (u == (stbi_uc *) s) u = 0; // end of animated gif marker
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5656 if (u) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5657 *x = g.w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5658 *y = g.h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5659 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5660
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5661 return u;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5662 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5663
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5664 static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5665 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5666 return stbi__gif_info_raw(s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5667 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5668 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5669
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5670 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5671 // Radiance RGBE HDR loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5672 // originally by Nicolas Schulz
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5673 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5674 static int stbi__hdr_test_core(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5675 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5676 const char *signature = "#?RADIANCE\n";
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5677 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5678 for (i=0; signature[i]; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5679 if (stbi__get8(s) != signature[i])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5680 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5681 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5682 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5683
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5684 static int stbi__hdr_test(stbi__context* s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5685 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5686 int r = stbi__hdr_test_core(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5687 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5688 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5689 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5690
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5691 #define STBI__HDR_BUFLEN 1024
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5692 static char *stbi__hdr_gettoken(stbi__context *z, char *buffer)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5693 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5694 int len=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5695 char c = '\0';
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5696
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5697 c = (char) stbi__get8(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5698
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5699 while (!stbi__at_eof(z) && c != '\n') {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5700 buffer[len++] = c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5701 if (len == STBI__HDR_BUFLEN-1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5702 // flush to end of line
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5703 while (!stbi__at_eof(z) && stbi__get8(z) != '\n')
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5704 ;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5705 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5706 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5707 c = (char) stbi__get8(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5708 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5709
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5710 buffer[len] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5711 return buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5712 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5713
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5714 static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5715 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5716 if ( input[3] != 0 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5717 float f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5718 // Exponent
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5719 f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5720 if (req_comp <= 2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5721 output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5722 else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5723 output[0] = input[0] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5724 output[1] = input[1] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5725 output[2] = input[2] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5726 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5727 if (req_comp == 2) output[1] = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5728 if (req_comp == 4) output[3] = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5729 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5730 switch (req_comp) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5731 case 4: output[3] = 1; /* fallthrough */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5732 case 3: output[0] = output[1] = output[2] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5733 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5734 case 2: output[1] = 1; /* fallthrough */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5735 case 1: output[0] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5736 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5737 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5738 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5739 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5740
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5741 static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5742 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5743 char buffer[STBI__HDR_BUFLEN];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5744 char *token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5745 int valid = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5746 int width, height;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5747 stbi_uc *scanline;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5748 float *hdr_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5749 int len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5750 unsigned char count, value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5751 int i, j, k, c1,c2, z;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5752
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5753
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5754 // Check identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5755 if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5756 return stbi__errpf("not HDR", "Corrupt HDR image");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5757
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5758 // Parse header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5759 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5760 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5761 if (token[0] == 0) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5762 if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5763 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5764
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5765 if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5766
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5767 // Parse width and height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5768 // can't use sscanf() if we're not using stdio!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5769 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5770 if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5771 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5772 height = (int) strtol(token, &token, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5773 while (*token == ' ') ++token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5774 if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5775 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5776 width = (int) strtol(token, NULL, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5777
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5778 *x = width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5779 *y = height;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5780
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5781 if (comp) *comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5782 if (req_comp == 0) req_comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5783
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5784 // Read data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5785 hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5786
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5787 // Load image data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5788 // image data is stored as some number of sca
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5789 if ( width < 8 || width >= 32768) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5790 // Read flat data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5791 for (j=0; j < height; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5792 for (i=0; i < width; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5793 stbi_uc rgbe[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5794 main_decode_loop:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5795 stbi__getn(s, rgbe, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5796 stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5797 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5798 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5799 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5800 // Read RLE-encoded data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5801 scanline = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5802
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5803 for (j = 0; j < height; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5804 c1 = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5805 c2 = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5806 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5807 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5808 // not run-length encoded, so we have to actually use THIS data as a decoded
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5809 // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5810 stbi_uc rgbe[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5811 rgbe[0] = (stbi_uc) c1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5812 rgbe[1] = (stbi_uc) c2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5813 rgbe[2] = (stbi_uc) len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5814 rgbe[3] = (stbi_uc) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5815 stbi__hdr_convert(hdr_data, rgbe, req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5816 i = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5817 j = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5818 STBI_FREE(scanline);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5819 goto main_decode_loop; // yes, this makes no sense
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5820 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5821 len <<= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5822 len |= stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5823 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5824 if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5825
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5826 for (k = 0; k < 4; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5827 i = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5828 while (i < width) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5829 count = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5830 if (count > 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5831 // Run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5832 value = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5833 count -= 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5834 for (z = 0; z < count; ++z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5835 scanline[i++ * 4 + k] = value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5836 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5837 // Dump
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5838 for (z = 0; z < count; ++z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5839 scanline[i++ * 4 + k] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5840 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5841 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5842 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5843 for (i=0; i < width; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5844 stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5845 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5846 STBI_FREE(scanline);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5847 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5848
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5849 return hdr_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5850 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5851
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5852 static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5853 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5854 char buffer[STBI__HDR_BUFLEN];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5855 char *token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5856 int valid = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5857
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5858 if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5859 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5860 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5861 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5862
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5863 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5864 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5865 if (token[0] == 0) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5866 if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5867 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5868
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5869 if (!valid) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5870 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5871 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5872 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5873 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5874 if (strncmp(token, "-Y ", 3)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5875 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5876 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5877 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5878 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5879 *y = (int) strtol(token, &token, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5880 while (*token == ' ') ++token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5881 if (strncmp(token, "+X ", 3)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5882 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5883 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5884 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5885 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5886 *x = (int) strtol(token, NULL, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5887 *comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5888 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5889 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5890 #endif // STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5891
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5892 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5893 static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5894 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5895 int hsz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5896 if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5897 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5898 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5899 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5900 stbi__skip(s,12);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5901 hsz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5902 if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5903 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5904 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5905 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5906 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5907 *x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5908 *y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5909 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5910 *x = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5911 *y = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5912 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5913 if (stbi__get16le(s) != 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5914 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5915 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5916 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5917 *comp = stbi__get16le(s) / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5918 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5919 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5920 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5921
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5922 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5923 static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5924 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5925 int channelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5926 if (stbi__get32be(s) != 0x38425053) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5927 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5928 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5929 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5930 if (stbi__get16be(s) != 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5931 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5932 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5933 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5934 stbi__skip(s, 6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5935 channelCount = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5936 if (channelCount < 0 || channelCount > 16) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5937 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5938 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5939 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5940 *y = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5941 *x = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5942 if (stbi__get16be(s) != 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5943 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5944 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5945 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5946 if (stbi__get16be(s) != 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5947 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5948 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5949 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5950 *comp = 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5951 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5952 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5953 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5954
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5955 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5956 static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5957 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5958 int act_comp=0,num_packets=0,chained;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5959 stbi__pic_packet packets[10];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5960
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5961 stbi__skip(s, 92);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5962
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5963 *x = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5964 *y = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5965 if (stbi__at_eof(s)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5966 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5967 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5968 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5969 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5970
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5971 stbi__skip(s, 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5972
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5973 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5974 stbi__pic_packet *packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5975
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5976 if (num_packets==sizeof(packets)/sizeof(packets[0]))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5977 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5978
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5979 packet = &packets[num_packets++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5980 chained = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5981 packet->size = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5982 packet->type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5983 packet->channel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5984 act_comp |= packet->channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5985
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5986 if (stbi__at_eof(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5987 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5988 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5989 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5990 if (packet->size != 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5991 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5992 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5993 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5994 } while (chained);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5995
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5996 *comp = (act_comp & 0x10 ? 4 : 3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5997
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5998 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5999 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6000 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6001
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6002 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6003 // Portable Gray Map and Portable Pixel Map loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6004 // by Ken Miller
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6005 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6006 // PGM: http://netpbm.sourceforge.net/doc/pgm.html
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6007 // PPM: http://netpbm.sourceforge.net/doc/ppm.html
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6008 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6009 // Known limitations:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6010 // Does not support comments in the header section
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6011 // Does not support ASCII image data (formats P2 and P3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6012 // Does not support 16-bit-per-channel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6013
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6014 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6015
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6016 static int stbi__pnm_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6017 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6018 char p, t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6019 p = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6020 t = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6021 if (p != 'P' || (t != '5' && t != '6')) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6022 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6023 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6024 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6025 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6026 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6027
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6028 static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6029 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6030 stbi_uc *out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6031 if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6032 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6033 *x = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6034 *y = s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6035 *comp = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6036
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6037 out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6038 if (!out) return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6039 stbi__getn(s, out, s->img_n * s->img_x * s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6040
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6041 if (req_comp && req_comp != s->img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6042 out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6043 if (out == NULL) return out; // stbi__convert_format frees input on failure
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6044 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6045 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6046 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6047
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6048 static int stbi__pnm_isspace(char c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6049 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6050 return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6051 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6052
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6053 static void stbi__pnm_skip_whitespace(stbi__context *s, char *c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6054 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6055 while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6056 *c = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6057 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6058
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6059 static int stbi__pnm_isdigit(char c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6060 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6061 return c >= '0' && c <= '9';
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6062 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6063
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6064 static int stbi__pnm_getinteger(stbi__context *s, char *c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6065 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6066 int value = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6067
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6068 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6069 value = value*10 + (*c - '0');
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6070 *c = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6071 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6072
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6073 return value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6074 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6075
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6076 static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6077 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6078 int maxv;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6079 char c, p, t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6080
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6081 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6082
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6083 // Get identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6084 p = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6085 t = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6086 if (p != 'P' || (t != '5' && t != '6')) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6087 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6088 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6089 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6090
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6091 *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6092
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6093 c = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6094 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6095
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6096 *x = stbi__pnm_getinteger(s, &c); // read width
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6097 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6098
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6099 *y = stbi__pnm_getinteger(s, &c); // read height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6100 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6101
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6102 maxv = stbi__pnm_getinteger(s, &c); // read max value
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6103
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6104 if (maxv > 255)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6105 return stbi__err("max value > 255", "PPM image not 8-bit");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6106 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6107 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6108 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6109 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6110
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6111 static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6112 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6113 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6114 if (stbi__jpeg_info(s, x, y, comp)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6115 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6116
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6117 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6118 if (stbi__png_info(s, x, y, comp)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6119 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6120
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6121 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6122 if (stbi__gif_info(s, x, y, comp)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6123 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6124
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6125 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6126 if (stbi__bmp_info(s, x, y, comp)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6127 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6128
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6129 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6130 if (stbi__psd_info(s, x, y, comp)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6131 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6132
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6133 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6134 if (stbi__pic_info(s, x, y, comp)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6135 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6136
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6137 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6138 if (stbi__pnm_info(s, x, y, comp)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6139 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6140
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6141 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6142 if (stbi__hdr_info(s, x, y, comp)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6143 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6144
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6145 // test tga last because it's a crappy test!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6146 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6147 if (stbi__tga_info(s, x, y, comp))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6148 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6149 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6150 return stbi__err("unknown image type", "Image not of any known type, or corrupt");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6151 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6152
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6153 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6154 STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6155 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6156 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6157 int result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6158 if (!f) return stbi__err("can't fopen", "Unable to open file");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6159 result = stbi_info_from_file(f, x, y, comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6160 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6161 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6162 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6163
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6164 STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6165 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6166 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6167 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6168 long pos = ftell(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6169 stbi__start_file(&s, f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6170 r = stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6171 fseek(f,pos,SEEK_SET);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6172 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6173 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6174 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6175
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6176 STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6177 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6178 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6179 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6180 return stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6181 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6182
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6183 STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6184 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6185 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6186 stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6187 return stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6188 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6189
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6190 #endif // STB_IMAGE_IMPLEMENTATION
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6191
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6192 /*
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6193 revision history:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6194 2.02 (2015-01-19) fix incorrect assert, fix warning
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6195 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6196 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6197 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6198 progressive JPEG (stb)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6199 PGM/PPM support (Ken Miller)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6200 STBI_MALLOC,STBI_REALLOC,STBI_FREE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6201 GIF bugfix -- seemingly never worked
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6202 STBI_NO_*, STBI_ONLY_*
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6203 1.48 (2014-12-14) fix incorrectly-named assert()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6204 1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6205 optimize PNG (ryg)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6206 fix bug in interlaced PNG with user-specified channel count (stb)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6207 1.46 (2014-08-26)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6208 fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6209 1.45 (2014-08-16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6210 fix MSVC-ARM internal compiler error by wrapping malloc
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6211 1.44 (2014-08-07)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6212 various warning fixes from Ronny Chevalier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6213 1.43 (2014-07-15)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6214 fix MSVC-only compiler problem in code changed in 1.42
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6215 1.42 (2014-07-09)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6216 don't define _CRT_SECURE_NO_WARNINGS (affects user code)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6217 fixes to stbi__cleanup_jpeg path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6218 added STBI_ASSERT to avoid requiring assert.h
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6219 1.41 (2014-06-25)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6220 fix search&replace from 1.36 that messed up comments/error messages
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6221 1.40 (2014-06-22)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6222 fix gcc struct-initialization warning
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6223 1.39 (2014-06-15)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6224 fix to TGA optimization when req_comp != number of components in TGA;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6225 fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6226 add support for BMP version 5 (more ignored fields)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6227 1.38 (2014-06-06)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6228 suppress MSVC warnings on integer casts truncating values
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6229 fix accidental rename of 'skip' field of I/O
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6230 1.37 (2014-06-04)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6231 remove duplicate typedef
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6232 1.36 (2014-06-03)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6233 convert to header file single-file library
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6234 if de-iphone isn't set, load iphone images color-swapped instead of returning NULL
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6235 1.35 (2014-05-27)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6236 various warnings
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6237 fix broken STBI_SIMD path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6238 fix bug where stbi_load_from_file no longer left file pointer in correct place
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6239 fix broken non-easy path for 32-bit BMP (possibly never used)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6240 TGA optimization by Arseny Kapoulkine
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6241 1.34 (unknown)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6242 use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6243 1.33 (2011-07-14)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6244 make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6245 1.32 (2011-07-13)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6246 support for "info" function for all supported filetypes (SpartanJ)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6247 1.31 (2011-06-20)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6248 a few more leak fixes, bug in PNG handling (SpartanJ)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6249 1.30 (2011-06-11)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6250 added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6251 removed deprecated format-specific test/load functions
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6252 removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6253 error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6254 fix inefficiency in decoding 32-bit BMP (David Woo)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6255 1.29 (2010-08-16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6256 various warning fixes from Aurelien Pocheville
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6257 1.28 (2010-08-01)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6258 fix bug in GIF palette transparency (SpartanJ)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6259 1.27 (2010-08-01)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6260 cast-to-stbi_uc to fix warnings
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6261 1.26 (2010-07-24)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6262 fix bug in file buffering for PNG reported by SpartanJ
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6263 1.25 (2010-07-17)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6264 refix trans_data warning (Won Chun)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6265 1.24 (2010-07-12)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6266 perf improvements reading from files on platforms with lock-heavy fgetc()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6267 minor perf improvements for jpeg
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6268 deprecated type-specific functions so we'll get feedback if they're needed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6269 attempt to fix trans_data warning (Won Chun)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6270 1.23 fixed bug in iPhone support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6271 1.22 (2010-07-10)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6272 removed image *writing* support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6273 stbi_info support from Jetro Lauha
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6274 GIF support from Jean-Marc Lienher
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6275 iPhone PNG-extensions from James Brown
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6276 warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6277 1.21 fix use of 'stbi_uc' in header (reported by jon blow)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6278 1.20 added support for Softimage PIC, by Tom Seddon
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6279 1.19 bug in interlaced PNG corruption check (found by ryg)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6280 1.18 2008-08-02
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6281 fix a threading bug (local mutable static)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6282 1.17 support interlaced PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6283 1.16 major bugfix - stbi__convert_format converted one too many pixels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6284 1.15 initialize some fields for thread safety
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6285 1.14 fix threadsafe conversion bug
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6286 header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6287 1.13 threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6288 1.12 const qualifiers in the API
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6289 1.11 Support installable IDCT, colorspace conversion routines
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6290 1.10 Fixes for 64-bit (don't use "unsigned long")
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6291 optimized upsampling by Fabian "ryg" Giesen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6292 1.09 Fix format-conversion for PSD code (bad global variables!)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6293 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6294 1.07 attempt to fix C++ warning/errors again
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6295 1.06 attempt to fix C++ warning/errors again
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6296 1.05 fix TGA loading to return correct *comp and use good luminance calc
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6297 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6298 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6299 1.02 support for (subset of) HDR files, float interface for preferred access to them
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6300 1.01 fix bug: possible bug in handling right-side up bmps... not sure
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6301 fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6302 1.00 interface to zlib that skips zlib header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6303 0.99 correct handling of alpha in palette
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6304 0.98 TGA loader by lonesock; dynamically add loaders (untested)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6305 0.97 jpeg errors on too large a file; also catch another malloc failure
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6306 0.96 fix detection of invalid v value - particleman@mollyrocket forum
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6307 0.95 during header scan, seek to markers in case of padding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6308 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6309 0.93 handle jpegtran output; verbose errors
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6310 0.92 read 4,8,16,24,32-bit BMP files of several formats
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6311 0.91 output 24-bit Windows 3.0 BMP files
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6312 0.90 fix a few more warnings; bump version number to approach 1.0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6313 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6314 0.60 fix compiling as c++
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6315 0.59 fix warnings: merge Dave Moore's -Wall fixes
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6316 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6317 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6318 0.56 fix bug: zlib uncompressed mode len vs. nlen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6319 0.55 fix bug: restart_interval not initialized to 0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6320 0.54 allow NULL for 'int *comp'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6321 0.53 fix bug in png 3->4; speedup png decoding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6322 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6323 0.51 obey req_comp requests, 1-component jpegs return as 1-component,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6324 on 'test' only check type, not whether we support this variant
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6325 0.50 first released version
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
6326 */