annotate src/stb_image.c @ 1134:d0898867ec4c

Various fixes for issues reported by clang static analyzer.
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 04 Mar 2015 08:38:19 +0200
parents c023fae92620
children e42aa3c940c1
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 #ifdef __cplusplus
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
397 extern "C" {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
398 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
399
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
400 #ifdef STB_IMAGE_STATIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
401 #define STBIDEF static
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
402 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
403 #define STBIDEF extern
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
404 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
405
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
406 //////////////////////////////////////////////////////////////////////////////
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 // PRIMARY API - works on images of any type
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
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 // 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
413 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
414
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
415 typedef struct
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 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
418 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
419 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
420 } stbi_io_callbacks;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
421
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
422 STBIDEF Uint8 *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp);
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
423 STBIDEF Uint8 *stbi_load_from_memory (Uint8 const *buffer, int len , int *x, int *y, int *comp, int req_comp);
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
424 STBIDEF Uint8 *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
425
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
426 #ifndef STBI_NO_STDIO
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
427 STBIDEF Uint8 *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
428 // 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
429 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
430
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
431 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
432 STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
433 STBIDEF float *stbi_loadf_from_memory (Uint8 const *buffer, int len, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
434 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
435
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
436 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
437 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
438 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
439 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
440
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
441 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
442 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
443 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
444 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
445
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
446 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
447 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
448 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
449 #endif // STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
450
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
451 // 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
452 STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
453 STBIDEF int stbi_is_hdr_from_memory(Uint8 const *buffer, int len);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
454 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
455 STBIDEF int stbi_is_hdr (char const *filename);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
456 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
457 #endif // STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
458
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
459
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
460 // get a VERY brief reason for failure
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
461 // NOT THREADSAFE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
462 STBIDEF const char *stbi_failure_reason (void);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
463
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
464 // free the loaded image -- this is just free()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
465 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
466
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
467 // get image dimensions & components without fully decoding
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
468 STBIDEF int stbi_info_from_memory(Uint8 const *buffer, int len, int *x, int *y, int *comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
469 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
470
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
471 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
472 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
473 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
474
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
475 #endif
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
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 // 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
480 // 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
481 // unpremultiplication. results are undefined if the unpremultiply overflow.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
482 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
483
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
484 // 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
485 // or just pass them through "as-is"
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
486 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
487
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
488
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
489 #ifdef __cplusplus
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 #endif
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 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
494 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
495 //// end header file /////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
496 #endif // STBI_INCLUDE_STB_IMAGE_H
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 #ifdef STB_IMAGE_IMPLEMENTATION
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
499
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
500 #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
501 || 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
502 || 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
503 || defined(STBI_ONLY_ZLIB)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
504 #ifndef STBI_ONLY_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
505 #define STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
506 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
507 #ifndef STBI_ONLY_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
508 #define STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
509 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
510 #ifndef STBI_ONLY_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
511 #define STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
512 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
513 #ifndef STBI_ONLY_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
514 #define STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
515 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
516 #ifndef STBI_ONLY_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
517 #define STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
518 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
519 #ifndef STBI_ONLY_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
520 #define STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
521 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
522 #ifndef STBI_ONLY_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
523 #define STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
524 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
525 #ifndef STBI_ONLY_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
526 #define STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
527 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
528 #ifndef STBI_ONLY_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
529 #define STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
530 #endif
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
533
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
534 #include <stdarg.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
535 #include <stddef.h> // ptrdiff_t on osx
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
536 #include <stdlib.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
537 #include <string.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
538
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
539 #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
540 #include <math.h> // ldexp
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
541 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
542
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
543 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
544 #include <stdio.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
545 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
546
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
547 #ifndef STBI_ASSERT
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
548 #include <assert.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
549 #define STBI_ASSERT(x) assert(x)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
550 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
551
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
552
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
553 #define stbi_inline inline
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
554 #define STBI_NOTUSED(v) (void)(v)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
555
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
556
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
557 #ifdef _MSC_VER
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
558 #define STBI_HAS_LROTL
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
559 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
560
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
561 #ifdef STBI_HAS_LROTL
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
562 #define stbi_lrot(x,y) _lrotl(x,y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
563 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
564 #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
565 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
566
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
567 #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
568 // ok
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
569 #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
570 // ok
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
571 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
572 #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
573 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
574
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
575 #ifndef STBI_MALLOC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
576 #define STBI_MALLOC(sz) malloc(sz)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
577 #define STBI_REALLOC(p,sz) realloc(p,sz)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
578 #define STBI_FREE(p) free(p)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
579 #endif
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 #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
582 // 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
583 // (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
584 // 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
585 // 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
586 #define STBI_NO_SIMD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
587 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
588
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
589 #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
590 #define STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
591 #include <emmintrin.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
592
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
593 #ifdef _MSC_VER
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
594
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
595 #if _MSC_VER >= 1400 // not VC6
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
596 #include <intrin.h> // __cpuid
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
597 static int stbi__cpuid3(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
598 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
599 int info[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
600 __cpuid(info,1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
601 return info[3];
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 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
604 static int stbi__cpuid3(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
605 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
606 int res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
607 __asm {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
608 mov eax,1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
609 cpuid
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
610 mov res,edx
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
611 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
612 return res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
613 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
614 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
615
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
616 #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
617
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
618 static int stbi__sse2_available()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
619 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
620 int info3 = stbi__cpuid3();
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
621 return ((info3 >> 26) & 1) != 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
622 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
623 #else // assume GCC-style if not VC++
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
624 #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
625
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
626 static int stbi__sse2_available()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
627 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
628 #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
629 // 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
630 return __builtin_cpu_supports("sse2");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
631 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
632 // 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
633 // just bail for now.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
634 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
635 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
636 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
637 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
638 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
639
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
640 // ARM NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
641 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
642 #undef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
643 #endif
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 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
646 #include <arm_neon.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
647 // assume GCC or Clang on ARM targets
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
648 #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
649 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
650
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
651 #ifndef STBI_SIMD_ALIGN
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
652 #define STBI_SIMD_ALIGN(type, name) type name
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
653 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
654
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
655 ///////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
656 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
657 // stbi__context struct and start_xxx functions
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
658
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
659 // 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
660 // 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
661 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
662 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
663 Uint32 img_x, img_y;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
664 int img_n, img_out_n;
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 stbi_io_callbacks io;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
667 void *io_user_data;
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 int read_from_callbacks;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
670 int buflen;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
671 Uint8 buffer_start[128];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
672
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
673 Uint8 *img_buffer, *img_buffer_end;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
674 Uint8 *img_buffer_original;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
675 } stbi__context;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
676
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
677
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
678 static void stbi__refill_buffer(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
679
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
680 // initialize a memory-decode context
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
681 static void stbi__start_mem(stbi__context *s, Uint8 const *buffer, int len)
893
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 s->io.read = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
684 s->read_from_callbacks = 0;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
685 s->img_buffer = s->img_buffer_original = (Uint8 *) buffer;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
686 s->img_buffer_end = (Uint8 *) buffer+len;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
687 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
688
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
689 // initialize a callback-based context
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
690 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
691 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
692 s->io = *c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
693 s->io_user_data = user;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
694 s->buflen = sizeof(s->buffer_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
695 s->read_from_callbacks = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
696 s->img_buffer_original = s->buffer_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
697 stbi__refill_buffer(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
698 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
699
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
700 #ifndef STBI_NO_STDIO
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 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
703 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
704 return (int) fread(data,1,size,(FILE*) user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
705 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
706
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
707 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
708 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
709 fseek((FILE*) user, n, SEEK_CUR);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
710 }
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 static int stbi__stdio_eof(void *user)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
713 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
714 return feof((FILE*) user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
715 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
716
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
717 static stbi_io_callbacks stbi__stdio_callbacks =
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__stdio_read,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
720 stbi__stdio_skip,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
721 stbi__stdio_eof,
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__start_file(stbi__context *s, FILE *f)
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 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
727 }
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 //static void stop_file(stbi__context *s) { }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
730
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
731 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
732
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
733 static void stbi__rewind(stbi__context *s)
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 // 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
736 // 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
737 // 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
738 s->img_buffer = s->img_buffer_original;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
739 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
740
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
741 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
742 static int stbi__jpeg_test(stbi__context *s);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
743 static Uint8 *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
744 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
745 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
746
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
747 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
748 static int stbi__png_test(stbi__context *s);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
749 static Uint8 *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
750 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
751 #endif
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 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
754 static int stbi__bmp_test(stbi__context *s);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
755 static Uint8 *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
756 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
757 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
758
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
759 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
760 static int stbi__tga_test(stbi__context *s);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
761 static Uint8 *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
762 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
763 #endif
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 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
766 static int stbi__psd_test(stbi__context *s);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
767 static Uint8 *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
768 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
769 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
770
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
771 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
772 static int stbi__hdr_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
773 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
774 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
775 #endif
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 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
778 static int stbi__pic_test(stbi__context *s);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
779 static Uint8 *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
780 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
781 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
782
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
783 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
784 static int stbi__gif_test(stbi__context *s);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
785 static Uint8 *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
786 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
787 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
788
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
789 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
790 static int stbi__pnm_test(stbi__context *s);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
791 static Uint8 *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
792 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
793 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
794
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
795 // this is not threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
796 static const char *stbi__g_failure_reason;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
797
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
798 STBIDEF const char *stbi_failure_reason(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
799 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
800 return stbi__g_failure_reason;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
801 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
802
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
803 #ifndef STBI_NO_FAILURE_STRINGS
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
804 static int stbi__err(const char *str)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
805 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
806 stbi__g_failure_reason = str;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
807 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
808 }
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
809 #endif
893
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 static void *stbi__malloc(size_t size)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
812 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
813 return STBI_MALLOC(size);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
814 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
815
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
816 // stbi__err - error
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
817 // stbi__errpf - error returning pointer to float
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
818 // stbi__errpuc - error returning pointer to unsigned char
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
819
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
820 #ifdef STBI_NO_FAILURE_STRINGS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
821 #define stbi__err(x,y) 0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
822 #elif defined(STBI_FAILURE_USERMSG)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
823 #define stbi__err(x,y) stbi__err(y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
824 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
825 #define stbi__err(x,y) stbi__err(x)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
826 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
827
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
828 #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
829 #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
830
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
831 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
832 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
833 STBI_FREE(retval_from_stbi_load);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
836 #ifndef STBI_NO_LINEAR
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
837 static float *stbi__ldr_to_hdr(Uint8 *data, int x, int y, int comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
838 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
839
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
840 #ifndef STBI_NO_HDR
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
841 static Uint8 *stbi__hdr_to_ldr(float *data, int x, int y, int comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
842 #endif
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 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
845 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
846 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
847 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
848 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
849 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
850 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
851 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
852 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
853 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
854 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
855 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
856 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
857 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
858 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
859 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
860 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
861 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
862 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
863 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
864 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
865 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
866 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
867
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
868 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
869 if (stbi__hdr_test(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
870 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
871 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
872 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
873 #endif
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 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
876 // 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
877 if (stbi__tga_test(s))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
878 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
879 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
880
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
881 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
882 }
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_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
885
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
886 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
887 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
888 FILE *f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
889 #if defined(_MSC_VER) && _MSC_VER >= 1400
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
890 if (0 != fopen_s(&f, filename, mode))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
891 f=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
892 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
893 f = fopen(filename, mode);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
894 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
895 return f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
896 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
897
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
898
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
899 STBIDEF Uint8 *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
900 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
901 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
902 unsigned char *result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
903 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
904 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
905 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
906 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
907 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
908
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
909 STBIDEF Uint8 *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
910 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
911 unsigned char *result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
912 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
913 stbi__start_file(&s,f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
914 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
915 if (result) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
916 // 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
917 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
918 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
919 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
920 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
921 #endif //!STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
922
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
923 STBIDEF Uint8 *stbi_load_from_memory(Uint8 const *buffer, int len, int *x, int *y, int *comp, int req_comp)
893
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 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
926 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
927 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
928 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
929
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
930 STBIDEF Uint8 *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)
893
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 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
933 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
934 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
935 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
936
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
937 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
938 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
939 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
940 unsigned char *data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
941 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
942 if (stbi__hdr_test(s))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
943 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
944 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
945 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
946 if (data)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
947 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
948 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
949 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
950
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
951 STBIDEF float *stbi_loadf_from_memory(Uint8 const *buffer, int len, int *x, int *y, int *comp, int req_comp)
893
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 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
954 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
955 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
956 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
957
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
958 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
959 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
960 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
961 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
962 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
963 }
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 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
966 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
967 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
968 float *result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
969 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
970 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
971 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
972 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
973 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
974 }
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 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
977 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
978 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
979 stbi__start_file(&s,f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
980 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
981 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
982 #endif // !STBI_NO_STDIO
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 #endif // !STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
985
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
986 // 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
987 // 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
988 // reports false!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
989
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
990 STBIDEF int stbi_is_hdr_from_memory(Uint8 const *buffer, int len)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
991 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
992 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
993 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
994 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
995 return stbi__hdr_test(&s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
996 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
997 STBI_NOTUSED(buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
998 STBI_NOTUSED(len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
999 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1000 #endif
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1003 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1004 STBIDEF int stbi_is_hdr (char const *filename)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1005 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1006 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1007 int result=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1008 if (f) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1009 result = stbi_is_hdr_from_file(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1010 fclose(f);
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 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1013 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1014
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1015 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
1016 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1017 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1018 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1019 stbi__start_file(&s,f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1020 return stbi__hdr_test(&s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1021 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1022 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1023 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1024 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1025 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1026
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1027 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
1028 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1029 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1030 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1031 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
1032 return stbi__hdr_test(&s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1033 #else
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1034 (void) clbk;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1035 (void) user;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1036 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1037 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1038 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1039
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1040 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
1041 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
1042
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1043 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1044 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
1045 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
1046 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1047
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1048 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
1049 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
1050
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1051
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1052 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1053 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1054 // Common code used by all image loaders
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1057 enum
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 STBI__SCAN_load=0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1060 STBI__SCAN_type,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1061 STBI__SCAN_header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1062 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1063
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1064 static void stbi__refill_buffer(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1065 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1066 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
1067 if (n == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1068 // 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
1069 // 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
1070 s->read_from_callbacks = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1071 s->img_buffer = s->buffer_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1072 s->img_buffer_end = s->buffer_start+1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1073 *s->img_buffer = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1074 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1075 s->img_buffer = s->buffer_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1076 s->img_buffer_end = s->buffer_start + n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1077 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1078 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1079
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1080 stbi_inline static Uint8 stbi__get8(stbi__context *s)
893
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 if (s->img_buffer < s->img_buffer_end)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1083 return *s->img_buffer++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1084 if (s->read_from_callbacks) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1085 stbi__refill_buffer(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1086 return *s->img_buffer++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1087 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1088 return 0;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1091 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
1092 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1093 if (s->io.read) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1094 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
1095 // if feof() is true, check if buffer = end
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1096 // 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
1097 if (s->read_from_callbacks == 0) return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1100 return s->img_buffer >= s->img_buffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1101 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1102
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1103 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
1104 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1105 if (s->io.read) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1106 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
1107 if (blen < n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1108 s->img_buffer = s->img_buffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1109 (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
1110 return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1111 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1112 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1113 s->img_buffer += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1114 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1115
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1116 static int stbi__getn(stbi__context *s, Uint8 *buffer, int n)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1117 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1118 if (s->io.read) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1119 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
1120 if (blen < n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1121 int res, count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1122
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1123 memcpy(buffer, s->img_buffer, blen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1124
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1125 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
1126 res = (count == (n-blen));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1127 s->img_buffer = s->img_buffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1128 return res;
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 }
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 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
1133 memcpy(buffer, s->img_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1134 s->img_buffer += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1135 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1136 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1137 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1138 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1139
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1140 static int stbi__get16be(stbi__context *s)
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 int z = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1143 return (z << 8) + stbi__get8(s);
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
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1146 static Uint32 stbi__get32be(stbi__context *s)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1147 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1148 Uint32 z = stbi__get16be(s);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1149 return (z << 16) + stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1150 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1151
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1152 static int stbi__get16le(stbi__context *s)
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 int z = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1155 return z + (stbi__get8(s) << 8);
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
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1158 static Uint32 stbi__get32le(stbi__context *s)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1159 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1160 Uint32 z = stbi__get16le(s);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1161 return z + (stbi__get16le(s) << 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1162 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1163
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1164 #define STBI__BYTECAST(x) ((Uint8) ((x) & 255)) // truncate int to byte without warnings
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1165
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 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1168 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1169 // 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
1170 // 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
1171 // 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
1172 // 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
1173 // 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
1174 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1175 // 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
1176 // only failure mode is malloc failing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1177
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1178 static Uint8 stbi__compute_y(int r, int g, int b)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1179 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1180 return (Uint8) (((r*77) + (g*150) + (29*b)) >> 8);
893
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1183 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
1184 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1185 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1186 unsigned char *good;
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 if (req_comp == img_n) return data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1189 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1190
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1191 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
1192 if (good == NULL) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1193 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1194 return stbi__errpuc("outofmem", "Out of memory");
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1197 for (j=0; j < (int) y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1198 unsigned char *src = data + j * x * img_n ;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1199 unsigned char *dest = good + j * x * req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1200
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1201 #define COMBO(a,b) ((a)*8+(b))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1202 #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
1203 // 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
1204 // 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
1205 switch (COMBO(img_n, req_comp)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1206 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
1207 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
1208 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
1209 CASE(2,1) dest[0]=src[0]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1210 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
1211 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
1212 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
1213 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
1214 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
1215 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
1216 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
1217 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
1218 default: STBI_ASSERT(0);
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 #undef CASE
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1223 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1224 return good;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1225 }
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 #ifndef STBI_NO_LINEAR
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1228 static float *stbi__ldr_to_hdr(Uint8 *data, int x, int y, int comp)
893
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 int i,k,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1231 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
1232 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
1233 // compute number of non-alpha components
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1234 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
1235 for (i=0; i < x*y; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1236 for (k=0; k < n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1237 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
1238 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1239 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
1240 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1241 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1242 return output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1243 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1244 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1245
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1246 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1247 #define stbi__float2int(x) ((int) (x))
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1248 static Uint8 *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1249 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1250 int i,k,n;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1251 Uint8 *output = (Uint8 *) stbi__malloc(x * y * comp);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1252 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
1253 // compute number of non-alpha components
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1254 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
1255 for (i=0; i < x*y; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1256 for (k=0; k < n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1257 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
1258 if (z < 0) z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1259 if (z > 255) z = 255;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1260 output[i*comp + k] = (Uint8) stbi__float2int(z);
893
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 if (k < comp) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1263 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
1264 if (z < 0) z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1265 if (z > 255) z = 255;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1266 output[i*comp + k] = (Uint8) stbi__float2int(z);
893
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 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1270 return output;
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 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1273
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1274 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1275 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1276 // "baseline" JPEG/JFIF decoder
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1277 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1278 // simple implementation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1279 // - doesn't support delayed output of y-dimension
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1280 // - 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
1281 // - doesn't try to recover corrupt jpegs
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1282 // - 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
1283 // - 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
1284 // - 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
1285 // - non-interleaved case requires this anyway
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1286 // - allows good upsampling (see next)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1287 // high-quality
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1288 // - upsampled channels are bilinearly interpolated, even across blocks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1289 // - quality integer IDCT derived from IJG's 'slow'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1290 // performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1291 // - fast huffman; reasonable integer IDCT
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1292 // - 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
1293 // - 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
1294
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1295 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1296
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1297 // huffman decoding acceleration
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1298 #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
1299
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1300 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1301 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1302 Uint8 fast[1 << FAST_BITS];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1303 // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1304 Uint16 code[256];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1305 Uint8 values[256];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1306 Uint8 size[257];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1307 unsigned int maxcode[18];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1308 int delta[17]; // old 'firstsymbol' - old 'firstcode'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1309 } stbi__huffman;
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 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1312 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1313 stbi__context *s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1314 stbi__huffman huff_dc[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1315 stbi__huffman huff_ac[4];
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1316 Uint8 dequant[4][64];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1317 Sint16 fast_ac[4][1 << FAST_BITS];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1318
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1319 // sizes for components, interleaved MCUs
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1320 int img_h_max, img_v_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1321 int img_mcu_x, img_mcu_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1322 int img_mcu_w, img_mcu_h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1323
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1324 // definition of jpeg image component
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1325 struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1326 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1327 int id;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1328 int h,v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1329 int tq;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1330 int hd,ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1331 int dc_pred;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1332
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1333 int x,y,w2,h2;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1334 Uint8 *data;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1335 void *raw_data, *raw_coeff;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1336 Uint8 *linebuf;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1337 short *coeff; // progressive only
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1338 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
1339 } img_comp[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1340
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1341 Uint32 code_buffer; // jpeg entropy-coded buffer
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1342 int code_bits; // number of valid bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1343 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
1344 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
1345
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1346 int progressive;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1347 int spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1348 int spec_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1349 int succ_high;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1350 int succ_low;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1351 int eob_run;
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 int scan_n, order[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1354 int restart_interval, todo;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1355
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1356 // kernels
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1357 void (*idct_block_kernel)(Uint8 *out, int out_stride, short data[64]);
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1358 void (*YCbCr_to_RGB_kernel)(Uint8 *out, const Uint8 *y, const Uint8 *pcb, const Uint8 *pcr, int count, int step);
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1359 Uint8 *(*resample_row_hv_2_kernel)(Uint8 *out, Uint8 *in_near, Uint8 *in_far, int w, int hs);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1360 } stbi__jpeg;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1361
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1362 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
1363 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1364 int i,j,k=0,code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1365 // 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
1366 for (i=0; i < 16; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1367 for (j=0; j < count[i]; ++j)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1368 h->size[k++] = (Uint8) (i+1);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1369 h->size[k] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1370
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1371 // compute actual symbols (from jpeg spec)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1372 code = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1373 k = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1374 for(j=1; j <= 16; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1375 // 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
1376 h->delta[j] = k - code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1377 if (h->size[k] == j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1378 while (h->size[k] == j)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1379 h->code[k++] = (Uint16) (code++);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1380 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
1381 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1382 // 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
1383 h->maxcode[j] = code << (16-j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1384 code <<= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1385 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1386 h->maxcode[j] = 0xffffffff;
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 // 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
1389 memset(h->fast, 255, 1 << FAST_BITS);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1390 for (i=0; i < k; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1391 int s = h->size[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1392 if (s <= FAST_BITS) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1393 int c = h->code[i] << (FAST_BITS-s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1394 int m = 1 << (FAST_BITS-s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1395 for (j=0; j < m; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1396 h->fast[c+j] = (Uint8) i;
893
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1399 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1400 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1401 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1402
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1403 // 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
1404 // one go.
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1405 static void stbi__build_fast_ac(Sint16 *fast_ac, stbi__huffman *h)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1406 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1407 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1408 for (i=0; i < (1 << FAST_BITS); ++i) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1409 Uint8 fast = h->fast[i];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1410 fast_ac[i] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1411 if (fast < 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1412 int rs = h->values[fast];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1413 int run = (rs >> 4) & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1414 int magbits = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1415 int len = h->size[fast];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1416
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1417 if (magbits && len + magbits <= FAST_BITS) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1418 // magnitude code followed by receive_extend code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1419 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
1420 int m = 1 << (magbits - 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1421 if (k < m) k += (-1 << magbits) + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1422 // 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
1423 if (k >= -128 && k <= 127)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1424 fast_ac[i] = (Sint16) ((k << 8) + (run << 4) + (len + magbits));
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1425 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1426 }
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 }
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 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
1431 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1432 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1433 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
1434 if (b == 0xff) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1435 int c = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1436 if (c != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1437 j->marker = (unsigned char) c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1438 j->nomore = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1439 return;
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 j->code_buffer |= b << (24 - j->code_bits);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1443 j->code_bits += 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1444 } while (j->code_bits <= 24);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1445 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1446
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1447 // (1 << n) - 1
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1448 static Uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1449
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1450 // decode a jpeg huffman value from the bitstream
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1451 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
1452 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1453 unsigned int temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1454 int c,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1455
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1456 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
1457
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1458 // 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
1459 // if the code is <= FAST_BITS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1460 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
1461 k = h->fast[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1462 if (k < 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1463 int s = h->size[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1464 if (s > j->code_bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1465 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1466 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1467 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1468 return h->values[k];
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 // 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
1472 // 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
1473 // 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
1474 // 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
1475 // 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
1476 // 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
1477 temp = j->code_buffer >> 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1478 for (k=FAST_BITS+1 ; ; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1479 if (temp < h->maxcode[k])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1480 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1481 if (k == 17) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1482 // error! code not found
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1483 j->code_bits -= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1484 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1485 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1486
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1487 if (k > j->code_bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1488 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1489
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1490 // convert the huffman code to the symbol id
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1491 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
1492 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
1493
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1494 // convert the id to a symbol
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1495 j->code_bits -= k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1496 j->code_buffer <<= k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1497 return h->values[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1498 }
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 // bias[n] = (-1<<n) + 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1501 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
1502
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1503 // combined JPEG 'receive' and JPEG 'extend', since baseline
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1504 // always extends everything it receives.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1505 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
1506 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1507 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1508 int sgn;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1509 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
1510
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1511 sgn = (Sint32)j->code_buffer >> 31; // sign bit is always in MSB
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1512 k = stbi_lrot(j->code_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1513 j->code_buffer = k & ~stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1514 k &= stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1515 j->code_bits -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1516 return k + (stbi__jbias[n] & ~sgn);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1517 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1518
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1519 // get some unsigned bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1520 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
1521 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1522 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1523 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
1524 k = stbi_lrot(j->code_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1525 j->code_buffer = k & ~stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1526 k &= stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1527 j->code_bits -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1528 return k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1529 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1530
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1531 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
1532 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1533 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1534 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
1535 k = j->code_buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1536 j->code_buffer <<= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1537 --j->code_bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1538 return k & 0x80000000;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1539 }
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 // 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
1542 // where does it appear in the 8x8 matrix coded as row-major?
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1543 static Uint8 stbi__jpeg_dezigzag[64+15] =
893
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 0, 1, 8, 16, 9, 2, 3, 10,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1546 17, 24, 32, 25, 18, 11, 4, 5,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1547 12, 19, 26, 33, 40, 48, 41, 34,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1548 27, 20, 13, 6, 7, 14, 21, 28,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1549 35, 42, 49, 56, 57, 50, 43, 36,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1550 29, 22, 15, 23, 30, 37, 44, 51,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1551 58, 59, 52, 45, 38, 31, 39, 46,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1552 53, 60, 61, 54, 47, 55, 62, 63,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1553 // let corrupt input sample past end
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1554 63, 63, 63, 63, 63, 63, 63, 63,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1555 63, 63, 63, 63, 63, 63, 63
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1556 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1557
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1558 // decode one 64-entry block--
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1559 static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, Sint16 *fac, int b, Uint8 *dequant)
893
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 int diff,dc,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1562 int t;
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 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
1565 t = stbi__jpeg_huff_decode(j, hdc);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1566 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
1567
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1568 // 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
1569 memset(data,0,64*sizeof(data[0]));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1570
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1571 diff = t ? stbi__extend_receive(j, t) : 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1572 dc = j->img_comp[b].dc_pred + diff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1573 j->img_comp[b].dc_pred = dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1574 data[0] = (short) (dc * dequant[0]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1575
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1576 // decode AC components, see JPEG spec
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1577 k = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1578 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1579 unsigned int zig;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1580 int c,r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1581 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
1582 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
1583 r = fac[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1584 if (r) { // fast-AC path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1585 k += (r >> 4) & 15; // run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1586 s = r & 15; // combined length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1587 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1588 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1589 // decode into unzigzag'd location
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1590 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1591 data[zig] = (short) ((r >> 8) * dequant[zig]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1592 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1593 int rs = stbi__jpeg_huff_decode(j, hac);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1594 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
1595 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1596 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1597 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1598 if (rs != 0xf0) break; // end block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1599 k += 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1600 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1601 k += r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1602 // decode into unzigzag'd location
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1603 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1604 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
1605 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1606 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1607 } while (k < 64);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1608 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1611 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
1612 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1613 int diff,dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1614 int t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1615 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
1616
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1617 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
1618
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1619 if (j->succ_high == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1620 // first scan for DC coefficient, must be first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1621 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
1622 t = stbi__jpeg_huff_decode(j, hdc);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1623 diff = t ? stbi__extend_receive(j, t) : 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1624
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1625 dc = j->img_comp[b].dc_pred + diff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1626 j->img_comp[b].dc_pred = dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1627 data[0] = (short) (dc << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1628 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1629 // refinement scan for DC coefficient
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1630 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1631 data[0] += (short) (1 << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1632 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1633 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1634 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1635
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1636 // @OPTIMIZE: store non-zigzagged during the decode passes,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1637 // and only de-zigzag when dequantizing
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1638 static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, Sint16 *fac)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1639 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1640 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1641 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
1642
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1643 if (j->succ_high == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1644 int shift = j->succ_low;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1645
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1646 if (j->eob_run) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1647 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1648 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1649 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1650
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1651 k = j->spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1652 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1653 unsigned int zig;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1654 int c,r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1655 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
1656 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
1657 r = fac[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1658 if (r) { // fast-AC path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1659 k += (r >> 4) & 15; // run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1660 s = r & 15; // combined length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1661 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1662 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1663 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1664 data[zig] = (short) ((r >> 8) << shift);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1665 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1666 int rs = stbi__jpeg_huff_decode(j, hac);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1667 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
1668 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1669 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1670 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1671 if (r < 15) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1672 j->eob_run = (1 << r);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1673 if (r)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1674 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
1675 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1676 break;
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 k += 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1679 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1680 k += r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1681 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1682 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
1683 }
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 } while (k <= j->spec_end);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1686 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1687 // refinement scan for these AC coefficients
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1688
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1689 short bit = (short) (1 << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1690
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1691 if (j->eob_run) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1692 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1693 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
1694 short *p = &data[stbi__jpeg_dezigzag[k]];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1695 if (*p != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1696 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1697 if ((*p & bit)==0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1698 if (*p > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1699 *p += bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1700 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1701 *p -= bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1702 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1703 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1704 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1705 k = j->spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1706 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1707 int r,s;
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); // @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
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) - 1;
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 r = 64; // force end of block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1718 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1719 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
1720 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1721 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
1722 // sign bit
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1723 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1724 s = bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1725 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1726 s = -bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1727 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1728
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1729 // advance by r
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1730 while (k <= j->spec_end) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1731 short *p = &data[stbi__jpeg_dezigzag[k]];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1732 if (*p != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1733 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1734 if ((*p & bit)==0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1735 if (*p > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1736 *p += bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1737 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1738 *p -= bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1739 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1740 ++k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1741 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1742 if (r == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1743 if (s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1744 data[stbi__jpeg_dezigzag[k++]] = (short) s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1745 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1746 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1747 --r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1748 ++k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1749 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1750 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1751 } while (k <= j->spec_end);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1752 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1753 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1754 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1755 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1756
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1757 // take a -128..127 value and stbi__clamp it and convert to 0..255
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1758 stbi_inline static Uint8 stbi__clamp(int x)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1759 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1760 // 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
1761 if ((unsigned int) x > 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1762 if (x < 0) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1763 if (x > 255) return 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1764 }
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1765 return (Uint8) x;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1766 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1767
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1768 #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
1769 #define stbi__fsh(x) ((x) << 12)
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 // derived from jidctint -- DCT_ISLOW
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1772 #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
1773 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
1774 p2 = s2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1775 p3 = s6; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1776 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1777 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1778 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1779 p2 = s0; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1780 p3 = s4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1781 t0 = stbi__fsh(p2+p3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1782 t1 = stbi__fsh(p2-p3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1783 x0 = t0+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1784 x3 = t0-t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1785 x1 = t1+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1786 x2 = t1-t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1787 t0 = s7; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1788 t1 = s5; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1789 t2 = s3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1790 t3 = s1; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1791 p3 = t0+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1792 p4 = t1+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1793 p1 = t0+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1794 p2 = t1+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1795 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1796 t0 = t0*stbi__f2f( 0.298631336f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1797 t1 = t1*stbi__f2f( 2.053119869f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1798 t2 = t2*stbi__f2f( 3.072711026f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1799 t3 = t3*stbi__f2f( 1.501321110f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1800 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1801 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1802 p3 = p3*stbi__f2f(-1.961570560f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1803 p4 = p4*stbi__f2f(-0.390180644f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1804 t3 += p1+p4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1805 t2 += p2+p3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1806 t1 += p2+p4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1807 t0 += p1+p3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1808
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1809 static void stbi__idct_block(Uint8 *out, int out_stride, short data[64])
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1810 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1811 int i,val[64],*v=val;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1812 Uint8 *o;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1813 short *d = data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1814
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1815 // columns
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1816 for (i=0; i < 8; ++i,++d, ++v) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1817 // 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
1818 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
1819 && 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
1820 // no shortcut 0 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1821 // (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
1822 // all separate -0.047 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1823 // 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
1824 int dcterm = d[0] << 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1825 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
1826 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1827 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
1828 // 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
1829 // down, but keep 2 extra bits of precision
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1830 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1831 v[ 0] = (x0+t3) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1832 v[56] = (x0-t3) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1833 v[ 8] = (x1+t2) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1834 v[48] = (x1-t2) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1835 v[16] = (x2+t1) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1836 v[40] = (x2-t1) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1837 v[24] = (x3+t0) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1838 v[32] = (x3-t0) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1839 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1840 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1841
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1842 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
1843 // 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
1844 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
1845 // 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
1846 // 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
1847 // 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
1848 // 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
1849 // 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
1850 // 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
1851 x0 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1852 x1 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1853 x2 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1854 x3 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1855 // 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
1856 // 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
1857 o[0] = stbi__clamp((x0+t3) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1858 o[7] = stbi__clamp((x0-t3) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1859 o[1] = stbi__clamp((x1+t2) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1860 o[6] = stbi__clamp((x1-t2) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1861 o[2] = stbi__clamp((x2+t1) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1862 o[5] = stbi__clamp((x2-t1) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1863 o[3] = stbi__clamp((x3+t0) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1864 o[4] = stbi__clamp((x3-t0) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1865 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1866 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1867
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1868 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1869 // 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
1870 // 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
1871 // fully "transparent".
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1872 static void stbi__idct_simd(Uint8 *out, int out_stride, short data[64])
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1873 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1874 // 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
1875 __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
1876 __m128i tmp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1877
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1878 // 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
1879 #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
1880
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1881 // 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
1882 // out(1) = c1[even]*x + c1[odd]*y
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1883 #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
1884 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1885 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1886 __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
1887 __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
1888 __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
1889 __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
1890
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1891 // 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
1892 #define dct_widen(out, in) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1893 __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
1894 __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
1895
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1896 // wide add
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1897 #define dct_wadd(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1898 __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
1899 __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
1900
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1901 // wide sub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1902 #define dct_wsub(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1903 __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
1904 __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
1905
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1906 // 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
1907 #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
1908 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1909 __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
1910 __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
1911 dct_wadd(sum, abiased, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1912 dct_wsub(dif, abiased, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1913 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
1914 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
1915 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1916
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1917 // 8-bit interleave step (for transposes)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1918 #define dct_interleave8(a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1919 tmp = a; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1920 a = _mm_unpacklo_epi8(a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1921 b = _mm_unpackhi_epi8(tmp, b)
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 // 16-bit interleave step (for transposes)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1924 #define dct_interleave16(a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1925 tmp = a; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1926 a = _mm_unpacklo_epi16(a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1927 b = _mm_unpackhi_epi16(tmp, b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1928
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1929 #define dct_pass(bias,shift) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1930 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1931 /* even part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1932 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
1933 __m128i sum04 = _mm_add_epi16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1934 __m128i dif04 = _mm_sub_epi16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1935 dct_widen(t0e, sum04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1936 dct_widen(t1e, dif04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1937 dct_wadd(x0, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1938 dct_wsub(x3, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1939 dct_wadd(x1, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1940 dct_wsub(x2, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1941 /* odd part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1942 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
1943 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
1944 __m128i sum17 = _mm_add_epi16(row1, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1945 __m128i sum35 = _mm_add_epi16(row3, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1946 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
1947 dct_wadd(x4, y0o, y4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1948 dct_wadd(x5, y1o, y5o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1949 dct_wadd(x6, y2o, y5o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1950 dct_wadd(x7, y3o, y4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1951 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1952 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1953 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1954 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1955 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1956
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1957 __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
1958 __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
1959 __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
1960 __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
1961 __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
1962 __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
1963 __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
1964 __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
1965
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1966 // 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
1967 __m128i bias_0 = _mm_set1_epi32(512);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1968 __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
1969
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1970 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1971 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
1972 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
1973 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
1974 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
1975 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
1976 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
1977 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
1978 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
1979
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1980 // column pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1981 dct_pass(bias_0, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1982
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1983 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1984 // 16bit 8x8 transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1985 dct_interleave16(row0, row4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1986 dct_interleave16(row1, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1987 dct_interleave16(row2, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1988 dct_interleave16(row3, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1989
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1990 // transpose pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1991 dct_interleave16(row0, row2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1992 dct_interleave16(row1, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1993 dct_interleave16(row4, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1994 dct_interleave16(row5, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1995
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1996 // transpose pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1997 dct_interleave16(row0, row1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1998 dct_interleave16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1999 dct_interleave16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2000 dct_interleave16(row6, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2001 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2002
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2003 // row pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2004 dct_pass(bias_1, 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2005
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2006 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2007 // pack
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2008 __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
2009 __m128i p1 = _mm_packus_epi16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2010 __m128i p2 = _mm_packus_epi16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2011 __m128i p3 = _mm_packus_epi16(row6, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2012
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2013 // 8bit 8x8 transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2014 dct_interleave8(p0, p2); // a0e0a1e1...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2015 dct_interleave8(p1, p3); // c0g0c1g1...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2016
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2017 // transpose pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2018 dct_interleave8(p0, p1); // a0c0e0g0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2019 dct_interleave8(p2, p3); // b0d0f0h0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2020
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2021 // transpose pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2022 dct_interleave8(p0, p2); // a0b0c0d0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2023 dct_interleave8(p1, p3); // a4b4c4d4...
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 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2026 _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
2027 _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
2028 _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
2029 _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
2030 _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
2031 _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
2032 _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
2033 _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
2034 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2035
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2036 #undef dct_const
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2037 #undef dct_rot
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2038 #undef dct_widen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2039 #undef dct_wadd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2040 #undef dct_wsub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2041 #undef dct_bfly32o
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2042 #undef dct_interleave8
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2043 #undef dct_interleave16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2044 #undef dct_pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2045 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2046
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2047 #endif // STBI_SSE2
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 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2050
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2051 // NEON integer IDCT. should produce bit-identical
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2052 // results to the generic C version.
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2053 static void stbi__idct_simd(Uint8 *out, int out_stride, short data[64])
893
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 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
2056
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2057 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
2058 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
2059 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
2060 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
2061 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
2062 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
2063 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
2064 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
2065 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
2066 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
2067 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
2068 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
2069
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2070 #define dct_long_mul(out, inq, coeff) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2071 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
2072 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
2073
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2074 #define dct_long_mac(out, acc, inq, coeff) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2075 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
2076 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
2077
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2078 #define dct_widen(out, inq) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2079 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
2080 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
2081
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2082 // wide add
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2083 #define dct_wadd(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2084 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
2085 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
2086
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2087 // wide sub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2088 #define dct_wsub(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2089 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
2090 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
2091
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2092 // 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
2093 #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
2094 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2095 dct_wadd(sum, a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2096 dct_wsub(dif, a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2097 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
2098 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
2099 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2100
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2101 #define dct_pass(shiftop, shift) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2102 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2103 /* even part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2104 int16x8_t sum26 = vaddq_s16(row2, row6); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2105 dct_long_mul(p1e, sum26, rot0_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2106 dct_long_mac(t2e, p1e, row6, rot0_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2107 dct_long_mac(t3e, p1e, row2, rot0_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2108 int16x8_t sum04 = vaddq_s16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2109 int16x8_t dif04 = vsubq_s16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2110 dct_widen(t0e, sum04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2111 dct_widen(t1e, dif04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2112 dct_wadd(x0, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2113 dct_wsub(x3, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2114 dct_wadd(x1, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2115 dct_wsub(x2, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2116 /* odd part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2117 int16x8_t sum15 = vaddq_s16(row1, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2118 int16x8_t sum17 = vaddq_s16(row1, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2119 int16x8_t sum35 = vaddq_s16(row3, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2120 int16x8_t sum37 = vaddq_s16(row3, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2121 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2122 dct_long_mul(p5o, sumodd, rot1_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2123 dct_long_mac(p1o, p5o, sum17, rot1_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2124 dct_long_mac(p2o, p5o, sum35, rot1_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2125 dct_long_mul(p3o, sum37, rot2_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2126 dct_long_mul(p4o, sum15, rot2_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2127 dct_wadd(sump13o, p1o, p3o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2128 dct_wadd(sump24o, p2o, p4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2129 dct_wadd(sump23o, p2o, p3o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2130 dct_wadd(sump14o, p1o, p4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2131 dct_long_mac(x4, sump13o, row7, rot3_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2132 dct_long_mac(x5, sump24o, row5, rot3_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2133 dct_long_mac(x6, sump23o, row3, rot3_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2134 dct_long_mac(x7, sump14o, row1, rot3_3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2135 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2136 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2137 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2138 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2139 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2140
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2141 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2142 row0 = vld1q_s16(data + 0*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2143 row1 = vld1q_s16(data + 1*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2144 row2 = vld1q_s16(data + 2*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2145 row3 = vld1q_s16(data + 3*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2146 row4 = vld1q_s16(data + 4*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2147 row5 = vld1q_s16(data + 5*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2148 row6 = vld1q_s16(data + 6*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2149 row7 = vld1q_s16(data + 7*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2150
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2151 // add DC bias
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2152 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
2153
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2154 // column pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2155 dct_pass(vrshrn_n_s32, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2156
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2157 // 16bit 8x8 transpose
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2158 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2159 // 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
2160 // 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
2161 #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
2162 #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
2163 #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
2164
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2165 // pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2166 dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2167 dct_trn16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2168 dct_trn16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2169 dct_trn16(row6, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2170
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2171 // pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2172 dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2173 dct_trn32(row1, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2174 dct_trn32(row4, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2175 dct_trn32(row5, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2176
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2177 // pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2178 dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2179 dct_trn64(row1, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2180 dct_trn64(row2, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2181 dct_trn64(row3, row7);
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 #undef dct_trn16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2184 #undef dct_trn32
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2185 #undef dct_trn64
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2186 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2187
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2188 // row pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2189 // 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
2190 // 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
2191 // up with a rounding shift by 1.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2192 dct_pass(vshrn_n_s32, 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2193
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2194 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2195 // pack and round
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2196 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2197 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2198 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2199 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2200 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2201 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2202 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2203 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2204
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2205 // 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
2206 #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
2207 #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
2208 #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
2209
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2210 // 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
2211 // 8 bytes to each scan line!
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 // 8x8 8-bit transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2214 dct_trn8_8(p0, p1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2215 dct_trn8_8(p2, p3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2216 dct_trn8_8(p4, p5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2217 dct_trn8_8(p6, p7);
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 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2220 dct_trn8_16(p0, p2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2221 dct_trn8_16(p1, p3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2222 dct_trn8_16(p4, p6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2223 dct_trn8_16(p5, p7);
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 // pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2226 dct_trn8_32(p0, p4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2227 dct_trn8_32(p1, p5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2228 dct_trn8_32(p2, p6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2229 dct_trn8_32(p3, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2230
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2231 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2232 vst1_u8(out, p0); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2233 vst1_u8(out, p1); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2234 vst1_u8(out, p2); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2235 vst1_u8(out, p3); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2236 vst1_u8(out, p4); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2237 vst1_u8(out, p5); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2238 vst1_u8(out, p6); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2239 vst1_u8(out, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2240
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2241 #undef dct_trn8_8
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2242 #undef dct_trn8_16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2243 #undef dct_trn8_32
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2244 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2245
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2246 #undef dct_long_mul
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2247 #undef dct_long_mac
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2248 #undef dct_widen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2249 #undef dct_wadd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2250 #undef dct_wsub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2251 #undef dct_bfly32o
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2252 #undef dct_pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2253 }
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 #endif // STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2256
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2257 #define STBI__MARKER_none 0xff
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2258 // 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
2259 // 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
2260 // marker, return 0xff, which is never a valid marker value
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2261 static Uint8 stbi__get_marker(stbi__jpeg *j)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2262 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2263 Uint8 x;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2264 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
2265 x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2266 if (x != 0xff) return STBI__MARKER_none;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2267 while (x == 0xff)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2268 x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2269 return x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2270 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2271
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2272 // 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
2273 // of the components is specified by order[]
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2274 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2275
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2276 // 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
2277 // the dc prediction
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2278 static void stbi__jpeg_reset(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2279 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2280 j->code_bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2281 j->code_buffer = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2282 j->nomore = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2283 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
2284 j->marker = STBI__MARKER_none;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2285 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
2286 j->eob_run = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2287 // 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
2288 // 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
2289 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2290
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2291 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
2292 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2293 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2294 if (!z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2295 if (z->scan_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2296 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2297 STBI_SIMD_ALIGN(short, data[64]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2298 int n = z->order[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2299 // 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
2300 // in trivial scanline order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2301 // 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
2302 // 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
2303 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
2304 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
2305 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2306 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2307 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2308 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
2309 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
2310 // 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
2311 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2312 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
2313 // 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
2314 // rather than no data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2315 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2316 stbi__jpeg_reset(z);
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2319 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2320 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2321 } else { // interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2322 int i,j,k,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2323 STBI_SIMD_ALIGN(short, data[64]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2324 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
2325 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
2326 // 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
2327 for (k=0; k < z->scan_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2328 int n = z->order[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2329 // 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
2330 // 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
2331 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
2332 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
2333 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
2334 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
2335 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2336 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
2337 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
2338 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2339 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2340 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2341 // 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
2342 // so now count down the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2343 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2344 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
2345 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2346 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2347 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2348 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2349 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2350 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2351 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2352 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2353 if (z->scan_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2354 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2355 int n = z->order[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2356 // 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
2357 // in trivial scanline order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2358 // 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
2359 // 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
2360 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
2361 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
2362 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2363 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2364 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
2365 if (z->spec_start == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2366 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
2367 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2368 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2369 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2370 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
2371 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2372 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2373 // 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
2374 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2375 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
2376 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2377 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2378 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2379 }
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 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2382 } else { // interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2383 int i,j,k,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2384 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
2385 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
2386 // 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
2387 for (k=0; k < z->scan_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2388 int n = z->order[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2389 // 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
2390 // 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
2391 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
2392 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
2393 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
2394 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
2395 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
2396 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
2397 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2398 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2399 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2400 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2401 // 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
2402 // so now count down the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2403 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2404 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
2405 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2406 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2407 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2408 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2409 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2410 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2411 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2412 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2413 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2414
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2415 static void stbi__jpeg_dequantize(short *data, Uint8 *dequant)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2416 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2417 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2418 for (i=0; i < 64; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2419 data[i] *= dequant[i];
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 static void stbi__jpeg_finish(stbi__jpeg *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2423 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2424 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2425 // dequantize and idct the data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2426 int i,j,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2427 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
2428 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
2429 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
2430 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2431 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2432 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
2433 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
2434 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
2435 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2436 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2437 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2438 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2439 }
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 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
2442 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2443 int L;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2444 switch (m) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2445 case STBI__MARKER_none: // no marker found
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2446 return stbi__err("expected marker","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2447
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2448 case 0xDD: // DRI - specify restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2449 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
2450 z->restart_interval = stbi__get16be(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2451 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2452
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2453 case 0xDB: // DQT - define quantization table
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2454 L = stbi__get16be(z->s)-2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2455 while (L > 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2456 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2457 int p = q >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2458 int t = q & 15,i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2459 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
2460 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
2461 for (i=0; i < 64; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2462 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
2463 L -= 65;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2464 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2465 return L==0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2466
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2467 case 0xC4: // DHT - define huffman table
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2468 L = stbi__get16be(z->s)-2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2469 while (L > 0) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2470 Uint8 *v;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2471 int sizes[16],i,n=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2472 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2473 int tc = q >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2474 int th = q & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2475 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
2476 for (i=0; i < 16; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2477 sizes[i] = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2478 n += sizes[i];
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 L -= 17;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2481 if (tc == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2482 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
2483 v = z->huff_dc[th].values;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2484 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2485 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
2486 v = z->huff_ac[th].values;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2487 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2488 for (i=0; i < n; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2489 v[i] = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2490 if (tc != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2491 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
2492 L -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2493 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2494 return L==0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2495 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2496 // check for comment block or APP blocks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2497 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2498 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
2499 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2500 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2501 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2502 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2503
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2504 // after we see SOS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2505 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
2506 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2507 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2508 int Ls = stbi__get16be(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2509 z->scan_n = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2510 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
2511 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
2512 for (i=0; i < z->scan_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2513 int id = stbi__get8(z->s), which;
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 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
2516 if (z->img_comp[which].id == id)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2517 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2518 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
2519 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
2520 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
2521 z->order[i] = which;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2522 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2523
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2524 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2525 int aa;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2526 z->spec_start = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2527 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
2528 aa = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2529 z->succ_high = (aa >> 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2530 z->succ_low = (aa & 15);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2531 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2532 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
2533 return stbi__err("bad SOS", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2534 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2535 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
2536 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
2537 z->spec_end = 63;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2538 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2539 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2540
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2544 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
2545 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2546 stbi__context *s = z->s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2547 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
2548 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
2549 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
2550 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
2551 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
2552 c = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2553 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
2554 s->img_n = c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2555 for (i=0; i < c; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2556 z->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2557 z->img_comp[i].linebuf = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2558 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2559
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2560 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
2561
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2562 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2563 z->img_comp[i].id = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2564 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
2565 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
2566 return stbi__err("bad component ID","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2567 q = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2568 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
2569 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
2570 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
2571 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2572
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2573 if (scan != STBI__SCAN_load) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2574
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2575 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
2576
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2577 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2578 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
2579 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
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 // compute interleaved mcu info
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2583 z->img_h_max = h_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2584 z->img_v_max = v_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2585 z->img_mcu_w = h_max * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2586 z->img_mcu_h = v_max * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2587 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
2588 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
2589
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2590 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2591 // 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
2592 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
2593 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
2594 // 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
2595 // 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
2596 // 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
2597 // discard the extra data until colorspace conversion
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2598 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
2599 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
2600 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
2601
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2602 if (z->img_comp[i].raw_data == NULL) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2603 for(--i; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2604 STBI_FREE(z->img_comp[i].raw_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2605 z->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2606 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2607 return stbi__err("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2608 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2609 // align blocks for idct using mmx/sse
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2610 z->img_comp[i].data = (Uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2611 z->img_comp[i].linebuf = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2612 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2613 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
2614 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
2615 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
2616 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
2617 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2618 z->img_comp[i].coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2619 z->img_comp[i].raw_coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2620 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2621 }
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 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2624 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2625
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2626 // 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
2627 #define stbi__DNL(x) ((x) == 0xdc)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2628 #define stbi__SOI(x) ((x) == 0xd8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2629 #define stbi__EOI(x) ((x) == 0xd9)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2630 #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
2631 #define stbi__SOS(x) ((x) == 0xda)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2632
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2633 #define stbi__SOF_progressive(x) ((x) == 0xc2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2634
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2635 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
2636 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2637 int m;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2638 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
2639 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2640 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
2641 if (scan == STBI__SCAN_type) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2642 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2643 while (!stbi__SOF(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2644 if (!stbi__process_marker(z,m)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2645 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2646 while (m == STBI__MARKER_none) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2647 // 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
2648 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
2649 m = stbi__get_marker(z);
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2652 z->progressive = stbi__SOF_progressive(m);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2653 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
2654 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2655 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2656
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2657 // decode image to YCbCr format
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2658 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
2659 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2660 int m;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2661 j->restart_interval = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2662 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
2663 m = stbi__get_marker(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2664 while (!stbi__EOI(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2665 if (stbi__SOS(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2666 if (!stbi__process_scan_header(j)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2667 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
2668 if (j->marker == STBI__MARKER_none ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2669 // 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
2670 while (!stbi__at_eof(j->s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2671 int x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2672 if (x == 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2673 j->marker = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2674 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2675 } else if (x != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2676 return stbi__err("junk before marker", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2677 }
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 // 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
2680 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2681 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2682 if (!stbi__process_marker(j, m)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2683 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2684 m = stbi__get_marker(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2685 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2686 if (j->progressive)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2687 stbi__jpeg_finish(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2688 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2689 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2690
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2691 // static jfif-centered resampling (across block boundaries)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2692
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2693 typedef Uint8 *(*resample_row_func)(Uint8 *out, Uint8 *in0, Uint8 *in1,
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2694 int w, int hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2695
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2696 #define stbi__div4(x) ((Uint8) ((x) >> 2))
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2697
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2698 static Uint8 *resample_row_1(Uint8 *out, Uint8 *in_near, Uint8 *in_far, int w, int hs)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2699 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2700 STBI_NOTUSED(out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2701 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2702 STBI_NOTUSED(w);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2703 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2704 return in_near;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2705 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2706
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2707 static Uint8* stbi__resample_row_v_2(Uint8 *out, Uint8 *in_near, Uint8 *in_far, int w, int hs)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2708 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2709 // 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
2710 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2711 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2712 for (i=0; i < w; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2713 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
2714 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2715 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2716
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2717 static Uint8* stbi__resample_row_h_2(Uint8 *out, Uint8 *in_near, Uint8 *in_far, int w, int hs)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2718 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2719 // 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
2720 int i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2721 Uint8 *input = in_near;
893
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 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2724 // 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
2725 out[0] = out[1] = input[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2726 return out;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2729 out[0] = input[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2730 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
2731 for (i=1; i < w-1; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2732 int n = 3*input[i]+2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2733 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
2734 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
2735 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2736 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
2737 out[i*2+1] = input[w-1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2738
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2739 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2740 STBI_NOTUSED(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 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2743 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2744
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2745 #define stbi__div16(x) ((Uint8) ((x) >> 4))
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2746
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2747 static Uint8 *stbi__resample_row_hv_2(Uint8 *out, Uint8 *in_near, Uint8 *in_far, int w, int hs)
893
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 // 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
2750 int i,t0,t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2751 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2752 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
2753 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2754 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2755
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2756 t1 = 3*in_near[0] + in_far[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2757 out[0] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2758 for (i=1; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2759 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2760 t1 = 3*in_near[i]+in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2761 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
2762 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
2763 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2764 out[w*2-1] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2765
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2766 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2767
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 #if defined(STBI_SSE2) || defined(STBI_NEON)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2772 static Uint8 *stbi__resample_row_hv_2_simd(Uint8 *out, Uint8 *in_near, Uint8 *in_far, int w, int hs)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2773 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2774 // 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
2775 int i=0,t0,t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2776
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2777 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2778 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
2779 return out;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2782 t1 = 3*in_near[0] + in_far[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2783 // 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
2784 // 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
2785 // 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
2786 for (; i < ((w-1) & ~7); i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2787 #if defined(STBI_SSE2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2788 // load and perform the vertical filtering pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2789 // 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
2790 __m128i zero = _mm_setzero_si128();
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2791 __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
2792 __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
2793 __m128i farw = _mm_unpacklo_epi8(farb, zero);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2794 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2795 __m128i diff = _mm_sub_epi16(farw, nearw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2796 __m128i nears = _mm_slli_epi16(nearw, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2797 __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
2798
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2799 // 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
2800 // 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
2801 // insert the previous pixel value (from t1).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2802 // "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
2803 // of next block of 8 pixels added in.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2804 __m128i prv0 = _mm_slli_si128(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2805 __m128i nxt0 = _mm_srli_si128(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2806 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2807 __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
2808
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2809 // horizontal filter, polyphase implementation since it's convenient:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2810 // 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
2811 // 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
2812 // note the shared term.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2813 __m128i bias = _mm_set1_epi16(8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2814 __m128i curs = _mm_slli_epi16(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2815 __m128i prvd = _mm_sub_epi16(prev, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2816 __m128i nxtd = _mm_sub_epi16(next, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2817 __m128i curb = _mm_add_epi16(curs, bias);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2818 __m128i even = _mm_add_epi16(prvd, curb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2819 __m128i odd = _mm_add_epi16(nxtd, curb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2820
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2821 // interleave even and odd pixels, then undo scaling.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2822 __m128i int0 = _mm_unpacklo_epi16(even, odd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2823 __m128i int1 = _mm_unpackhi_epi16(even, odd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2824 __m128i de0 = _mm_srli_epi16(int0, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2825 __m128i de1 = _mm_srli_epi16(int1, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2826
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2827 // pack and write output
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2828 __m128i outv = _mm_packus_epi16(de0, de1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2829 _mm_storeu_si128((__m128i *) (out + i*2), outv);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2830 #elif defined(STBI_NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2831 // load and perform the vertical filtering pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2832 // 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
2833 uint8x8_t farb = vld1_u8(in_far + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2834 uint8x8_t nearb = vld1_u8(in_near + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2835 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
2836 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
2837 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
2838
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2839 // 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
2840 // 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
2841 // insert the previous pixel value (from t1).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2842 // "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
2843 // of next block of 8 pixels added in.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2844 int16x8_t prv0 = vextq_s16(curr, curr, 7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2845 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2846 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
2847 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
2848
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2849 // horizontal filter, polyphase implementation since it's convenient:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2850 // 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
2851 // 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
2852 // note the shared term.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2853 int16x8_t curs = vshlq_n_s16(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2854 int16x8_t prvd = vsubq_s16(prev, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2855 int16x8_t nxtd = vsubq_s16(next, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2856 int16x8_t even = vaddq_s16(curs, prvd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2857 int16x8_t odd = vaddq_s16(curs, nxtd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2858
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2859 // 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
2860 uint8x8x2_t o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2861 o.val[0] = vqrshrun_n_s16(even, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2862 o.val[1] = vqrshrun_n_s16(odd, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2863 vst2_u8(out + i*2, o);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2864 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2865
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2866 // "previous" value for next iter
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2867 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
2868 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2869
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2870 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2871 t1 = 3*in_near[i] + in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2872 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
2873
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2874 for (++i; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2875 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2876 t1 = 3*in_near[i]+in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2877 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
2878 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
2879 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2880 out[w*2-1] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2881
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2882 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2883
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2884 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2885 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2886 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2887
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2888 static Uint8 *stbi__resample_row_generic(Uint8 *out, Uint8 *in_near, Uint8 *in_far, int w, int hs)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2889 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2890 // resample with nearest-neighbor
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2891 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2892 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2893 for (i=0; i < w; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2894 for (j=0; j < hs; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2895 out[i*hs+j] = in_near[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2896 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2897 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2898
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2899 #ifdef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2900 // 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
2901 // historically before the algorithm changes in 1.49
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2902 #define float2fixed(x) ((int) ((x) * 65536 + 0.5))
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2903 static void stbi__YCbCr_to_RGB_row(Uint8 *out, const Uint8 *y, const Uint8 *pcb, const Uint8 *pcr, int count, int step)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2904 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2905 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2906 for (i=0; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2907 int y_fixed = (y[i] << 16) + 32768; // rounding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2908 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2909 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2910 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2911 r = y_fixed + cr*float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2912 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
2913 b = y_fixed + cb*float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2914 r >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2915 g >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2916 b >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2917 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
2918 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
2919 if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2920 out[0] = (Uint8)r;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2921 out[1] = (Uint8)g;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2922 out[2] = (Uint8)b;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2923 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2924 out += step;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2927 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2928 // 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
2929 // 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
2930 #define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2931 static void stbi__YCbCr_to_RGB_row(Uint8 *out, const Uint8 *y, const Uint8 *pcb, const Uint8 *pcr, int count, int step)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2932 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2933 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2934 for (i=0; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2935 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
2936 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2937 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2938 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2939 r = y_fixed + cr* float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2940 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
2941 b = y_fixed + cb* float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2942 r >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2943 g >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2944 b >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2945 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
2946 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
2947 if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2948 out[0] = (Uint8)r;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2949 out[1] = (Uint8)g;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2950 out[2] = (Uint8)b;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2951 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2952 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2953 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2954 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2955 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2956
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2957 #if defined(STBI_SSE2) || defined(STBI_NEON)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2958 static void stbi__YCbCr_to_RGB_simd(Uint8 *out, Uint8 const *y, Uint8 const *pcb, Uint8 const *pcr, int count, int step)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2959 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2960 int i = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2961
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2962 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2963 // 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
2964 // 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
2965 // so just accelerate step == 4 case.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2966 if (step == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2967 // 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
2968 __m128i signflip = _mm_set1_epi8(-0x80);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2969 __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
2970 __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
2971 __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
2972 __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
2973 __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
2974 __m128i xw = _mm_set1_epi16(255); // alpha channel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2975
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2976 for (; i+7 < count; i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2977 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2978 __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
2979 __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
2980 __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
2981 __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
2982 __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
2983
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2984 // 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
2985 __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
2986 __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
2987 __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
2988
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2989 // color transform
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2990 __m128i yws = _mm_srli_epi16(yw, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2991 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2992 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2993 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2994 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2995 __m128i rws = _mm_add_epi16(cr0, yws);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2996 __m128i gwt = _mm_add_epi16(cb0, yws);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2997 __m128i bws = _mm_add_epi16(yws, cb1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2998 __m128i gws = _mm_add_epi16(gwt, cr1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2999
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3000 // descale
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3001 __m128i rw = _mm_srai_epi16(rws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3002 __m128i bw = _mm_srai_epi16(bws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3003 __m128i gw = _mm_srai_epi16(gws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3004
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3005 // back to byte, set up for transpose
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3006 __m128i brb = _mm_packus_epi16(rw, bw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3007 __m128i gxb = _mm_packus_epi16(gw, xw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3008
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3009 // transpose to interleave channels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3010 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3011 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3012 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3013 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3014
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3015 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3016 _mm_storeu_si128((__m128i *) (out + 0), o0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3017 _mm_storeu_si128((__m128i *) (out + 16), o1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3018 out += 32;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3019 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3020 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3021 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3022
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3023 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3024 // 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
3025 if (step == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3026 // 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
3027 uint8x8_t signflip = vdup_n_u8(0x80);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3028 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
3029 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
3030 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
3031 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
3032
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3033 for (; i+7 < count; i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3034 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3035 uint8x8_t y_bytes = vld1_u8(y + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3036 uint8x8_t cr_bytes = vld1_u8(pcr + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3037 uint8x8_t cb_bytes = vld1_u8(pcb + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3038 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
3039 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
3040
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3041 // expand to s16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3042 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
3043 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
3044 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
3045
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3046 // color transform
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3047 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3048 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3049 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3050 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3051 int16x8_t rws = vaddq_s16(yws, cr0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3052 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
3053 int16x8_t bws = vaddq_s16(yws, cb1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3054
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3055 // undo scaling, round, convert to byte
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3056 uint8x8x4_t o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3057 o.val[0] = vqrshrun_n_s16(rws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3058 o.val[1] = vqrshrun_n_s16(gws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3059 o.val[2] = vqrshrun_n_s16(bws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3060 o.val[3] = vdup_n_u8(255);
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 // store, interleaving r/g/b/a
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3063 vst4_u8(out, o);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3064 out += 8*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3065 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3066 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3067 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3068
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3069 for (; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3070 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
3071 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3072 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3073 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3074 r = y_fixed + cr* float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3075 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
3076 b = y_fixed + cb* float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3077 r >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3078 g >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3079 b >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3080 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
3081 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
3082 if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3083 out[0] = (Uint8)r;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3084 out[1] = (Uint8)g;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3085 out[2] = (Uint8)b;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3086 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3087 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3088 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3089 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3090 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3091
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3092 // set up the kernels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3093 static void stbi__setup_jpeg(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3094 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3095 j->idct_block_kernel = stbi__idct_block;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3096 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
3097 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
3098
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3099 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3100 if (stbi__sse2_available()) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3101 j->idct_block_kernel = stbi__idct_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3102 #ifndef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3103 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
3104 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3105 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
3106 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3107 #endif
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 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3110 j->idct_block_kernel = stbi__idct_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3111 #ifndef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3112 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
3113 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3114 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
3115 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3116 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3117
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3118 // clean up the temporary component buffers
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3119 static void stbi__cleanup_jpeg(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3120 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3121 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3122 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
3123 if (j->img_comp[i].raw_data) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3124 STBI_FREE(j->img_comp[i].raw_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3125 j->img_comp[i].raw_data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3126 j->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3127 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3128 if (j->img_comp[i].raw_coeff) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3129 STBI_FREE(j->img_comp[i].raw_coeff);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3130 j->img_comp[i].raw_coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3131 j->img_comp[i].coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3132 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3133 if (j->img_comp[i].linebuf) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3134 STBI_FREE(j->img_comp[i].linebuf);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3135 j->img_comp[i].linebuf = NULL;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3138 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3139
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3140 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3141 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3142 resample_row_func resample;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3143 Uint8 *line0,*line1;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3144 int hs,vs; // expansion factor in each axis
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3145 int w_lores; // horizontal pixels pre-expansion
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3146 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
3147 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
3148 } stbi__resample;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3149
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3150 static Uint8 *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3151 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3152 int n, decode_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3153 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
3154
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3155 // validate req_comp
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3156 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
3157
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3158 // 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
3159 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
3160
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3161 // determine actual number of components to generate
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3162 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
3163
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3164 if (z->s->img_n == 3 && n < 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3165 decode_n = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3166 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3167 decode_n = z->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3168
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3169 // resample and color-convert
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3170 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3171 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3172 unsigned int i,j;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3173 Uint8 *output;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3174 Uint8 *coutput[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3175
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3176 stbi__resample res_comp[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3177
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3178 for (k=0; k < decode_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3179 stbi__resample *r = &res_comp[k];
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 // 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
3182 // with upsample factor of 4
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3183 z->img_comp[k].linebuf = (Uint8 *) stbi__malloc(z->s->img_x + 3);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3184 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
3185
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3186 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
3187 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
3188 r->ystep = r->vs >> 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3189 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
3190 r->ypos = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3191 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
3192
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3193 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
3194 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
3195 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
3196 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
3197 else r->resample = stbi__resample_row_generic;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3198 }
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 // can't error after this so, this is safe
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3201 output = (Uint8 *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3202 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
3203
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3204 // now go ahead and resample
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3205 for (j=0; j < z->s->img_y; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3206 Uint8 *out = output + n * z->s->img_x * j;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3207 for (k=0; k < decode_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3208 stbi__resample *r = &res_comp[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3209 int y_bot = r->ystep >= (r->vs >> 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3210 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
3211 y_bot ? r->line1 : r->line0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3212 y_bot ? r->line0 : r->line1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3213 r->w_lores, r->hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3214 if (++r->ystep >= r->vs) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3215 r->ystep = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3216 r->line0 = r->line1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3217 if (++r->ypos < z->img_comp[k].y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3218 r->line1 += z->img_comp[k].w2;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3221 if (n >= 3) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3222 Uint8 *y = coutput[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3223 if (z->s->img_n == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3224 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
3225 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3226 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
3227 out[0] = out[1] = out[2] = y[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3228 out[3] = 255; // not used if n==3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3229 out += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3230 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3231 } else {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3232 Uint8 *y = coutput[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3233 if (n == 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3234 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
3235 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3236 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
3237 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3238 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3239 stbi__cleanup_jpeg(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3240 *out_x = z->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3241 *out_y = z->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3242 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
3243 return output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3244 }
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3247 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
3248 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3249 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3250 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3251 stbi__setup_jpeg(&j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3252 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
3253 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3254
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3255 static int stbi__jpeg_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3256 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3257 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3258 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3259 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3260 stbi__setup_jpeg(&j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3261 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
3262 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3263 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3264 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3265
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3266 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
3267 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3268 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
3269 stbi__rewind( j->s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3270 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3271 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3272 if (x) *x = j->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3273 if (y) *y = j->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3274 if (comp) *comp = j->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3275 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3276 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3277
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3278 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
3279 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3280 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3281 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3282 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
3283 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3284 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3285
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3286
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3287 // 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
3288 // simple implementation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3289 // - only 8-bit samples
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3290 // - no CRC checking
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3291 // - allocates lots of intermediate memory
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3292 // - avoids problem of streaming data between subsystems
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3293 // - avoids explicit window management
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3294 // performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3295 // - 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
3296
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3297 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3298 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3299 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3300 Uint32 length;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3301 Uint32 type;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3302 } stbi__pngchunk;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3303
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3304 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
3305 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3306 stbi__pngchunk c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3307 c.length = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3308 c.type = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3309 return c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3310 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3311
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3312 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
3313 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3314 static Uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 };
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3315 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3316 for (i=0; i < 8; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3317 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
3318 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3321 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3322 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3323 stbi__context *s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3324 Uint8 *idata, *expanded, *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3325 } stbi__png;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3326
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 enum {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3329 STBI__F_none=0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3330 STBI__F_sub=1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3331 STBI__F_up=2,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3332 STBI__F_avg=3,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3333 STBI__F_paeth=4,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3334 // 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
3335 STBI__F_avg_first,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3336 STBI__F_paeth_first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3337 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3338
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3339 static Uint8 first_row_filter[5] =
893
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 STBI__F_none,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3342 STBI__F_sub,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3343 STBI__F_none,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3344 STBI__F_avg_first,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3345 STBI__F_paeth_first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3346 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3347
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3348 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
3349 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3350 int p = a + b - c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3351 int pa = abs(p-a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3352 int pb = abs(p-b);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3353 int pc = abs(p-c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3354 if (pa <= pb && pa <= pc) return a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3355 if (pb <= pc) return b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3356 return c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3357 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3358
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3359 static Uint8 stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
893
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 // create the png data from post-deflated data
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3362 static int stbi__create_png_image_raw(stbi__png *a, Uint8 *raw, Uint32 raw_len, int out_n, Uint32 x, Uint32 y, int depth, int color)
893
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__context *s = a->s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3365 Uint32 i,j,stride = x*out_n;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3366 Uint32 img_len, img_width_bytes;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3367 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3368 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
3369
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3370 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3371 a->out = (Uint8 *) stbi__malloc(x * y * out_n); // extra bytes to write off the end into
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3372 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
3373
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3374 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
3375 img_len = (img_width_bytes + 1) * y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3376 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
3377 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
3378 } else { // interlaced:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3379 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
3380 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3381
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3382 for (j=0; j < y; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3383 Uint8 *cur = a->out + stride*j;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3384 Uint8 *prior = cur - stride;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3385 int filter = *raw++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3386 int filter_bytes = img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3387 int width = x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3388 if (filter > 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3389 return stbi__err("invalid filter","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3390
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3391 if (depth < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3392 STBI_ASSERT(img_width_bytes <= x);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3393 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
3394 filter_bytes = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3395 width = img_width_bytes;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3396 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3397
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3398 // 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
3399 if (j == 0) filter = first_row_filter[filter];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3400
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3401 // handle first byte explicitly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3402 for (k=0; k < filter_bytes; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3403 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3404 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
3405 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
3406 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
3407 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
3408 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
3409 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
3410 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
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3414 if (depth == 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3415 if (img_n != out_n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3416 cur[img_n] = 255; // first pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3417 raw += img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3418 cur += out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3419 prior += out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3420 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3421 raw += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3422 cur += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3423 prior += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3424 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3425
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3426 // 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
3427 if (depth < 8 || img_n == out_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3428 int nk = (width - 1)*img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3429 #define CASE(f) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3430 case f: \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3431 for (k=0; k < nk; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3432 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3433 // "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
3434 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
3435 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
3436 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
3437 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
3438 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
3439 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
3440 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
3441 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3442 #undef CASE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3443 raw += nk;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3444 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3445 STBI_ASSERT(img_n+1 == out_n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3446 #define CASE(f) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3447 case f: \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3448 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
3449 for (k=0; k < img_n; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3450 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3451 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
3452 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
3453 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
3454 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
3455 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
3456 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
3457 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
3458 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3459 #undef CASE
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 }
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 // 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
3464 // 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
3465 // 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
3466 if (depth < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3467 for (j=0; j < y; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3468 Uint8 *cur = a->out + stride*j;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3469 Uint8 *in = a->out + stride*j + x*out_n - img_width_bytes;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3470 // 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
3471 // 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
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3472 Uint8 scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3473
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3474 // 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
3475 // 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
3476 // 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
3477 // 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
3478 // 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
3479
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3480 if (depth == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3481 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
3482 *cur++ = scale * ((*in >> 4) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3483 *cur++ = scale * ((*in ) & 0x0f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3484 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3485 if (k > 0) *cur++ = scale * ((*in >> 4) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3486 } else if (depth == 2) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3487 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
3488 *cur++ = scale * ((*in >> 6) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3489 *cur++ = scale * ((*in >> 4) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3490 *cur++ = scale * ((*in >> 2) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3491 *cur++ = scale * ((*in ) & 0x03);
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 if (k > 0) *cur++ = scale * ((*in >> 6) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3494 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3495 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3496 } else if (depth == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3497 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
3498 *cur++ = scale * ((*in >> 7) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3499 *cur++ = scale * ((*in >> 6) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3500 *cur++ = scale * ((*in >> 5) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3501 *cur++ = scale * ((*in >> 4) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3502 *cur++ = scale * ((*in >> 3) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3503 *cur++ = scale * ((*in >> 2) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3504 *cur++ = scale * ((*in >> 1) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3505 *cur++ = scale * ((*in ) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3506 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3507 if (k > 0) *cur++ = scale * ((*in >> 7) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3508 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3509 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3510 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3511 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3512 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3513 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3514 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3515 if (img_n != out_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3516 // insert alpha = 255
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3517 Uint8 *cur = a->out + stride*j;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3518 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3519 if (img_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3520 for (i=x-1; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3521 cur[i*2+1] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3522 cur[i*2+0] = cur[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3523 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3524 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3525 STBI_ASSERT(img_n == 3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3526 for (i=x-1; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3527 cur[i*4+3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3528 cur[i*4+2] = cur[i*3+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3529 cur[i*4+1] = cur[i*3+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3530 cur[i*4+0] = cur[i*3+0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3531 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3532 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3533 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3534 }
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3537 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3538 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3539
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3540 static int stbi__create_png_image(stbi__png *a, Uint8 *image_data, Uint32 image_data_len, int out_n, int depth, int color, int interlaced)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3541 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3542 Uint8 *final;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3543 int p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3544 if (!interlaced)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3545 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
3546
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3547 // de-interlacing
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3548 final = (Uint8 *) stbi__malloc(a->s->img_x * a->s->img_y * out_n);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3549 for (p=0; p < 7; ++p) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3550 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
3551 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
3552 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
3553 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
3554 int i,j,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3555 // 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
3556 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
3557 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
3558 if (x && y) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3559 Uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3560 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
3561 STBI_FREE(final);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3562 return 0;
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 for (j=0; j < y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3565 for (i=0; i < x; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3566 int out_y = j*yspc[p]+yorig[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3567 int out_x = i*xspc[p]+xorig[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3568 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
3569 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
3570 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3571 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3572 STBI_FREE(a->out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3573 image_data += img_len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3574 image_data_len -= img_len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3575 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3576 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3577 a->out = final;
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 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3580 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3581
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3582 static int stbi__compute_transparency(stbi__png *z, Uint8 tc[3], int out_n)
893
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 stbi__context *s = z->s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3585 Uint32 i, pixel_count = s->img_x * s->img_y;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3586 Uint8 *p = z->out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3587
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3588 // compute color-based transparency, assuming we've
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3589 // 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
3590 STBI_ASSERT(out_n == 2 || out_n == 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3591
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3592 if (out_n == 2) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3593 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3594 p[1] = (p[0] == tc[0] ? 0 : 255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3595 p += 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3596 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3597 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3598 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3599 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
3600 p[3] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3601 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3602 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3603 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3604 return 1;
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
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3607 static int stbi__expand_png_palette(stbi__png *a, Uint8 *palette, int len, int pal_img_n)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3608 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3609 Uint32 i, pixel_count = a->s->img_x * a->s->img_y;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3610 Uint8 *p, *temp_out, *orig = a->out;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3611
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3612 p = (Uint8 *) stbi__malloc(pixel_count * pal_img_n);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3613 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
3614
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3615 // 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
3616 temp_out = p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3617
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3618 if (pal_img_n == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3619 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3620 int n = orig[i]*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3621 p[0] = palette[n ];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3622 p[1] = palette[n+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3623 p[2] = palette[n+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3624 p += 3;
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 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3627 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3628 int n = orig[i]*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3629 p[0] = palette[n ];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3630 p[1] = palette[n+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3631 p[2] = palette[n+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3632 p[3] = palette[n+3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3633 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3634 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3635 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3636 STBI_FREE(a->out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3637 a->out = temp_out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3638
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3639 STBI_NOTUSED(len);
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 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3642 }
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 static int stbi__unpremultiply_on_load = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3645 static int stbi__de_iphone_flag = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3646
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3647 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
3648 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3649 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
3650 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3651
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3652 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
3653 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3654 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
3655 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3656
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3657 static void stbi__de_iphone(stbi__png *z)
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 stbi__context *s = z->s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3660 Uint32 i, pixel_count = s->img_x * s->img_y;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3661 Uint8 *p = z->out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3662
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3663 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
3664 for (i=0; i < pixel_count; ++i) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3665 Uint8 t = p[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3666 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3667 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3668 p += 3;
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 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3671 STBI_ASSERT(s->img_out_n == 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3672 if (stbi__unpremultiply_on_load) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3673 // convert bgr to rgb and unpremultiply
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3674 for (i=0; i < pixel_count; ++i) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3675 Uint8 a = p[3];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3676 Uint8 t = p[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3677 if (a) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3678 p[0] = p[2] * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3679 p[1] = p[1] * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3680 p[2] = t * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3681 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3682 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3683 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3684 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3685 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3686 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3687 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3688 // convert bgr to rgb
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3689 for (i=0; i < pixel_count; ++i) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3690 Uint8 t = p[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3691 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3692 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3693 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3694 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3698
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3699
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3700 int stbi_zlib_decode_malloc_guesssize_headerflag(
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3701 Uint8 *inBuf, size_t inLen,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3702 Uint8 **outBuf, size_t *outLen,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3703 size_t initialSize,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3704 BOOL parseHeader)
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3705 {
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3706 DMZLibContext ctx;
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3707 int ret;
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3708
1123
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3709
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3710 if ((ret = dmZLibInitInflate(&ctx)) != DMERR_OK)
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3711 goto err;
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3712
1074
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3713 if ((ctx.outBuffer = ctx.outBufferStart = dmMalloc(initialSize)) == NULL)
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3714 {
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3715 ret = dmError(DMERR_MALLOC,
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3716 "Failed to allocate initial decompression buffer.\n");
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3717 goto err;
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3718 }
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3719
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3720 // Initialize decompression structures
1076
21b0aedb7b5c Also initialize DMZLibContext.inBufferStart where needed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1074
diff changeset
3721 ctx.inBuffer = ctx.inBufferStart = inBuf;
21b0aedb7b5c Also initialize DMZLibContext.inBufferStart where needed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1074
diff changeset
3722 ctx.inBufferEnd = inBuf + inLen;
1074
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3723 ctx.outBufferEnd = ctx.outBufferStart + initialSize;
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3724 ctx.expandable = TRUE;
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3725
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3726 if (parseHeader && (ret = dmZLibParseHeader(&ctx, TRUE)) != DMERR_OK)
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3727 goto err;
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3728
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3729 if ((ret = dmZLibInflate(&ctx)) != DMERR_OK)
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3730 goto err;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 1083
diff changeset
3731
1074
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3732 *outBuf = ctx.outBufferStart;
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3733 *outLen = ctx.outBuffer - ctx.outBufferStart;
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3734
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3735 dmZLibCloseInflate(&ctx);
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3736 return DMERR_OK;
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3737
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3738 err:
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3739 dmZLibCloseInflate(&ctx);
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3740 dmFree(*outBuf);
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3741 *outBuf = NULL;
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3742 return ret;
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3743 }
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3744
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3745
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3746
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3747 #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
3748
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3749 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
3750 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3751 Uint8 palette[1024], pal_img_n=0;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3752 Uint8 has_trans=0, tc[3];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3753 Uint32 ioff=0, idata_limit=0, i, pal_len=0;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3754 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
3755 stbi__context *s = z->s;
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 z->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3758 z->idata = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3759 z->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3760
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3761 if (!stbi__check_png_header(s)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3762
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3763 if (scan == STBI__SCAN_type) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3764
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3765 for (;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3766 stbi__pngchunk c = stbi__get_chunk_header(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3767 switch (c.type) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3768 case STBI__PNG_TYPE('C','g','B','I'):
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3769 is_iphone = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3770 stbi__skip(s, c.length);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3771 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3772 case STBI__PNG_TYPE('I','H','D','R'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3773 int comp,filter;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3774 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
3775 first = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3776 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
3777 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
3778 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
3779 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
3780 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
3781 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
3782 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
3783 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
3784 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
3785 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
3786 if (!pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3787 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
3788 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
3789 if (scan == STBI__SCAN_header) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3790 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3791 // 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
3792 // img_n is # components to decompress/filter.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3793 s->img_n = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3794 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
3795 // 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
3796 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3797 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3798 }
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 case STBI__PNG_TYPE('P','L','T','E'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3801 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
3802 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
3803 pal_len = c.length / 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3804 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
3805 for (i=0; i < pal_len; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3806 palette[i*4+0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3807 palette[i*4+1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3808 palette[i*4+2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3809 palette[i*4+3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3810 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3811 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3812 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3813
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3814 case STBI__PNG_TYPE('t','R','N','S'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3815 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
3816 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
3817 if (pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3818 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
3819 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
3820 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
3821 pal_img_n = 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3822 for (i=0; i < c.length; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3823 palette[i*4+3] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3824 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3825 if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3826 if (c.length != (Uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3827 has_trans = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3828 for (k=0; k < s->img_n; ++k)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3829 tc[k] = (Uint8) (stbi__get16be(s) & 255) * stbi__depth_scale_table[depth]; // non 8-bit images will be larger
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3830 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3831 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3832 }
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 case STBI__PNG_TYPE('I','D','A','T'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3835 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
3836 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
3837 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
3838 if (ioff + c.length > idata_limit) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3839 Uint8 *p;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3840 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
3841 while (ioff + c.length > idata_limit)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3842 idata_limit *= 2;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3843 p = (Uint8 *) STBI_REALLOC(z->idata, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3844 z->idata = p;
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 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
3847 ioff += c.length;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3848 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3849 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3850
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3851 case STBI__PNG_TYPE('I','E','N','D'): {
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3852 size_t raw_len, bpl;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3853 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
3854 if (scan != STBI__SCAN_load) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3855 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
3856 // 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
3857 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
3858 raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;
950
88d9440afad0 Use dmzlib module in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 899
diff changeset
3859
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3860 if (stbi_zlib_decode_malloc_guesssize_headerflag(
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3861 z->idata, ioff,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3862 &z->expanded, &raw_len,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3863 raw_len, !is_iphone) != DMERR_OK)
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3864 return 0;
950
88d9440afad0 Use dmzlib module in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 899
diff changeset
3865
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3866 STBI_FREE(z->idata); z->idata = NULL;
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3867
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3868 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
3869 s->img_out_n = s->img_n+1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3870 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3871 s->img_out_n = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3872 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
3873 if (has_trans)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3874 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
3875 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
3876 stbi__de_iphone(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3877 if (pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3878 // pal_img_n == 3 or 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3879 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
3880 s->img_out_n = pal_img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3881 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
3882 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
3883 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3884 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3885 STBI_FREE(z->expanded); z->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3886 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3887 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3888
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3889 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3890 // if critical, fail
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3891 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
3892 if ((c.type & (1 << 29)) == 0) {
1083
f88ad5cb44e5 Silence a warning.
Matti Hamalainen <ccr@tnsp.org>
parents: 1076
diff changeset
3893 #if !defined(STBI_NO_FAILURE_STRINGS) && !defined(STBI_FAILURE_USERMSG)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3894 // not threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3895 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
3896 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3897 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3898 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3899 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3900 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3901 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
3902 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3903 stbi__skip(s, c.length);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3904 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3905 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3906 // end of PNG chunk, read and skip CRC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3907 stbi__get32be(s);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3911 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
3912 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3913 unsigned char *result=NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3914 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
3915 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
3916 result = p->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3917 p->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3918 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
3919 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
3920 p->s->img_out_n = req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3921 if (result == NULL) return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3922 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3923 *x = p->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3924 *y = p->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3925 if (n) *n = p->s->img_out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3926 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3927 STBI_FREE(p->out); p->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3928 STBI_FREE(p->expanded); p->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3929 STBI_FREE(p->idata); p->idata = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3930
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3931 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3932 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3933
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3934 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
3935 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3936 stbi__png p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3937 p.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3938 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
3939 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3940
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3941 static int stbi__png_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3942 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3943 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3944 r = stbi__check_png_header(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3945 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3946 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3947 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3948
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3949 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
3950 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3951 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
3952 stbi__rewind( p->s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3953 return 0;
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 if (x) *x = p->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3956 if (y) *y = p->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3957 if (comp) *comp = p->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3958 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3959 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3960
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3961 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
3962 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3963 stbi__png p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3964 p.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3965 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
3966 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3967 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3968
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3969 // Microsoft/Windows BMP image
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3970
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3971 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3972 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
3973 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3974 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3975 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3976 if (stbi__get8(s) != 'B') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3977 if (stbi__get8(s) != 'M') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3978 stbi__get32le(s); // discard filesize
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3979 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3980 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3981 stbi__get32le(s); // discard data offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3982 sz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3983 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
3984 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3985 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3986
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3987 static int stbi__bmp_test(stbi__context *s)
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 int r = stbi__bmp_test_raw(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3990 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3991 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3992 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3993
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3994
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3995 // returns 0..31 for the highest set bit
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3996 static int stbi__high_bit(unsigned int z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3997 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3998 int n=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3999 if (z == 0) return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4000 if (z >= 0x10000) n += 16, z >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4001 if (z >= 0x00100) n += 8, z >>= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4002 if (z >= 0x00010) n += 4, z >>= 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4003 if (z >= 0x00004) n += 2, z >>= 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4004 if (z >= 0x00002) n += 1, z >>= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4005 return n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4006 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4007
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4008 static int stbi__bitcount(unsigned int a)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4009 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4010 a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4011 a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4012 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
4013 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
4014 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
4015 return a & 0xff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4016 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4017
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4018 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
4019 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4020 int result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4021 int z=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4022
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4023 if (shift < 0) v <<= -shift;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4024 else v >>= shift;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4025 result = v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4026
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4027 z = bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4028 while (z < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4029 result += v >> z;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4030 z += bits;
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 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4033 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4034
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4035 static Uint8 *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4036 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4037 Uint8 *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4038 unsigned int mr=0,mg=0,mb=0,ma=0, fake_a=0;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4039 Uint8 pal[256][4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4040 int psize=0,i,j,compress=0,width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4041 int bpp, flip_vertically, pad, target, offset, hsz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4042 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
4043 stbi__get32le(s); // discard filesize
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4044 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4045 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4046 offset = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4047 hsz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4048 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
4049 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4050 s->img_x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4051 s->img_y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4052 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4053 s->img_x = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4054 s->img_y = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4055 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4056 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
4057 bpp = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4058 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
4059 flip_vertically = ((int) s->img_y) > 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4060 s->img_y = abs((int) s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4061 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4062 if (bpp < 24)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4063 psize = (offset - 14 - 24) / 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4064 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4065 compress = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4066 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
4067 stbi__get32le(s); // discard sizeof
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4068 stbi__get32le(s); // discard hres
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4069 stbi__get32le(s); // discard vres
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4070 stbi__get32le(s); // discard colorsused
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4071 stbi__get32le(s); // discard max important
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4072 if (hsz == 40 || hsz == 56) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4073 if (hsz == 56) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4074 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4075 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4076 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4077 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4078 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4079 if (bpp == 16 || bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4080 if (compress == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4081 if (bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4082 mr = 0xffu << 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4083 mg = 0xffu << 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4084 mb = 0xffu << 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4085 ma = 0xffu << 24;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4086 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
4087 STBI_NOTUSED(fake_a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4088 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4089 mr = 31u << 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4090 mg = 31u << 5;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4091 mb = 31u << 0;
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 if (compress == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4094 mr = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4095 mg = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4096 mb = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4097 // 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
4098 if (mr == mg && mg == mb) {
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 stbi__errpuc("bad BMP", "bad BMP");
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 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4103 return stbi__errpuc("bad BMP", "bad BMP");
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 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4106 STBI_ASSERT(hsz == 108 || hsz == 124);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4107 mr = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4108 mg = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4109 mb = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4110 ma = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4111 stbi__get32le(s); // discard color space
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4112 for (i=0; i < 12; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4113 stbi__get32le(s); // discard color space parameters
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4114 if (hsz == 124) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4115 stbi__get32le(s); // discard rendering intent
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4116 stbi__get32le(s); // discard offset of profile data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4117 stbi__get32le(s); // discard size of profile data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4118 stbi__get32le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4119 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4120 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4121 if (bpp < 16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4122 psize = (offset - 14 - hsz) >> 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4123 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4124 s->img_n = ma ? 4 : 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4125 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
4126 target = req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4127 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4128 target = s->img_n; // if they want monochrome, we'll post-convert
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4129 out = (Uint8 *) stbi__malloc(target * s->img_x * s->img_y);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4130 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
4131 if (bpp < 16) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4132 int z=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4133 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
4134 for (i=0; i < psize; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4135 pal[i][2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4136 pal[i][1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4137 pal[i][0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4138 if (hsz != 12) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4139 pal[i][3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4140 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4141 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
4142 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
4143 else if (bpp == 8) width = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4144 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
4145 pad = (-width)&3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4146 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
4147 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
4148 int v=stbi__get8(s),v2=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4149 if (bpp == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4150 v2 = v & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4151 v >>= 4;
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 out[z++] = pal[v][0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4154 out[z++] = pal[v][1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4155 out[z++] = pal[v][2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4156 if (target == 4) out[z++] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4157 if (i+1 == (int) s->img_x) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4158 v = (bpp == 8) ? stbi__get8(s) : v2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4159 out[z++] = pal[v][0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4160 out[z++] = pal[v][1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4161 out[z++] = pal[v][2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4162 if (target == 4) out[z++] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4163 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4164 stbi__skip(s, pad);
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 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
4168 int z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4169 int easy=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4170 stbi__skip(s, offset - 14 - hsz);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4171 if (bpp == 24) width = 3 * s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4172 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
4173 else /* bpp = 32 and pad = 0 */ width=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4174 pad = (-width) & 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4175 if (bpp == 24) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4176 easy = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4177 } else if (bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4178 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
4179 easy = 2;
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 if (!easy) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4182 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
4183 // 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
4184 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
4185 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
4186 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
4187 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
4188 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4189 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
4190 if (easy) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4191 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
4192 unsigned char a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4193 out[z+2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4194 out[z+1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4195 out[z+0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4196 z += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4197 a = (easy == 2 ? stbi__get8(s) : 255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4198 if (target == 4) out[z++] = a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4199 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4200 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4201 for (i=0; i < (int) s->img_x; ++i) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4202 Uint32 v = (Uint32) (bpp == 16 ? (Uint16) stbi__get16le(s) : stbi__get32le(s));
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4203 int a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4204 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
4205 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
4206 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
4207 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
4208 if (target == 4) out[z++] = STBI__BYTECAST(a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4209 }
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 stbi__skip(s, pad);
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4214 if (flip_vertically) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4215 Uint8 t;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4216 for (j=0; j < (int) s->img_y>>1; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4217 Uint8 *p1 = out + j *s->img_x*target;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4218 Uint8 *p2 = out + (s->img_y-1-j)*s->img_x*target;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4219 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
4220 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
4221 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4222 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4223 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4224
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4225 if (req_comp && req_comp != target) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4226 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
4227 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
4228 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4229
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4230 *x = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4231 *y = s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4232 if (comp) *comp = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4233 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4234 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4235 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4236
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4237 // Targa Truevision - TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4238 // by Jonathan Dummer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4239 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4240 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
4241 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4242 int tga_w, tga_h, tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4243 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4244 stbi__get8(s); // discard Offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4245 sz = stbi__get8(s); // color type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4246 if( sz > 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4247 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4248 return 0; // only RGB or indexed allowed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4249 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4250 sz = stbi__get8(s); // image type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4251 // only RGB or grey allowed, +/- RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4252 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
4253 stbi__skip(s,9);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4254 tga_w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4255 if( tga_w < 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4256 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4257 return 0; // test width
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 tga_h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4260 if( tga_h < 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4261 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4262 return 0; // test height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4263 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4264 sz = stbi__get8(s); // bits per pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4265 // only RGB or RGBA or grey allowed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4266 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
4267 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4268 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4269 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4270 tga_comp = sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4271 if (x) *x = tga_w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4272 if (y) *y = tga_h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4273 if (comp) *comp = tga_comp / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4274 return 1; // seems to have passed everything
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4275 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4276
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4277 static int stbi__tga_test(stbi__context *s)
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 int res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4280 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4281 stbi__get8(s); // discard Offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4282 sz = stbi__get8(s); // color type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4283 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
4284 sz = stbi__get8(s); // image type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4285 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
4286 stbi__get16be(s); // discard palette start
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4287 stbi__get16be(s); // discard palette length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4288 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
4289 stbi__get16be(s); // discard x origin
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4290 stbi__get16be(s); // discard y origin
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4291 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
4292 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
4293 sz = stbi__get8(s); // bits per pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4294 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
4295 res = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4296 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4297 res = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4298 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4299 return res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4300 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4301
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4302 static Uint8 *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4303 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4304 // read in the TGA header stuff
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4305 int tga_offset = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4306 int tga_indexed = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4307 int tga_image_type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4308 int tga_is_RLE = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4309 int tga_palette_start = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4310 int tga_palette_len = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4311 int tga_palette_bits = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4312 int tga_x_origin = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4313 int tga_y_origin = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4314 int tga_width = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4315 int tga_height = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4316 int tga_bits_per_pixel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4317 int tga_comp = tga_bits_per_pixel / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4318 int tga_inverted = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4319 // image data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4320 unsigned char *tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4321 unsigned char *tga_palette = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4322 int i, j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4323 unsigned char raw_data[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4324 int RLE_count = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4325 int RLE_repeating = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4326 int read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4327
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4328 // do a tiny bit of precessing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4329 if ( tga_image_type >= 8 )
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 tga_image_type -= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4332 tga_is_RLE = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4333 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4334 /* int tga_alpha_bits = tga_inverted & 15; */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4335 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4336
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4337 // error check
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4338 if ( //(tga_indexed) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4339 (tga_width < 1) || (tga_height < 1) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4340 (tga_image_type < 1) || (tga_image_type > 3) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4341 ((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
4342 (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
4343 )
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 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
4346 }
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 // 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
4349 if ( tga_indexed )
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 tga_comp = tga_palette_bits / 8;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4354 // tga info
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4355 *x = tga_width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4356 *y = tga_height;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4357 if (comp) *comp = tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4358
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4359 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
4360 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
4361
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4362 // 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
4363 stbi__skip(s, tga_offset );
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 if ( !tga_indexed && !tga_is_RLE) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4366 for (i=0; i < tga_height; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4367 int y = tga_inverted ? tga_height -i - 1 : i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4368 Uint8 *tga_row = tga_data + y*tga_width*tga_comp;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4369 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
4370 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4371 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4372 // do I need to load a palette?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4373 if ( tga_indexed)
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 // any data to skip? (offset usually = 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4376 stbi__skip(s, tga_palette_start );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4377 // load the palette
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4378 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
4379 if (!tga_palette) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4380 STBI_FREE(tga_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4381 return stbi__errpuc("outofmem", "Out of memory");
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 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
4384 STBI_FREE(tga_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4385 STBI_FREE(tga_palette);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4386 return stbi__errpuc("bad palette", "Corrupt TGA");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4387 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4388 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4389 // load the data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4390 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
4391 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4392 // 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
4393 if ( tga_is_RLE )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4394 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4395 if ( RLE_count == 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 // 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
4398 int RLE_cmd = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4399 RLE_count = 1 + (RLE_cmd & 127);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4400 RLE_repeating = RLE_cmd >> 7;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4401 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4402 } else if ( !RLE_repeating )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4403 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4404 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4405 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4406 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4407 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4408 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4409 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4410 // 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
4411 if ( read_next_pixel )
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 // load however much data we did have
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4414 if ( tga_indexed )
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 // read in 1 byte, then perform the lookup
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4417 int pal_idx = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4418 if ( pal_idx >= tga_palette_len )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4419 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4420 // invalid index
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4421 pal_idx = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4422 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4423 pal_idx *= tga_bits_per_pixel / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4424 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
4425 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4426 raw_data[j] = tga_palette[pal_idx+j];
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 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4429 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4430 // read in the data raw
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4431 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
4432 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4433 raw_data[j] = stbi__get8(s);
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 // clear the reading flag for the next pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4437 read_next_pixel = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4438 } // end of reading a pixel
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 // copy data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4441 for (j = 0; j < tga_comp; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4442 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
4443
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4444 // 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
4445 --RLE_count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4446 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4447 // do I need to invert the image?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4448 if ( tga_inverted )
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 for (j = 0; j*2 < tga_height; ++j)
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 int index1 = j * tga_width * tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4453 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
4454 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
4455 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4456 unsigned char temp = tga_data[index1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4457 tga_data[index1] = tga_data[index2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4458 tga_data[index2] = temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4459 ++index1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4460 ++index2;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4463 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4464 // clear my palette, if I had one
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4465 if ( tga_palette != NULL )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4466 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4467 STBI_FREE( tga_palette );
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4470
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4471 // swap RGB
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4472 if (tga_comp >= 3)
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 unsigned char* tga_pixel = tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4475 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
4476 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4477 unsigned char temp = tga_pixel[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4478 tga_pixel[0] = tga_pixel[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4479 tga_pixel[2] = temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4480 tga_pixel += tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4481 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4482 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4483
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4484 // convert to target component count
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4485 if (req_comp && req_comp != tga_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4486 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
4487
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4488 // 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
4489 // Microsoft's C compilers happy... [8^(
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4490 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
4491 tga_x_origin = tga_y_origin = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4492 // OK, done
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4493 return tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4494 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4495 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4496
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 // 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
4499
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4500 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4501 static int stbi__psd_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4502 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4503 int r = (stbi__get32be(s) == 0x38425053);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4504 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4505 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4506 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4507
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4508 static Uint8 *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4509 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4510 int pixelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4511 int channelCount, compression;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4512 int channel, i, count, len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4513 int w,h;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4514 Uint8 *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4515
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4516 // Check identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4517 if (stbi__get32be(s) != 0x38425053) // "8BPS"
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4518 return stbi__errpuc("not PSD", "Corrupt PSD image");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4519
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4520 // Check file type version.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4521 if (stbi__get16be(s) != 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4522 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
4523
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4524 // Skip 6 reserved bytes.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4525 stbi__skip(s, 6 );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4526
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4527 // 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
4528 channelCount = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4529 if (channelCount < 0 || channelCount > 16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4530 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
4531
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4532 // Read the rows and columns of the image.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4533 h = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4534 w = stbi__get32be(s);
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 // Make sure the depth is 8 bits.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4537 if (stbi__get16be(s) != 8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4538 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
4539
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4540 // Make sure the color mode is RGB.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4541 // Valid options are:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4542 // 0: Bitmap
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4543 // 1: Grayscale
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4544 // 2: Indexed color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4545 // 3: RGB color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4546 // 4: CMYK color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4547 // 7: Multichannel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4548 // 8: Duotone
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4549 // 9: Lab color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4550 if (stbi__get16be(s) != 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4551 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
4552
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4553 // 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
4554 stbi__skip(s,stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4555
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4556 // 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
4557 stbi__skip(s, stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4558
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4559 // Skip the reserved data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4560 stbi__skip(s, stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4561
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4562 // Find out if the data is compressed.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4563 // Known values:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4564 // 0: no compression
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4565 // 1: RLE compressed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4566 compression = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4567 if (compression > 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4568 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
4569
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4570 // Create the destination image.
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4571 out = (Uint8 *) stbi__malloc(4 * w*h);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4572 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
4573 pixelCount = w*h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4574
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4575 // Initialize the data to zero.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4576 //memset( out, 0, pixelCount * 4 );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4577
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4578 // Finally, the image data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4579 if (compression) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4580 // RLE as used by .PSD and .TIFF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4581 // 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
4582 // Read the next source byte into n.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4583 // 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
4584 // 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
4585 // Else if n is 128, noop.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4586 // Endloop
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4587
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4588 // 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
4589 // which we're going to just skip.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4590 stbi__skip(s, h * channelCount * 2 );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4591
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4592 // Read the RLE data by channel.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4593 for (channel = 0; channel < 4; channel++) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4594 Uint8 *p;
893
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 p = out+channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4597 if (channel >= channelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4598 // Fill this channel with default data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4599 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
4600 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4601 // Read the RLE data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4602 count = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4603 while (count < pixelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4604 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4605 if (len == 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4606 // No-op.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4607 } else if (len < 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4608 // Copy next len+1 bytes literally.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4609 len++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4610 count += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4611 while (len) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4612 *p = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4613 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4614 len--;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4615 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4616 } else if (len > 128) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4617 Uint8 val;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4618 // 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
4619 // (Interpret len as a negative 8-bit int.)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4620 len ^= 0x0FF;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4621 len += 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4622 val = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4623 count += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4624 while (len) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4625 *p = val;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4626 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4627 len--;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4628 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4629 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4630 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4633
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4634 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4635 // 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
4636 // 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
4637
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4638 // Read the data by channel.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4639 for (channel = 0; channel < 4; channel++) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4640 Uint8 *p;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4641
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4642 p = out + channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4643 if (channel > channelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4644 // Fill this channel with default data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4645 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
4646 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4647 // Read the data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4648 for (i = 0; i < pixelCount; i++)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4649 *p = stbi__get8(s), p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4650 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4651 }
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 if (req_comp && req_comp != 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4655 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
4656 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
4657 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4658
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4659 if (comp) *comp = channelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4660 *y = h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4661 *x = w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4662
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4663 return out;
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 #endif
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 // Softimage PIC loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4669 // by Tom Seddon
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4670 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4671 // 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
4672 // 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
4673
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4674 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4675 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
4676 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4677 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4678 for (i=0; i<4; ++i)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4679 if (stbi__get8(s) != (Uint8)str[i])
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4680 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4681
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4682 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4683 }
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 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
4686 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4687 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4688
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4689 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
4690 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4691
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4692 for(i=0;i<84;++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4693 stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4694
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4695 if (!stbi__pic_is4(s,"PICT"))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4696 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4697
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4698 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4699 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4700
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4701 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4702 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4703 Uint8 size,type,channel;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4704 } stbi__pic_packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4705
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4706 static Uint8 *stbi__readval(stbi__context *s, int channel, Uint8 *dest)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4707 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4708 int mask=0x80, i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4709
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4710 for (i=0; i<4; ++i, mask>>=1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4711 if (channel & mask) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4712 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
4713 dest[i]=stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4714 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4715 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4716
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4717 return dest;
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
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4720 static void stbi__copyval(int channel,Uint8 *dest,const Uint8 *src)
893
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 mask=0x80,i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4723
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4724 for (i=0;i<4; ++i, mask>>=1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4725 if (channel&mask)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4726 dest[i]=src[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4727 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4728
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4729 static Uint8 *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, Uint8 *result)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4730 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4731 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
4732 stbi__pic_packet packets[10];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4733
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4734 // 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
4735 // for the same channel in multiple packets.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4736 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4737 stbi__pic_packet *packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4738
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4739 if (num_packets==sizeof(packets)/sizeof(packets[0]))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4740 return stbi__errpuc("bad format","too many packets");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4741
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4742 packet = &packets[num_packets++];
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 chained = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4745 packet->size = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4746 packet->type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4747 packet->channel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4748
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4749 act_comp |= packet->channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4750
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4751 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
4752 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
4753 } while (chained);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4754
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4755 *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
4756
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4757 for(y=0; y<height; ++y) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4758 int packet_idx;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4759
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4760 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
4761 stbi__pic_packet *packet = &packets[packet_idx];
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4762 Uint8 *dest = result+y*width*4;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4763
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4764 switch (packet->type) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4765 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4766 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
4767
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4768 case 0: {//uncompressed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4769 int x;
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 for(x=0;x<width;++x, dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4772 if (!stbi__readval(s,packet->channel,dest))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4773 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4774 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4775 }
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 case 1://Pure RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4778 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4779 int left=width, i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4780
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4781 while (left>0) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4782 Uint8 count,value[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4783
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4784 count=stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4785 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
4786
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4787 if (count > left)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4788 count = (Uint8) left;
893
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 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
4791
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4792 for(i=0; i<count; ++i,dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4793 stbi__copyval(packet->channel,dest,value);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4794 left -= count;
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 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4798
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4799 case 2: {//Mixed RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4800 int left=width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4801 while (left>0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4802 int count = stbi__get8(s), i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4803 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
4804
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4805 if (count >= 128) { // Repeated
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4806 Uint8 value[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4807 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4808
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4809 if (count==128)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4810 count = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4811 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4812 count -= 127;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4813 if (count > left)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4814 return stbi__errpuc("bad file","scanline overrun");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4815
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4816 if (!stbi__readval(s,packet->channel,value))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4817 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4818
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4819 for(i=0;i<count;++i, dest += 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4820 stbi__copyval(packet->channel,dest,value);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4821 } else { // Raw
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4822 ++count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4823 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
4824
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4825 for(i=0;i<count;++i, dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4826 if (!stbi__readval(s,packet->channel,dest))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4827 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4828 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4829 left-=count;
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 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4832 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4833 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4836
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4837 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4838 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4839
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4840 static Uint8 *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4841 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4842 Uint8 *result;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4843 int i, x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4844
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4845 for (i=0; i<92; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4846 stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4847
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4848 x = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4849 y = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4850 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
4851 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
4852
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4853 stbi__get32be(s); //skip `ratio'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4854 stbi__get16be(s); //skip `fields'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4855 stbi__get16be(s); //skip `pad'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4856
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4857 // intermediate buffer is RGBA
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4858 result = (Uint8 *) stbi__malloc(x*y*4);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4859 memset(result, 0xff, x*y*4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4860
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4861 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
4862 STBI_FREE(result);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4863 result=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4864 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4865 *px = x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4866 *py = y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4867 if (req_comp == 0) req_comp = *comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4868 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
4869
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4870 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4871 }
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 static int stbi__pic_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4874 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4875 int r = stbi__pic_test_core(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4876 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4877 return r;
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 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4880
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4881 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4882 // 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
4883
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4884 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4885 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4886 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4887 Sint16 prefix;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4888 Uint8 first;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4889 Uint8 suffix;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4890 } stbi__gif_lzw;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4891
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4892 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4893 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4894 int w,h;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4895 Uint8 *out; // output buffer (always 4 components)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4896 int flags, bgindex, ratio, transparent, eflags;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4897 Uint8 pal[256][4];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4898 Uint8 lpal[256][4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4899 stbi__gif_lzw codes[4096];
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4900 Uint8 *color_table;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4901 int parse, step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4902 int lflags;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4903 int start_x, start_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4904 int max_x, max_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4905 int cur_x, cur_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4906 int line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4907 } stbi__gif;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4908
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4909 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
4910 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4911 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4912 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
4913 sz = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4914 if (sz != '9' && sz != '7') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4915 if (stbi__get8(s) != 'a') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4916 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4917 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4918
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4919 static int stbi__gif_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4920 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4921 int r = stbi__gif_test_raw(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4922 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4923 return r;
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
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4926 static void stbi__gif_parse_colortable(stbi__context *s, Uint8 pal[256][4], int num_entries, int transp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4927 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4928 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4929 for (i=0; i < num_entries; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4930 pal[i][2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4931 pal[i][1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4932 pal[i][0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4933 pal[i][3] = transp == i ? 0 : 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4934 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4935 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4936
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4937 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
4938 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4939 Uint8 version;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4940 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
4941 return stbi__err("not GIF", "Corrupt GIF");
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 version = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4944 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
4945 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
4946
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4947 stbi__g_failure_reason = "";
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4948 g->w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4949 g->h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4950 g->flags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4951 g->bgindex = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4952 g->ratio = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4953 g->transparent = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4954
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4955 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
4956
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4957 if (is_info) return 1;
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 if (g->flags & 0x80)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4960 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
4961
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4962 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4963 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4964
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4965 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
4966 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4967 stbi__gif g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4968 if (!stbi__gif_header(s, &g, comp, 1)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4969 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4970 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4971 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4972 if (x) *x = g.w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4973 if (y) *y = g.h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4974 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4975 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4976
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4977 static void stbi__out_gif_code(stbi__gif *g, Uint16 code)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4978 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4979 Uint8 *p, *c;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4980
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4981 // 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
4982 // 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
4983 if (g->codes[code].prefix >= 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4984 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
4985
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4986 if (g->cur_y >= g->max_y) return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4987
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4988 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
4989 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
4990
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4991 if (c[3] >= 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4992 p[0] = c[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4993 p[1] = c[1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4994 p[2] = c[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4995 p[3] = c[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4996 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4997 g->cur_x += 4;
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 if (g->cur_x >= g->max_x) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5000 g->cur_x = g->start_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5001 g->cur_y += g->step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5002
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5003 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
5004 g->step = (1 << g->parse) * g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5005 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
5006 --g->parse;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5007 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5008 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5009 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5010
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5011 static Uint8 *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5012 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5013 Uint8 lzw_cs;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5014 Sint32 len, code;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5015 Uint32 first;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5016 Sint32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5017 stbi__gif_lzw *p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5018
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5019 lzw_cs = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5020 clear = 1 << lzw_cs;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5021 first = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5022 codesize = lzw_cs + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5023 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5024 bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5025 valid_bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5026 for (code = 0; code < clear; code++) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5027 g->codes[code].prefix = -1;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5028 g->codes[code].first = (Uint8) code;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5029 g->codes[code].suffix = (Uint8) code;
893
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5032 // support no starting clear code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5033 avail = clear+2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5034 oldcode = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5035
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5036 len = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5037 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5038 if (valid_bits < codesize) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5039 if (len == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5040 len = stbi__get8(s); // start new block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5041 if (len == 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5042 return g->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5043 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5044 --len;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5045 bits |= (Sint32) stbi__get8(s) << valid_bits;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5046 valid_bits += 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5047 } else {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5048 Sint32 code = bits & codemask;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5049 bits >>= codesize;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5050 valid_bits -= codesize;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5051 // @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
5052 if (code == clear) { // clear code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5053 codesize = lzw_cs + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5054 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5055 avail = clear + 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5056 oldcode = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5057 first = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5058 } 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
5059 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5060 while ((len = stbi__get8(s)) > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5061 stbi__skip(s,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5062 return g->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5063 } else if (code <= avail) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5064 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
5065
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5066 if (oldcode >= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5067 p = &g->codes[avail++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5068 if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF");
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5069 p->prefix = (Sint16) oldcode;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5070 p->first = g->codes[oldcode].first;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5071 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
5072 } else if (code == avail)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5073 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
5074
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5075 stbi__out_gif_code(g, (Uint16) code);
893
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 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5078 codesize++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5079 codemask = (1 << codesize) - 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5082 oldcode = code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5083 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5084 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
5085 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5086 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5087 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5088 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5089
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5090 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
5091 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5092 int i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5093 Uint8 *c = g->pal[g->bgindex];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5094 // @OPTIMIZE: write a dword at a time
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5095 for (i = 0; i < g->w * g->h * 4; i += 4) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5096 Uint8 *p = &g->out[i];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5097 p[0] = c[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5098 p[1] = c[1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5099 p[2] = c[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5100 p[3] = c[3];
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5103
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5104 // this function is designed to support animated gifs, although stb_image doesn't support it
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5105 static Uint8 *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5106 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5107 int i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5108 Uint8 *old_out = 0;
893
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 if (g->out == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5111 if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5112 g->out = (Uint8 *) stbi__malloc(4 * g->w * g->h);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5113 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
5114 stbi__fill_gif_background(g);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5115 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5116 // animated-gif-only path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5117 if (((g->eflags & 0x1C) >> 2) == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5118 old_out = g->out;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5119 g->out = (Uint8 *) stbi__malloc(4 * g->w * g->h);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5120 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
5121 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
5122 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5123 }
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 for (;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5126 switch (stbi__get8(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5127 case 0x2C: /* Image Descriptor */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5128 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5129 Sint32 x, y, w, h;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5130 Uint8 *o;
893
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 x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5133 y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5134 w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5135 h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5136 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
5137 return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5138
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5139 g->line_size = g->w * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5140 g->start_x = x * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5141 g->start_y = y * g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5142 g->max_x = g->start_x + w * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5143 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
5144 g->cur_x = g->start_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5145 g->cur_y = g->start_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5146
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5147 g->lflags = stbi__get8(s);
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 if (g->lflags & 0x40) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5150 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
5151 g->parse = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5152 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5153 g->step = g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5154 g->parse = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5155 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5156
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5157 if (g->lflags & 0x80) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5158 stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5159 g->color_table = (Uint8 *) g->lpal;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5160 } else if (g->flags & 0x80) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5161 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
5162 g->pal[i][3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5163 if (g->transparent >= 0 && (g->eflags & 0x01))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5164 g->pal[g->transparent][3] = 0;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5165 g->color_table = (Uint8 *) g->pal;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5166 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5167 return stbi__errpuc("missing color table", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5168
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5169 o = stbi__process_gif_raster(s, g);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5170 if (o == NULL) return NULL;
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 if (req_comp && req_comp != 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5173 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
5174 return o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5175 }
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 case 0x21: // Comment Extension.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5178 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5179 int len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5180 if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5181 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5182 if (len == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5183 g->eflags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5184 stbi__get16le(s); // delay
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5185 g->transparent = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5186 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5187 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5188 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5189 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5190 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5191 while ((len = stbi__get8(s)) != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5192 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5193 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5194 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5195
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5196 case 0x3B: // gif stream termination code
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5197 return (Uint8 *) s; // using '1' causes warning on some compilers
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5198
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5199 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5200 return stbi__errpuc("unknown code", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5201 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5204
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5205 static Uint8 *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5206 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5207 Uint8 *u = 0;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5208 stbi__gif g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5209 memset(&g, 0, sizeof(g));
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 u = stbi__gif_load_next(s, &g, comp, req_comp);
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5212 if (u == (Uint8 *) s) u = 0; // end of animated gif marker
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5213 if (u) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5214 *x = g.w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5215 *y = g.h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5216 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5217
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5218 return u;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5221 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
5222 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5223 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
5224 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5225 #endif
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 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5228 // Radiance RGBE HDR loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5229 // originally by Nicolas Schulz
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5230 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5231 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
5232 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5233 const char *signature = "#?RADIANCE\n";
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5234 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5235 for (i=0; signature[i]; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5236 if (stbi__get8(s) != signature[i])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5237 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5238 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5241 static int stbi__hdr_test(stbi__context* s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5242 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5243 int r = stbi__hdr_test_core(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5244 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5245 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5246 }
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 #define STBI__HDR_BUFLEN 1024
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5249 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
5250 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5251 int len=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5252 char c = '\0';
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5253
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5254 c = (char) stbi__get8(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5255
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5256 while (!stbi__at_eof(z) && c != '\n') {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5257 buffer[len++] = c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5258 if (len == STBI__HDR_BUFLEN-1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5259 // flush to end of line
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5260 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
5261 ;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5262 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5263 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5264 c = (char) stbi__get8(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5265 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5266
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5267 buffer[len] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5268 return buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5269 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5270
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5271 static void stbi__hdr_convert(float *output, Uint8 *input, int req_comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5272 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5273 if ( input[3] != 0 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5274 float f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5275 // Exponent
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5276 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
5277 if (req_comp <= 2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5278 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
5279 else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5280 output[0] = input[0] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5281 output[1] = input[1] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5282 output[2] = input[2] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5283 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5284 if (req_comp == 2) output[1] = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5285 if (req_comp == 4) output[3] = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5286 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5287 switch (req_comp) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5288 case 4: output[3] = 1; /* fallthrough */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5289 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
5290 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5291 case 2: output[1] = 1; /* fallthrough */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5292 case 1: output[0] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5293 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5294 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5297
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5298 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
5299 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5300 char buffer[STBI__HDR_BUFLEN];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5301 char *token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5302 int valid = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5303 int width, height;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5304 Uint8 *scanline;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5305 float *hdr_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5306 int len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5307 unsigned char count, value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5308 int i, j, k, c1,c2, z;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5309
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5310
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5311 // Check identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5312 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
5313 return stbi__errpf("not HDR", "Corrupt HDR image");
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 // Parse header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5316 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5317 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5318 if (token[0] == 0) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5319 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
5320 }
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 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
5323
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5324 // Parse width and height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5325 // 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
5326 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5327 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
5328 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5329 height = (int) strtol(token, &token, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5330 while (*token == ' ') ++token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5331 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
5332 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5333 width = (int) strtol(token, NULL, 10);
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 *x = width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5336 *y = height;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5337
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5338 if (comp) *comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5339 if (req_comp == 0) req_comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5340
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5341 // Read data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5342 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
5343
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5344 // Load image data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5345 // 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
5346 if ( width < 8 || width >= 32768) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5347 // Read flat data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5348 for (j=0; j < height; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5349 for (i=0; i < width; ++i) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5350 Uint8 rgbe[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5351 main_decode_loop:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5352 stbi__getn(s, rgbe, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5353 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
5354 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5355 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5356 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5357 // Read RLE-encoded data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5358 scanline = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5359
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5360 for (j = 0; j < height; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5361 c1 = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5362 c2 = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5363 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5364 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5365 // 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
5366 // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5367 Uint8 rgbe[4];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5368 rgbe[0] = (Uint8) c1;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5369 rgbe[1] = (Uint8) c2;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5370 rgbe[2] = (Uint8) len;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5371 rgbe[3] = (Uint8) stbi__get8(s);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5372 stbi__hdr_convert(hdr_data, rgbe, req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5373 i = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5374 j = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5375 STBI_FREE(scanline);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5376 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
5377 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5378 len <<= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5379 len |= stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5380 if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5381 if (scanline == NULL) scanline = (Uint8 *) stbi__malloc(width * 4);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5382
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5383 for (k = 0; k < 4; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5384 i = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5385 while (i < width) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5386 count = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5387 if (count > 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5388 // Run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5389 value = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5390 count -= 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5391 for (z = 0; z < count; ++z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5392 scanline[i++ * 4 + k] = value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5393 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5394 // Dump
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5395 for (z = 0; z < count; ++z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5396 scanline[i++ * 4 + k] = stbi__get8(s);
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 }
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 for (i=0; i < width; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5401 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
5402 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5403 STBI_FREE(scanline);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5406 return hdr_data;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5409 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
5410 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5411 char buffer[STBI__HDR_BUFLEN];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5412 char *token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5413 int valid = 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 (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5416 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5417 return 0;
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 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5421 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5422 if (token[0] == 0) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5423 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
5424 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5425
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5426 if (!valid) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5427 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5428 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5429 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5430 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5431 if (strncmp(token, "-Y ", 3)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5432 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5433 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5434 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5435 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5436 *y = (int) strtol(token, &token, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5437 while (*token == ' ') ++token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5438 if (strncmp(token, "+X ", 3)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5439 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5440 return 0;
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 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5443 *x = (int) strtol(token, NULL, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5444 *comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5445 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5446 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5447 #endif // STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5448
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5449 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5450 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
5451 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5452 int hsz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5453 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
5454 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5455 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5456 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5457 stbi__skip(s,12);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5458 hsz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5459 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
5460 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5461 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5462 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5463 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5464 *x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5465 *y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5466 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5467 *x = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5468 *y = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5469 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5470 if (stbi__get16le(s) != 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5471 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5472 return 0;
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 *comp = stbi__get16le(s) / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5475 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5476 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5477 #endif
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 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5480 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
5481 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5482 int channelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5483 if (stbi__get32be(s) != 0x38425053) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5484 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5485 return 0;
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 if (stbi__get16be(s) != 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5488 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5489 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5490 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5491 stbi__skip(s, 6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5492 channelCount = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5493 if (channelCount < 0 || channelCount > 16) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5494 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5495 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5496 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5497 *y = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5498 *x = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5499 if (stbi__get16be(s) != 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5500 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5501 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5502 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5503 if (stbi__get16be(s) != 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5504 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5505 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5506 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5507 *comp = 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5508 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5509 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5510 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5511
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5512 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5513 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
5514 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5515 int act_comp=0,num_packets=0,chained;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5516 stbi__pic_packet packets[10];
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__skip(s, 92);
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 *x = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5521 *y = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5522 if (stbi__at_eof(s)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5523 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5524 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5525 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5526 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5527
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5528 stbi__skip(s, 8);
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 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5531 stbi__pic_packet *packet;
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 if (num_packets==sizeof(packets)/sizeof(packets[0]))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5534 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5535
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5536 packet = &packets[num_packets++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5537 chained = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5538 packet->size = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5539 packet->type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5540 packet->channel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5541 act_comp |= packet->channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5542
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5543 if (stbi__at_eof(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5544 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5545 return 0;
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 if (packet->size != 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5548 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5549 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5550 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5551 } while (chained);
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 *comp = (act_comp & 0x10 ? 4 : 3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5554
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5555 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5556 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5557 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5558
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5559 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5560 // Portable Gray Map and Portable Pixel Map loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5561 // by Ken Miller
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5562 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5563 // PGM: http://netpbm.sourceforge.net/doc/pgm.html
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5564 // PPM: http://netpbm.sourceforge.net/doc/ppm.html
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 // Known limitations:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5567 // Does not support comments in the header section
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5568 // 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
5569 // Does not support 16-bit-per-channel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5570
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5571 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5572
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5573 static int stbi__pnm_test(stbi__context *s)
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 char p, t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5576 p = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5577 t = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5578 if (p != 'P' || (t != '5' && t != '6')) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5579 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5580 return 0;
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 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5583 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5584
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5585 static Uint8 *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5586 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5587 Uint8 *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5588 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
5589 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5590 *x = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5591 *y = s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5592 *comp = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5593
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5594 out = (Uint8 *) stbi__malloc(s->img_n * s->img_x * s->img_y);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5595 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
5596 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
5597
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5598 if (req_comp && req_comp != s->img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5599 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
5600 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
5601 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5602 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5603 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5604
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5605 static int stbi__pnm_isspace(char c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5606 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5607 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
5608 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5609
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5610 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
5611 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5612 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
5613 *c = (char) stbi__get8(s);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5616 static int stbi__pnm_isdigit(char c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5617 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5618 return c >= '0' && c <= '9';
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5621 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
5622 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5623 int value = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5624
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5625 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
5626 value = value*10 + (*c - '0');
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5627 *c = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5628 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5629
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5630 return value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5631 }
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 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
5634 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5635 int maxv;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5636 char c, p, t;
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 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5639
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5640 // Get identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5641 p = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5642 t = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5643 if (p != 'P' || (t != '5' && t != '6')) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5644 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5645 return 0;
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 *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
5649
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5650 c = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5651 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5652
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5653 *x = stbi__pnm_getinteger(s, &c); // read width
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5654 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5655
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5656 *y = stbi__pnm_getinteger(s, &c); // read height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5657 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5658
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5659 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
5660
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5661 if (maxv > 255)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5662 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
5663 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5664 return 1;
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 #endif
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 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
5669 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5670 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5671 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
5672 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5673
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5674 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5675 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
5676 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5677
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5678 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5679 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
5680 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5681
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5682 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5683 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
5684 #endif
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 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5687 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
5688 #endif
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 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5691 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
5692 #endif
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 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5695 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
5696 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5697
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5698 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5699 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
5700 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5701
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5702 // 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
5703 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5704 if (stbi__tga_info(s, x, y, comp))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5705 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5706 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5707 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
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 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5711 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
5712 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5713 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5714 int result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5715 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
5716 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
5717 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5718 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5719 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5720
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5721 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
5722 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5723 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5724 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5725 long pos = ftell(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5726 stbi__start_file(&s, f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5727 r = stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5728 fseek(f,pos,SEEK_SET);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5729 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5730 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5731 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5732
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5733 STBIDEF int stbi_info_from_memory(Uint8 const *buffer, int len, int *x, int *y, int *comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5734 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5735 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5736 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5737 return stbi__info_main(&s,x,y,comp);
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 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
5741 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5742 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5743 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
5744 return stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5745 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5746
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5747 #endif // STB_IMAGE_IMPLEMENTATION
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5748
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5749 /*
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5750 revision history:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5751 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
5752 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
5753 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
5754 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
5755 progressive JPEG (stb)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5756 PGM/PPM support (Ken Miller)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5757 STBI_MALLOC,STBI_REALLOC,STBI_FREE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5758 GIF bugfix -- seemingly never worked
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5759 STBI_NO_*, STBI_ONLY_*
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5760 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
5761 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
5762 optimize PNG (ryg)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5763 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
5764 1.46 (2014-08-26)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5765 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
5766 1.45 (2014-08-16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5767 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
5768 1.44 (2014-08-07)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5769 various warning fixes from Ronny Chevalier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5770 1.43 (2014-07-15)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5771 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
5772 1.42 (2014-07-09)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5773 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
5774 fixes to stbi__cleanup_jpeg path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5775 added STBI_ASSERT to avoid requiring assert.h
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5776 1.41 (2014-06-25)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5777 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
5778 1.40 (2014-06-22)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5779 fix gcc struct-initialization warning
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5780 1.39 (2014-06-15)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5781 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
5782 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
5783 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
5784 1.38 (2014-06-06)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5785 suppress MSVC warnings on integer casts truncating values
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5786 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
5787 1.37 (2014-06-04)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5788 remove duplicate typedef
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5789 1.36 (2014-06-03)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5790 convert to header file single-file library
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5791 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
5792 1.35 (2014-05-27)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5793 various warnings
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5794 fix broken STBI_SIMD path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5795 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
5796 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
5797 TGA optimization by Arseny Kapoulkine
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5798 1.34 (unknown)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5799 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
5800 1.33 (2011-07-14)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5801 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
5802 1.32 (2011-07-13)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5803 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
5804 1.31 (2011-06-20)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5805 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
5806 1.30 (2011-06-11)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5807 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
5808 removed deprecated format-specific test/load functions
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5809 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
5810 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
5811 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
5812 1.29 (2010-08-16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5813 various warning fixes from Aurelien Pocheville
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5814 1.28 (2010-08-01)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5815 fix bug in GIF palette transparency (SpartanJ)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5816 1.27 (2010-08-01)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5817 cast-to-Uint8 to fix warnings
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5818 1.26 (2010-07-24)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5819 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
5820 1.25 (2010-07-17)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5821 refix trans_data warning (Won Chun)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5822 1.24 (2010-07-12)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5823 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
5824 minor perf improvements for jpeg
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5825 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
5826 attempt to fix trans_data warning (Won Chun)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5827 1.23 fixed bug in iPhone support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5828 1.22 (2010-07-10)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5829 removed image *writing* support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5830 stbi_info support from Jetro Lauha
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5831 GIF support from Jean-Marc Lienher
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5832 iPhone PNG-extensions from James Brown
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5833 warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5834 1.21 fix use of 'Uint8' in header (reported by jon blow)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5835 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
5836 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
5837 1.18 2008-08-02
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5838 fix a threading bug (local mutable static)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5839 1.17 support interlaced PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5840 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
5841 1.15 initialize some fields for thread safety
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5842 1.14 fix threadsafe conversion bug
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5843 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
5844 1.13 threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5845 1.12 const qualifiers in the API
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5846 1.11 Support installable IDCT, colorspace conversion routines
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5847 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
5848 optimized upsampling by Fabian "ryg" Giesen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5849 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
5850 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
5851 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
5852 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
5853 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
5854 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
5855 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
5856 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
5857 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
5858 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
5859 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
5860 0.99 correct handling of alpha in palette
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5861 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
5862 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
5863 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
5864 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
5865 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
5866 0.93 handle jpegtran output; verbose errors
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5867 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
5868 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
5869 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
5870 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
5871 0.60 fix compiling as c++
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5872 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
5873 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
5874 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
5875 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
5876 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
5877 0.54 allow NULL for 'int *comp'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5878 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
5879 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
5880 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
5881 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
5882 0.50 first released version
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5883 */