annotate src/stb_image.c @ 1137:e42aa3c940c1

Add #ifdef guards for stbi__get{16,32}le() for cases where they are not needed (only GIF, TGA and BMP loaders use them.)
author Matti Hamalainen <ccr@tnsp.org>
date Wed, 04 Mar 2015 08:59:33 +0200
parents d0898867ec4c
children fa59b65149e6
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
1137
e42aa3c940c1 Add #ifdef guards for stbi__get{16,32}le() for cases where they are
Matti Hamalainen <ccr@tnsp.org>
parents: 1134
diff changeset
1152 #if !defined(STBI_NO_BMP) && !defined(STBI_NO_TGA) && !defined(STBI_NO_GIF)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1153 static int stbi__get16le(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1154 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1155 int z = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1156 return z + (stbi__get8(s) << 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1157 }
1137
e42aa3c940c1 Add #ifdef guards for stbi__get{16,32}le() for cases where they are
Matti Hamalainen <ccr@tnsp.org>
parents: 1134
diff changeset
1158 #endif
e42aa3c940c1 Add #ifdef guards for stbi__get{16,32}le() for cases where they are
Matti Hamalainen <ccr@tnsp.org>
parents: 1134
diff changeset
1159
e42aa3c940c1 Add #ifdef guards for stbi__get{16,32}le() for cases where they are
Matti Hamalainen <ccr@tnsp.org>
parents: 1134
diff changeset
1160 #if !defined(STBI_NO_BMP)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1161 static Uint32 stbi__get32le(stbi__context *s)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1162 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1163 Uint32 z = stbi__get16le(s);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1164 return z + (stbi__get16le(s) << 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1165 }
1137
e42aa3c940c1 Add #ifdef guards for stbi__get{16,32}le() for cases where they are
Matti Hamalainen <ccr@tnsp.org>
parents: 1134
diff changeset
1166 #endif
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1167
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1168 #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
1169
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1170
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1171 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1172 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1173 // 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
1174 // 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
1175 // 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
1176 // 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
1177 // 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
1178 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1179 // 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
1180 // only failure mode is malloc failing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1181
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1182 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
1183 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1184 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
1185 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1186
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1187 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
1188 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1189 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1190 unsigned char *good;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1191
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1192 if (req_comp == img_n) return data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1193 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1194
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1195 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
1196 if (good == NULL) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1197 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1198 return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1199 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1200
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1201 for (j=0; j < (int) y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1202 unsigned char *src = data + j * x * img_n ;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1203 unsigned char *dest = good + j * x * req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1204
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1205 #define COMBO(a,b) ((a)*8+(b))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1206 #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
1207 // 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
1208 // 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
1209 switch (COMBO(img_n, req_comp)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1210 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
1211 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
1212 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
1213 CASE(2,1) dest[0]=src[0]; break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1214 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
1215 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
1216 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
1217 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
1218 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
1219 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
1220 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
1221 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
1222 default: STBI_ASSERT(0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1223 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1224 #undef CASE
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 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1228 return good;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1229 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1230
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1231 #ifndef STBI_NO_LINEAR
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1232 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
1233 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1234 int i,k,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1235 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
1236 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
1237 // compute number of non-alpha components
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1238 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
1239 for (i=0; i < x*y; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1240 for (k=0; k < n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1241 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
1242 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1243 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
1244 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1245 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1246 return output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1247 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1248 #endif
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 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1251 #define stbi__float2int(x) ((int) (x))
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1252 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
1253 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1254 int i,k,n;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1255 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
1256 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
1257 // compute number of non-alpha components
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1258 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
1259 for (i=0; i < x*y; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1260 for (k=0; k < n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1261 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
1262 if (z < 0) z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1263 if (z > 255) z = 255;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1264 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
1265 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1266 if (k < comp) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1267 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
1268 if (z < 0) z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1269 if (z > 255) z = 255;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1270 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
1271 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1272 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1273 STBI_FREE(data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1274 return output;
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 #endif
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 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1279 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1280 // "baseline" JPEG/JFIF decoder
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1281 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1282 // simple implementation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1283 // - doesn't support delayed output of y-dimension
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1284 // - 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
1285 // - doesn't try to recover corrupt jpegs
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1286 // - 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
1287 // - 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
1288 // - 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
1289 // - non-interleaved case requires this anyway
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1290 // - allows good upsampling (see next)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1291 // high-quality
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1292 // - upsampled channels are bilinearly interpolated, even across blocks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1293 // - quality integer IDCT derived from IJG's 'slow'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1294 // performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1295 // - fast huffman; reasonable integer IDCT
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1296 // - 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
1297 // - 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
1298
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1299 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1300
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1301 // huffman decoding acceleration
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1302 #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
1303
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1304 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1305 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1306 Uint8 fast[1 << FAST_BITS];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1307 // 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
1308 Uint16 code[256];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1309 Uint8 values[256];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1310 Uint8 size[257];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1311 unsigned int maxcode[18];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1312 int delta[17]; // old 'firstsymbol' - old 'firstcode'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1313 } stbi__huffman;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1314
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1315 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1316 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1317 stbi__context *s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1318 stbi__huffman huff_dc[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1319 stbi__huffman huff_ac[4];
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1320 Uint8 dequant[4][64];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1321 Sint16 fast_ac[4][1 << FAST_BITS];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1322
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1323 // sizes for components, interleaved MCUs
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1324 int img_h_max, img_v_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1325 int img_mcu_x, img_mcu_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1326 int img_mcu_w, img_mcu_h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1327
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1328 // definition of jpeg image component
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1329 struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1330 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1331 int id;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1332 int h,v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1333 int tq;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1334 int hd,ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1335 int dc_pred;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1336
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1337 int x,y,w2,h2;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1338 Uint8 *data;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1339 void *raw_data, *raw_coeff;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1340 Uint8 *linebuf;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1341 short *coeff; // progressive only
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1342 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
1343 } img_comp[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1344
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1345 Uint32 code_buffer; // jpeg entropy-coded buffer
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1346 int code_bits; // number of valid bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1347 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
1348 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
1349
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1350 int progressive;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1351 int spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1352 int spec_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1353 int succ_high;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1354 int succ_low;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1355 int eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1356
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1357 int scan_n, order[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1358 int restart_interval, todo;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1359
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1360 // kernels
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1361 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
1362 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
1363 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
1364 } stbi__jpeg;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1365
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1366 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
1367 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1368 int i,j,k=0,code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1369 // 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
1370 for (i=0; i < 16; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1371 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
1372 h->size[k++] = (Uint8) (i+1);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1373 h->size[k] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1374
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1375 // compute actual symbols (from jpeg spec)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1376 code = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1377 k = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1378 for(j=1; j <= 16; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1379 // 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
1380 h->delta[j] = k - code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1381 if (h->size[k] == j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1382 while (h->size[k] == j)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1383 h->code[k++] = (Uint16) (code++);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1384 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
1385 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1386 // 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
1387 h->maxcode[j] = code << (16-j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1388 code <<= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1389 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1390 h->maxcode[j] = 0xffffffff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1391
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1392 // 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
1393 memset(h->fast, 255, 1 << FAST_BITS);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1394 for (i=0; i < k; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1395 int s = h->size[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1396 if (s <= FAST_BITS) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1397 int c = h->code[i] << (FAST_BITS-s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1398 int m = 1 << (FAST_BITS-s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1399 for (j=0; j < m; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1400 h->fast[c+j] = (Uint8) i;
893
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1404 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1405 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1406
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1407 // 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
1408 // one go.
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1409 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
1410 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1411 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1412 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
1413 Uint8 fast = h->fast[i];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1414 fast_ac[i] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1415 if (fast < 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1416 int rs = h->values[fast];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1417 int run = (rs >> 4) & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1418 int magbits = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1419 int len = h->size[fast];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1420
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1421 if (magbits && len + magbits <= FAST_BITS) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1422 // magnitude code followed by receive_extend code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1423 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
1424 int m = 1 << (magbits - 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1425 if (k < m) k += (-1 << magbits) + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1426 // 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
1427 if (k >= -128 && k <= 127)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1428 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
1429 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1430 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1433
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1434 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
1435 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1436 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1437 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
1438 if (b == 0xff) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1439 int c = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1440 if (c != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1441 j->marker = (unsigned char) c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1442 j->nomore = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1443 return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1444 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1445 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1446 j->code_buffer |= b << (24 - j->code_bits);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1447 j->code_bits += 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1448 } while (j->code_bits <= 24);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1451 // (1 << n) - 1
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1452 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
1453
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1454 // decode a jpeg huffman value from the bitstream
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1455 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
1456 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1457 unsigned int temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1458 int c,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1459
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1460 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
1461
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1462 // 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
1463 // if the code is <= FAST_BITS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1464 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
1465 k = h->fast[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1466 if (k < 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1467 int s = h->size[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1468 if (s > j->code_bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1469 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1470 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1471 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1472 return h->values[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1473 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1474
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1475 // 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
1476 // 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
1477 // 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
1478 // 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
1479 // 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
1480 // 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
1481 temp = j->code_buffer >> 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1482 for (k=FAST_BITS+1 ; ; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1483 if (temp < h->maxcode[k])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1484 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1485 if (k == 17) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1486 // error! code not found
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1487 j->code_bits -= 16;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1491 if (k > j->code_bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1492 return -1;
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 huffman code to the symbol id
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1495 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
1496 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
1497
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1498 // convert the id to a symbol
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1499 j->code_bits -= k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1500 j->code_buffer <<= k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1501 return h->values[c];
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1504 // bias[n] = (-1<<n) + 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1505 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
1506
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1507 // combined JPEG 'receive' and JPEG 'extend', since baseline
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1508 // always extends everything it receives.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1509 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
1510 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1511 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1512 int sgn;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1513 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
1514
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1515 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
1516 k = stbi_lrot(j->code_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1517 j->code_buffer = k & ~stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1518 k &= stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1519 j->code_bits -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1520 return k + (stbi__jbias[n] & ~sgn);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1523 // get some unsigned bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1524 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
1525 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1526 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1527 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
1528 k = stbi_lrot(j->code_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1529 j->code_buffer = k & ~stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1530 k &= stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1531 j->code_bits -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1532 return k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1533 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1534
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1535 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
1536 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1537 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1538 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
1539 k = j->code_buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1540 j->code_buffer <<= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1541 --j->code_bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1542 return k & 0x80000000;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1543 }
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 // 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
1546 // 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
1547 static Uint8 stbi__jpeg_dezigzag[64+15] =
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1548 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1549 0, 1, 8, 16, 9, 2, 3, 10,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1550 17, 24, 32, 25, 18, 11, 4, 5,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1551 12, 19, 26, 33, 40, 48, 41, 34,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1552 27, 20, 13, 6, 7, 14, 21, 28,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1553 35, 42, 49, 56, 57, 50, 43, 36,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1554 29, 22, 15, 23, 30, 37, 44, 51,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1555 58, 59, 52, 45, 38, 31, 39, 46,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1556 53, 60, 61, 54, 47, 55, 62, 63,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1557 // let corrupt input sample past end
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1558 63, 63, 63, 63, 63, 63, 63, 63,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1559 63, 63, 63, 63, 63, 63, 63
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1562 // decode one 64-entry block--
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1563 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
1564 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1565 int diff,dc,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1566 int t;
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 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
1569 t = stbi__jpeg_huff_decode(j, hdc);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1570 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
1571
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1572 // 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
1573 memset(data,0,64*sizeof(data[0]));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1574
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1575 diff = t ? stbi__extend_receive(j, t) : 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1576 dc = j->img_comp[b].dc_pred + diff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1577 j->img_comp[b].dc_pred = dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1578 data[0] = (short) (dc * dequant[0]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1579
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1580 // decode AC components, see JPEG spec
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1581 k = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1582 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1583 unsigned int zig;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1584 int c,r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1585 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
1586 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
1587 r = fac[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1588 if (r) { // fast-AC path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1589 k += (r >> 4) & 15; // run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1590 s = r & 15; // combined length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1591 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1592 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1593 // decode into unzigzag'd location
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1594 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1595 data[zig] = (short) ((r >> 8) * dequant[zig]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1596 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1597 int rs = stbi__jpeg_huff_decode(j, hac);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1598 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
1599 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1600 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1601 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1602 if (rs != 0xf0) break; // end block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1603 k += 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1604 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1605 k += r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1606 // decode into unzigzag'd location
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1607 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1608 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
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 } while (k < 64);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1612 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1613 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1614
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1615 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
1616 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1617 int diff,dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1618 int t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1619 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
1620
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1621 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
1622
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1623 if (j->succ_high == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1624 // first scan for DC coefficient, must be first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1625 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
1626 t = stbi__jpeg_huff_decode(j, hdc);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1627 diff = t ? stbi__extend_receive(j, t) : 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1628
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1629 dc = j->img_comp[b].dc_pred + diff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1630 j->img_comp[b].dc_pred = dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1631 data[0] = (short) (dc << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1632 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1633 // refinement scan for DC coefficient
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1634 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1635 data[0] += (short) (1 << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1636 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1637 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1638 }
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 // @OPTIMIZE: store non-zigzagged during the decode passes,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1641 // and only de-zigzag when dequantizing
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1642 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
1643 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1644 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1645 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
1646
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1647 if (j->succ_high == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1648 int shift = j->succ_low;
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 if (j->eob_run) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1651 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1652 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1653 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1654
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1655 k = j->spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1656 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1657 unsigned int zig;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1658 int c,r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1659 if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1660 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
1661 r = fac[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1662 if (r) { // fast-AC path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1663 k += (r >> 4) & 15; // run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1664 s = r & 15; // combined length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1665 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1666 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1667 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1668 data[zig] = (short) ((r >> 8) << shift);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1669 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1670 int rs = stbi__jpeg_huff_decode(j, hac);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1671 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
1672 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1673 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1674 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1675 if (r < 15) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1676 j->eob_run = (1 << r);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1677 if (r)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1678 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
1679 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1680 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1681 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1682 k += 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1683 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1684 k += r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1685 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1686 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
1687 }
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 } while (k <= j->spec_end);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1690 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1691 // refinement scan for these AC coefficients
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1692
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1693 short bit = (short) (1 << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1694
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1695 if (j->eob_run) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1696 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1697 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
1698 short *p = &data[stbi__jpeg_dezigzag[k]];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1699 if (*p != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1700 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1701 if ((*p & bit)==0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1702 if (*p > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1703 *p += bit;
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 *p -= bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1706 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1707 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1708 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1709 k = j->spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1710 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1711 int r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1712 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
1713 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
1714 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1715 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1716 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1717 if (r < 15) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1718 j->eob_run = (1 << r) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1719 if (r)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1720 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
1721 r = 64; // force end of block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1722 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1723 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
1724 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1725 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
1726 // sign bit
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1727 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1728 s = bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1729 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1730 s = -bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1731 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1732
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1733 // advance by r
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1734 while (k <= j->spec_end) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1735 short *p = &data[stbi__jpeg_dezigzag[k]];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1736 if (*p != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1737 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1738 if ((*p & bit)==0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1739 if (*p > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1740 *p += bit;
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 *p -= bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1743 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1744 ++k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1745 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1746 if (r == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1747 if (s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1748 data[stbi__jpeg_dezigzag[k++]] = (short) s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1749 break;
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 --r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1752 ++k;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1755 } while (k <= j->spec_end);
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1758 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1761 // 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
1762 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
1763 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1764 // 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
1765 if ((unsigned int) x > 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1766 if (x < 0) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1767 if (x > 255) return 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1768 }
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1769 return (Uint8) x;
893
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1772 #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
1773 #define stbi__fsh(x) ((x) << 12)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1774
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1775 // derived from jidctint -- DCT_ISLOW
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1776 #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
1777 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
1778 p2 = s2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1779 p3 = s6; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1780 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1781 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1782 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1783 p2 = s0; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1784 p3 = s4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1785 t0 = stbi__fsh(p2+p3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1786 t1 = stbi__fsh(p2-p3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1787 x0 = t0+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1788 x3 = t0-t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1789 x1 = t1+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1790 x2 = t1-t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1791 t0 = s7; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1792 t1 = s5; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1793 t2 = s3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1794 t3 = s1; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1795 p3 = t0+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1796 p4 = t1+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1797 p1 = t0+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1798 p2 = t1+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1799 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1800 t0 = t0*stbi__f2f( 0.298631336f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1801 t1 = t1*stbi__f2f( 2.053119869f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1802 t2 = t2*stbi__f2f( 3.072711026f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1803 t3 = t3*stbi__f2f( 1.501321110f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1804 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1805 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1806 p3 = p3*stbi__f2f(-1.961570560f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1807 p4 = p4*stbi__f2f(-0.390180644f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1808 t3 += p1+p4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1809 t2 += p2+p3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1810 t1 += p2+p4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1811 t0 += p1+p3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1812
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1813 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
1814 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1815 int i,val[64],*v=val;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1816 Uint8 *o;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1817 short *d = data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1818
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1819 // columns
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1820 for (i=0; i < 8; ++i,++d, ++v) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1821 // 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
1822 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
1823 && 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
1824 // no shortcut 0 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1825 // (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
1826 // all separate -0.047 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1827 // 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
1828 int dcterm = d[0] << 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1829 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
1830 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1831 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
1832 // 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
1833 // down, but keep 2 extra bits of precision
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1834 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1835 v[ 0] = (x0+t3) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1836 v[56] = (x0-t3) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1837 v[ 8] = (x1+t2) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1838 v[48] = (x1-t2) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1839 v[16] = (x2+t1) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1840 v[40] = (x2-t1) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1841 v[24] = (x3+t0) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1842 v[32] = (x3-t0) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1843 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1844 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1845
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1846 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
1847 // 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
1848 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
1849 // 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
1850 // 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
1851 // 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
1852 // 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
1853 // 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
1854 // 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
1855 x0 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1856 x1 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1857 x2 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1858 x3 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1859 // 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
1860 // 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
1861 o[0] = stbi__clamp((x0+t3) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1862 o[7] = stbi__clamp((x0-t3) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1863 o[1] = stbi__clamp((x1+t2) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1864 o[6] = stbi__clamp((x1-t2) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1865 o[2] = stbi__clamp((x2+t1) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1866 o[5] = stbi__clamp((x2-t1) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1867 o[3] = stbi__clamp((x3+t0) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1868 o[4] = stbi__clamp((x3-t0) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1869 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1870 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1871
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1872 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1873 // 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
1874 // 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
1875 // fully "transparent".
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1876 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
1877 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1878 // 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
1879 __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
1880 __m128i tmp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1881
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1882 // 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
1883 #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
1884
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1885 // 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
1886 // out(1) = c1[even]*x + c1[odd]*y
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1887 #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
1888 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1889 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1890 __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
1891 __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
1892 __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
1893 __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
1894
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1895 // 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
1896 #define dct_widen(out, in) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1897 __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
1898 __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
1899
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1900 // wide add
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1901 #define dct_wadd(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1902 __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
1903 __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
1904
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1905 // wide sub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1906 #define dct_wsub(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1907 __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
1908 __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
1909
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1910 // 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
1911 #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
1912 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1913 __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
1914 __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
1915 dct_wadd(sum, abiased, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1916 dct_wsub(dif, abiased, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1917 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
1918 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
1919 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1920
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1921 // 8-bit interleave step (for transposes)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1922 #define dct_interleave8(a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1923 tmp = a; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1924 a = _mm_unpacklo_epi8(a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1925 b = _mm_unpackhi_epi8(tmp, b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1926
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1927 // 16-bit interleave step (for transposes)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1928 #define dct_interleave16(a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1929 tmp = a; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1930 a = _mm_unpacklo_epi16(a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1931 b = _mm_unpackhi_epi16(tmp, b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1932
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1933 #define dct_pass(bias,shift) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1934 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1935 /* even part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1936 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
1937 __m128i sum04 = _mm_add_epi16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1938 __m128i dif04 = _mm_sub_epi16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1939 dct_widen(t0e, sum04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1940 dct_widen(t1e, dif04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1941 dct_wadd(x0, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1942 dct_wsub(x3, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1943 dct_wadd(x1, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1944 dct_wsub(x2, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1945 /* odd part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1946 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
1947 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
1948 __m128i sum17 = _mm_add_epi16(row1, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1949 __m128i sum35 = _mm_add_epi16(row3, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1950 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
1951 dct_wadd(x4, y0o, y4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1952 dct_wadd(x5, y1o, y5o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1953 dct_wadd(x6, y2o, y5o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1954 dct_wadd(x7, y3o, y4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1955 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1956 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1957 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1958 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1959 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1960
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1961 __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
1962 __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
1963 __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
1964 __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
1965 __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
1966 __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
1967 __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
1968 __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
1969
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1970 // 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
1971 __m128i bias_0 = _mm_set1_epi32(512);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1972 __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
1973
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1974 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1975 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
1976 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
1977 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
1978 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
1979 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
1980 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
1981 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
1982 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
1983
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1984 // column pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1985 dct_pass(bias_0, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1986
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1987 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1988 // 16bit 8x8 transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1989 dct_interleave16(row0, row4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1990 dct_interleave16(row1, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1991 dct_interleave16(row2, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1992 dct_interleave16(row3, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1993
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1994 // transpose pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1995 dct_interleave16(row0, row2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1996 dct_interleave16(row1, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1997 dct_interleave16(row4, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1998 dct_interleave16(row5, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1999
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2000 // transpose pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2001 dct_interleave16(row0, row1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2002 dct_interleave16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2003 dct_interleave16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2004 dct_interleave16(row6, row7);
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 // row pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2008 dct_pass(bias_1, 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2009
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2010 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2011 // pack
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2012 __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
2013 __m128i p1 = _mm_packus_epi16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2014 __m128i p2 = _mm_packus_epi16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2015 __m128i p3 = _mm_packus_epi16(row6, row7);
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 // 8bit 8x8 transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2018 dct_interleave8(p0, p2); // a0e0a1e1...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2019 dct_interleave8(p1, p3); // c0g0c1g1...
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 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2022 dct_interleave8(p0, p1); // a0c0e0g0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2023 dct_interleave8(p2, p3); // b0d0f0h0...
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 // transpose pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2026 dct_interleave8(p0, p2); // a0b0c0d0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2027 dct_interleave8(p1, p3); // a4b4c4d4...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2028
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2029 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2030 _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
2031 _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
2032 _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
2033 _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
2034 _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
2035 _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
2036 _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
2037 _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
2038 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2039
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2040 #undef dct_const
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2041 #undef dct_rot
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2042 #undef dct_widen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2043 #undef dct_wadd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2044 #undef dct_wsub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2045 #undef dct_bfly32o
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2046 #undef dct_interleave8
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2047 #undef dct_interleave16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2048 #undef dct_pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2049 }
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 #endif // STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2052
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2053 #ifdef STBI_NEON
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 // NEON integer IDCT. should produce bit-identical
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2056 // results to the generic C version.
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2057 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
2058 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2059 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
2060
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2061 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
2062 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
2063 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
2064 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
2065 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
2066 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
2067 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
2068 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
2069 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
2070 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
2071 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
2072 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
2073
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2074 #define dct_long_mul(out, inq, coeff) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2075 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
2076 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
2077
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2078 #define dct_long_mac(out, acc, inq, coeff) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2079 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
2080 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
2081
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2082 #define dct_widen(out, inq) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2083 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
2084 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
2085
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2086 // wide add
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2087 #define dct_wadd(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2088 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
2089 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
2090
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2091 // wide sub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2092 #define dct_wsub(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2093 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
2094 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
2095
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2096 // 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
2097 #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
2098 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2099 dct_wadd(sum, a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2100 dct_wsub(dif, a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2101 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
2102 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
2103 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2104
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2105 #define dct_pass(shiftop, shift) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2106 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2107 /* even part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2108 int16x8_t sum26 = vaddq_s16(row2, row6); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2109 dct_long_mul(p1e, sum26, rot0_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2110 dct_long_mac(t2e, p1e, row6, rot0_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2111 dct_long_mac(t3e, p1e, row2, rot0_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2112 int16x8_t sum04 = vaddq_s16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2113 int16x8_t dif04 = vsubq_s16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2114 dct_widen(t0e, sum04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2115 dct_widen(t1e, dif04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2116 dct_wadd(x0, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2117 dct_wsub(x3, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2118 dct_wadd(x1, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2119 dct_wsub(x2, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2120 /* odd part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2121 int16x8_t sum15 = vaddq_s16(row1, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2122 int16x8_t sum17 = vaddq_s16(row1, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2123 int16x8_t sum35 = vaddq_s16(row3, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2124 int16x8_t sum37 = vaddq_s16(row3, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2125 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2126 dct_long_mul(p5o, sumodd, rot1_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2127 dct_long_mac(p1o, p5o, sum17, rot1_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2128 dct_long_mac(p2o, p5o, sum35, rot1_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2129 dct_long_mul(p3o, sum37, rot2_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2130 dct_long_mul(p4o, sum15, rot2_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2131 dct_wadd(sump13o, p1o, p3o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2132 dct_wadd(sump24o, p2o, p4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2133 dct_wadd(sump23o, p2o, p3o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2134 dct_wadd(sump14o, p1o, p4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2135 dct_long_mac(x4, sump13o, row7, rot3_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2136 dct_long_mac(x5, sump24o, row5, rot3_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2137 dct_long_mac(x6, sump23o, row3, rot3_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2138 dct_long_mac(x7, sump14o, row1, rot3_3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2139 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2140 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2141 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2142 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2143 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2144
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2145 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2146 row0 = vld1q_s16(data + 0*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2147 row1 = vld1q_s16(data + 1*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2148 row2 = vld1q_s16(data + 2*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2149 row3 = vld1q_s16(data + 3*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2150 row4 = vld1q_s16(data + 4*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2151 row5 = vld1q_s16(data + 5*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2152 row6 = vld1q_s16(data + 6*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2153 row7 = vld1q_s16(data + 7*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2154
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2155 // add DC bias
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2156 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
2157
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2158 // column pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2159 dct_pass(vrshrn_n_s32, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2160
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2161 // 16bit 8x8 transpose
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2162 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2163 // 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
2164 // 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
2165 #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
2166 #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
2167 #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
2168
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2169 // pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2170 dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2171 dct_trn16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2172 dct_trn16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2173 dct_trn16(row6, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2174
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2175 // pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2176 dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2177 dct_trn32(row1, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2178 dct_trn32(row4, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2179 dct_trn32(row5, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2180
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2181 // pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2182 dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2183 dct_trn64(row1, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2184 dct_trn64(row2, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2185 dct_trn64(row3, row7);
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 #undef dct_trn16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2188 #undef dct_trn32
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2189 #undef dct_trn64
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2190 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2191
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2192 // row pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2193 // 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
2194 // 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
2195 // up with a rounding shift by 1.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2196 dct_pass(vshrn_n_s32, 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2197
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2198 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2199 // pack and round
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2200 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2201 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2202 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2203 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2204 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2205 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2206 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2207 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2208
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2209 // 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
2210 #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
2211 #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
2212 #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
2213
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2214 // 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
2215 // 8 bytes to each scan line!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2216
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2217 // 8x8 8-bit transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2218 dct_trn8_8(p0, p1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2219 dct_trn8_8(p2, p3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2220 dct_trn8_8(p4, p5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2221 dct_trn8_8(p6, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2222
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2223 // pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2224 dct_trn8_16(p0, p2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2225 dct_trn8_16(p1, p3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2226 dct_trn8_16(p4, p6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2227 dct_trn8_16(p5, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2228
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2229 // pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2230 dct_trn8_32(p0, p4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2231 dct_trn8_32(p1, p5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2232 dct_trn8_32(p2, p6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2233 dct_trn8_32(p3, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2234
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2235 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2236 vst1_u8(out, p0); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2237 vst1_u8(out, p1); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2238 vst1_u8(out, p2); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2239 vst1_u8(out, p3); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2240 vst1_u8(out, p4); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2241 vst1_u8(out, p5); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2242 vst1_u8(out, p6); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2243 vst1_u8(out, p7);
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 #undef dct_trn8_8
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2246 #undef dct_trn8_16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2247 #undef dct_trn8_32
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2248 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2249
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2250 #undef dct_long_mul
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2251 #undef dct_long_mac
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2252 #undef dct_widen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2253 #undef dct_wadd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2254 #undef dct_wsub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2255 #undef dct_bfly32o
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2256 #undef dct_pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2257 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2258
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2259 #endif // STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2260
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2261 #define STBI__MARKER_none 0xff
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2262 // 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
2263 // 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
2264 // 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
2265 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
2266 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2267 Uint8 x;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2268 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
2269 x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2270 if (x != 0xff) return STBI__MARKER_none;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2271 while (x == 0xff)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2272 x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2273 return x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2274 }
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 // 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
2277 // of the components is specified by order[]
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2278 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
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 // 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
2281 // the dc prediction
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2282 static void stbi__jpeg_reset(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2283 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2284 j->code_bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2285 j->code_buffer = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2286 j->nomore = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2287 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
2288 j->marker = STBI__MARKER_none;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2289 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
2290 j->eob_run = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2291 // 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
2292 // 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
2293 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2294
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2295 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
2296 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2297 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2298 if (!z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2299 if (z->scan_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2300 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2301 STBI_SIMD_ALIGN(short, data[64]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2302 int n = z->order[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2303 // 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
2304 // in trivial scanline order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2305 // 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
2306 // 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
2307 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
2308 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
2309 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2310 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2311 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2312 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
2313 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
2314 // 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
2315 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2316 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
2317 // 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
2318 // rather than no data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2319 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2320 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2321 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2322 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2323 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2324 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2325 } else { // interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2326 int i,j,k,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2327 STBI_SIMD_ALIGN(short, data[64]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2328 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
2329 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
2330 // 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
2331 for (k=0; k < z->scan_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2332 int n = z->order[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2333 // 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
2334 // 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
2335 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
2336 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
2337 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
2338 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
2339 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2340 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
2341 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
2342 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2343 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2344 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2345 // 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
2346 // so now count down the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2347 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2348 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
2349 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2350 stbi__jpeg_reset(z);
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2353 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2354 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2355 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2356 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2357 if (z->scan_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2358 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2359 int n = z->order[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2360 // 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
2361 // in trivial scanline order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2362 // 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
2363 // 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
2364 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
2365 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
2366 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2367 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2368 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
2369 if (z->spec_start == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2370 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
2371 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2372 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2373 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2374 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
2375 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2376 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2377 // 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
2378 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2379 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
2380 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2381 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2382 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2383 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2384 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2385 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2386 } else { // interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2387 int i,j,k,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2388 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
2389 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
2390 // 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
2391 for (k=0; k < z->scan_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2392 int n = z->order[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2393 // 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
2394 // 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
2395 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
2396 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
2397 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
2398 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
2399 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
2400 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
2401 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2402 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2403 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2404 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2405 // 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
2406 // so now count down the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2407 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2408 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
2409 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2410 stbi__jpeg_reset(z);
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 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2415 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2418
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2419 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
2420 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2421 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2422 for (i=0; i < 64; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2423 data[i] *= dequant[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2424 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2425
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2426 static void stbi__jpeg_finish(stbi__jpeg *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2427 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2428 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2429 // dequantize and idct the data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2430 int i,j,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2431 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
2432 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
2433 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
2434 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2435 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2436 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
2437 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
2438 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
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 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2444
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2445 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
2446 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2447 int L;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2448 switch (m) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2449 case STBI__MARKER_none: // no marker found
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2450 return stbi__err("expected marker","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2451
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2452 case 0xDD: // DRI - specify restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2453 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
2454 z->restart_interval = stbi__get16be(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2455 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2456
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2457 case 0xDB: // DQT - define quantization table
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2458 L = stbi__get16be(z->s)-2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2459 while (L > 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2460 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2461 int p = q >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2462 int t = q & 15,i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2463 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
2464 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
2465 for (i=0; i < 64; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2466 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
2467 L -= 65;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2468 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2469 return L==0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2470
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2471 case 0xC4: // DHT - define huffman table
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2472 L = stbi__get16be(z->s)-2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2473 while (L > 0) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2474 Uint8 *v;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2475 int sizes[16],i,n=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2476 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2477 int tc = q >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2478 int th = q & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2479 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
2480 for (i=0; i < 16; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2481 sizes[i] = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2482 n += sizes[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2483 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2484 L -= 17;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2485 if (tc == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2486 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
2487 v = z->huff_dc[th].values;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2488 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2489 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
2490 v = z->huff_ac[th].values;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2491 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2492 for (i=0; i < n; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2493 v[i] = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2494 if (tc != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2495 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
2496 L -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2497 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2498 return L==0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2499 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2500 // check for comment block or APP blocks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2501 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2502 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
2503 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2504 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2505 return 0;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2508 // after we see SOS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2509 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
2510 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2511 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2512 int Ls = stbi__get16be(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2513 z->scan_n = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2514 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
2515 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
2516 for (i=0; i < z->scan_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2517 int id = stbi__get8(z->s), which;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2518 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2519 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
2520 if (z->img_comp[which].id == id)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2521 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2522 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
2523 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
2524 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
2525 z->order[i] = which;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2526 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2527
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2528 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2529 int aa;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2530 z->spec_start = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2531 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
2532 aa = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2533 z->succ_high = (aa >> 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2534 z->succ_low = (aa & 15);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2535 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2536 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
2537 return stbi__err("bad SOS", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2538 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2539 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
2540 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
2541 z->spec_end = 63;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2545 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2546 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2547
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2548 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
2549 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2550 stbi__context *s = z->s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2551 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
2552 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
2553 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
2554 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
2555 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
2556 c = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2557 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
2558 s->img_n = c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2559 for (i=0; i < c; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2560 z->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2561 z->img_comp[i].linebuf = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2562 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2563
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2564 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
2565
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2566 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2567 z->img_comp[i].id = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2568 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
2569 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
2570 return stbi__err("bad component ID","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2571 q = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2572 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
2573 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
2574 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
2575 }
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 if (scan != STBI__SCAN_load) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2578
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2579 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
2580
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2581 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2582 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
2583 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
2584 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2585
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2586 // compute interleaved mcu info
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2587 z->img_h_max = h_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2588 z->img_v_max = v_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2589 z->img_mcu_w = h_max * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2590 z->img_mcu_h = v_max * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2591 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
2592 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
2593
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2594 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2595 // 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
2596 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
2597 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
2598 // 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
2599 // 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
2600 // 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
2601 // discard the extra data until colorspace conversion
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2602 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
2603 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
2604 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
2605
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2606 if (z->img_comp[i].raw_data == NULL) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2607 for(--i; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2608 STBI_FREE(z->img_comp[i].raw_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2609 z->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2610 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2611 return stbi__err("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2612 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2613 // 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
2614 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
2615 z->img_comp[i].linebuf = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2616 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2617 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
2618 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
2619 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
2620 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
2621 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2622 z->img_comp[i].coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2623 z->img_comp[i].raw_coeff = 0;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2627 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2628 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2629
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2630 // 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
2631 #define stbi__DNL(x) ((x) == 0xdc)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2632 #define stbi__SOI(x) ((x) == 0xd8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2633 #define stbi__EOI(x) ((x) == 0xd9)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2634 #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
2635 #define stbi__SOS(x) ((x) == 0xda)
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 #define stbi__SOF_progressive(x) ((x) == 0xc2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2638
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2639 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
2640 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2641 int m;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2642 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
2643 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2644 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
2645 if (scan == STBI__SCAN_type) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2646 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2647 while (!stbi__SOF(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2648 if (!stbi__process_marker(z,m)) return 0;
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 while (m == STBI__MARKER_none) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2651 // 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
2652 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
2653 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2654 }
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 z->progressive = stbi__SOF_progressive(m);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2657 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
2658 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2661 // decode image to YCbCr format
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2662 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
2663 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2664 int m;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2665 j->restart_interval = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2666 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
2667 m = stbi__get_marker(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2668 while (!stbi__EOI(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2669 if (stbi__SOS(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2670 if (!stbi__process_scan_header(j)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2671 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
2672 if (j->marker == STBI__MARKER_none ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2673 // 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
2674 while (!stbi__at_eof(j->s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2675 int x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2676 if (x == 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2677 j->marker = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2678 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2679 } else if (x != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2680 return stbi__err("junk before marker", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2681 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2682 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2683 // 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
2684 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2685 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2686 if (!stbi__process_marker(j, m)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2687 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2688 m = stbi__get_marker(j);
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 if (j->progressive)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2691 stbi__jpeg_finish(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2692 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2693 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2694
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2695 // static jfif-centered resampling (across block boundaries)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2696
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2697 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
2698 int w, int hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2699
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2700 #define stbi__div4(x) ((Uint8) ((x) >> 2))
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2701
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2702 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
2703 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2704 STBI_NOTUSED(out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2705 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2706 STBI_NOTUSED(w);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2707 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2708 return in_near;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2709 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2710
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2711 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
2712 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2713 // 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
2714 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2715 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2716 for (i=0; i < w; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2717 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
2718 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2719 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2720
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2721 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
2722 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2723 // 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
2724 int i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2725 Uint8 *input = in_near;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2726
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2727 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2728 // 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
2729 out[0] = out[1] = input[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2730 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2731 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2732
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2733 out[0] = input[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2734 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
2735 for (i=1; i < w-1; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2736 int n = 3*input[i]+2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2737 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
2738 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
2739 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2740 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
2741 out[i*2+1] = input[w-1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2742
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2743 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2744 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2745
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2746 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2747 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2748
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2749 #define stbi__div16(x) ((Uint8) ((x) >> 4))
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2750
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2751 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
2752 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2753 // 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
2754 int i,t0,t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2755 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2756 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
2757 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2758 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2759
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2760 t1 = 3*in_near[0] + in_far[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2761 out[0] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2762 for (i=1; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2763 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2764 t1 = 3*in_near[i]+in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2765 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
2766 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
2767 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2768 out[w*2-1] = stbi__div4(t1+2);
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 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2771
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2772 return out;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2775 #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
2776 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
2777 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2778 // 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
2779 int i=0,t0,t1;
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 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2782 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
2783 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2784 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2785
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2786 t1 = 3*in_near[0] + in_far[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2787 // 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
2788 // 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
2789 // 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
2790 for (; i < ((w-1) & ~7); i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2791 #if defined(STBI_SSE2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2792 // load and perform the vertical filtering pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2793 // 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
2794 __m128i zero = _mm_setzero_si128();
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2795 __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
2796 __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
2797 __m128i farw = _mm_unpacklo_epi8(farb, zero);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2798 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2799 __m128i diff = _mm_sub_epi16(farw, nearw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2800 __m128i nears = _mm_slli_epi16(nearw, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2801 __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
2802
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2803 // 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
2804 // 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
2805 // insert the previous pixel value (from t1).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2806 // "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
2807 // of next block of 8 pixels added in.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2808 __m128i prv0 = _mm_slli_si128(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2809 __m128i nxt0 = _mm_srli_si128(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2810 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2811 __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
2812
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2813 // horizontal filter, polyphase implementation since it's convenient:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2814 // 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
2815 // 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
2816 // note the shared term.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2817 __m128i bias = _mm_set1_epi16(8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2818 __m128i curs = _mm_slli_epi16(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2819 __m128i prvd = _mm_sub_epi16(prev, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2820 __m128i nxtd = _mm_sub_epi16(next, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2821 __m128i curb = _mm_add_epi16(curs, bias);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2822 __m128i even = _mm_add_epi16(prvd, curb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2823 __m128i odd = _mm_add_epi16(nxtd, curb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2824
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2825 // interleave even and odd pixels, then undo scaling.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2826 __m128i int0 = _mm_unpacklo_epi16(even, odd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2827 __m128i int1 = _mm_unpackhi_epi16(even, odd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2828 __m128i de0 = _mm_srli_epi16(int0, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2829 __m128i de1 = _mm_srli_epi16(int1, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2830
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2831 // pack and write output
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2832 __m128i outv = _mm_packus_epi16(de0, de1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2833 _mm_storeu_si128((__m128i *) (out + i*2), outv);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2834 #elif defined(STBI_NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2835 // load and perform the vertical filtering pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2836 // 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
2837 uint8x8_t farb = vld1_u8(in_far + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2838 uint8x8_t nearb = vld1_u8(in_near + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2839 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
2840 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
2841 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
2842
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2843 // 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
2844 // 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
2845 // insert the previous pixel value (from t1).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2846 // "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
2847 // of next block of 8 pixels added in.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2848 int16x8_t prv0 = vextq_s16(curr, curr, 7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2849 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2850 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
2851 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
2852
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2853 // horizontal filter, polyphase implementation since it's convenient:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2854 // 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
2855 // 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
2856 // note the shared term.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2857 int16x8_t curs = vshlq_n_s16(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2858 int16x8_t prvd = vsubq_s16(prev, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2859 int16x8_t nxtd = vsubq_s16(next, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2860 int16x8_t even = vaddq_s16(curs, prvd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2861 int16x8_t odd = vaddq_s16(curs, nxtd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2862
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2863 // 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
2864 uint8x8x2_t o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2865 o.val[0] = vqrshrun_n_s16(even, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2866 o.val[1] = vqrshrun_n_s16(odd, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2867 vst2_u8(out + i*2, o);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2868 #endif
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 // "previous" value for next iter
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2871 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
2872 }
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 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2875 t1 = 3*in_near[i] + in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2876 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
2877
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2878 for (++i; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2879 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2880 t1 = 3*in_near[i]+in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2881 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
2882 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
2883 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2884 out[w*2-1] = stbi__div4(t1+2);
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 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2887
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2888 return out;
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 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2891
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2892 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
2893 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2894 // resample with nearest-neighbor
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2895 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2896 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2897 for (i=0; i < w; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2898 for (j=0; j < hs; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2899 out[i*hs+j] = in_near[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2900 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2901 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2902
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2903 #ifdef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2904 // 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
2905 // historically before the algorithm changes in 1.49
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2906 #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
2907 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
2908 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2909 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2910 for (i=0; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2911 int y_fixed = (y[i] << 16) + 32768; // rounding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2912 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2913 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2914 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2915 r = y_fixed + cr*float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2916 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
2917 b = y_fixed + cb*float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2918 r >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2919 g >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2920 b >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2921 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
2922 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
2923 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
2924 out[0] = (Uint8)r;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2925 out[1] = (Uint8)g;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2926 out[2] = (Uint8)b;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2927 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2928 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2929 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2930 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2931 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2932 // 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
2933 // 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
2934 #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
2935 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
2936 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2937 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2938 for (i=0; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2939 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
2940 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2941 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2942 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2943 r = y_fixed + cr* float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2944 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
2945 b = y_fixed + cb* float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2946 r >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2947 g >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2948 b >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2949 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
2950 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
2951 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
2952 out[0] = (Uint8)r;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2953 out[1] = (Uint8)g;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2954 out[2] = (Uint8)b;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2955 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2956 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2957 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2958 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2959 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2960
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2961 #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
2962 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
2963 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2964 int i = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2965
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2966 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2967 // 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
2968 // 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
2969 // so just accelerate step == 4 case.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2970 if (step == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2971 // 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
2972 __m128i signflip = _mm_set1_epi8(-0x80);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2973 __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
2974 __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
2975 __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
2976 __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
2977 __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
2978 __m128i xw = _mm_set1_epi16(255); // alpha channel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2979
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2980 for (; i+7 < count; i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2981 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2982 __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
2983 __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
2984 __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
2985 __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
2986 __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
2987
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2988 // 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
2989 __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
2990 __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
2991 __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
2992
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2993 // color transform
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2994 __m128i yws = _mm_srli_epi16(yw, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2995 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2996 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2997 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2998 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2999 __m128i rws = _mm_add_epi16(cr0, yws);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3000 __m128i gwt = _mm_add_epi16(cb0, yws);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3001 __m128i bws = _mm_add_epi16(yws, cb1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3002 __m128i gws = _mm_add_epi16(gwt, cr1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3003
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3004 // descale
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3005 __m128i rw = _mm_srai_epi16(rws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3006 __m128i bw = _mm_srai_epi16(bws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3007 __m128i gw = _mm_srai_epi16(gws, 4);
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 // back to byte, set up for transpose
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3010 __m128i brb = _mm_packus_epi16(rw, bw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3011 __m128i gxb = _mm_packus_epi16(gw, xw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3012
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3013 // transpose to interleave channels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3014 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3015 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3016 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3017 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3018
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3019 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3020 _mm_storeu_si128((__m128i *) (out + 0), o0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3021 _mm_storeu_si128((__m128i *) (out + 16), o1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3022 out += 32;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3023 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3024 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3025 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3026
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3027 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3028 // 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
3029 if (step == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3030 // 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
3031 uint8x8_t signflip = vdup_n_u8(0x80);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3032 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
3033 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
3034 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
3035 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
3036
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3037 for (; i+7 < count; i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3038 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3039 uint8x8_t y_bytes = vld1_u8(y + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3040 uint8x8_t cr_bytes = vld1_u8(pcr + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3041 uint8x8_t cb_bytes = vld1_u8(pcb + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3042 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
3043 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
3044
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3045 // expand to s16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3046 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
3047 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
3048 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
3049
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3050 // color transform
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3051 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3052 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3053 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3054 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3055 int16x8_t rws = vaddq_s16(yws, cr0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3056 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
3057 int16x8_t bws = vaddq_s16(yws, cb1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3058
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3059 // undo scaling, round, convert to byte
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3060 uint8x8x4_t o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3061 o.val[0] = vqrshrun_n_s16(rws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3062 o.val[1] = vqrshrun_n_s16(gws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3063 o.val[2] = vqrshrun_n_s16(bws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3064 o.val[3] = vdup_n_u8(255);
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 // store, interleaving r/g/b/a
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3067 vst4_u8(out, o);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3068 out += 8*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3069 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3070 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3071 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3072
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3073 for (; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3074 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
3075 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3076 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3077 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3078 r = y_fixed + cr* float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3079 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
3080 b = y_fixed + cb* float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3081 r >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3082 g >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3083 b >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3084 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
3085 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
3086 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
3087 out[0] = (Uint8)r;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3088 out[1] = (Uint8)g;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3089 out[2] = (Uint8)b;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3090 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3091 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3092 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3093 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3094 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3095
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3096 // set up the kernels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3097 static void stbi__setup_jpeg(stbi__jpeg *j)
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 j->idct_block_kernel = stbi__idct_block;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3100 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
3101 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
3102
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3103 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3104 if (stbi__sse2_available()) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3105 j->idct_block_kernel = stbi__idct_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3106 #ifndef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3107 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
3108 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3109 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
3110 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3111 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3112
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3113 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3114 j->idct_block_kernel = stbi__idct_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3115 #ifndef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3116 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
3117 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3118 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
3119 #endif
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3122 // clean up the temporary component buffers
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3123 static void stbi__cleanup_jpeg(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3124 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3125 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3126 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
3127 if (j->img_comp[i].raw_data) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3128 STBI_FREE(j->img_comp[i].raw_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3129 j->img_comp[i].raw_data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3130 j->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3131 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3132 if (j->img_comp[i].raw_coeff) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3133 STBI_FREE(j->img_comp[i].raw_coeff);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3134 j->img_comp[i].raw_coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3135 j->img_comp[i].coeff = 0;
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 if (j->img_comp[i].linebuf) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3138 STBI_FREE(j->img_comp[i].linebuf);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3139 j->img_comp[i].linebuf = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3140 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3141 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3142 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3143
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3144 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3145 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3146 resample_row_func resample;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3147 Uint8 *line0,*line1;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3148 int hs,vs; // expansion factor in each axis
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3149 int w_lores; // horizontal pixels pre-expansion
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3150 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
3151 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
3152 } stbi__resample;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3153
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3154 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
3155 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3156 int n, decode_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3157 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
3158
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3159 // validate req_comp
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3160 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
3161
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3162 // 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
3163 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
3164
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3165 // determine actual number of components to generate
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3166 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
3167
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3168 if (z->s->img_n == 3 && n < 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3169 decode_n = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3170 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3171 decode_n = z->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3172
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3173 // resample and color-convert
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3174 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3175 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3176 unsigned int i,j;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3177 Uint8 *output;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3178 Uint8 *coutput[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3179
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3180 stbi__resample res_comp[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3181
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3182 for (k=0; k < decode_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3183 stbi__resample *r = &res_comp[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3184
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3185 // 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
3186 // with upsample factor of 4
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3187 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
3188 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
3189
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3190 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
3191 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
3192 r->ystep = r->vs >> 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3193 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
3194 r->ypos = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3195 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
3196
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3197 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
3198 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
3199 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
3200 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
3201 else r->resample = stbi__resample_row_generic;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3202 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3203
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3204 // 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
3205 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
3206 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
3207
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3208 // now go ahead and resample
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3209 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
3210 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
3211 for (k=0; k < decode_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3212 stbi__resample *r = &res_comp[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3213 int y_bot = r->ystep >= (r->vs >> 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3214 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
3215 y_bot ? r->line1 : r->line0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3216 y_bot ? r->line0 : r->line1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3217 r->w_lores, r->hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3218 if (++r->ystep >= r->vs) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3219 r->ystep = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3220 r->line0 = r->line1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3221 if (++r->ypos < z->img_comp[k].y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3222 r->line1 += z->img_comp[k].w2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3223 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3224 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3225 if (n >= 3) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3226 Uint8 *y = coutput[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3227 if (z->s->img_n == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3228 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
3229 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3230 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
3231 out[0] = out[1] = out[2] = y[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3232 out[3] = 255; // not used if n==3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3233 out += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3234 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3235 } else {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3236 Uint8 *y = coutput[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3237 if (n == 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3238 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
3239 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3240 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
3241 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3242 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3243 stbi__cleanup_jpeg(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3244 *out_x = z->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3245 *out_y = z->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3246 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
3247 return output;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3250
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3251 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
3252 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3253 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3254 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3255 stbi__setup_jpeg(&j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3256 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
3257 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3258
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3259 static int stbi__jpeg_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3260 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3261 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3262 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3263 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3264 stbi__setup_jpeg(&j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3265 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
3266 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3267 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3268 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3269
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3270 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
3271 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3272 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
3273 stbi__rewind( j->s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3274 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3275 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3276 if (x) *x = j->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3277 if (y) *y = j->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3278 if (comp) *comp = j->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3279 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3280 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3281
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3282 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
3283 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3284 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3285 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3286 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
3287 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3288 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3289
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3290
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3291 // 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
3292 // simple implementation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3293 // - only 8-bit samples
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3294 // - no CRC checking
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3295 // - allocates lots of intermediate memory
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3296 // - avoids problem of streaming data between subsystems
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3297 // - avoids explicit window management
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3298 // performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3299 // - 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
3300
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3301 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3302 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3303 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3304 Uint32 length;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3305 Uint32 type;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3306 } stbi__pngchunk;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3307
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3308 static 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
3309 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3310 stbi__pngchunk c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3311 c.length = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3312 c.type = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3313 return c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3314 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3315
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3316 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
3317 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3318 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
3319 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3320 for (i=0; i < 8; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3321 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
3322 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3323 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3324
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3325 typedef struct
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 stbi__context *s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3328 Uint8 *idata, *expanded, *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3329 } stbi__png;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3330
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3331
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3332 enum {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3333 STBI__F_none=0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3334 STBI__F_sub=1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3335 STBI__F_up=2,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3336 STBI__F_avg=3,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3337 STBI__F_paeth=4,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3338 // 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
3339 STBI__F_avg_first,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3340 STBI__F_paeth_first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3341 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3342
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3343 static Uint8 first_row_filter[5] =
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3344 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3345 STBI__F_none,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3346 STBI__F_sub,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3347 STBI__F_none,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3348 STBI__F_avg_first,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3349 STBI__F_paeth_first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3350 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3351
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3352 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
3353 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3354 int p = a + b - c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3355 int pa = abs(p-a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3356 int pb = abs(p-b);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3357 int pc = abs(p-c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3358 if (pa <= pb && pa <= pc) return a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3359 if (pb <= pc) return b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3360 return c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3361 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3362
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3363 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
3364
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3365 // 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
3366 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
3367 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3368 stbi__context *s = a->s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3369 Uint32 i,j,stride = x*out_n;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3370 Uint32 img_len, img_width_bytes;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3371 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3372 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
3373
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3374 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
3375 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
3376 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
3377
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3378 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
3379 img_len = (img_width_bytes + 1) * y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3380 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
3381 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
3382 } else { // interlaced:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3383 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
3384 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3385
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3386 for (j=0; j < y; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3387 Uint8 *cur = a->out + stride*j;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3388 Uint8 *prior = cur - stride;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3389 int filter = *raw++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3390 int filter_bytes = img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3391 int width = x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3392 if (filter > 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3393 return stbi__err("invalid filter","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3394
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3395 if (depth < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3396 STBI_ASSERT(img_width_bytes <= x);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3397 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
3398 filter_bytes = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3399 width = img_width_bytes;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3402 // 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
3403 if (j == 0) filter = first_row_filter[filter];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3404
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3405 // handle first byte explicitly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3406 for (k=0; k < filter_bytes; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3407 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3408 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
3409 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
3410 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
3411 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
3412 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
3413 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
3414 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
3415 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3416 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3417
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3418 if (depth == 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3419 if (img_n != out_n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3420 cur[img_n] = 255; // first pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3421 raw += img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3422 cur += out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3423 prior += out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3424 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3425 raw += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3426 cur += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3427 prior += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3428 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3429
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3430 // 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
3431 if (depth < 8 || img_n == out_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3432 int nk = (width - 1)*img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3433 #define CASE(f) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3434 case f: \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3435 for (k=0; k < nk; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3436 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3437 // "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
3438 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
3439 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
3440 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
3441 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
3442 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
3443 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
3444 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
3445 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3446 #undef CASE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3447 raw += nk;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3448 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3449 STBI_ASSERT(img_n+1 == out_n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3450 #define CASE(f) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3451 case f: \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3452 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
3453 for (k=0; k < img_n; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3454 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3455 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
3456 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
3457 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
3458 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
3459 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
3460 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
3461 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
3462 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3463 #undef CASE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3464 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3465 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3466
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3467 // 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
3468 // 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
3469 // 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
3470 if (depth < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3471 for (j=0; j < y; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3472 Uint8 *cur = a->out + stride*j;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3473 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
3474 // 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
3475 // 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
3476 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
3477
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3478 // 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
3479 // 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
3480 // 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
3481 // 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
3482 // 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
3483
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3484 if (depth == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3485 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
3486 *cur++ = scale * ((*in >> 4) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3487 *cur++ = scale * ((*in ) & 0x0f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3488 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3489 if (k > 0) *cur++ = scale * ((*in >> 4) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3490 } else if (depth == 2) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3491 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
3492 *cur++ = scale * ((*in >> 6) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3493 *cur++ = scale * ((*in >> 4) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3494 *cur++ = scale * ((*in >> 2) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3495 *cur++ = scale * ((*in ) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3496 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3497 if (k > 0) *cur++ = scale * ((*in >> 6) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3498 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3499 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3500 } else if (depth == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3501 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
3502 *cur++ = scale * ((*in >> 7) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3503 *cur++ = scale * ((*in >> 6) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3504 *cur++ = scale * ((*in >> 5) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3505 *cur++ = scale * ((*in >> 4) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3506 *cur++ = scale * ((*in >> 3) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3507 *cur++ = scale * ((*in >> 2) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3508 *cur++ = scale * ((*in >> 1) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3509 *cur++ = scale * ((*in ) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3510 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3511 if (k > 0) *cur++ = scale * ((*in >> 7) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3512 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3513 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3514 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3515 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3516 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3517 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3518 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3519 if (img_n != out_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3520 // insert alpha = 255
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3521 Uint8 *cur = a->out + stride*j;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3522 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3523 if (img_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3524 for (i=x-1; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3525 cur[i*2+1] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3526 cur[i*2+0] = cur[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3527 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3528 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3529 STBI_ASSERT(img_n == 3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3530 for (i=x-1; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3531 cur[i*4+3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3532 cur[i*4+2] = cur[i*3+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3533 cur[i*4+1] = cur[i*3+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3534 cur[i*4+0] = cur[i*3+0];
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 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3540
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3541 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3542 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3543
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3544 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
3545 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3546 Uint8 *final;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3547 int p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3548 if (!interlaced)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3549 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
3550
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3551 // de-interlacing
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3552 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
3553 for (p=0; p < 7; ++p) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3554 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
3555 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
3556 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
3557 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
3558 int i,j,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3559 // 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
3560 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
3561 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
3562 if (x && y) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3563 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
3564 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
3565 STBI_FREE(final);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3566 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3567 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3568 for (j=0; j < y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3569 for (i=0; i < x; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3570 int out_y = j*yspc[p]+yorig[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3571 int out_x = i*xspc[p]+xorig[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3572 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
3573 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
3574 }
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 STBI_FREE(a->out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3577 image_data += img_len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3578 image_data_len -= img_len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3579 }
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 a->out = final;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3582
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3583 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3584 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3585
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3586 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
3587 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3588 stbi__context *s = z->s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3589 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
3590 Uint8 *p = z->out;
893
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 // compute color-based transparency, assuming we've
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3593 // 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
3594 STBI_ASSERT(out_n == 2 || out_n == 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3595
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3596 if (out_n == 2) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3597 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3598 p[1] = (p[0] == tc[0] ? 0 : 255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3599 p += 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3600 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3601 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3602 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3603 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
3604 p[3] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3605 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3606 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3607 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3608 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3609 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3610
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3611 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
3612 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3613 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
3614 Uint8 *p, *temp_out, *orig = a->out;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3615
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3616 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
3617 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
3618
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3619 // 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
3620 temp_out = p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3621
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3622 if (pal_img_n == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3623 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3624 int n = orig[i]*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3625 p[0] = palette[n ];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3626 p[1] = palette[n+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3627 p[2] = palette[n+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3628 p += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3629 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3630 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3631 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3632 int n = orig[i]*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3633 p[0] = palette[n ];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3634 p[1] = palette[n+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3635 p[2] = palette[n+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3636 p[3] = palette[n+3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3637 p += 4;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3640 STBI_FREE(a->out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3641 a->out = temp_out;
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 STBI_NOTUSED(len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3644
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3645 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3648 static int stbi__unpremultiply_on_load = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3649 static int stbi__de_iphone_flag = 0;
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 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
3652 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3653 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
3654 }
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 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
3657 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3658 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
3659 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3660
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3661 static void stbi__de_iphone(stbi__png *z)
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 stbi__context *s = z->s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3664 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
3665 Uint8 *p = z->out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3666
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3667 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
3668 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
3669 Uint8 t = p[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3670 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3671 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3672 p += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3673 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3674 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3675 STBI_ASSERT(s->img_out_n == 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3676 if (stbi__unpremultiply_on_load) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3677 // convert bgr to rgb and unpremultiply
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3678 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
3679 Uint8 a = p[3];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3680 Uint8 t = p[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3681 if (a) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3682 p[0] = p[2] * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3683 p[1] = p[1] * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3684 p[2] = t * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3685 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3686 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3687 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3688 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3689 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3690 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3691 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3692 // convert bgr to rgb
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3693 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
3694 Uint8 t = p[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3695 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3696 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3697 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3698 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3699 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3700 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3701 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3702
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3703
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3704 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
3705 Uint8 *inBuf, size_t inLen,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3706 Uint8 **outBuf, size_t *outLen,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3707 size_t initialSize,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3708 BOOL parseHeader)
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3709 {
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3710 DMZLibContext ctx;
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3711 int ret;
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3712
1123
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3713
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3714 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
3715 goto err;
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3716
1074
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3717 if ((ctx.outBuffer = ctx.outBufferStart = dmMalloc(initialSize)) == NULL)
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3718 {
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3719 ret = dmError(DMERR_MALLOC,
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3720 "Failed to allocate initial decompression buffer.\n");
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3721 goto err;
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3722 }
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3723
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3724 // Initialize decompression structures
1076
21b0aedb7b5c Also initialize DMZLibContext.inBufferStart where needed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1074
diff changeset
3725 ctx.inBuffer = ctx.inBufferStart = inBuf;
21b0aedb7b5c Also initialize DMZLibContext.inBufferStart where needed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1074
diff changeset
3726 ctx.inBufferEnd = inBuf + inLen;
1074
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3727 ctx.outBufferEnd = ctx.outBufferStart + initialSize;
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3728 ctx.expandable = TRUE;
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3729
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3730 if (parseHeader && (ret = dmZLibParseHeader(&ctx, TRUE)) != DMERR_OK)
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3731 goto err;
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3732
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3733 if ((ret = dmZLibInflate(&ctx)) != DMERR_OK)
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3734 goto err;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 1083
diff changeset
3735
1074
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3736 *outBuf = ctx.outBufferStart;
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3737 *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
3738
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3739 dmZLibCloseInflate(&ctx);
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3740 return DMERR_OK;
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3741
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3742 err:
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3743 dmZLibCloseInflate(&ctx);
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3744 dmFree(*outBuf);
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3745 *outBuf = NULL;
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3746 return ret;
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3747 }
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3748
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3749
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3750
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3751 #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
3752
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3753 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
3754 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3755 Uint8 palette[1024], pal_img_n=0;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3756 Uint8 has_trans=0, tc[3];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3757 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
3758 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
3759 stbi__context *s = z->s;
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 z->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3762 z->idata = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3763 z->out = NULL;
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 if (!stbi__check_png_header(s)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3766
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3767 if (scan == STBI__SCAN_type) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3768
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3769 for (;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3770 stbi__pngchunk c = stbi__get_chunk_header(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3771 switch (c.type) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3772 case STBI__PNG_TYPE('C','g','B','I'):
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3773 is_iphone = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3774 stbi__skip(s, c.length);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3775 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3776 case STBI__PNG_TYPE('I','H','D','R'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3777 int comp,filter;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3778 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
3779 first = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3780 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
3781 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
3782 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
3783 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
3784 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
3785 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
3786 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
3787 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
3788 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
3789 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
3790 if (!pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3791 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
3792 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
3793 if (scan == STBI__SCAN_header) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3794 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3795 // 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
3796 // img_n is # components to decompress/filter.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3797 s->img_n = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3798 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
3799 // 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
3800 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3801 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3802 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3803
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3804 case STBI__PNG_TYPE('P','L','T','E'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3805 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
3806 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
3807 pal_len = c.length / 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3808 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
3809 for (i=0; i < pal_len; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3810 palette[i*4+0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3811 palette[i*4+1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3812 palette[i*4+2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3813 palette[i*4+3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3814 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3815 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3816 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3817
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3818 case STBI__PNG_TYPE('t','R','N','S'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3819 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
3820 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
3821 if (pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3822 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
3823 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
3824 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
3825 pal_img_n = 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3826 for (i=0; i < c.length; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3827 palette[i*4+3] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3828 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3829 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
3830 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
3831 has_trans = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3832 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
3833 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
3834 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3835 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3836 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3837
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3838 case STBI__PNG_TYPE('I','D','A','T'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3839 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
3840 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
3841 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
3842 if (ioff + c.length > idata_limit) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3843 Uint8 *p;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3844 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
3845 while (ioff + c.length > idata_limit)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3846 idata_limit *= 2;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3847 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
3848 z->idata = p;
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 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
3851 ioff += c.length;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3852 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3853 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3854
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3855 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
3856 size_t raw_len, bpl;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3857 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
3858 if (scan != STBI__SCAN_load) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3859 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
3860 // 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
3861 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
3862 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
3863
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3864 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
3865 z->idata, ioff,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3866 &z->expanded, &raw_len,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3867 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
3868 return 0;
950
88d9440afad0 Use dmzlib module in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 899
diff changeset
3869
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3870 STBI_FREE(z->idata); z->idata = NULL;
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3871
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3872 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
3873 s->img_out_n = s->img_n+1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3874 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3875 s->img_out_n = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3876 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
3877 if (has_trans)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3878 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
3879 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
3880 stbi__de_iphone(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3881 if (pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3882 // pal_img_n == 3 or 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3883 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
3884 s->img_out_n = pal_img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3885 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
3886 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
3887 return 0;
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 STBI_FREE(z->expanded); z->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3890 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3891 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3892
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3893 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3894 // if critical, fail
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3895 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
3896 if ((c.type & (1 << 29)) == 0) {
1083
f88ad5cb44e5 Silence a warning.
Matti Hamalainen <ccr@tnsp.org>
parents: 1076
diff changeset
3897 #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
3898 // not threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3899 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
3900 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3901 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3902 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3903 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3904 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3905 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
3906 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3907 stbi__skip(s, c.length);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3908 break;
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 // end of PNG chunk, read and skip CRC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3911 stbi__get32be(s);
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3914
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3915 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
3916 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3917 unsigned char *result=NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3918 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
3919 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
3920 result = p->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3921 p->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3922 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
3923 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
3924 p->s->img_out_n = req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3925 if (result == NULL) return result;
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 *x = p->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3928 *y = p->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3929 if (n) *n = p->s->img_out_n;
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 STBI_FREE(p->out); p->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3932 STBI_FREE(p->expanded); p->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3933 STBI_FREE(p->idata); p->idata = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3934
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3935 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3936 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3937
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3938 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
3939 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3940 stbi__png p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3941 p.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3942 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
3943 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3944
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3945 static int stbi__png_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3946 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3947 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3948 r = stbi__check_png_header(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3949 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3950 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3951 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3952
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3953 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
3954 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3955 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
3956 stbi__rewind( p->s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3957 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3958 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3959 if (x) *x = p->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3960 if (y) *y = p->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3961 if (comp) *comp = p->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3962 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3963 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3964
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3965 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
3966 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3967 stbi__png p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3968 p.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3969 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
3970 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3971 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3972
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3973 // Microsoft/Windows BMP image
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3974
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3975 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3976 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
3977 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3978 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3979 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3980 if (stbi__get8(s) != 'B') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3981 if (stbi__get8(s) != 'M') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3982 stbi__get32le(s); // discard filesize
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3983 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3984 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3985 stbi__get32le(s); // discard data offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3986 sz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3987 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
3988 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3989 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3990
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3991 static int stbi__bmp_test(stbi__context *s)
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 int r = stbi__bmp_test_raw(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3994 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3995 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3996 }
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3999 // returns 0..31 for the highest set bit
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4000 static int stbi__high_bit(unsigned int z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4001 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4002 int n=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4003 if (z == 0) return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4004 if (z >= 0x10000) n += 16, z >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4005 if (z >= 0x00100) n += 8, z >>= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4006 if (z >= 0x00010) n += 4, z >>= 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4007 if (z >= 0x00004) n += 2, z >>= 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4008 if (z >= 0x00002) n += 1, z >>= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4009 return n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4010 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4011
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4012 static int stbi__bitcount(unsigned int a)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4013 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4014 a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4015 a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4016 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
4017 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
4018 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
4019 return a & 0xff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4020 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4021
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4022 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
4023 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4024 int result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4025 int z=0;
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 if (shift < 0) v <<= -shift;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4028 else v >>= shift;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4029 result = v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4030
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4031 z = bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4032 while (z < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4033 result += v >> z;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4034 z += bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4035 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4036 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4037 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4038
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4039 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
4040 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4041 Uint8 *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4042 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
4043 Uint8 pal[256][4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4044 int psize=0,i,j,compress=0,width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4045 int bpp, flip_vertically, pad, target, offset, hsz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4046 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
4047 stbi__get32le(s); // discard filesize
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4048 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4049 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4050 offset = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4051 hsz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4052 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
4053 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4054 s->img_x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4055 s->img_y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4056 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4057 s->img_x = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4058 s->img_y = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4059 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4060 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
4061 bpp = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4062 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
4063 flip_vertically = ((int) s->img_y) > 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4064 s->img_y = abs((int) s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4065 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4066 if (bpp < 24)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4067 psize = (offset - 14 - 24) / 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4068 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4069 compress = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4070 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
4071 stbi__get32le(s); // discard sizeof
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4072 stbi__get32le(s); // discard hres
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4073 stbi__get32le(s); // discard vres
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4074 stbi__get32le(s); // discard colorsused
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4075 stbi__get32le(s); // discard max important
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4076 if (hsz == 40 || hsz == 56) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4077 if (hsz == 56) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4078 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4079 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4080 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4081 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4082 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4083 if (bpp == 16 || bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4084 if (compress == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4085 if (bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4086 mr = 0xffu << 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4087 mg = 0xffu << 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4088 mb = 0xffu << 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4089 ma = 0xffu << 24;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4090 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
4091 STBI_NOTUSED(fake_a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4092 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4093 mr = 31u << 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4094 mg = 31u << 5;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4095 mb = 31u << 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4096 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4097 } else if (compress == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4098 mr = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4099 mg = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4100 mb = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4101 // 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
4102 if (mr == mg && mg == mb) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4103 // ?!?!?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4104 return stbi__errpuc("bad BMP", "bad BMP");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4105 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4106 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4107 return stbi__errpuc("bad BMP", "bad BMP");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4108 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4109 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4110 STBI_ASSERT(hsz == 108 || hsz == 124);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4111 mr = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4112 mg = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4113 mb = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4114 ma = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4115 stbi__get32le(s); // discard color space
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4116 for (i=0; i < 12; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4117 stbi__get32le(s); // discard color space parameters
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4118 if (hsz == 124) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4119 stbi__get32le(s); // discard rendering intent
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4120 stbi__get32le(s); // discard offset of profile data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4121 stbi__get32le(s); // discard size of profile data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4122 stbi__get32le(s); // discard reserved
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4125 if (bpp < 16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4126 psize = (offset - 14 - hsz) >> 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4127 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4128 s->img_n = ma ? 4 : 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4129 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
4130 target = req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4131 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4132 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
4133 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
4134 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
4135 if (bpp < 16) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4136 int z=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4137 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
4138 for (i=0; i < psize; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4139 pal[i][2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4140 pal[i][1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4141 pal[i][0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4142 if (hsz != 12) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4143 pal[i][3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4144 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4145 stbi__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
4146 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
4147 else if (bpp == 8) width = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4148 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
4149 pad = (-width)&3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4150 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
4151 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
4152 int v=stbi__get8(s),v2=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4153 if (bpp == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4154 v2 = v & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4155 v >>= 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4156 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4157 out[z++] = pal[v][0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4158 out[z++] = pal[v][1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4159 out[z++] = pal[v][2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4160 if (target == 4) out[z++] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4161 if (i+1 == (int) s->img_x) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4162 v = (bpp == 8) ? stbi__get8(s) : v2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4163 out[z++] = pal[v][0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4164 out[z++] = pal[v][1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4165 out[z++] = pal[v][2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4166 if (target == 4) out[z++] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4167 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4168 stbi__skip(s, pad);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4169 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4170 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4171 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
4172 int z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4173 int easy=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4174 stbi__skip(s, offset - 14 - hsz);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4175 if (bpp == 24) width = 3 * s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4176 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
4177 else /* bpp = 32 and pad = 0 */ width=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4178 pad = (-width) & 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4179 if (bpp == 24) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4180 easy = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4181 } else if (bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4182 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
4183 easy = 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4184 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4185 if (!easy) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4186 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
4187 // 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
4188 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
4189 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
4190 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
4191 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
4192 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4193 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
4194 if (easy) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4195 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
4196 unsigned char a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4197 out[z+2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4198 out[z+1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4199 out[z+0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4200 z += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4201 a = (easy == 2 ? stbi__get8(s) : 255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4202 if (target == 4) out[z++] = a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4203 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4204 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4205 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
4206 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
4207 int a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4208 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
4209 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
4210 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
4211 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
4212 if (target == 4) out[z++] = STBI__BYTECAST(a);
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4215 stbi__skip(s, pad);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4216 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4217 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4218 if (flip_vertically) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4219 Uint8 t;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4220 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
4221 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
4222 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
4223 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
4224 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
4225 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4226 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4227 }
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 if (req_comp && req_comp != target) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4230 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
4231 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
4232 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4233
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4234 *x = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4235 *y = s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4236 if (comp) *comp = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4237 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4238 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4239 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4240
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4241 // Targa Truevision - TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4242 // by Jonathan Dummer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4243 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4244 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
4245 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4246 int tga_w, tga_h, tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4247 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4248 stbi__get8(s); // discard Offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4249 sz = stbi__get8(s); // color type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4250 if( sz > 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4251 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4252 return 0; // only RGB or indexed allowed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4253 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4254 sz = stbi__get8(s); // image type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4255 // only RGB or grey allowed, +/- RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4256 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
4257 stbi__skip(s,9);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4258 tga_w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4259 if( tga_w < 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4260 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4261 return 0; // test width
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4262 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4263 tga_h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4264 if( tga_h < 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4265 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4266 return 0; // test height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4267 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4268 sz = stbi__get8(s); // bits per pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4269 // only RGB or RGBA or grey allowed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4270 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
4271 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4272 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4273 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4274 tga_comp = sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4275 if (x) *x = tga_w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4276 if (y) *y = tga_h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4277 if (comp) *comp = tga_comp / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4278 return 1; // seems to have passed everything
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4279 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4280
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4281 static int stbi__tga_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4282 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4283 int res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4284 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4285 stbi__get8(s); // discard Offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4286 sz = stbi__get8(s); // color type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4287 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
4288 sz = stbi__get8(s); // image type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4289 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
4290 stbi__get16be(s); // discard palette start
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4291 stbi__get16be(s); // discard palette length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4292 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
4293 stbi__get16be(s); // discard x origin
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4294 stbi__get16be(s); // discard y origin
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4295 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
4296 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
4297 sz = stbi__get8(s); // bits per pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4298 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
4299 res = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4300 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4301 res = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4302 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4303 return res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4304 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4305
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4306 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
4307 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4308 // read in the TGA header stuff
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4309 int tga_offset = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4310 int tga_indexed = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4311 int tga_image_type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4312 int tga_is_RLE = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4313 int tga_palette_start = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4314 int tga_palette_len = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4315 int tga_palette_bits = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4316 int tga_x_origin = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4317 int tga_y_origin = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4318 int tga_width = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4319 int tga_height = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4320 int tga_bits_per_pixel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4321 int tga_comp = tga_bits_per_pixel / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4322 int tga_inverted = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4323 // image data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4324 unsigned char *tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4325 unsigned char *tga_palette = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4326 int i, j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4327 unsigned char raw_data[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4328 int RLE_count = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4329 int RLE_repeating = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4330 int read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4331
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4332 // do a tiny bit of precessing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4333 if ( tga_image_type >= 8 )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4334 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4335 tga_image_type -= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4336 tga_is_RLE = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4337 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4338 /* int tga_alpha_bits = tga_inverted & 15; */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4339 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4340
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4341 // error check
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4342 if ( //(tga_indexed) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4343 (tga_width < 1) || (tga_height < 1) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4344 (tga_image_type < 1) || (tga_image_type > 3) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4345 ((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
4346 (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
4347 )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4348 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4349 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
4350 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4351
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4352 // 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
4353 if ( tga_indexed )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4354 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4355 tga_comp = tga_palette_bits / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4356 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4357
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4358 // tga info
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4359 *x = tga_width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4360 *y = tga_height;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4361 if (comp) *comp = tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4362
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4363 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
4364 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
4365
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4366 // 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
4367 stbi__skip(s, tga_offset );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4368
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4369 if ( !tga_indexed && !tga_is_RLE) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4370 for (i=0; i < tga_height; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4371 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
4372 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
4373 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
4374 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4375 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4376 // do I need to load a palette?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4377 if ( tga_indexed)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4378 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4379 // any data to skip? (offset usually = 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4380 stbi__skip(s, tga_palette_start );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4381 // load the palette
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4382 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
4383 if (!tga_palette) {
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 return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4386 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4387 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
4388 STBI_FREE(tga_data);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4389 STBI_FREE(tga_palette);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4390 return stbi__errpuc("bad palette", "Corrupt TGA");
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4393 // load the data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4394 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
4395 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4396 // 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
4397 if ( tga_is_RLE )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4398 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4399 if ( RLE_count == 0 )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4400 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4401 // 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
4402 int RLE_cmd = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4403 RLE_count = 1 + (RLE_cmd & 127);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4404 RLE_repeating = RLE_cmd >> 7;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4405 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4406 } else if ( !RLE_repeating )
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 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4411 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4412 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4413 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4414 // 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
4415 if ( read_next_pixel )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4416 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4417 // load however much data we did have
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4418 if ( tga_indexed )
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 // read in 1 byte, then perform the lookup
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4421 int pal_idx = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4422 if ( pal_idx >= tga_palette_len )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4423 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4424 // invalid index
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4425 pal_idx = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4426 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4427 pal_idx *= tga_bits_per_pixel / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4428 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
4429 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4430 raw_data[j] = tga_palette[pal_idx+j];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4431 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4432 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4433 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4434 // read in the data raw
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4435 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
4436 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4437 raw_data[j] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4438 }
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 // clear the reading flag for the next pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4441 read_next_pixel = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4442 } // end of reading a pixel
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 // copy data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4445 for (j = 0; j < tga_comp; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4446 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
4447
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4448 // 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
4449 --RLE_count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4450 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4451 // do I need to invert the image?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4452 if ( tga_inverted )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4453 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4454 for (j = 0; j*2 < tga_height; ++j)
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 int index1 = j * tga_width * tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4457 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
4458 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
4459 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4460 unsigned char temp = tga_data[index1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4461 tga_data[index1] = tga_data[index2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4462 tga_data[index2] = temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4463 ++index1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4464 ++index2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4465 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4468 // clear my palette, if I had one
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4469 if ( tga_palette != NULL )
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 STBI_FREE( tga_palette );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4472 }
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4475 // swap RGB
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4476 if (tga_comp >= 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4477 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4478 unsigned char* tga_pixel = tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4479 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
4480 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4481 unsigned char temp = tga_pixel[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4482 tga_pixel[0] = tga_pixel[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4483 tga_pixel[2] = temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4484 tga_pixel += tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4485 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4486 }
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 // convert to target component count
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4489 if (req_comp && req_comp != tga_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4490 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
4491
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4492 // 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
4493 // Microsoft's C compilers happy... [8^(
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4494 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
4495 tga_x_origin = tga_y_origin = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4496 // OK, done
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4497 return tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4498 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4499 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4500
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4501 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4502 // 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
4503
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4504 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4505 static int stbi__psd_test(stbi__context *s)
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 int r = (stbi__get32be(s) == 0x38425053);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4508 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4509 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4510 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4511
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4512 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
4513 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4514 int pixelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4515 int channelCount, compression;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4516 int channel, i, count, len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4517 int w,h;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4518 Uint8 *out;
893
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 identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4521 if (stbi__get32be(s) != 0x38425053) // "8BPS"
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4522 return stbi__errpuc("not PSD", "Corrupt 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 // Check file type version.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4525 if (stbi__get16be(s) != 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4526 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
4527
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4528 // Skip 6 reserved bytes.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4529 stbi__skip(s, 6 );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4530
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4531 // 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
4532 channelCount = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4533 if (channelCount < 0 || channelCount > 16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4534 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
4535
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4536 // Read the rows and columns of the image.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4537 h = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4538 w = stbi__get32be(s);
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 depth is 8 bits.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4541 if (stbi__get16be(s) != 8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4542 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
4543
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4544 // Make sure the color mode is RGB.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4545 // Valid options are:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4546 // 0: Bitmap
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4547 // 1: Grayscale
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4548 // 2: Indexed color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4549 // 3: RGB color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4550 // 4: CMYK color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4551 // 7: Multichannel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4552 // 8: Duotone
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4553 // 9: Lab color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4554 if (stbi__get16be(s) != 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4555 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
4556
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4557 // 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
4558 stbi__skip(s,stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4559
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4560 // 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
4561 stbi__skip(s, stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4562
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4563 // Skip the reserved data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4564 stbi__skip(s, stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4565
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4566 // Find out if the data is compressed.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4567 // Known values:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4568 // 0: no compression
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4569 // 1: RLE compressed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4570 compression = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4571 if (compression > 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4572 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
4573
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4574 // Create the destination image.
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4575 out = (Uint8 *) stbi__malloc(4 * w*h);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4576 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
4577 pixelCount = w*h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4578
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4579 // Initialize the data to zero.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4580 //memset( out, 0, pixelCount * 4 );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4581
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4582 // Finally, the image data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4583 if (compression) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4584 // RLE as used by .PSD and .TIFF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4585 // 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
4586 // Read the next source byte into n.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4587 // 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
4588 // 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
4589 // Else if n is 128, noop.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4590 // Endloop
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 // 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
4593 // which we're going to just skip.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4594 stbi__skip(s, h * channelCount * 2 );
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 // Read the RLE data by channel.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4597 for (channel = 0; channel < 4; channel++) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4598 Uint8 *p;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4599
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4600 p = out+channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4601 if (channel >= channelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4602 // Fill this channel with default data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4603 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
4604 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4605 // Read the RLE data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4606 count = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4607 while (count < pixelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4608 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4609 if (len == 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4610 // No-op.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4611 } else if (len < 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4612 // Copy next len+1 bytes literally.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4613 len++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4614 count += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4615 while (len) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4616 *p = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4617 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4618 len--;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4619 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4620 } else if (len > 128) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4621 Uint8 val;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4622 // 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
4623 // (Interpret len as a negative 8-bit int.)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4624 len ^= 0x0FF;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4625 len += 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4626 val = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4627 count += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4628 while (len) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4629 *p = val;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4630 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4631 len--;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4635 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4636 }
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 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4639 // 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
4640 // 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
4641
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4642 // Read the data by channel.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4643 for (channel = 0; channel < 4; channel++) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4644 Uint8 *p;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4645
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4646 p = out + channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4647 if (channel > channelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4648 // Fill this channel with default data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4649 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
4650 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4651 // Read the data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4652 for (i = 0; i < pixelCount; i++)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4653 *p = stbi__get8(s), p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4654 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4655 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4656 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4657
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4658 if (req_comp && req_comp != 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4659 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
4660 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
4661 }
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 if (comp) *comp = channelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4664 *y = h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4665 *x = w;
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 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4668 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4669 #endif
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 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4672 // Softimage PIC loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4673 // by Tom Seddon
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4674 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4675 // 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
4676 // 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
4677
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4678 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4679 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
4680 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4681 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4682 for (i=0; i<4; ++i)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4683 if (stbi__get8(s) != (Uint8)str[i])
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4684 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4685
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4686 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4687 }
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 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
4690 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4691 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4692
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4693 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
4694 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4695
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4696 for(i=0;i<84;++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4697 stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4698
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4699 if (!stbi__pic_is4(s,"PICT"))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4700 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4701
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4702 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4703 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4704
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4705 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4706 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4707 Uint8 size,type,channel;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4708 } stbi__pic_packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4709
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4710 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
4711 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4712 int mask=0x80, i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4713
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4714 for (i=0; i<4; ++i, mask>>=1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4715 if (channel & mask) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4716 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
4717 dest[i]=stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4718 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4719 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4720
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4721 return dest;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4722 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4723
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4724 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
4725 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4726 int mask=0x80,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 for (i=0;i<4; ++i, mask>>=1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4729 if (channel&mask)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4730 dest[i]=src[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4731 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4732
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4733 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
4734 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4735 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
4736 stbi__pic_packet packets[10];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4737
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4738 // 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
4739 // for the same channel in multiple packets.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4740 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4741 stbi__pic_packet *packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4742
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4743 if (num_packets==sizeof(packets)/sizeof(packets[0]))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4744 return stbi__errpuc("bad format","too many packets");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4745
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4746 packet = &packets[num_packets++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4747
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4748 chained = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4749 packet->size = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4750 packet->type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4751 packet->channel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4752
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4753 act_comp |= packet->channel;
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 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
4756 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
4757 } while (chained);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4758
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4759 *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
4760
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4761 for(y=0; y<height; ++y) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4762 int packet_idx;
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 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
4765 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
4766 Uint8 *dest = result+y*width*4;
893
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 switch (packet->type) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4769 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4770 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
4771
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4772 case 0: {//uncompressed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4773 int x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4774
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4775 for(x=0;x<width;++x, dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4776 if (!stbi__readval(s,packet->channel,dest))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4777 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4778 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4779 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4780
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4781 case 1://Pure RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4782 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4783 int left=width, i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4784
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4785 while (left>0) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4786 Uint8 count,value[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4787
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4788 count=stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4789 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
4790
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4791 if (count > left)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4792 count = (Uint8) left;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4793
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4794 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
4795
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4796 for(i=0; i<count; ++i,dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4797 stbi__copyval(packet->channel,dest,value);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4798 left -= count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4799 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4800 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4801 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4802
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4803 case 2: {//Mixed RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4804 int left=width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4805 while (left>0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4806 int count = stbi__get8(s), i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4807 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
4808
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4809 if (count >= 128) { // Repeated
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4810 Uint8 value[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4811 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4812
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4813 if (count==128)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4814 count = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4815 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4816 count -= 127;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4817 if (count > left)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4818 return stbi__errpuc("bad file","scanline overrun");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4819
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4820 if (!stbi__readval(s,packet->channel,value))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4821 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4822
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4823 for(i=0;i<count;++i, dest += 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4824 stbi__copyval(packet->channel,dest,value);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4825 } else { // Raw
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4826 ++count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4827 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
4828
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4829 for(i=0;i<count;++i, dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4830 if (!stbi__readval(s,packet->channel,dest))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4831 return 0;
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 left-=count;
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 break;
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 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4840
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4841 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4842 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4843
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4844 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
4845 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4846 Uint8 *result;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4847 int i, x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4848
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4849 for (i=0; i<92; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4850 stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4851
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4852 x = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4853 y = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4854 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
4855 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
4856
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4857 stbi__get32be(s); //skip `ratio'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4858 stbi__get16be(s); //skip `fields'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4859 stbi__get16be(s); //skip `pad'
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 // intermediate buffer is RGBA
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4862 result = (Uint8 *) stbi__malloc(x*y*4);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4863 memset(result, 0xff, x*y*4);
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 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
4866 STBI_FREE(result);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4867 result=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4868 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4869 *px = x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4870 *py = y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4871 if (req_comp == 0) req_comp = *comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4872 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
4873
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4874 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4875 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4876
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4877 static int stbi__pic_test(stbi__context *s)
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 int r = stbi__pic_test_core(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4880 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4881 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4882 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4883 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4884
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4885 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4886 // 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
4887
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4888 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4889 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4890 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4891 Sint16 prefix;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4892 Uint8 first;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4893 Uint8 suffix;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4894 } stbi__gif_lzw;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4895
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4896 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4897 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4898 int w,h;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4899 Uint8 *out; // output buffer (always 4 components)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4900 int flags, bgindex, ratio, transparent, eflags;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4901 Uint8 pal[256][4];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4902 Uint8 lpal[256][4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4903 stbi__gif_lzw codes[4096];
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4904 Uint8 *color_table;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4905 int parse, step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4906 int lflags;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4907 int start_x, start_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4908 int max_x, max_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4909 int cur_x, cur_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4910 int line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4911 } stbi__gif;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4912
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4913 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
4914 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4915 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4916 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
4917 sz = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4918 if (sz != '9' && sz != '7') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4919 if (stbi__get8(s) != 'a') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4920 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4921 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4922
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4923 static int stbi__gif_test(stbi__context *s)
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 int r = stbi__gif_test_raw(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4926 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4927 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4928 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4929
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4930 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
4931 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4932 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4933 for (i=0; i < num_entries; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4934 pal[i][2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4935 pal[i][1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4936 pal[i][0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4937 pal[i][3] = transp == i ? 0 : 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4938 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4939 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4940
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4941 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
4942 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4943 Uint8 version;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4944 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
4945 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 version = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4948 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
4949 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
4950
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4951 stbi__g_failure_reason = "";
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4952 g->w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4953 g->h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4954 g->flags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4955 g->bgindex = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4956 g->ratio = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4957 g->transparent = -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 (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
4960
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4961 if (is_info) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4962
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4963 if (g->flags & 0x80)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4964 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
4965
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4966 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4967 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4968
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4969 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
4970 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4971 stbi__gif g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4972 if (!stbi__gif_header(s, &g, comp, 1)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4973 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4974 return 0;
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 if (x) *x = g.w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4977 if (y) *y = g.h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4978 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4979 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4980
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4981 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
4982 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4983 Uint8 *p, *c;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4984
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4985 // 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
4986 // 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
4987 if (g->codes[code].prefix >= 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4988 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
4989
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4990 if (g->cur_y >= g->max_y) return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4991
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4992 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
4993 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
4994
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4995 if (c[3] >= 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4996 p[0] = c[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4997 p[1] = c[1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4998 p[2] = c[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4999 p[3] = c[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5000 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5001 g->cur_x += 4;
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 if (g->cur_x >= g->max_x) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5004 g->cur_x = g->start_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5005 g->cur_y += g->step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5006
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5007 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
5008 g->step = (1 << g->parse) * g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5009 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
5010 --g->parse;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5011 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5012 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5013 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5014
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5015 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
5016 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5017 Uint8 lzw_cs;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5018 Sint32 len, code;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5019 Uint32 first;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5020 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
5021 stbi__gif_lzw *p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5022
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5023 lzw_cs = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5024 clear = 1 << lzw_cs;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5025 first = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5026 codesize = lzw_cs + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5027 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5028 bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5029 valid_bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5030 for (code = 0; code < clear; code++) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5031 g->codes[code].prefix = -1;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5032 g->codes[code].first = (Uint8) code;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5033 g->codes[code].suffix = (Uint8) code;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5034 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5035
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5036 // support no starting clear code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5037 avail = clear+2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5038 oldcode = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5039
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5040 len = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5041 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5042 if (valid_bits < codesize) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5043 if (len == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5044 len = stbi__get8(s); // start new block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5045 if (len == 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5046 return g->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5047 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5048 --len;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5049 bits |= (Sint32) stbi__get8(s) << valid_bits;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5050 valid_bits += 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5051 } else {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5052 Sint32 code = bits & codemask;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5053 bits >>= codesize;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5054 valid_bits -= codesize;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5055 // @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
5056 if (code == clear) { // clear code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5057 codesize = lzw_cs + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5058 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5059 avail = clear + 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5060 oldcode = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5061 first = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5062 } 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
5063 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5064 while ((len = stbi__get8(s)) > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5065 stbi__skip(s,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5066 return g->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5067 } else if (code <= avail) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5068 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
5069
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5070 if (oldcode >= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5071 p = &g->codes[avail++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5072 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
5073 p->prefix = (Sint16) oldcode;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5074 p->first = g->codes[oldcode].first;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5075 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
5076 } else if (code == avail)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5077 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
5078
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5079 stbi__out_gif_code(g, (Uint16) code);
893
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 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5082 codesize++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5083 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5084 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5085
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5086 oldcode = code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5087 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5088 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
5089 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5090 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5093
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5094 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
5095 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5096 int i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5097 Uint8 *c = g->pal[g->bgindex];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5098 // @OPTIMIZE: write a dword at a time
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5099 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
5100 Uint8 *p = &g->out[i];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5101 p[0] = c[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5102 p[1] = c[1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5103 p[2] = c[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5104 p[3] = c[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5105 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5106 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5107
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5108 // 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
5109 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
5110 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5111 int i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5112 Uint8 *old_out = 0;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5113
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5114 if (g->out == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5115 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
5116 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
5117 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
5118 stbi__fill_gif_background(g);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5119 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5120 // animated-gif-only path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5121 if (((g->eflags & 0x1C) >> 2) == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5122 old_out = g->out;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5123 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
5124 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
5125 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
5126 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5127 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5128
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5129 for (;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5130 switch (stbi__get8(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5131 case 0x2C: /* Image Descriptor */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5132 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5133 Sint32 x, y, w, h;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5134 Uint8 *o;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5135
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5136 x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5137 y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5138 w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5139 h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5140 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
5141 return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5142
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5143 g->line_size = g->w * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5144 g->start_x = x * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5145 g->start_y = y * g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5146 g->max_x = g->start_x + w * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5147 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
5148 g->cur_x = g->start_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5149 g->cur_y = g->start_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5150
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5151 g->lflags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5152
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5153 if (g->lflags & 0x40) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5154 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
5155 g->parse = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5156 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5157 g->step = g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5158 g->parse = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5159 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5160
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5161 if (g->lflags & 0x80) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5162 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
5163 g->color_table = (Uint8 *) g->lpal;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5164 } else if (g->flags & 0x80) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5165 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
5166 g->pal[i][3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5167 if (g->transparent >= 0 && (g->eflags & 0x01))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5168 g->pal[g->transparent][3] = 0;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5169 g->color_table = (Uint8 *) g->pal;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5170 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5171 return stbi__errpuc("missing color table", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5172
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5173 o = stbi__process_gif_raster(s, g);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5174 if (o == NULL) return NULL;
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 if (req_comp && req_comp != 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5177 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
5178 return o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5179 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5180
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5181 case 0x21: // Comment Extension.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5182 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5183 int len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5184 if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5185 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5186 if (len == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5187 g->eflags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5188 stbi__get16le(s); // delay
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5189 g->transparent = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5190 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5191 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5192 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5193 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5194 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5195 while ((len = stbi__get8(s)) != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5196 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5197 break;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5200 case 0x3B: // gif stream termination code
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5201 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
5202
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5203 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5204 return stbi__errpuc("unknown code", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5205 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5206 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5207 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5208
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5209 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
5210 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5211 Uint8 *u = 0;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5212 stbi__gif g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5213 memset(&g, 0, sizeof(g));
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5214
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5215 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
5216 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
5217 if (u) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5218 *x = g.w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5219 *y = g.h;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5222 return u;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5223 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5224
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5225 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
5226 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5227 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
5228 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5229 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5230
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5231 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5232 // Radiance RGBE HDR loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5233 // originally by Nicolas Schulz
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5234 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5235 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
5236 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5237 const char *signature = "#?RADIANCE\n";
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5238 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5239 for (i=0; signature[i]; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5240 if (stbi__get8(s) != signature[i])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5241 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5242 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5243 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5244
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5245 static int stbi__hdr_test(stbi__context* s)
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 int r = stbi__hdr_test_core(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5248 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5249 return r;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5252 #define STBI__HDR_BUFLEN 1024
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5253 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
5254 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5255 int len=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5256 char c = '\0';
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5257
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5258 c = (char) stbi__get8(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5259
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5260 while (!stbi__at_eof(z) && c != '\n') {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5261 buffer[len++] = c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5262 if (len == STBI__HDR_BUFLEN-1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5263 // flush to end of line
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5264 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
5265 ;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5266 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5267 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5268 c = (char) stbi__get8(z);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5271 buffer[len] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5272 return buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5273 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5274
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5275 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
5276 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5277 if ( input[3] != 0 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5278 float f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5279 // Exponent
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5280 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
5281 if (req_comp <= 2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5282 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
5283 else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5284 output[0] = input[0] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5285 output[1] = input[1] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5286 output[2] = input[2] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5287 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5288 if (req_comp == 2) output[1] = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5289 if (req_comp == 4) output[3] = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5290 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5291 switch (req_comp) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5292 case 4: output[3] = 1; /* fallthrough */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5293 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
5294 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5295 case 2: output[1] = 1; /* fallthrough */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5296 case 1: output[0] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5297 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5298 }
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5301
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5302 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
5303 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5304 char buffer[STBI__HDR_BUFLEN];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5305 char *token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5306 int valid = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5307 int width, height;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5308 Uint8 *scanline;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5309 float *hdr_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5310 int len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5311 unsigned char count, value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5312 int i, j, k, c1,c2, z;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5313
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 // Check identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5316 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
5317 return stbi__errpf("not HDR", "Corrupt HDR image");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5318
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5319 // Parse header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5320 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5321 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5322 if (token[0] == 0) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5323 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
5324 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5325
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5326 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
5327
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5328 // Parse width and height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5329 // 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
5330 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5331 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
5332 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5333 height = (int) strtol(token, &token, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5334 while (*token == ' ') ++token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5335 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
5336 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5337 width = (int) strtol(token, NULL, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5338
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5339 *x = width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5340 *y = height;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5341
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5342 if (comp) *comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5343 if (req_comp == 0) req_comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5344
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5345 // Read data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5346 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
5347
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5348 // Load image data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5349 // 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
5350 if ( width < 8 || width >= 32768) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5351 // Read flat data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5352 for (j=0; j < height; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5353 for (i=0; i < width; ++i) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5354 Uint8 rgbe[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5355 main_decode_loop:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5356 stbi__getn(s, rgbe, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5357 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
5358 }
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 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5361 // Read RLE-encoded data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5362 scanline = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5363
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5364 for (j = 0; j < height; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5365 c1 = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5366 c2 = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5367 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5368 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5369 // 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
5370 // 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
5371 Uint8 rgbe[4];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5372 rgbe[0] = (Uint8) c1;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5373 rgbe[1] = (Uint8) c2;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5374 rgbe[2] = (Uint8) len;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5375 rgbe[3] = (Uint8) stbi__get8(s);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5376 stbi__hdr_convert(hdr_data, rgbe, req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5377 i = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5378 j = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5379 STBI_FREE(scanline);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5380 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
5381 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5382 len <<= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5383 len |= stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5384 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
5385 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
5386
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5387 for (k = 0; k < 4; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5388 i = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5389 while (i < width) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5390 count = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5391 if (count > 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5392 // Run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5393 value = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5394 count -= 128;
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] = value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5397 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5398 // Dump
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5399 for (z = 0; z < count; ++z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5400 scanline[i++ * 4 + k] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5401 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5402 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5403 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5404 for (i=0; i < width; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5405 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
5406 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5407 STBI_FREE(scanline);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5410 return hdr_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5411 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5412
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5413 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
5414 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5415 char buffer[STBI__HDR_BUFLEN];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5416 char *token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5417 int valid = 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 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
5420 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5421 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5422 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5423
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5424 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5425 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5426 if (token[0] == 0) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5427 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
5428 }
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 if (!valid) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5431 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5432 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5433 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5434 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5435 if (strncmp(token, "-Y ", 3)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5436 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5437 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5438 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5439 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5440 *y = (int) strtol(token, &token, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5441 while (*token == ' ') ++token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5442 if (strncmp(token, "+X ", 3)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5443 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5444 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5445 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5446 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5447 *x = (int) strtol(token, NULL, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5448 *comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5449 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5450 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5451 #endif // STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5452
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5453 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5454 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
5455 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5456 int hsz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5457 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
5458 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5459 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5460 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5461 stbi__skip(s,12);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5462 hsz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5463 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
5464 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5465 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5466 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5467 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5468 *x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5469 *y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5470 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5471 *x = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5472 *y = stbi__get32le(s);
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 if (stbi__get16le(s) != 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5475 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5476 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5477 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5478 *comp = stbi__get16le(s) / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5479 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5480 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5481 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5482
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5483 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5484 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
5485 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5486 int channelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5487 if (stbi__get32be(s) != 0x38425053) {
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 if (stbi__get16be(s) != 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5492 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5493 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5494 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5495 stbi__skip(s, 6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5496 channelCount = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5497 if (channelCount < 0 || channelCount > 16) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5498 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5499 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5500 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5501 *y = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5502 *x = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5503 if (stbi__get16be(s) != 8) {
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 if (stbi__get16be(s) != 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5508 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5509 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5510 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5511 *comp = 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5512 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5513 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5514 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5515
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5516 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5517 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
5518 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5519 int act_comp=0,num_packets=0,chained;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5520 stbi__pic_packet packets[10];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5521
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5522 stbi__skip(s, 92);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5523
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5524 *x = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5525 *y = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5526 if (stbi__at_eof(s)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5527 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5528 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5529 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5530 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5531
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5532 stbi__skip(s, 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5533
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5534 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5535 stbi__pic_packet *packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5536
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5537 if (num_packets==sizeof(packets)/sizeof(packets[0]))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5538 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5539
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5540 packet = &packets[num_packets++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5541 chained = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5542 packet->size = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5543 packet->type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5544 packet->channel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5545 act_comp |= packet->channel;
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 (stbi__at_eof(s)) {
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 if (packet->size != 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5552 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5553 return 0;
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 } while (chained);
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 *comp = (act_comp & 0x10 ? 4 : 3);
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 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5560 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5561 #endif
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 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5564 // Portable Gray Map and Portable Pixel Map loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5565 // by Ken Miller
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5566 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5567 // PGM: http://netpbm.sourceforge.net/doc/pgm.html
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5568 // PPM: http://netpbm.sourceforge.net/doc/ppm.html
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5569 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5570 // Known limitations:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5571 // Does not support comments in the header section
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5572 // 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
5573 // Does not support 16-bit-per-channel
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 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5576
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5577 static int stbi__pnm_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5578 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5579 char p, t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5580 p = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5581 t = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5582 if (p != 'P' || (t != '5' && t != '6')) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5583 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5584 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5585 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5586 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5587 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5588
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5589 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
5590 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5591 Uint8 *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5592 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
5593 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5594 *x = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5595 *y = s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5596 *comp = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5597
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5598 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
5599 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
5600 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
5601
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5602 if (req_comp && req_comp != s->img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5603 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
5604 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
5605 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5606 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5607 }
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 static int stbi__pnm_isspace(char c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5610 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5611 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
5612 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5613
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5614 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
5615 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5616 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
5617 *c = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5618 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5619
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5620 static int stbi__pnm_isdigit(char c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5621 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5622 return c >= '0' && c <= '9';
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5623 }
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 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
5626 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5627 int value = 0;
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 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
5630 value = value*10 + (*c - '0');
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5631 *c = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5632 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5633
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5634 return value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5635 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5636
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5637 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
5638 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5639 int maxv;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5640 char c, p, t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5641
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5642 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5643
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5644 // Get identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5645 p = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5646 t = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5647 if (p != 'P' || (t != '5' && t != '6')) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5648 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5649 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5650 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5651
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5652 *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
5653
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5654 c = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5655 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5656
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5657 *x = stbi__pnm_getinteger(s, &c); // read width
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5658 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5659
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5660 *y = stbi__pnm_getinteger(s, &c); // read height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5661 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5662
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5663 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
5664
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5665 if (maxv > 255)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5666 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
5667 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5668 return 1;
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 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5671
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5672 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
5673 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5674 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5675 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
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_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5679 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
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_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5683 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
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_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5687 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
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_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5691 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
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_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5695 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
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_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5699 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
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 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5703 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
5704 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5705
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5706 // 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
5707 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5708 if (stbi__tga_info(s, x, y, comp))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5709 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5710 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5711 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
5712 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5713
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5714 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5715 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
5716 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5717 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5718 int result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5719 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
5720 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
5721 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5722 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5723 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5724
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5725 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
5726 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5727 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5728 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5729 long pos = ftell(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5730 stbi__start_file(&s, f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5731 r = stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5732 fseek(f,pos,SEEK_SET);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5733 return r;
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 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5736
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5737 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
5738 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5739 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5740 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5741 return stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5742 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5743
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5744 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
5745 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5746 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5747 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
5748 return stbi__info_main(&s,x,y,comp);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5751 #endif // STB_IMAGE_IMPLEMENTATION
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5752
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5753 /*
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5754 revision history:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5755 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
5756 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
5757 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
5758 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
5759 progressive JPEG (stb)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5760 PGM/PPM support (Ken Miller)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5761 STBI_MALLOC,STBI_REALLOC,STBI_FREE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5762 GIF bugfix -- seemingly never worked
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5763 STBI_NO_*, STBI_ONLY_*
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5764 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
5765 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
5766 optimize PNG (ryg)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5767 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
5768 1.46 (2014-08-26)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5769 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
5770 1.45 (2014-08-16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5771 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
5772 1.44 (2014-08-07)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5773 various warning fixes from Ronny Chevalier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5774 1.43 (2014-07-15)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5775 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
5776 1.42 (2014-07-09)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5777 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
5778 fixes to stbi__cleanup_jpeg path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5779 added STBI_ASSERT to avoid requiring assert.h
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5780 1.41 (2014-06-25)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5781 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
5782 1.40 (2014-06-22)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5783 fix gcc struct-initialization warning
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5784 1.39 (2014-06-15)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5785 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
5786 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
5787 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
5788 1.38 (2014-06-06)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5789 suppress MSVC warnings on integer casts truncating values
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5790 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
5791 1.37 (2014-06-04)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5792 remove duplicate typedef
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5793 1.36 (2014-06-03)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5794 convert to header file single-file library
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5795 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
5796 1.35 (2014-05-27)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5797 various warnings
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5798 fix broken STBI_SIMD path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5799 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
5800 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
5801 TGA optimization by Arseny Kapoulkine
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5802 1.34 (unknown)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5803 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
5804 1.33 (2011-07-14)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5805 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
5806 1.32 (2011-07-13)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5807 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
5808 1.31 (2011-06-20)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5809 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
5810 1.30 (2011-06-11)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5811 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
5812 removed deprecated format-specific test/load functions
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5813 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
5814 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
5815 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
5816 1.29 (2010-08-16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5817 various warning fixes from Aurelien Pocheville
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5818 1.28 (2010-08-01)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5819 fix bug in GIF palette transparency (SpartanJ)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5820 1.27 (2010-08-01)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5821 cast-to-Uint8 to fix warnings
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5822 1.26 (2010-07-24)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5823 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
5824 1.25 (2010-07-17)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5825 refix trans_data warning (Won Chun)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5826 1.24 (2010-07-12)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5827 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
5828 minor perf improvements for jpeg
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5829 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
5830 attempt to fix trans_data warning (Won Chun)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5831 1.23 fixed bug in iPhone support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5832 1.22 (2010-07-10)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5833 removed image *writing* support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5834 stbi_info support from Jetro Lauha
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5835 GIF support from Jean-Marc Lienher
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5836 iPhone PNG-extensions from James Brown
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5837 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
5838 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
5839 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
5840 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
5841 1.18 2008-08-02
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5842 fix a threading bug (local mutable static)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5843 1.17 support interlaced PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5844 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
5845 1.15 initialize some fields for thread safety
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5846 1.14 fix threadsafe conversion bug
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5847 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
5848 1.13 threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5849 1.12 const qualifiers in the API
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5850 1.11 Support installable IDCT, colorspace conversion routines
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5851 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
5852 optimized upsampling by Fabian "ryg" Giesen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5853 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
5854 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
5855 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
5856 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
5857 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
5858 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
5859 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
5860 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
5861 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
5862 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
5863 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
5864 0.99 correct handling of alpha in palette
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5865 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
5866 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
5867 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
5868 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
5869 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
5870 0.93 handle jpegtran output; verbose errors
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5871 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
5872 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
5873 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
5874 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
5875 0.60 fix compiling as c++
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5876 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
5877 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
5878 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
5879 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
5880 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
5881 0.54 allow NULL for 'int *comp'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5882 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
5883 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
5884 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
5885 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
5886 0.50 first released version
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5887 */