annotate src/stb_image.c @ 2298:b5abfff07ca9

Add new DMGrowBuf helper functions dmGrowBufCopyOffsSize() and dmGrowBufConstCopyOffsSize().
author Matti Hamalainen <ccr@tnsp.org>
date Thu, 04 Jul 2019 10:54:16 +0300
parents 40797bfd35bf
children 69a5af2eb1ea
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;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
221 // Uint8 *data = stbi_load(filename, &x, &y, &n, 0);
893
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 //
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
234 // The return value from an image loader is an 'Uint8 *' which points
893
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
538 #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
539 #include <math.h> // ldexp
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
540 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
541
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
542 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
543 #include <stdio.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
544 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
545
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
546 #ifndef STBI_ASSERT
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
547 #include <assert.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
548 #define STBI_ASSERT(x) assert(x)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
549 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
550
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
551
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
552 #define stbi_inline inline
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
553 #define STBI_NOTUSED(v) (void)(v)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
554
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
555
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
556 #ifdef _MSC_VER
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
557 #define STBI_HAS_LROTL
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
558 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
559
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
560 #ifdef STBI_HAS_LROTL
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
561 #define stbi_lrot(x,y) _lrotl(x,y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
562 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
563 #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
564 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
565
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
566 #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
567 // 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
568 // (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
569 // 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
570 // 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
571 #define STBI_NO_SIMD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
572 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
573
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
574 #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
575 #define STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
576 #include <emmintrin.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
577
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
578 #ifdef _MSC_VER
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
579
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
580 #if _MSC_VER >= 1400 // not VC6
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
581 #include <intrin.h> // __cpuid
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
582 static int stbi__cpuid3(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
583 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
584 int info[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
585 __cpuid(info,1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
586 return info[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
587 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
588 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
589 static int stbi__cpuid3(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
590 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
591 int res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
592 __asm {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
593 mov eax,1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
594 cpuid
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
595 mov res,edx
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
596 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
597 return res;
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 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
600
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
601 #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
602
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
603 static int stbi__sse2_available()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
604 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
605 int info3 = stbi__cpuid3();
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
606 return ((info3 >> 26) & 1) != 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
607 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
608 #else // assume GCC-style if not VC++
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
609 #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
610
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
611 static int stbi__sse2_available()
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
612 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
613 #if defined(__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
614 // 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
615 return __builtin_cpu_supports("sse2");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
616 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
617 // 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
618 // just bail for now.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
619 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
620 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
621 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
622 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
623 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
624
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
625 // ARM NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
626 #if defined(STBI_NO_SIMD) && defined(STBI_NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
627 #undef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
628 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
629
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
630 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
631 #include <arm_neon.h>
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
632 // assume GCC or Clang on ARM targets
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
633 #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
634 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
635
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
636 #ifndef STBI_SIMD_ALIGN
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
637 #define STBI_SIMD_ALIGN(type, name) type name
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 ///////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
641 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
642 // stbi__context struct and start_xxx functions
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
643
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
644 // 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
645 // 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
646 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
647 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
648 Uint32 img_x, img_y;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
649 int img_n, img_out_n;
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 stbi_io_callbacks io;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
652 void *io_user_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
653
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
654 int read_from_callbacks;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
655 int buflen;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
656 Uint8 buffer_start[128];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
657
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
658 Uint8 *img_buffer, *img_buffer_end;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
659 Uint8 *img_buffer_original;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
660 } stbi__context;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
661
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
662
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
663 static void stbi__refill_buffer(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
664
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
665 // initialize a memory-decode context
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
666 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
667 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
668 s->io.read = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
669 s->read_from_callbacks = 0;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
670 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
671 s->img_buffer_end = (Uint8 *) buffer+len;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
672 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
673
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
674 // initialize a callback-based context
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
675 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
676 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
677 s->io = *c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
678 s->io_user_data = user;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
679 s->buflen = sizeof(s->buffer_start);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
680 s->read_from_callbacks = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
681 s->img_buffer_original = s->buffer_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
682 stbi__refill_buffer(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
683 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
684
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
685 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
686
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
687 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
688 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
689 return (int) fread(data,1,size,(FILE*) user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
690 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
691
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
692 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
693 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
694 fseek((FILE*) user, n, SEEK_CUR);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
695 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
696
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
697 static int stbi__stdio_eof(void *user)
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 return feof((FILE*) user);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
700 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
701
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
702 static stbi_io_callbacks stbi__stdio_callbacks =
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 stbi__stdio_read,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
705 stbi__stdio_skip,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
706 stbi__stdio_eof,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
707 };
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 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
710 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
711 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
712 }
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 //static void stop_file(stbi__context *s) { }
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 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
717
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
718 static void stbi__rewind(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
719 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
720 // 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
721 // 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
722 // 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
723 s->img_buffer = s->img_buffer_original;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
724 }
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 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
727 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
728 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
729 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
730 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
731
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
732 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
733 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
734 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
735 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
736 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
737
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
738 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
739 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
740 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
741 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
742 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
743
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
744 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
745 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
746 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
747 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
748 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
749
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
750 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
751 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
752 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
753 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
754 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
755
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
756 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
757 static int stbi__hdr_test(stbi__context *s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
758 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
759 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
760 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
761
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
762 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
763 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
764 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
765 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
766 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
767
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
768 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
769 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
770 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
771 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
772 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
773
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
774 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
775 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
776 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
777 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
778 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
779
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
780 // this is not threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
781 static const char *stbi__g_failure_reason;
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 STBIDEF const char *stbi_failure_reason(void)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
784 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
785 return stbi__g_failure_reason;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
786 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
787
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
788 #ifndef STBI_NO_FAILURE_STRINGS
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
789 static int stbi__err(const char *str)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
790 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
791 stbi__g_failure_reason = str;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
792 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
793 }
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
794 #endif
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
795
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
796
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
797 // stbi__err - error
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
798 // stbi__errpf - error returning pointer to float
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
799 // stbi__errpuc - error returning pointer to Uint8
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
800
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
801 #ifdef STBI_NO_FAILURE_STRINGS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
802 #define stbi__err(x,y) 0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
803 #elif defined(STBI_FAILURE_USERMSG)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
804 #define stbi__err(x,y) stbi__err(y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
805 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
806 #define stbi__err(x,y) stbi__err(x)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
807 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
808
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
809 #define stbi__errpf(x,y) ((float *) (stbi__err(x,y)?NULL:NULL))
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
810 #define stbi__errpuc(x,y) ((Uint8 *) (stbi__err(x,y)?NULL:NULL))
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
811
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
812 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
813 {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
814 dmFree(retval_from_stbi_load);
893
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
817 #ifndef STBI_NO_LINEAR
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
818 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
819 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
820
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
821 #ifndef STBI_NO_HDR
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
822 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
823 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
824
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
825 static Uint8 *stbi_load_main(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
826 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
827 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
828 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
829 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
830 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
831 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
832 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
833 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
834 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
835 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
836 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
837 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
838 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
839 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
840 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
841 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
842 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
843 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
844 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
845 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
846 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
847 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
848
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
849 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
850 if (stbi__hdr_test(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
851 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
852 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
853 }
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
856 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
857 // 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
858 if (stbi__tga_test(s))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
859 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
860 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
861
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
862 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
863 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
864
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
865 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
866
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
867 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
868 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
869 FILE *f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
870 #if defined(_MSC_VER) && _MSC_VER >= 1400
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
871 if (0 != fopen_s(&f, filename, mode))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
872 f=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
873 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
874 f = fopen(filename, mode);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
875 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
876 return f;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
877 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
878
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
879
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
880 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
881 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
882 FILE *f = stbi__fopen(filename, "rb");
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
883 Uint8 *result;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
884 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
885 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
886 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
887 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
888 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
889
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
890 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
891 {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
892 Uint8 *result;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
893 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
894 stbi__start_file(&s,f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
895 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
896 if (result) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
897 // 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
898 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
899 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
900 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
901 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
902 #endif //!STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
903
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
904 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
905 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
906 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
907 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
908 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
909 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
910
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
911 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
912 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
913 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
914 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
915 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
916 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
917
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
918 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
919 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
920 {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
921 Uint8 *data;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
922 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
923 if (stbi__hdr_test(s))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
924 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
925 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
926 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
927 if (data)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
928 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
929 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
930 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
931
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
932 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
933 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
934 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
935 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
936 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
937 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
938
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
939 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
940 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
941 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
942 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
943 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
944 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
945
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
946 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
947 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
948 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
949 float *result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
950 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
951 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
952 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
953 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
954 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
955 }
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 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
958 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
959 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
960 stbi__start_file(&s,f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
961 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
962 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
963 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
964
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
965 #endif // !STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
966
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
967 // 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
968 // 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
969 // reports false!
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
970
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
971 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
972 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
973 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
974 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
975 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
976 return stbi__hdr_test(&s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
977 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
978 STBI_NOTUSED(buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
979 STBI_NOTUSED(len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
980 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
981 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
982 }
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 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
985 STBIDEF int stbi_is_hdr (char const *filename)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
986 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
987 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
988 int result=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
989 if (f) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
990 result = stbi_is_hdr_from_file(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
991 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
992 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
993 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
994 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
995
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
996 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
997 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
998 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
999 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1000 stbi__start_file(&s,f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1001 return stbi__hdr_test(&s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1002 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1003 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1004 #endif
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 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1007
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1008 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
1009 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1010 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1011 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1012 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
1013 return stbi__hdr_test(&s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1014 #else
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1015 (void) clbk;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1016 (void) user;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1017 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1018 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1019 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1020
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1021 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
1022 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
1023
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1024 #ifndef STBI_NO_LINEAR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1025 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
1026 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
1027 #endif
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 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
1030 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
1031
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1032
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1033 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1034 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1035 // Common code used by all image loaders
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1036 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1037
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1038 enum
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 STBI__SCAN_load=0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1041 STBI__SCAN_type,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1042 STBI__SCAN_header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1043 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1044
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1045 static void stbi__refill_buffer(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1046 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1047 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
1048 if (n == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1049 // 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
1050 // 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
1051 s->read_from_callbacks = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1052 s->img_buffer = s->buffer_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1053 s->img_buffer_end = s->buffer_start+1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1054 *s->img_buffer = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1055 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1056 s->img_buffer = s->buffer_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1057 s->img_buffer_end = s->buffer_start + n;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1060
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1061 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
1062 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1063 if (s->img_buffer < s->img_buffer_end)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1064 return *s->img_buffer++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1065 if (s->read_from_callbacks) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1066 stbi__refill_buffer(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1067 return *s->img_buffer++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1068 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1069 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1070 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1071
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1072 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
1073 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1074 if (s->io.read) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1075 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
1076 // if feof() is true, check if buffer = end
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1077 // 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
1078 if (s->read_from_callbacks == 0) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1079 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1080
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1081 return s->img_buffer >= s->img_buffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1082 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1083
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1084 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
1085 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1086 if (s->io.read) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1087 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
1088 if (blen < n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1089 s->img_buffer = s->img_buffer_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1090 (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
1091 return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1092 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1093 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1094 s->img_buffer += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1095 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1096
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1097 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
1098 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1099 if (s->io.read) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1100 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
1101 if (blen < n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1102 int res, count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1103
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1104 memcpy(buffer, s->img_buffer, blen);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1105
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1106 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
1107 res = (count == (n-blen));
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 return res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1110 }
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 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
1114 memcpy(buffer, s->img_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1115 s->img_buffer += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1116 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1117 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1118 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1119 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1120
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1121 static int stbi__get16be(stbi__context *s)
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 int z = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1124 return (z << 8) + stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1125 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1126
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1127 static Uint32 stbi__get32be(stbi__context *s)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1128 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1129 Uint32 z = stbi__get16be(s);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1130 return (z << 16) + stbi__get16be(s);
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
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
1133 #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
1134 static int stbi__get16le(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1135 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1136 int z = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1137 return z + (stbi__get8(s) << 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1138 }
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
1139 #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
1140
e42aa3c940c1 Add #ifdef guards for stbi__get{16,32}le() for cases where they are
Matti Hamalainen <ccr@tnsp.org>
parents: 1134
diff changeset
1141 #if !defined(STBI_NO_BMP)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1142 static Uint32 stbi__get32le(stbi__context *s)
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1143 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1144 Uint32 z = stbi__get16le(s);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1145 return z + (stbi__get16le(s) << 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1146 }
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
1147 #endif
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1148
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1149 #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
1150
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1151
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1152 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1153 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1154 // 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
1155 // 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
1156 // 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
1157 // 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
1158 // 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
1159 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1160 // 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
1161 // only failure mode is malloc failing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1162
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1163 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
1164 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1165 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
1166 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1167
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1168 static Uint8 *stbi__convert_format(Uint8 *data, int img_n, int req_comp, unsigned int x, unsigned int y)
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 int i,j;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1171 Uint8 *good;
893
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 if (req_comp == img_n) return data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1174 STBI_ASSERT(req_comp >= 1 && req_comp <= 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1175
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1176 good = (Uint8 *) dmMalloc(req_comp * x * y);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1177 if (good == NULL) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1178 dmFree(data);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1179 return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1180 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1181
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1182 for (j=0; j < (int) y; ++j) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1183 Uint8 *src = data + j * x * img_n ;
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1184 Uint8 *dest = good + j * x * req_comp;
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 #define COMBO(a,b) ((a)*8+(b))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1187 #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
1188 // 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
1189 // 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
1190 switch (COMBO(img_n, req_comp)) {
1276
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1191 CASE(1,2) { dest[0]=src[0], dest[1]=255; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1192 CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1193 CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1194 CASE(2,1) { dest[0]=src[0]; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1195 CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1196 CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1197 CASE(3,4) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1198 CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1199 CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1200 CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1201 CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
1202 CASE(4,3) { dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; } break;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1203 default: STBI_ASSERT(0);
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 #undef CASE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1206 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1207
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1208 dmFree(data);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1209 return good;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1210 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1211
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1212 #ifndef STBI_NO_LINEAR
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1213 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
1214 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1215 int i,k,n;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1216 float *output = (float *) dmMalloc(x * y * comp * sizeof(float));
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1217 if (output == NULL) { dmFree(data); return stbi__errpf("outofmem", "Out of memory"); }
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1218 // compute number of non-alpha components
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1219 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
1220 for (i=0; i < x*y; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1221 for (k=0; k < n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1222 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
1223 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1224 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
1225 }
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1226 dmFree(data);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1227 return output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1228 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1229 #endif
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_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1232 #define stbi__float2int(x) ((int) (x))
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1233 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
1234 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1235 int i,k,n;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1236 Uint8 *output = (Uint8 *) dmMalloc(x * y * comp);
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1237 if (output == NULL) { dmFree(data); return stbi__errpuc("outofmem", "Out of memory"); }
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1238 // compute number of non-alpha components
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1239 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
1240 for (i=0; i < x*y; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1241 for (k=0; k < n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1242 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
1243 if (z < 0) z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1244 if (z > 255) z = 255;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1245 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
1246 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1247 if (k < comp) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1248 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
1249 if (z < 0) z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1250 if (z > 255) z = 255;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1251 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
1252 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1253 }
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1254 dmFree(data);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1255 return output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1256 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1257 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1258
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1259 //////////////////////////////////////////////////////////////////////////////
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1260 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1261 // "baseline" JPEG/JFIF decoder
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1262 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1263 // simple implementation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1264 // - doesn't support delayed output of y-dimension
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1265 // - 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
1266 // - doesn't try to recover corrupt jpegs
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1267 // - 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
1268 // - 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
1269 // - 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
1270 // - non-interleaved case requires this anyway
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1271 // - allows good upsampling (see next)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1272 // high-quality
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1273 // - upsampled channels are bilinearly interpolated, even across blocks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1274 // - quality integer IDCT derived from IJG's 'slow'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1275 // performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1276 // - fast huffman; reasonable integer IDCT
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1277 // - 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
1278 // - 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
1279
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1280 #ifndef STBI_NO_JPEG
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 // huffman decoding acceleration
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1283 #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
1284
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1285 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1286 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1287 Uint8 fast[1 << FAST_BITS];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1288 // 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
1289 Uint16 code[256];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1290 Uint8 values[256];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1291 Uint8 size[257];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1292 unsigned int maxcode[18];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1293 int delta[17]; // old 'firstsymbol' - old 'firstcode'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1294 } stbi__huffman;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1295
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1296 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1297 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1298 stbi__context *s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1299 stbi__huffman huff_dc[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1300 stbi__huffman huff_ac[4];
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1301 Uint8 dequant[4][64];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1302 Sint16 fast_ac[4][1 << FAST_BITS];
893
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 // sizes for components, interleaved MCUs
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1305 int img_h_max, img_v_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1306 int img_mcu_x, img_mcu_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1307 int img_mcu_w, img_mcu_h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1308
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1309 // definition of jpeg image component
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1310 struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1311 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1312 int id;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1313 int h,v;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1314 int tq;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1315 int hd,ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1316 int dc_pred;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1317
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1318 int x,y,w2,h2;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1319 Uint8 *data;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1320 void *raw_data, *raw_coeff;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1321 Uint8 *linebuf;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1322 short *coeff; // progressive only
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1323 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
1324 } img_comp[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1325
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1326 Uint32 code_buffer; // jpeg entropy-coded buffer
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1327 int code_bits; // number of valid bits
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1328 Uint8 marker; // marker seen while filling entropy buffer
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1329 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
1330
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1331 int progressive;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1332 int spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1333 int spec_end;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1334 int succ_high;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1335 int succ_low;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1336 int eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1337
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1338 int scan_n, order[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1339 int restart_interval, todo;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1340
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1341 // kernels
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1342 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
1343 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
1344 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
1345 } stbi__jpeg;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1346
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1347 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
1348 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1349 int i,j,k=0,code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1350 // 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
1351 for (i=0; i < 16; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1352 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
1353 h->size[k++] = (Uint8) (i+1);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1354 h->size[k] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1355
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1356 // compute actual symbols (from jpeg spec)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1357 code = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1358 k = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1359 for(j=1; j <= 16; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1360 // 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
1361 h->delta[j] = k - code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1362 if (h->size[k] == j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1363 while (h->size[k] == j)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1364 h->code[k++] = (Uint16) (code++);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1365 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
1366 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1367 // 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
1368 h->maxcode[j] = code << (16-j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1369 code <<= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1370 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1371 h->maxcode[j] = 0xffffffff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1372
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1373 // build non-spec acceleration table; 255 is flag for not-accelerated
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1374 dmMemset(h->fast, 255, 1 << FAST_BITS);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1375 for (i=0; i < k; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1376 int s = h->size[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1377 if (s <= FAST_BITS) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1378 int c = h->code[i] << (FAST_BITS-s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1379 int m = 1 << (FAST_BITS-s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1380 for (j=0; j < m; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1381 h->fast[c+j] = (Uint8) i;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1382 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1383 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1384 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1385 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1386 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1387
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1388 // build 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
1389 // one go.
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1390 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
1391 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1392 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1393 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
1394 Uint8 fast = h->fast[i];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1395 fast_ac[i] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1396 if (fast < 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1397 int rs = h->values[fast];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1398 int run = (rs >> 4) & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1399 int magbits = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1400 int len = h->size[fast];
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 if (magbits && len + magbits <= FAST_BITS) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1403 // magnitude code followed by receive_extend code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1404 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
1405 int m = 1 << (magbits - 1);
1438
40797bfd35bf Fix a warning.
Matti Hamalainen <ccr@tnsp.org>
parents: 1276
diff changeset
1406 if (k < m) k += (-1U << magbits) + 1;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1407 // 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
1408 if (k >= -128 && k <= 127)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1409 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
1410 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1411 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1412 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1413 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1414
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1415 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
1416 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1417 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1418 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
1419 if (b == 0xff) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1420 int c = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1421 if (c != 0) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1422 j->marker = (Uint8) c;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1423 j->nomore = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1424 return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1425 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1426 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1427 j->code_buffer |= b << (24 - j->code_bits);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1428 j->code_bits += 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1429 } while (j->code_bits <= 24);
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 // (1 << n) - 1
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1433 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
1434
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1435 // decode a jpeg huffman value from the bitstream
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1436 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
1437 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1438 unsigned int temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1439 int c,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1440
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1441 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
1442
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1443 // 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
1444 // if the code is <= FAST_BITS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1445 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
1446 k = h->fast[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1447 if (k < 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1448 int s = h->size[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1449 if (s > j->code_bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1450 return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1451 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1452 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1453 return h->values[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1454 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1455
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1456 // 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
1457 // 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
1458 // 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
1459 // 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
1460 // 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
1461 // 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
1462 temp = j->code_buffer >> 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1463 for (k=FAST_BITS+1 ; ; ++k)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1464 if (temp < h->maxcode[k])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1465 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1466 if (k == 17) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1467 // error! code not found
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1468 j->code_bits -= 16;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1471
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1472 if (k > j->code_bits)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1473 return -1;
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 // convert the huffman code to the symbol id
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1476 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
1477 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
1478
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1479 // convert the id to a symbol
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1480 j->code_bits -= k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1481 j->code_buffer <<= k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1482 return h->values[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1483 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1484
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1485 // bias[n] = (-1<<n) + 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1486 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
1487
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1488 // combined JPEG 'receive' and JPEG 'extend', since baseline
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1489 // always extends everything it receives.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1490 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
1491 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1492 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1493 int sgn;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1494 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
1495
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1496 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
1497 k = stbi_lrot(j->code_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1498 j->code_buffer = k & ~stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1499 k &= stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1500 j->code_bits -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1501 return k + (stbi__jbias[n] & ~sgn);
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 // get some unsigned bits
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1505 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
1506 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1507 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1508 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
1509 k = stbi_lrot(j->code_buffer, n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1510 j->code_buffer = k & ~stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1511 k &= stbi__bmask[n];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1512 j->code_bits -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1513 return k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1514 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1515
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1516 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
1517 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1518 unsigned int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1519 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
1520 k = j->code_buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1521 j->code_buffer <<= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1522 --j->code_bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1523 return k & 0x80000000;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1524 }
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 // 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
1527 // 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
1528 static Uint8 stbi__jpeg_dezigzag[64+15] =
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1529 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1530 0, 1, 8, 16, 9, 2, 3, 10,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1531 17, 24, 32, 25, 18, 11, 4, 5,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1532 12, 19, 26, 33, 40, 48, 41, 34,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1533 27, 20, 13, 6, 7, 14, 21, 28,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1534 35, 42, 49, 56, 57, 50, 43, 36,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1535 29, 22, 15, 23, 30, 37, 44, 51,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1536 58, 59, 52, 45, 38, 31, 39, 46,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1537 53, 60, 61, 54, 47, 55, 62, 63,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1538 // let corrupt input sample past end
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1539 63, 63, 63, 63, 63, 63, 63, 63,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1540 63, 63, 63, 63, 63, 63, 63
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1541 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1542
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1543 // decode one 64-entry block--
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1544 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
1545 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1546 int diff,dc,k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1547 int t;
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 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
1550 t = stbi__jpeg_huff_decode(j, hdc);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1551 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
1552
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1553 // 0 all the ac values now so we can do it 32-bits at a time
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1554 dmMemset(data,0,64*sizeof(data[0]));
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1555
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1556 diff = t ? stbi__extend_receive(j, t) : 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1557 dc = j->img_comp[b].dc_pred + diff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1558 j->img_comp[b].dc_pred = dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1559 data[0] = (short) (dc * dequant[0]);
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 // decode AC components, see JPEG spec
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1562 k = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1563 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1564 unsigned int zig;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1565 int c,r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1566 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
1567 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
1568 r = fac[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1569 if (r) { // fast-AC path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1570 k += (r >> 4) & 15; // run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1571 s = r & 15; // combined length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1572 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1573 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1574 // decode into unzigzag'd location
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1575 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1576 data[zig] = (short) ((r >> 8) * dequant[zig]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1577 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1578 int rs = stbi__jpeg_huff_decode(j, hac);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1579 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
1580 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1581 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1582 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1583 if (rs != 0xf0) break; // end block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1584 k += 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1585 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1586 k += r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1587 // decode into unzigzag'd location
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1588 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1589 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
1590 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1591 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1592 } while (k < 64);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1593 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1594 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1595
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1596 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
1597 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1598 int diff,dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1599 int t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1600 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
1601
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1602 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
1603
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1604 if (j->succ_high == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1605 // first scan for DC coefficient, must be first
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
1606 dmMemset(data,0,64*sizeof(data[0])); // 0 all the ac values now
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1607 t = stbi__jpeg_huff_decode(j, hdc);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1608 diff = t ? stbi__extend_receive(j, t) : 0;
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 dc = j->img_comp[b].dc_pred + diff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1611 j->img_comp[b].dc_pred = dc;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1612 data[0] = (short) (dc << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1613 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1614 // refinement scan for DC coefficient
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1615 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1616 data[0] += (short) (1 << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1617 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1618 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1619 }
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 // @OPTIMIZE: store non-zigzagged during the decode passes,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1622 // and only de-zigzag when dequantizing
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1623 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
1624 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1625 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1626 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
1627
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1628 if (j->succ_high == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1629 int shift = j->succ_low;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1630
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1631 if (j->eob_run) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1632 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1633 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1634 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1635
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1636 k = j->spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1637 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1638 unsigned int zig;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1639 int c,r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1640 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
1641 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
1642 r = fac[c];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1643 if (r) { // fast-AC path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1644 k += (r >> 4) & 15; // run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1645 s = r & 15; // combined length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1646 j->code_buffer <<= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1647 j->code_bits -= s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1648 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1649 data[zig] = (short) ((r >> 8) << shift);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1650 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1651 int rs = stbi__jpeg_huff_decode(j, hac);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1652 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
1653 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1654 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1655 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1656 if (r < 15) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1657 j->eob_run = (1 << r);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1658 if (r)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1659 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
1660 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1661 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1662 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1663 k += 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1664 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1665 k += r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1666 zig = stbi__jpeg_dezigzag[k++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1667 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
1668 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1669 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1670 } while (k <= j->spec_end);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1671 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1672 // refinement scan for these AC coefficients
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1673
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1674 short bit = (short) (1 << j->succ_low);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1675
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1676 if (j->eob_run) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1677 --j->eob_run;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1678 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
1679 short *p = &data[stbi__jpeg_dezigzag[k]];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1680 if (*p != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1681 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1682 if ((*p & bit)==0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1683 if (*p > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1684 *p += bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1685 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1686 *p -= bit;
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 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1690 k = j->spec_start;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1691 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1692 int r,s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1693 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
1694 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
1695 s = rs & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1696 r = rs >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1697 if (s == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1698 if (r < 15) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1699 j->eob_run = (1 << r) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1700 if (r)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1701 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
1702 r = 64; // force end of block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1703 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1704 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
1705 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1706 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
1707 // sign bit
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1708 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1709 s = bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1710 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1711 s = -bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1712 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1713
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1714 // advance by r
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1715 while (k <= j->spec_end) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1716 short *p = &data[stbi__jpeg_dezigzag[k]];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1717 if (*p != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1718 if (stbi__jpeg_get_bit(j))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1719 if ((*p & bit)==0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1720 if (*p > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1721 *p += bit;
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 *p -= bit;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1724 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1725 ++k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1726 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1727 if (r == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1728 if (s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1729 data[stbi__jpeg_dezigzag[k++]] = (short) s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1730 break;
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 --r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1733 ++k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1734 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1735 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1736 } while (k <= j->spec_end);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1737 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1738 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1739 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1740 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1741
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1742 // 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
1743 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
1744 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1745 // 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
1746 if ((unsigned int) x > 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1747 if (x < 0) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1748 if (x > 255) return 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1749 }
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1750 return (Uint8) x;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1751 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1752
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1753 #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
1754 #define stbi__fsh(x) ((x) << 12)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1755
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1756 // derived from jidctint -- DCT_ISLOW
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1757 #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
1758 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
1759 p2 = s2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1760 p3 = s6; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1761 p1 = (p2+p3) * stbi__f2f(0.5411961f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1762 t2 = p1 + p3*stbi__f2f(-1.847759065f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1763 t3 = p1 + p2*stbi__f2f( 0.765366865f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1764 p2 = s0; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1765 p3 = s4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1766 t0 = stbi__fsh(p2+p3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1767 t1 = stbi__fsh(p2-p3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1768 x0 = t0+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1769 x3 = t0-t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1770 x1 = t1+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1771 x2 = t1-t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1772 t0 = s7; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1773 t1 = s5; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1774 t2 = s3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1775 t3 = s1; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1776 p3 = t0+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1777 p4 = t1+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1778 p1 = t0+t3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1779 p2 = t1+t2; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1780 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1781 t0 = t0*stbi__f2f( 0.298631336f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1782 t1 = t1*stbi__f2f( 2.053119869f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1783 t2 = t2*stbi__f2f( 3.072711026f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1784 t3 = t3*stbi__f2f( 1.501321110f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1785 p1 = p5 + p1*stbi__f2f(-0.899976223f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1786 p2 = p5 + p2*stbi__f2f(-2.562915447f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1787 p3 = p3*stbi__f2f(-1.961570560f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1788 p4 = p4*stbi__f2f(-0.390180644f); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1789 t3 += p1+p4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1790 t2 += p2+p3; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1791 t1 += p2+p4; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1792 t0 += p1+p3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1793
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1794 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
1795 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1796 int i,val[64],*v=val;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1797 Uint8 *o;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1798 short *d = data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1799
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1800 // columns
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1801 for (i=0; i < 8; ++i,++d, ++v) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1802 // 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
1803 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
1804 && 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
1805 // no shortcut 0 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1806 // (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
1807 // all separate -0.047 seconds
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1808 // 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
1809 int dcterm = d[0] << 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1810 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
1811 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1812 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
1813 // 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
1814 // down, but keep 2 extra bits of precision
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1815 x0 += 512; x1 += 512; x2 += 512; x3 += 512;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1816 v[ 0] = (x0+t3) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1817 v[56] = (x0-t3) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1818 v[ 8] = (x1+t2) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1819 v[48] = (x1-t2) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1820 v[16] = (x2+t1) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1821 v[40] = (x2-t1) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1822 v[24] = (x3+t0) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1823 v[32] = (x3-t0) >> 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1824 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1825 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1826
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1827 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
1828 // 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
1829 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
1830 // 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
1831 // 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
1832 // 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
1833 // 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
1834 // 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
1835 // 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
1836 x0 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1837 x1 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1838 x2 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1839 x3 += 65536 + (128<<17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1840 // 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
1841 // 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
1842 o[0] = stbi__clamp((x0+t3) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1843 o[7] = stbi__clamp((x0-t3) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1844 o[1] = stbi__clamp((x1+t2) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1845 o[6] = stbi__clamp((x1-t2) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1846 o[2] = stbi__clamp((x2+t1) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1847 o[5] = stbi__clamp((x2-t1) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1848 o[3] = stbi__clamp((x3+t0) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1849 o[4] = stbi__clamp((x3-t0) >> 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1850 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1851 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1852
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1853 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1854 // 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
1855 // 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
1856 // fully "transparent".
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
1857 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
1858 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1859 // 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
1860 __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
1861 __m128i tmp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1862
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1863 // 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
1864 #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
1865
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1866 // 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
1867 // out(1) = c1[even]*x + c1[odd]*y
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1868 #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
1869 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1870 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1871 __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
1872 __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
1873 __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
1874 __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
1875
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1876 // 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
1877 #define dct_widen(out, in) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1878 __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
1879 __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
1880
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1881 // wide add
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1882 #define dct_wadd(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1883 __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
1884 __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
1885
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1886 // wide sub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1887 #define dct_wsub(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1888 __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
1889 __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
1890
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1891 // 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
1892 #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
1893 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1894 __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
1895 __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
1896 dct_wadd(sum, abiased, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1897 dct_wsub(dif, abiased, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1898 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
1899 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
1900 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1901
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1902 // 8-bit interleave step (for transposes)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1903 #define dct_interleave8(a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1904 tmp = a; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1905 a = _mm_unpacklo_epi8(a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1906 b = _mm_unpackhi_epi8(tmp, b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1907
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1908 // 16-bit interleave step (for transposes)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1909 #define dct_interleave16(a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1910 tmp = a; \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1911 a = _mm_unpacklo_epi16(a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1912 b = _mm_unpackhi_epi16(tmp, b)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1913
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1914 #define dct_pass(bias,shift) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1915 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1916 /* even part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1917 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
1918 __m128i sum04 = _mm_add_epi16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1919 __m128i dif04 = _mm_sub_epi16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1920 dct_widen(t0e, sum04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1921 dct_widen(t1e, dif04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1922 dct_wadd(x0, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1923 dct_wsub(x3, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1924 dct_wadd(x1, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1925 dct_wsub(x2, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1926 /* odd part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1927 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
1928 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
1929 __m128i sum17 = _mm_add_epi16(row1, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1930 __m128i sum35 = _mm_add_epi16(row3, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1931 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
1932 dct_wadd(x4, y0o, y4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1933 dct_wadd(x5, y1o, y5o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1934 dct_wadd(x6, y2o, y5o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1935 dct_wadd(x7, y3o, y4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1936 dct_bfly32o(row0,row7, x0,x7,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1937 dct_bfly32o(row1,row6, x1,x6,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1938 dct_bfly32o(row2,row5, x2,x5,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1939 dct_bfly32o(row3,row4, x3,x4,bias,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1940 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1941
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1942 __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
1943 __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
1944 __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
1945 __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
1946 __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
1947 __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
1948 __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
1949 __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
1950
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1951 // 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
1952 __m128i bias_0 = _mm_set1_epi32(512);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1953 __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
1954
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1955 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1956 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
1957 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
1958 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
1959 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
1960 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
1961 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
1962 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
1963 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
1964
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1965 // column pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1966 dct_pass(bias_0, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1967
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1968 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1969 // 16bit 8x8 transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1970 dct_interleave16(row0, row4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1971 dct_interleave16(row1, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1972 dct_interleave16(row2, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1973 dct_interleave16(row3, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1974
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1975 // transpose pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1976 dct_interleave16(row0, row2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1977 dct_interleave16(row1, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1978 dct_interleave16(row4, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1979 dct_interleave16(row5, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1980
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1981 // transpose pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1982 dct_interleave16(row0, row1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1983 dct_interleave16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1984 dct_interleave16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1985 dct_interleave16(row6, row7);
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 // row pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1989 dct_pass(bias_1, 17);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1990
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1991 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1992 // pack
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1993 __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
1994 __m128i p1 = _mm_packus_epi16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1995 __m128i p2 = _mm_packus_epi16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1996 __m128i p3 = _mm_packus_epi16(row6, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1997
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1998 // 8bit 8x8 transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
1999 dct_interleave8(p0, p2); // a0e0a1e1...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2000 dct_interleave8(p1, p3); // c0g0c1g1...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2001
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2002 // transpose pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2003 dct_interleave8(p0, p1); // a0c0e0g0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2004 dct_interleave8(p2, p3); // b0d0f0h0...
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 // transpose pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2007 dct_interleave8(p0, p2); // a0b0c0d0...
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2008 dct_interleave8(p1, p3); // a4b4c4d4...
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 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2011 _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
2012 _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
2013 _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
2014 _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
2015 _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
2016 _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
2017 _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
2018 _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
2019 }
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 #undef dct_const
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2022 #undef dct_rot
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2023 #undef dct_widen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2024 #undef dct_wadd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2025 #undef dct_wsub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2026 #undef dct_bfly32o
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2027 #undef dct_interleave8
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2028 #undef dct_interleave16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2029 #undef dct_pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2030 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2031
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2032 #endif // STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2033
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2034 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2035
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2036 // NEON integer IDCT. should produce bit-identical
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2037 // results to the generic C version.
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2038 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
2039 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2040 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
2041
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2042 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
2043 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
2044 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
2045 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
2046 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
2047 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
2048 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
2049 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
2050 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
2051 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
2052 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
2053 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
2054
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2055 #define dct_long_mul(out, inq, coeff) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2056 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
2057 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
2058
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2059 #define dct_long_mac(out, acc, inq, coeff) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2060 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
2061 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
2062
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2063 #define dct_widen(out, inq) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2064 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
2065 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
2066
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2067 // wide add
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2068 #define dct_wadd(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2069 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
2070 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
2071
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2072 // wide sub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2073 #define dct_wsub(out, a, b) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2074 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
2075 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
2076
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2077 // 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
2078 #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
2079 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2080 dct_wadd(sum, a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2081 dct_wsub(dif, a, b); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2082 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
2083 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
2084 }
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 #define dct_pass(shiftop, shift) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2087 { \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2088 /* even part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2089 int16x8_t sum26 = vaddq_s16(row2, row6); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2090 dct_long_mul(p1e, sum26, rot0_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2091 dct_long_mac(t2e, p1e, row6, rot0_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2092 dct_long_mac(t3e, p1e, row2, rot0_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2093 int16x8_t sum04 = vaddq_s16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2094 int16x8_t dif04 = vsubq_s16(row0, row4); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2095 dct_widen(t0e, sum04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2096 dct_widen(t1e, dif04); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2097 dct_wadd(x0, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2098 dct_wsub(x3, t0e, t3e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2099 dct_wadd(x1, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2100 dct_wsub(x2, t1e, t2e); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2101 /* odd part */ \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2102 int16x8_t sum15 = vaddq_s16(row1, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2103 int16x8_t sum17 = vaddq_s16(row1, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2104 int16x8_t sum35 = vaddq_s16(row3, row5); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2105 int16x8_t sum37 = vaddq_s16(row3, row7); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2106 int16x8_t sumodd = vaddq_s16(sum17, sum35); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2107 dct_long_mul(p5o, sumodd, rot1_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2108 dct_long_mac(p1o, p5o, sum17, rot1_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2109 dct_long_mac(p2o, p5o, sum35, rot1_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2110 dct_long_mul(p3o, sum37, rot2_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2111 dct_long_mul(p4o, sum15, rot2_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2112 dct_wadd(sump13o, p1o, p3o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2113 dct_wadd(sump24o, p2o, p4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2114 dct_wadd(sump23o, p2o, p3o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2115 dct_wadd(sump14o, p1o, p4o); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2116 dct_long_mac(x4, sump13o, row7, rot3_0); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2117 dct_long_mac(x5, sump24o, row5, rot3_1); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2118 dct_long_mac(x6, sump23o, row3, rot3_2); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2119 dct_long_mac(x7, sump14o, row1, rot3_3); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2120 dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2121 dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2122 dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2123 dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2124 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2125
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2126 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2127 row0 = vld1q_s16(data + 0*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2128 row1 = vld1q_s16(data + 1*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2129 row2 = vld1q_s16(data + 2*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2130 row3 = vld1q_s16(data + 3*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2131 row4 = vld1q_s16(data + 4*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2132 row5 = vld1q_s16(data + 5*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2133 row6 = vld1q_s16(data + 6*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2134 row7 = vld1q_s16(data + 7*8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2135
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2136 // add DC bias
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2137 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
2138
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2139 // column pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2140 dct_pass(vrshrn_n_s32, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2141
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2142 // 16bit 8x8 transpose
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 // 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
2145 // 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
2146 #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
2147 #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
2148 #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
2149
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2150 // pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2151 dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2152 dct_trn16(row2, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2153 dct_trn16(row4, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2154 dct_trn16(row6, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2155
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2156 // pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2157 dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2158 dct_trn32(row1, row3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2159 dct_trn32(row4, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2160 dct_trn32(row5, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2161
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2162 // pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2163 dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2164 dct_trn64(row1, row5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2165 dct_trn64(row2, row6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2166 dct_trn64(row3, row7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2167
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2168 #undef dct_trn16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2169 #undef dct_trn32
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2170 #undef dct_trn64
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2171 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2172
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2173 // row pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2174 // 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
2175 // 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
2176 // up with a rounding shift by 1.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2177 dct_pass(vshrn_n_s32, 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2178
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2179 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2180 // pack and round
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2181 uint8x8_t p0 = vqrshrun_n_s16(row0, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2182 uint8x8_t p1 = vqrshrun_n_s16(row1, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2183 uint8x8_t p2 = vqrshrun_n_s16(row2, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2184 uint8x8_t p3 = vqrshrun_n_s16(row3, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2185 uint8x8_t p4 = vqrshrun_n_s16(row4, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2186 uint8x8_t p5 = vqrshrun_n_s16(row5, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2187 uint8x8_t p6 = vqrshrun_n_s16(row6, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2188 uint8x8_t p7 = vqrshrun_n_s16(row7, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2189
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2190 // 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
2191 #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
2192 #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
2193 #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
2194
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2195 // 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
2196 // 8 bytes to each scan line!
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 // 8x8 8-bit transpose pass 1
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2199 dct_trn8_8(p0, p1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2200 dct_trn8_8(p2, p3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2201 dct_trn8_8(p4, p5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2202 dct_trn8_8(p6, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2203
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2204 // pass 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2205 dct_trn8_16(p0, p2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2206 dct_trn8_16(p1, p3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2207 dct_trn8_16(p4, p6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2208 dct_trn8_16(p5, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2209
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2210 // pass 3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2211 dct_trn8_32(p0, p4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2212 dct_trn8_32(p1, p5);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2213 dct_trn8_32(p2, p6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2214 dct_trn8_32(p3, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2215
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2216 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2217 vst1_u8(out, p0); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2218 vst1_u8(out, p1); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2219 vst1_u8(out, p2); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2220 vst1_u8(out, p3); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2221 vst1_u8(out, p4); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2222 vst1_u8(out, p5); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2223 vst1_u8(out, p6); out += out_stride;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2224 vst1_u8(out, p7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2225
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2226 #undef dct_trn8_8
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2227 #undef dct_trn8_16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2228 #undef dct_trn8_32
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2229 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2230
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2231 #undef dct_long_mul
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2232 #undef dct_long_mac
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2233 #undef dct_widen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2234 #undef dct_wadd
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2235 #undef dct_wsub
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2236 #undef dct_bfly32o
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2237 #undef dct_pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2238 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2239
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2240 #endif // STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2241
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2242 #define STBI__MARKER_none 0xff
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2243 // 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
2244 // 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
2245 // 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
2246 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
2247 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2248 Uint8 x;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2249 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
2250 x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2251 if (x != 0xff) return STBI__MARKER_none;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2252 while (x == 0xff)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2253 x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2254 return x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2255 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2256
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2257 // 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
2258 // of the components is specified by order[]
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2259 #define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
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 // 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
2262 // the dc prediction
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2263 static void stbi__jpeg_reset(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2264 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2265 j->code_bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2266 j->code_buffer = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2267 j->nomore = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2268 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
2269 j->marker = STBI__MARKER_none;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2270 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
2271 j->eob_run = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2272 // 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
2273 // 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
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 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
2277 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2278 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2279 if (!z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2280 if (z->scan_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2281 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2282 STBI_SIMD_ALIGN(short, data[64]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2283 int n = z->order[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2284 // 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
2285 // in trivial scanline order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2286 // 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
2287 // 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
2288 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
2289 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
2290 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2291 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2292 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2293 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
2294 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
2295 // 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
2296 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2297 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
2298 // 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
2299 // rather than no data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2300 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2301 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2302 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2303 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2304 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2305 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2306 } else { // interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2307 int i,j,k,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2308 STBI_SIMD_ALIGN(short, data[64]);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2309 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
2310 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
2311 // 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
2312 for (k=0; k < z->scan_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2313 int n = z->order[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2314 // 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
2315 // 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
2316 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
2317 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
2318 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
2319 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
2320 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2321 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
2322 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
2323 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2324 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2325 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2326 // 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
2327 // so now count down the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2328 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2329 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
2330 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2331 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2332 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2333 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2334 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2335 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2336 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2337 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2338 if (z->scan_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2339 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2340 int n = z->order[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2341 // non-interleaved data, we just need to process one block at a time,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2342 // in trivial scanline order
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2343 // number of blocks to do just depends on how many actual "pixels" this
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2344 // component has, independent of interleaved MCU blocking and such
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2345 int w = (z->img_comp[n].x+7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2346 int h = (z->img_comp[n].y+7) >> 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2347 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2348 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2349 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
2350 if (z->spec_start == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2351 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
2352 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2353 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2354 int ha = z->img_comp[n].ha;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2355 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
2356 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2357 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2358 // 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
2359 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2360 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
2361 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2362 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2363 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2364 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2365 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2366 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2367 } else { // interleaved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2368 int i,j,k,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2369 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
2370 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
2371 // 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
2372 for (k=0; k < z->scan_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2373 int n = z->order[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2374 // 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
2375 // 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
2376 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
2377 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
2378 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
2379 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
2380 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
2381 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
2382 return 0;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2386 // 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
2387 // so now count down the restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2388 if (--z->todo <= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2389 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
2390 if (!STBI__RESTART(z->marker)) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2391 stbi__jpeg_reset(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2392 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2393 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2394 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2395 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2396 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2397 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2398 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2399
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2400 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
2401 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2402 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2403 for (i=0; i < 64; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2404 data[i] *= dequant[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2405 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2406
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2407 static void stbi__jpeg_finish(stbi__jpeg *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2408 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2409 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2410 // dequantize and idct the data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2411 int i,j,n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2412 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
2413 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
2414 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
2415 for (j=0; j < h; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2416 for (i=0; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2417 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
2418 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
2419 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
2420 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2421 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2422 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2423 }
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 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
2427 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2428 int L;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2429 switch (m) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2430 case STBI__MARKER_none: // no marker found
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2431 return stbi__err("expected marker","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2432
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2433 case 0xDD: // DRI - specify restart interval
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2434 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
2435 z->restart_interval = stbi__get16be(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2436 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2437
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2438 case 0xDB: // DQT - define quantization table
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2439 L = stbi__get16be(z->s)-2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2440 while (L > 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2441 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2442 int p = q >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2443 int t = q & 15,i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2444 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
2445 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
2446 for (i=0; i < 64; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2447 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
2448 L -= 65;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2449 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2450 return L==0;
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 0xC4: // DHT - define huffman table
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2453 L = stbi__get16be(z->s)-2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2454 while (L > 0) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2455 Uint8 *v;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2456 int sizes[16],i,n=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2457 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2458 int tc = q >> 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2459 int th = q & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2460 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
2461 for (i=0; i < 16; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2462 sizes[i] = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2463 n += sizes[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2464 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2465 L -= 17;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2466 if (tc == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2467 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
2468 v = z->huff_dc[th].values;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2469 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2470 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
2471 v = z->huff_ac[th].values;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2472 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2473 for (i=0; i < n; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2474 v[i] = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2475 if (tc != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2476 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
2477 L -= n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2478 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2479 return L==0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2480 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2481 // check for comment block or APP blocks
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2482 if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2483 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
2484 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2485 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2486 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2487 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2488
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2489 // after we see SOS
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2490 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
2491 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2492 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2493 int Ls = stbi__get16be(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2494 z->scan_n = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2495 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
2496 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
2497 for (i=0; i < z->scan_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2498 int id = stbi__get8(z->s), which;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2499 int q = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2500 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
2501 if (z->img_comp[which].id == id)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2502 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2503 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
2504 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
2505 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
2506 z->order[i] = which;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2509 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2510 int aa;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2511 z->spec_start = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2512 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
2513 aa = stbi__get8(z->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2514 z->succ_high = (aa >> 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2515 z->succ_low = (aa & 15);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2516 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2517 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
2518 return stbi__err("bad SOS", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2519 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2520 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
2521 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
2522 z->spec_end = 63;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2523 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2524 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2525
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2526 return 1;
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 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
2530 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2531 stbi__context *s = z->s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2532 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
2533 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
2534 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
2535 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
2536 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
2537 c = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2538 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
2539 s->img_n = c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2540 for (i=0; i < c; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2541 z->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2542 z->img_comp[i].linebuf = NULL;
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 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
2546
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2547 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2548 z->img_comp[i].id = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2549 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
2550 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
2551 return stbi__err("bad component ID","Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2552 q = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2553 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
2554 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
2555 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
2556 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2557
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2558 if (scan != STBI__SCAN_load) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2559
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2560 if ((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
2561
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2562 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2563 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
2564 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
2565 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2566
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2567 // compute interleaved mcu info
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2568 z->img_h_max = h_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2569 z->img_v_max = v_max;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2570 z->img_mcu_w = h_max * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2571 z->img_mcu_h = v_max * 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2572 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
2573 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
2574
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2575 for (i=0; i < s->img_n; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2576 // 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
2577 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
2578 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
2579 // 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
2580 // 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
2581 // 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
2582 // discard the extra data until colorspace conversion
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2583 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
2584 z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
2585 z->img_comp[i].raw_data = dmMalloc(z->img_comp[i].w2 * z->img_comp[i].h2+15);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2586
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2587 if (z->img_comp[i].raw_data == NULL) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2588 for(--i; i >= 0; --i) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
2589 dmFree(z->img_comp[i].raw_data);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2590 z->img_comp[i].data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2591 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2592 return stbi__err("outofmem", "Out of memory");
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 // 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
2595 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
2596 z->img_comp[i].linebuf = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2597 if (z->progressive) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2598 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
2599 z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
2600 z->img_comp[i].raw_coeff = dmMalloc(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2601 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
2602 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2603 z->img_comp[i].coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2604 z->img_comp[i].raw_coeff = 0;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2607
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2608 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2609 }
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 // 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
2612 #define stbi__DNL(x) ((x) == 0xdc)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2613 #define stbi__SOI(x) ((x) == 0xd8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2614 #define stbi__EOI(x) ((x) == 0xd9)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2615 #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
2616 #define stbi__SOS(x) ((x) == 0xda)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2617
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2618 #define stbi__SOF_progressive(x) ((x) == 0xc2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2619
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2620 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
2621 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2622 int m;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2623 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
2624 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2625 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
2626 if (scan == STBI__SCAN_type) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2627 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2628 while (!stbi__SOF(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2629 if (!stbi__process_marker(z,m)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2630 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2631 while (m == STBI__MARKER_none) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2632 // 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
2633 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
2634 m = stbi__get_marker(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2635 }
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 z->progressive = stbi__SOF_progressive(m);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2638 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
2639 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2642 // decode image to YCbCr format
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2643 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
2644 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2645 int m;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2646 j->restart_interval = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2647 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
2648 m = stbi__get_marker(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2649 while (!stbi__EOI(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2650 if (stbi__SOS(m)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2651 if (!stbi__process_scan_header(j)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2652 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
2653 if (j->marker == STBI__MARKER_none ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2654 // 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
2655 while (!stbi__at_eof(j->s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2656 int x = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2657 if (x == 255) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2658 j->marker = stbi__get8(j->s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2659 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2660 } else if (x != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2661 return stbi__err("junk before marker", "Corrupt JPEG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2662 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2663 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2664 // 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
2665 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2666 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2667 if (!stbi__process_marker(j, m)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2668 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2669 m = stbi__get_marker(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2670 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2671 if (j->progressive)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2672 stbi__jpeg_finish(j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2673 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2674 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2675
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2676 // static jfif-centered resampling (across block boundaries)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2677
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2678 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
2679 int w, int hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2680
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2681 #define stbi__div4(x) ((Uint8) ((x) >> 2))
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2682
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2683 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
2684 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2685 STBI_NOTUSED(out);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2686 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2687 STBI_NOTUSED(w);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2688 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2689 return in_near;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2690 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2691
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2692 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
2693 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2694 // 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
2695 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2696 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2697 for (i=0; i < w; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2698 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
2699 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2700 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2701
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2702 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
2703 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2704 // 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
2705 int i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2706 Uint8 *input = in_near;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2707
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2708 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2709 // 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
2710 out[0] = out[1] = input[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2711 return out;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2714 out[0] = input[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2715 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
2716 for (i=1; i < w-1; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2717 int n = 3*input[i]+2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2718 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
2719 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
2720 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2721 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
2722 out[i*2+1] = input[w-1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2723
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2724 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2725 STBI_NOTUSED(hs);
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 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2728 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2729
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2730 #define stbi__div16(x) ((Uint8) ((x) >> 4))
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2731
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2732 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
2733 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2734 // 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
2735 int i,t0,t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2736 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2737 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
2738 return out;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2741 t1 = 3*in_near[0] + in_far[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2742 out[0] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2743 for (i=1; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2744 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2745 t1 = 3*in_near[i]+in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2746 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
2747 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
2748 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2749 out[w*2-1] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2750
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2751 STBI_NOTUSED(hs);
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 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2754 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2755
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2756 #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
2757 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
2758 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2759 // 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
2760 int i=0,t0,t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2761
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2762 if (w == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2763 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
2764 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2765 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2766
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2767 t1 = 3*in_near[0] + in_far[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2768 // 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
2769 // 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
2770 // 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
2771 for (; i < ((w-1) & ~7); i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2772 #if defined(STBI_SSE2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2773 // load and perform the vertical filtering pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2774 // 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
2775 __m128i zero = _mm_setzero_si128();
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2776 __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
2777 __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
2778 __m128i farw = _mm_unpacklo_epi8(farb, zero);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2779 __m128i nearw = _mm_unpacklo_epi8(nearb, zero);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2780 __m128i diff = _mm_sub_epi16(farw, nearw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2781 __m128i nears = _mm_slli_epi16(nearw, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2782 __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
2783
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2784 // 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
2785 // 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
2786 // insert the previous pixel value (from t1).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2787 // "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
2788 // of next block of 8 pixels added in.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2789 __m128i prv0 = _mm_slli_si128(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2790 __m128i nxt0 = _mm_srli_si128(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2791 __m128i prev = _mm_insert_epi16(prv0, t1, 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2792 __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
2793
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2794 // horizontal filter, polyphase implementation since it's convenient:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2795 // 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
2796 // 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
2797 // note the shared term.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2798 __m128i bias = _mm_set1_epi16(8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2799 __m128i curs = _mm_slli_epi16(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2800 __m128i prvd = _mm_sub_epi16(prev, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2801 __m128i nxtd = _mm_sub_epi16(next, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2802 __m128i curb = _mm_add_epi16(curs, bias);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2803 __m128i even = _mm_add_epi16(prvd, curb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2804 __m128i odd = _mm_add_epi16(nxtd, curb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2805
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2806 // interleave even and odd pixels, then undo scaling.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2807 __m128i int0 = _mm_unpacklo_epi16(even, odd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2808 __m128i int1 = _mm_unpackhi_epi16(even, odd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2809 __m128i de0 = _mm_srli_epi16(int0, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2810 __m128i de1 = _mm_srli_epi16(int1, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2811
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2812 // pack and write output
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2813 __m128i outv = _mm_packus_epi16(de0, de1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2814 _mm_storeu_si128((__m128i *) (out + i*2), outv);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2815 #elif defined(STBI_NEON)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2816 // load and perform the vertical filtering pass
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2817 // 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
2818 uint8x8_t farb = vld1_u8(in_far + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2819 uint8x8_t nearb = vld1_u8(in_near + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2820 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
2821 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
2822 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
2823
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2824 // 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
2825 // 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
2826 // insert the previous pixel value (from t1).
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2827 // "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
2828 // of next block of 8 pixels added in.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2829 int16x8_t prv0 = vextq_s16(curr, curr, 7);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2830 int16x8_t nxt0 = vextq_s16(curr, curr, 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2831 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
2832 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
2833
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2834 // horizontal filter, polyphase implementation since it's convenient:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2835 // 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
2836 // 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
2837 // note the shared term.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2838 int16x8_t curs = vshlq_n_s16(curr, 2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2839 int16x8_t prvd = vsubq_s16(prev, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2840 int16x8_t nxtd = vsubq_s16(next, curr);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2841 int16x8_t even = vaddq_s16(curs, prvd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2842 int16x8_t odd = vaddq_s16(curs, nxtd);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2843
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2844 // 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
2845 uint8x8x2_t o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2846 o.val[0] = vqrshrun_n_s16(even, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2847 o.val[1] = vqrshrun_n_s16(odd, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2848 vst2_u8(out + i*2, o);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2849 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2850
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2851 // "previous" value for next iter
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2852 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
2853 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2854
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2855 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2856 t1 = 3*in_near[i] + in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2857 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
2858
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2859 for (++i; i < w; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2860 t0 = t1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2861 t1 = 3*in_near[i]+in_far[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2862 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
2863 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
2864 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2865 out[w*2-1] = stbi__div4(t1+2);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2866
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2867 STBI_NOTUSED(hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2868
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2869 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2870 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2871 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2872
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2873 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
2874 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2875 // resample with nearest-neighbor
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2876 int i,j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2877 STBI_NOTUSED(in_far);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2878 for (i=0; i < w; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2879 for (j=0; j < hs; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2880 out[i*hs+j] = in_near[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2881 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2882 }
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 #ifdef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2885 // 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
2886 // historically before the algorithm changes in 1.49
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2887 #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
2888 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
2889 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2890 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2891 for (i=0; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2892 int y_fixed = (y[i] << 16) + 32768; // rounding
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2893 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2894 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2895 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2896 r = y_fixed + cr*float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2897 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
2898 b = y_fixed + cb*float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2899 r >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2900 g >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2901 b >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2902 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
2903 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
2904 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
2905 out[0] = (Uint8)r;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2906 out[1] = (Uint8)g;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2907 out[2] = (Uint8)b;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2908 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2909 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2910 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2911 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2912 #else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2913 // 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
2914 // 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
2915 #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
2916 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
2917 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2918 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2919 for (i=0; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2920 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
2921 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2922 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2923 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2924 r = y_fixed + cr* float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2925 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
2926 b = y_fixed + cb* float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2927 r >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2928 g >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2929 b >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2930 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
2931 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
2932 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
2933 out[0] = (Uint8)r;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2934 out[1] = (Uint8)g;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
2935 out[2] = (Uint8)b;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2936 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2937 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2938 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2939 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2940 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2941
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2942 #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
2943 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
2944 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2945 int i = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2946
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2947 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2948 // 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
2949 // 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
2950 // so just accelerate step == 4 case.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2951 if (step == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2952 // 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
2953 __m128i signflip = _mm_set1_epi8(-0x80);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2954 __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
2955 __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
2956 __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
2957 __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f));
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
2958 __m128i y_bias = _mm_set1_epi8((char) (Uint8) 128);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2959 __m128i xw = _mm_set1_epi16(255); // alpha channel
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 for (; i+7 < count; i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2962 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2963 __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
2964 __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
2965 __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
2966 __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
2967 __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
2968
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2969 // 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
2970 __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
2971 __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
2972 __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
2973
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2974 // color transform
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2975 __m128i yws = _mm_srli_epi16(yw, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2976 __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2977 __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2978 __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2979 __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2980 __m128i rws = _mm_add_epi16(cr0, yws);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2981 __m128i gwt = _mm_add_epi16(cb0, yws);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2982 __m128i bws = _mm_add_epi16(yws, cb1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2983 __m128i gws = _mm_add_epi16(gwt, cr1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2984
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2985 // descale
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2986 __m128i rw = _mm_srai_epi16(rws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2987 __m128i bw = _mm_srai_epi16(bws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2988 __m128i gw = _mm_srai_epi16(gws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2989
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2990 // back to byte, set up for transpose
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2991 __m128i brb = _mm_packus_epi16(rw, bw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2992 __m128i gxb = _mm_packus_epi16(gw, xw);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2993
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2994 // transpose to interleave channels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2995 __m128i t0 = _mm_unpacklo_epi8(brb, gxb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2996 __m128i t1 = _mm_unpackhi_epi8(brb, gxb);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2997 __m128i o0 = _mm_unpacklo_epi16(t0, t1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2998 __m128i o1 = _mm_unpackhi_epi16(t0, t1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
2999
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3000 // store
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3001 _mm_storeu_si128((__m128i *) (out + 0), o0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3002 _mm_storeu_si128((__m128i *) (out + 16), o1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3003 out += 32;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3004 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3005 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3006 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3007
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3008 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3009 // 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
3010 if (step == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3011 // 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
3012 uint8x8_t signflip = vdup_n_u8(0x80);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3013 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
3014 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
3015 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
3016 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
3017
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3018 for (; i+7 < count; i += 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3019 // load
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3020 uint8x8_t y_bytes = vld1_u8(y + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3021 uint8x8_t cr_bytes = vld1_u8(pcr + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3022 uint8x8_t cb_bytes = vld1_u8(pcb + i);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3023 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
3024 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
3025
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3026 // expand to s16
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3027 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
3028 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
3029 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
3030
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3031 // color transform
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3032 int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3033 int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3034 int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3035 int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3036 int16x8_t rws = vaddq_s16(yws, cr0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3037 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
3038 int16x8_t bws = vaddq_s16(yws, cb1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3039
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3040 // undo scaling, round, convert to byte
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3041 uint8x8x4_t o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3042 o.val[0] = vqrshrun_n_s16(rws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3043 o.val[1] = vqrshrun_n_s16(gws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3044 o.val[2] = vqrshrun_n_s16(bws, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3045 o.val[3] = vdup_n_u8(255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3046
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3047 // store, interleaving r/g/b/a
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3048 vst4_u8(out, o);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3049 out += 8*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3050 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3051 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3052 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3053
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3054 for (; i < count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3055 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
3056 int r,g,b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3057 int cr = pcr[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3058 int cb = pcb[i] - 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3059 r = y_fixed + cr* float2fixed(1.40200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3060 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
3061 b = y_fixed + cb* float2fixed(1.77200f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3062 r >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3063 g >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3064 b >>= 20;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3065 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
3066 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
3067 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
3068 out[0] = (Uint8)r;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3069 out[1] = (Uint8)g;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3070 out[2] = (Uint8)b;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3071 out[3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3072 out += step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3073 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3074 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3075 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3076
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3077 // set up the kernels
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3078 static void stbi__setup_jpeg(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3079 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3080 j->idct_block_kernel = stbi__idct_block;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3081 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
3082 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
3083
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3084 #ifdef STBI_SSE2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3085 if (stbi__sse2_available()) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3086 j->idct_block_kernel = stbi__idct_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3087 #ifndef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3088 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
3089 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3090 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
3091 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3092 #endif
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 #ifdef STBI_NEON
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3095 j->idct_block_kernel = stbi__idct_simd;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3096 #ifndef STBI_JPEG_OLD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3097 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
3098 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3099 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
3100 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3101 }
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 // clean up the temporary component buffers
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3104 static void stbi__cleanup_jpeg(stbi__jpeg *j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3105 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3106 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3107 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
3108 if (j->img_comp[i].raw_data) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3109 dmFree(j->img_comp[i].raw_data);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3110 j->img_comp[i].raw_data = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3111 j->img_comp[i].data = NULL;
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 if (j->img_comp[i].raw_coeff) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3114 dmFree(j->img_comp[i].raw_coeff);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3115 j->img_comp[i].raw_coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3116 j->img_comp[i].coeff = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3117 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3118 if (j->img_comp[i].linebuf) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3119 dmFree(j->img_comp[i].linebuf);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3120 j->img_comp[i].linebuf = NULL;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3123 }
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 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3126 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3127 resample_row_func resample;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3128 Uint8 *line0,*line1;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3129 int hs,vs; // expansion factor in each axis
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3130 int w_lores; // horizontal pixels pre-expansion
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3131 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
3132 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
3133 } stbi__resample;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3134
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3135 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
3136 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3137 int n, decode_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3138 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
3139
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3140 // validate req_comp
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3141 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
3142
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3143 // 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
3144 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
3145
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3146 // determine actual number of components to generate
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3147 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
3148
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3149 if (z->s->img_n == 3 && n < 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3150 decode_n = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3151 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3152 decode_n = z->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3153
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3154 // resample and color-convert
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 k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3157 unsigned int i,j;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3158 Uint8 *output;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3159 Uint8 *coutput[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3160
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3161 stbi__resample res_comp[4];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3162
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3163 for (k=0; k < decode_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3164 stbi__resample *r = &res_comp[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3165
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3166 // 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
3167 // with upsample factor of 4
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3168 z->img_comp[k].linebuf = (Uint8 *) dmMalloc(z->s->img_x + 3);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3169 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
3170
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3171 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
3172 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
3173 r->ystep = r->vs >> 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3174 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
3175 r->ypos = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3176 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
3177
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3178 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
3179 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
3180 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
3181 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
3182 else r->resample = stbi__resample_row_generic;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3183 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3184
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3185 // can't error after this so, this is safe
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3186 output = (Uint8 *) dmMalloc(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
3187 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
3188
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3189 // now go ahead and resample
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3190 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
3191 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
3192 for (k=0; k < decode_n; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3193 stbi__resample *r = &res_comp[k];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3194 int y_bot = r->ystep >= (r->vs >> 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3195 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
3196 y_bot ? r->line1 : r->line0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3197 y_bot ? r->line0 : r->line1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3198 r->w_lores, r->hs);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3199 if (++r->ystep >= r->vs) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3200 r->ystep = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3201 r->line0 = r->line1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3202 if (++r->ypos < z->img_comp[k].y)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3203 r->line1 += z->img_comp[k].w2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3204 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3205 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3206 if (n >= 3) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3207 Uint8 *y = coutput[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3208 if (z->s->img_n == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3209 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
3210 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3211 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
3212 out[0] = out[1] = out[2] = y[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3213 out[3] = 255; // not used if n==3
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3214 out += n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3215 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3216 } else {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3217 Uint8 *y = coutput[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3218 if (n == 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3219 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
3220 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3221 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
3222 }
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 stbi__cleanup_jpeg(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3225 *out_x = z->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3226 *out_y = z->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3227 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
3228 return output;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3229 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3230 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3231
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3232 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
3233 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3234 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3235 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3236 stbi__setup_jpeg(&j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3237 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
3238 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3239
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3240 static int stbi__jpeg_test(stbi__context *s)
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 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3243 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3244 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3245 stbi__setup_jpeg(&j);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3246 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
3247 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3248 return r;
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 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
3252 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3253 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
3254 stbi__rewind( j->s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3255 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3256 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3257 if (x) *x = j->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3258 if (y) *y = j->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3259 if (comp) *comp = j->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3260 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3261 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3262
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3263 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
3264 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3265 stbi__jpeg j;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3266 j.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3267 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
3268 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3269 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3270
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3271
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3272 // 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
3273 // simple implementation
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3274 // - only 8-bit samples
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3275 // - no CRC checking
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3276 // - allocates lots of intermediate memory
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3277 // - avoids problem of streaming data between subsystems
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3278 // - avoids explicit window management
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3279 // performance
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3280 // - 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
3281
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3282 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3283 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3284 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3285 Uint32 length;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3286 Uint32 type;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3287 } stbi__pngchunk;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3288
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3289 static 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
3290 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3291 stbi__pngchunk c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3292 c.length = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3293 c.type = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3294 return c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3295 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3296
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3297 static int stbi__check_png_header(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3298 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3299 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
3300 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3301 for (i=0; i < 8; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3302 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
3303 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3304 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3305
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3306 typedef struct
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 stbi__context *s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3309 Uint8 *idata, *expanded, *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3310 } stbi__png;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3311
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3312
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3313 enum {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3314 STBI__F_none=0,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3315 STBI__F_sub=1,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3316 STBI__F_up=2,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3317 STBI__F_avg=3,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3318 STBI__F_paeth=4,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3319 // 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
3320 STBI__F_avg_first,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3321 STBI__F_paeth_first
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3322 };
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3323
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3324 static Uint8 first_row_filter[5] =
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3325 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3326 STBI__F_none,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3327 STBI__F_sub,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3328 STBI__F_none,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3329 STBI__F_avg_first,
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3330 STBI__F_paeth_first
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3333 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
3334 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3335 int p = a + b - c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3336 int pa = abs(p-a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3337 int pb = abs(p-b);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3338 int pc = abs(p-c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3339 if (pa <= pb && pa <= pc) return a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3340 if (pb <= pc) return b;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3341 return c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3342 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3343
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3344 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
3345
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3346 // 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
3347 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
3348 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3349 stbi__context *s = a->s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3350 Uint32 i,j,stride = x*out_n;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3351 Uint32 img_len, img_width_bytes;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3352 int k;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3353 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
3354
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3355 STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3356 a->out = (Uint8 *) dmMalloc(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
3357 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
3358
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3359 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
3360 img_len = (img_width_bytes + 1) * y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3361 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
3362 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
3363 } else { // interlaced:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3364 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
3365 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3366
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3367 for (j=0; j < y; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3368 Uint8 *cur = a->out + stride*j;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3369 Uint8 *prior = cur - stride;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3370 int filter = *raw++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3371 int filter_bytes = img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3372 int width = x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3373 if (filter > 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3374 return stbi__err("invalid filter","Corrupt PNG");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3375
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3376 if (depth < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3377 STBI_ASSERT(img_width_bytes <= x);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3378 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
3379 filter_bytes = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3380 width = img_width_bytes;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3381 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3382
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3383 // 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
3384 if (j == 0) filter = first_row_filter[filter];
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 // handle first byte explicitly
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3387 for (k=0; k < filter_bytes; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3388 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3389 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
3390 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
3391 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
3392 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
3393 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
3394 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
3395 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
3396 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3397 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3398
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3399 if (depth == 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3400 if (img_n != out_n)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3401 cur[img_n] = 255; // first pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3402 raw += img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3403 cur += out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3404 prior += out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3405 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3406 raw += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3407 cur += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3408 prior += 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3409 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3410
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3411 // 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
3412 if (depth < 8 || img_n == out_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3413 int nk = (width - 1)*img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3414 #define CASE(f) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3415 case f: \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3416 for (k=0; k < nk; ++k)
1276
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3417
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3418 switch (filter) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3419 // "none" filter turns into a memcpy here; make that explicit.
1276
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3420 case STBI__F_none: { memcpy(cur, raw, nk); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3421 CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3422 CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3423 CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3424 CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3425 CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3426 CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3427 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3428 #undef CASE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3429 raw += nk;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3430 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3431 STBI_ASSERT(img_n+1 == out_n);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3432 #define CASE(f) \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3433 case f: \
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3434 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
3435 for (k=0; k < img_n; ++k)
1276
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3436
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3437 switch (filter) {
1276
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3438 CASE(STBI__F_none) { cur[k] = raw[k]; } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3439 CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-out_n]); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3440 CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3441 CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-out_n])>>1)); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3442 CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],prior[k],prior[k-out_n])); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3443 CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-out_n] >> 1)); } break;
5fc043f1bd44 Fix and silence some (useless) gcc warnings.
Matti Hamalainen <ccr@tnsp.org>
parents: 1165
diff changeset
3444 CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-out_n],0,0)); } break;
893
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3448 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3449
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3450 // 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
3451 // 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
3452 // 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
3453 if (depth < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3454 for (j=0; j < y; ++j) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3455 Uint8 *cur = a->out + stride*j;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3456 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
3457 // 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
3458 // 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
3459 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
3460
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3461 // 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
3462 // 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
3463 // 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
3464 // 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
3465 // 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
3466
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3467 if (depth == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3468 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
3469 *cur++ = scale * ((*in >> 4) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3470 *cur++ = scale * ((*in ) & 0x0f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3471 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3472 if (k > 0) *cur++ = scale * ((*in >> 4) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3473 } else if (depth == 2) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3474 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
3475 *cur++ = scale * ((*in >> 6) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3476 *cur++ = scale * ((*in >> 4) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3477 *cur++ = scale * ((*in >> 2) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3478 *cur++ = scale * ((*in ) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3479 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3480 if (k > 0) *cur++ = scale * ((*in >> 6) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3481 if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3482 if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3483 } else if (depth == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3484 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
3485 *cur++ = scale * ((*in >> 7) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3486 *cur++ = scale * ((*in >> 6) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3487 *cur++ = scale * ((*in >> 5) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3488 *cur++ = scale * ((*in >> 4) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3489 *cur++ = scale * ((*in >> 3) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3490 *cur++ = scale * ((*in >> 2) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3491 *cur++ = scale * ((*in >> 1) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3492 *cur++ = scale * ((*in ) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3493 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3494 if (k > 0) *cur++ = scale * ((*in >> 7) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3495 if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3496 if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3497 if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3498 if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3499 if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3500 if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3501 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3502 if (img_n != out_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3503 // insert alpha = 255
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3504 Uint8 *cur = a->out + stride*j;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3505 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3506 if (img_n == 1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3507 for (i=x-1; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3508 cur[i*2+1] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3509 cur[i*2+0] = cur[i];
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 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3512 STBI_ASSERT(img_n == 3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3513 for (i=x-1; i >= 0; --i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3514 cur[i*4+3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3515 cur[i*4+2] = cur[i*3+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3516 cur[i*4+1] = cur[i*3+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3517 cur[i*4+0] = cur[i*3+0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3518 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3519 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3520 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3521 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3522 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3523
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3524 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3525 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3526
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3527 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
3528 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3529 Uint8 *final;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3530 int p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3531 if (!interlaced)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3532 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
3533
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3534 // de-interlacing
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3535 final = (Uint8 *) dmMalloc(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
3536 for (p=0; p < 7; ++p) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3537 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
3538 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
3539 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
3540 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
3541 int i,j,x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3542 // 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
3543 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
3544 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
3545 if (x && y) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3546 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
3547 if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3548 dmFree(final);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3549 return 0;
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 for (j=0; j < y; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3552 for (i=0; i < x; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3553 int out_y = j*yspc[p]+yorig[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3554 int out_x = i*xspc[p]+xorig[p];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3555 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
3556 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
3557 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3558 }
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3559 dmFree(a->out);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3560 image_data += img_len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3561 image_data_len -= img_len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3562 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3563 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3564 a->out = final;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3565
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3566 return 1;
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
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3569 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
3570 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3571 stbi__context *s = z->s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3572 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
3573 Uint8 *p = z->out;
893
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 // compute color-based transparency, assuming we've
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3576 // 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
3577 STBI_ASSERT(out_n == 2 || out_n == 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3578
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3579 if (out_n == 2) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3580 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3581 p[1] = (p[0] == tc[0] ? 0 : 255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3582 p += 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3583 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3584 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3585 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3586 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
3587 p[3] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3588 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3589 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3590 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3591 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3592 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3593
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3594 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
3595 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3596 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
3597 Uint8 *p, *temp_out, *orig = a->out;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3598
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3599 p = (Uint8 *) dmMalloc(pixel_count * pal_img_n);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3600 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
3601
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3602 // 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
3603 temp_out = p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3604
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3605 if (pal_img_n == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3606 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3607 int n = orig[i]*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3608 p[0] = palette[n ];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3609 p[1] = palette[n+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3610 p[2] = palette[n+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3611 p += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3612 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3613 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3614 for (i=0; i < pixel_count; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3615 int n = orig[i]*4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3616 p[0] = palette[n ];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3617 p[1] = palette[n+1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3618 p[2] = palette[n+2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3619 p[3] = palette[n+3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3620 p += 4;
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 }
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3623 dmFree(a->out);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3624 a->out = temp_out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3625
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3626 STBI_NOTUSED(len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3627
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3628 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3631 static int stbi__unpremultiply_on_load = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3632 static int stbi__de_iphone_flag = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3633
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3634 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
3635 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3636 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
3637 }
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 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
3640 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3641 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
3642 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3643
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3644 static void stbi__de_iphone(stbi__png *z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3645 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3646 stbi__context *s = z->s;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3647 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
3648 Uint8 *p = z->out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3649
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3650 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
3651 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
3652 Uint8 t = p[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3653 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3654 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3655 p += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3656 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3657 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3658 STBI_ASSERT(s->img_out_n == 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3659 if (stbi__unpremultiply_on_load) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3660 // convert bgr to rgb and unpremultiply
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3661 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
3662 Uint8 a = p[3];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3663 Uint8 t = p[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3664 if (a) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3665 p[0] = p[2] * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3666 p[1] = p[1] * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3667 p[2] = t * 255 / a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3668 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3669 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3670 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3671 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3672 p += 4;
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 // convert bgr to rgb
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3676 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
3677 Uint8 t = p[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3678 p[0] = p[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3679 p[2] = t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3680 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3681 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3682 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3683 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3684 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3685
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3686
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3687 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
3688 Uint8 *inBuf, size_t inLen,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3689 Uint8 **outBuf, size_t *outLen,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3690 size_t initialSize,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3691 BOOL parseHeader)
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3692 {
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3693 DMZLibContext ctx;
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3694 int ret;
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3695
1123
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3696
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3697 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
3698 goto err;
c023fae92620 Oops, 100L in dmzlib context init in image loader .. fixed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1121
diff changeset
3699
1074
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3700 if ((ctx.outBuffer = ctx.outBufferStart = dmMalloc(initialSize)) == NULL)
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3701 {
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3702 ret = dmError(DMERR_MALLOC,
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3703 "Failed to allocate initial decompression buffer.\n");
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3704 goto err;
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3705 }
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3706
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3707 // Initialize decompression structures
1076
21b0aedb7b5c Also initialize DMZLibContext.inBufferStart where needed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1074
diff changeset
3708 ctx.inBuffer = ctx.inBufferStart = inBuf;
21b0aedb7b5c Also initialize DMZLibContext.inBufferStart where needed.
Matti Hamalainen <ccr@tnsp.org>
parents: 1074
diff changeset
3709 ctx.inBufferEnd = inBuf + inLen;
1074
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3710 ctx.outBufferEnd = ctx.outBufferStart + initialSize;
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3711 ctx.expandable = TRUE;
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3712
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3713 if (parseHeader && (ret = dmZLibParseHeader(&ctx, TRUE)) != DMERR_OK)
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3714 goto err;
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3715
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3716 if ((ret = dmZLibInflate(&ctx)) != DMERR_OK)
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3717 goto err;
1102
e06abfde6c39 Cosmetics pass: Remove excess whitespace.
Matti Hamalainen <ccr@tnsp.org>
parents: 1083
diff changeset
3718
1074
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3719 *outBuf = ctx.outBufferStart;
e98bc627ad08 Rename dmzlib structure members.
Matti Hamalainen <ccr@tnsp.org>
parents: 966
diff changeset
3720 *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
3721
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3722 dmZLibCloseInflate(&ctx);
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3723 return DMERR_OK;
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3724
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3725 err:
1121
043b5942fdb6 Rename some dmzlib functions and add context init/close functions.
Matti Hamalainen <ccr@tnsp.org>
parents: 1102
diff changeset
3726 dmZLibCloseInflate(&ctx);
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3727 dmFree(*outBuf);
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3728 *outBuf = NULL;
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3729 return ret;
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3730 }
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3731
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3732
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3733
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3734 #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
3735
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3736 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
3737 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3738 Uint8 palette[1024], pal_img_n=0;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3739 Uint8 has_trans=0, tc[3];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3740 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
3741 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
3742 stbi__context *s = z->s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3743
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3744 z->expanded = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3745 z->idata = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3746 z->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3747
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3748 if (!stbi__check_png_header(s)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3749
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3750 if (scan == STBI__SCAN_type) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3751
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3752 for (;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3753 stbi__pngchunk c = stbi__get_chunk_header(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3754 switch (c.type) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3755 case STBI__PNG_TYPE('C','g','B','I'):
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3756 is_iphone = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3757 stbi__skip(s, c.length);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3758 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3759 case STBI__PNG_TYPE('I','H','D','R'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3760 int comp,filter;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3761 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
3762 first = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3763 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
3764 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
3765 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
3766 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
3767 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
3768 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
3769 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
3770 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
3771 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
3772 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
3773 if (!pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3774 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
3775 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
3776 if (scan == STBI__SCAN_header) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3777 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3778 // 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
3779 // img_n is # components to decompress/filter.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3780 s->img_n = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3781 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
3782 // 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
3783 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3784 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3785 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3786
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3787 case STBI__PNG_TYPE('P','L','T','E'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3788 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
3789 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
3790 pal_len = c.length / 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3791 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
3792 for (i=0; i < pal_len; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3793 palette[i*4+0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3794 palette[i*4+1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3795 palette[i*4+2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3796 palette[i*4+3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3797 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3798 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3799 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3800
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3801 case STBI__PNG_TYPE('t','R','N','S'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3802 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
3803 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
3804 if (pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3805 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
3806 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
3807 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
3808 pal_img_n = 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3809 for (i=0; i < c.length; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3810 palette[i*4+3] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3811 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3812 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
3813 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
3814 has_trans = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3815 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
3816 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
3817 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3818 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3819 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3820
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3821 case STBI__PNG_TYPE('I','D','A','T'): {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3822 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
3823 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
3824 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
3825 if (ioff + c.length > idata_limit) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
3826 Uint8 *p;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3827 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
3828 while (ioff + c.length > idata_limit)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3829 idata_limit *= 2;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3830 p = (Uint8 *) dmRealloc(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
3831 z->idata = p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3832 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3833 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
3834 ioff += c.length;
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','E','N','D'): {
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3839 size_t raw_len, bpl;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3840 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
3841 if (scan != STBI__SCAN_load) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3842 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
3843 // 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
3844 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
3845 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
3846
960
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3847 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
3848 z->idata, ioff,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3849 &z->expanded, &raw_len,
1832ac20edb2 Clean up dmzlib and use it in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 950
diff changeset
3850 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
3851 return 0;
950
88d9440afad0 Use dmzlib module in stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 899
diff changeset
3852
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3853 dmFree(z->idata); z->idata = NULL;
966
c91befdb668b Fixes and cleanups.
Matti Hamalainen <ccr@tnsp.org>
parents: 961
diff changeset
3854
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3855 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
3856 s->img_out_n = s->img_n+1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3857 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3858 s->img_out_n = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3859 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
3860 if (has_trans)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3861 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
3862 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
3863 stbi__de_iphone(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3864 if (pal_img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3865 // pal_img_n == 3 or 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3866 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
3867 s->img_out_n = pal_img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3868 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
3869 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
3870 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3871 }
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3872 dmFree(z->expanded); z->expanded = NULL;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3873 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3874 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3875
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3876 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3877 // if critical, fail
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3878 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
3879 if ((c.type & (1 << 29)) == 0) {
1083
f88ad5cb44e5 Silence a warning.
Matti Hamalainen <ccr@tnsp.org>
parents: 1076
diff changeset
3880 #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
3881 // not threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3882 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
3883 invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3884 invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3885 invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3886 invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3887 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3888 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
3889 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3890 stbi__skip(s, c.length);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3891 break;
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 // end of PNG chunk, read and skip CRC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3894 stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3895 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3896 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3897
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3898 static Uint8 *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3899 {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3900 Uint8 *result=NULL;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3901 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
3902 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
3903 result = p->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3904 p->out = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3905 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
3906 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
3907 p->s->img_out_n = req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3908 if (result == NULL) return result;
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 *x = p->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3911 *y = p->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3912 if (n) *n = p->s->img_out_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3913 }
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3914 dmFree(p->out); p->out = NULL;
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3915 dmFree(p->expanded); p->expanded = NULL;
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3916 dmFree(p->idata); p->idata = NULL;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3917
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3918 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3919 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3920
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
3921 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
3922 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3923 stbi__png p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3924 p.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3925 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
3926 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3927
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3928 static int stbi__png_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3929 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3930 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3931 r = stbi__check_png_header(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3932 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3933 return r;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3936 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
3937 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3938 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
3939 stbi__rewind( p->s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3940 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3941 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3942 if (x) *x = p->s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3943 if (y) *y = p->s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3944 if (comp) *comp = p->s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3945 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3948 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
3949 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3950 stbi__png p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3951 p.s = s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3952 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
3953 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3954 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3955
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3956 // Microsoft/Windows BMP image
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3957
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3958 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3959 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
3960 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3961 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3962 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3963 if (stbi__get8(s) != 'B') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3964 if (stbi__get8(s) != 'M') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3965 stbi__get32le(s); // discard filesize
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3966 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3967 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3968 stbi__get32le(s); // discard data offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3969 sz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3970 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
3971 return r;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3974 static int stbi__bmp_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3975 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3976 int r = stbi__bmp_test_raw(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3977 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3978 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3979 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3980
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3981
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3982 // returns 0..31 for the highest set bit
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3983 static int stbi__high_bit(unsigned int z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3984 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3985 int n=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3986 if (z == 0) return -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3987 if (z >= 0x10000) n += 16, z >>= 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3988 if (z >= 0x00100) n += 8, z >>= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3989 if (z >= 0x00010) n += 4, z >>= 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3990 if (z >= 0x00004) n += 2, z >>= 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3991 if (z >= 0x00002) n += 1, z >>= 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3992 return n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3993 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3994
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3995 static int stbi__bitcount(unsigned int a)
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 a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3998 a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
3999 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
4000 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
4001 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
4002 return a & 0xff;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4003 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4004
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4005 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
4006 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4007 int result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4008 int z=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4009
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4010 if (shift < 0) v <<= -shift;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4011 else v >>= shift;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4012 result = v;
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 z = bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4015 while (z < 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4016 result += v >> z;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4017 z += bits;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4018 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4019 return result;
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
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4022 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
4023 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4024 Uint8 *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4025 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
4026 Uint8 pal[256][4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4027 int psize=0,i,j,compress=0,width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4028 int bpp, flip_vertically, pad, target, offset, hsz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4029 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
4030 stbi__get32le(s); // discard filesize
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4031 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4032 stbi__get16le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4033 offset = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4034 hsz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4035 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
4036 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4037 s->img_x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4038 s->img_y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4039 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4040 s->img_x = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4041 s->img_y = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4042 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4043 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
4044 bpp = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4045 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
4046 flip_vertically = ((int) s->img_y) > 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4047 s->img_y = abs((int) s->img_y);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4048 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4049 if (bpp < 24)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4050 psize = (offset - 14 - 24) / 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4051 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4052 compress = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4053 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
4054 stbi__get32le(s); // discard sizeof
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4055 stbi__get32le(s); // discard hres
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4056 stbi__get32le(s); // discard vres
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4057 stbi__get32le(s); // discard colorsused
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4058 stbi__get32le(s); // discard max important
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4059 if (hsz == 40 || hsz == 56) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4060 if (hsz == 56) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4061 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4062 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4063 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4064 stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4065 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4066 if (bpp == 16 || bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4067 if (compress == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4068 if (bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4069 mr = 0xffu << 16;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4070 mg = 0xffu << 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4071 mb = 0xffu << 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4072 ma = 0xffu << 24;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4073 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
4074 STBI_NOTUSED(fake_a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4075 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4076 mr = 31u << 10;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4077 mg = 31u << 5;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4078 mb = 31u << 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4079 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4080 } else if (compress == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4081 mr = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4082 mg = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4083 mb = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4084 // 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
4085 if (mr == mg && mg == mb) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4086 // ?!?!?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4087 return stbi__errpuc("bad BMP", "bad BMP");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4088 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4089 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4090 return stbi__errpuc("bad BMP", "bad BMP");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4091 }
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 STBI_ASSERT(hsz == 108 || hsz == 124);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4094 mr = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4095 mg = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4096 mb = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4097 ma = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4098 stbi__get32le(s); // discard color space
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4099 for (i=0; i < 12; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4100 stbi__get32le(s); // discard color space parameters
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4101 if (hsz == 124) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4102 stbi__get32le(s); // discard rendering intent
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4103 stbi__get32le(s); // discard offset of profile data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4104 stbi__get32le(s); // discard size of profile data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4105 stbi__get32le(s); // discard reserved
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4106 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4107 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4108 if (bpp < 16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4109 psize = (offset - 14 - hsz) >> 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4110 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4111 s->img_n = ma ? 4 : 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4112 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
4113 target = req_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4114 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4115 target = s->img_n; // if they want monochrome, we'll post-convert
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4116 out = (Uint8 *) dmMalloc(target * s->img_x * s->img_y);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4117 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
4118 if (bpp < 16) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4119 int z=0;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4120 if (psize == 0 || psize > 256) { dmFree(out); return stbi__errpuc("invalid", "Corrupt BMP"); }
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4121 for (i=0; i < psize; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4122 pal[i][2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4123 pal[i][1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4124 pal[i][0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4125 if (hsz != 12) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4126 pal[i][3] = 255;
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 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
4129 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
4130 else if (bpp == 8) width = s->img_x;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4131 else { dmFree(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4132 pad = (-width)&3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4133 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
4134 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
4135 int v=stbi__get8(s),v2=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4136 if (bpp == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4137 v2 = v & 15;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4138 v >>= 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4139 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4140 out[z++] = pal[v][0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4141 out[z++] = pal[v][1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4142 out[z++] = pal[v][2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4143 if (target == 4) out[z++] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4144 if (i+1 == (int) s->img_x) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4145 v = (bpp == 8) ? stbi__get8(s) : v2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4146 out[z++] = pal[v][0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4147 out[z++] = pal[v][1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4148 out[z++] = pal[v][2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4149 if (target == 4) out[z++] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4150 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4151 stbi__skip(s, pad);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4152 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4153 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4154 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
4155 int z = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4156 int easy=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4157 stbi__skip(s, offset - 14 - hsz);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4158 if (bpp == 24) width = 3 * s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4159 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
4160 else /* bpp = 32 and pad = 0 */ width=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4161 pad = (-width) & 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4162 if (bpp == 24) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4163 easy = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4164 } else if (bpp == 32) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4165 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
4166 easy = 2;
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 if (!easy) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4169 if (!mr || !mg || !mb) { dmFree(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4170 // 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
4171 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
4172 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
4173 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
4174 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
4175 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4176 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
4177 if (easy) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4178 for (i=0; i < (int) s->img_x; ++i) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4179 Uint8 a;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4180 out[z+2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4181 out[z+1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4182 out[z+0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4183 z += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4184 a = (easy == 2 ? stbi__get8(s) : 255);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4185 if (target == 4) out[z++] = a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4186 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4187 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4188 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
4189 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
4190 int a;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4191 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
4192 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
4193 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
4194 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
4195 if (target == 4) out[z++] = STBI__BYTECAST(a);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4196 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4197 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4198 stbi__skip(s, pad);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4199 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4200 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4201 if (flip_vertically) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4202 Uint8 t;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4203 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
4204 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
4205 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
4206 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
4207 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
4208 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4209 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4210 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4211
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4212 if (req_comp && req_comp != target) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4213 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
4214 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
4215 }
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 *x = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4218 *y = s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4219 if (comp) *comp = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4220 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4221 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4222 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4223
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4224 // Targa Truevision - TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4225 // by Jonathan Dummer
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4226 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4227 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
4228 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4229 int tga_w, tga_h, tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4230 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4231 stbi__get8(s); // discard Offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4232 sz = stbi__get8(s); // color type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4233 if( sz > 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4234 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4235 return 0; // only RGB or indexed allowed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4236 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4237 sz = stbi__get8(s); // image type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4238 // only RGB or grey allowed, +/- RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4239 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
4240 stbi__skip(s,9);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4241 tga_w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4242 if( tga_w < 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4243 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4244 return 0; // test width
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 tga_h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4247 if( tga_h < 1 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4248 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4249 return 0; // test height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4250 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4251 sz = stbi__get8(s); // bits per pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4252 // only RGB or RGBA or grey allowed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4253 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
4254 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4255 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4256 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4257 tga_comp = sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4258 if (x) *x = tga_w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4259 if (y) *y = tga_h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4260 if (comp) *comp = tga_comp / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4261 return 1; // seems to have passed everything
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4264 static int stbi__tga_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4265 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4266 int res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4267 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4268 stbi__get8(s); // discard Offset
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4269 sz = stbi__get8(s); // color type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4270 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
4271 sz = stbi__get8(s); // image type
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4272 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
4273 stbi__get16be(s); // discard palette start
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4274 stbi__get16be(s); // discard palette length
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4275 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
4276 stbi__get16be(s); // discard x origin
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4277 stbi__get16be(s); // discard y origin
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4278 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
4279 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
4280 sz = stbi__get8(s); // bits per pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4281 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
4282 res = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4283 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4284 res = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4285 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4286 return res;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4287 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4288
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4289 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
4290 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4291 // read in the TGA header stuff
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4292 int tga_offset = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4293 int tga_indexed = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4294 int tga_image_type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4295 int tga_is_RLE = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4296 int tga_palette_start = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4297 int tga_palette_len = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4298 int tga_palette_bits = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4299 int tga_x_origin = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4300 int tga_y_origin = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4301 int tga_width = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4302 int tga_height = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4303 int tga_bits_per_pixel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4304 int tga_comp = tga_bits_per_pixel / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4305 int tga_inverted = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4306 // image data
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4307 Uint8 *tga_data;
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4308 Uint8 *tga_palette = NULL;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4309 int i, j;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4310 Uint8 raw_data[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4311 int RLE_count = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4312 int RLE_repeating = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4313 int read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4314
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4315 // do a tiny bit of precessing
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4316 if ( tga_image_type >= 8 )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4317 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4318 tga_image_type -= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4319 tga_is_RLE = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4320 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4321 /* int tga_alpha_bits = tga_inverted & 15; */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4322 tga_inverted = 1 - ((tga_inverted >> 5) & 1);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4323
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4324 // error check
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4325 if ( //(tga_indexed) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4326 (tga_width < 1) || (tga_height < 1) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4327 (tga_image_type < 1) || (tga_image_type > 3) ||
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4328 ((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
4329 (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
4330 )
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 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
4333 }
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 // 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
4336 if ( tga_indexed )
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 tga_comp = tga_palette_bits / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4339 }
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 // tga info
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4342 *x = tga_width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4343 *y = tga_height;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4344 if (comp) *comp = tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4345
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4346 tga_data = (Uint8*)dmMalloc( tga_width * tga_height * tga_comp );
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4347 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
4348
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4349 // 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
4350 stbi__skip(s, tga_offset );
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 ( !tga_indexed && !tga_is_RLE) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4353 for (i=0; i < tga_height; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4354 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
4355 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
4356 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
4357 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4358 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4359 // do I need to load a palette?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4360 if ( tga_indexed)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4361 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4362 // any data to skip? (offset usually = 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4363 stbi__skip(s, tga_palette_start );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4364 // load the palette
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4365 tga_palette = (Uint8*)dmMalloc( tga_palette_len * tga_palette_bits / 8 );
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4366 if (!tga_palette) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4367 dmFree(tga_data);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4368 return stbi__errpuc("outofmem", "Out of memory");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4369 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4370 if (!stbi__getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 )) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4371 dmFree(tga_data);
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4372 dmFree(tga_palette);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4373 return stbi__errpuc("bad palette", "Corrupt TGA");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4374 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4375 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4376 // load the data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4377 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
4378 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4379 // 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
4380 if ( tga_is_RLE )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4381 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4382 if ( RLE_count == 0 )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4383 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4384 // 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
4385 int RLE_cmd = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4386 RLE_count = 1 + (RLE_cmd & 127);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4387 RLE_repeating = RLE_cmd >> 7;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4388 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4389 } else if ( !RLE_repeating )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4390 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4391 read_next_pixel = 1;
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 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4394 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4395 read_next_pixel = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4396 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4397 // 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
4398 if ( read_next_pixel )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4399 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4400 // load however much data we did have
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4401 if ( tga_indexed )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4402 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4403 // read in 1 byte, then perform the lookup
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4404 int pal_idx = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4405 if ( pal_idx >= tga_palette_len )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4406 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4407 // invalid index
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4408 pal_idx = 0;
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 pal_idx *= tga_bits_per_pixel / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4411 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
4412 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4413 raw_data[j] = tga_palette[pal_idx+j];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4414 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4415 } else
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 // read in the data raw
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4418 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
4419 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4420 raw_data[j] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4421 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4422 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4423 // clear the reading flag for the next pixel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4424 read_next_pixel = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4425 } // end of reading a pixel
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 // copy data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4428 for (j = 0; j < tga_comp; ++j)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4429 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
4430
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4431 // 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
4432 --RLE_count;
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 // do I need to invert the image?
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4435 if ( tga_inverted )
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 for (j = 0; j*2 < tga_height; ++j)
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 int index1 = j * tga_width * tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4440 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
4441 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
4442 {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4443 Uint8 temp = tga_data[index1];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4444 tga_data[index1] = tga_data[index2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4445 tga_data[index2] = temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4446 ++index1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4447 ++index2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4448 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4449 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4450 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4451 // clear my palette, if I had one
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4452 if ( tga_palette != NULL )
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4453 {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4454 dmFree( tga_palette );
893
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4457
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4458 // swap RGB
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4459 if (tga_comp >= 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4460 {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4461 Uint8* tga_pixel = tga_data;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4462 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
4463 {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4464 Uint8 temp = tga_pixel[0];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4465 tga_pixel[0] = tga_pixel[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4466 tga_pixel[2] = temp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4467 tga_pixel += tga_comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4468 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4469 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4470
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4471 // convert to target component count
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4472 if (req_comp && req_comp != tga_comp)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4473 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
4474
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4475 // 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
4476 // Microsoft's C compilers happy... [8^(
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4477 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
4478 tga_x_origin = tga_y_origin = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4479 // OK, done
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4480 return tga_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4481 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4482 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4483
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4484 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4485 // 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
4486
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4487 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4488 static int stbi__psd_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4489 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4490 int r = (stbi__get32be(s) == 0x38425053);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4491 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4492 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4493 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4494
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4495 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
4496 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4497 int pixelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4498 int channelCount, compression;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4499 int channel, i, count, len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4500 int w,h;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4501 Uint8 *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4502
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4503 // Check identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4504 if (stbi__get32be(s) != 0x38425053) // "8BPS"
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4505 return stbi__errpuc("not PSD", "Corrupt PSD image");
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 // Check file type version.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4508 if (stbi__get16be(s) != 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4509 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
4510
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4511 // Skip 6 reserved bytes.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4512 stbi__skip(s, 6 );
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 // 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
4515 channelCount = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4516 if (channelCount < 0 || channelCount > 16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4517 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
4518
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4519 // Read the rows and columns of the image.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4520 h = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4521 w = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4522
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4523 // Make sure the depth is 8 bits.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4524 if (stbi__get16be(s) != 8)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4525 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
4526
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4527 // Make sure the color mode is RGB.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4528 // Valid options are:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4529 // 0: Bitmap
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4530 // 1: Grayscale
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4531 // 2: Indexed color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4532 // 3: RGB color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4533 // 4: CMYK color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4534 // 7: Multichannel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4535 // 8: Duotone
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4536 // 9: Lab color
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4537 if (stbi__get16be(s) != 3)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4538 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
4539
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4540 // 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
4541 stbi__skip(s,stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4542
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4543 // 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
4544 stbi__skip(s, stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4545
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4546 // Skip the reserved data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4547 stbi__skip(s, stbi__get32be(s) );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4548
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4549 // Find out if the data is compressed.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4550 // Known values:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4551 // 0: no compression
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4552 // 1: RLE compressed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4553 compression = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4554 if (compression > 1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4555 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
4556
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4557 // Create the destination image.
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4558 out = (Uint8 *) dmMalloc(4 * w*h);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4559 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
4560 pixelCount = w*h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4561
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4562 // Initialize the data to zero.
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4563 //dmMemset( out, 0, pixelCount * 4 );
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4564
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4565 // Finally, the image data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4566 if (compression) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4567 // RLE as used by .PSD and .TIFF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4568 // 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
4569 // Read the next source byte into n.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4570 // 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
4571 // 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
4572 // Else if n is 128, noop.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4573 // Endloop
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4574
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4575 // 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
4576 // which we're going to just skip.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4577 stbi__skip(s, h * channelCount * 2 );
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 // Read the RLE data by channel.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4580 for (channel = 0; channel < 4; channel++) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4581 Uint8 *p;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4582
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4583 p = out+channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4584 if (channel >= channelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4585 // Fill this channel with default data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4586 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
4587 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4588 // Read the RLE data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4589 count = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4590 while (count < pixelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4591 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4592 if (len == 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4593 // No-op.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4594 } else if (len < 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4595 // Copy next len+1 bytes literally.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4596 len++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4597 count += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4598 while (len) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4599 *p = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4600 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4601 len--;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4602 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4603 } else if (len > 128) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4604 Uint8 val;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4605 // 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
4606 // (Interpret len as a negative 8-bit int.)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4607 len ^= 0x0FF;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4608 len += 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4609 val = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4610 count += len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4611 while (len) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4612 *p = val;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4613 p += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4614 len--;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4615 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4616 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4617 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4618 }
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4621 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4622 // 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
4623 // 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
4624
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4625 // Read the data by channel.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4626 for (channel = 0; channel < 4; channel++) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4627 Uint8 *p;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4628
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4629 p = out + channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4630 if (channel > channelCount) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4631 // Fill this channel with default data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4632 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
4633 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4634 // Read the data.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4635 for (i = 0; i < pixelCount; i++)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4636 *p = stbi__get8(s), p += 4;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4639 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4640
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4641 if (req_comp && req_comp != 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4642 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
4643 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
4644 }
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 if (comp) *comp = channelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4647 *y = h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4648 *x = w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4649
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4650 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4651 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4652 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4653
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4654 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4655 // Softimage PIC loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4656 // by Tom Seddon
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 // 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
4659 // 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
4660
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4661 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4662 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
4663 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4664 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4665 for (i=0; i<4; ++i)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4666 if (stbi__get8(s) != (Uint8)str[i])
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4667 return 0;
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 return 1;
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 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
4673 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4674 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4675
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4676 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
4677 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4678
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4679 for(i=0;i<84;++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4680 stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4681
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4682 if (!stbi__pic_is4(s,"PICT"))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4683 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4684
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4685 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4686 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4687
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4688 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4689 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4690 Uint8 size,type,channel;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4691 } stbi__pic_packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4692
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4693 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
4694 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4695 int mask=0x80, i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4696
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4697 for (i=0; i<4; ++i, mask>>=1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4698 if (channel & mask) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4699 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
4700 dest[i]=stbi__get8(s);
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 }
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 return dest;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4705 }
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 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
4708 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4709 int mask=0x80,i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4710
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4711 for (i=0;i<4; ++i, mask>>=1)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4712 if (channel&mask)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4713 dest[i]=src[i];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4714 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4715
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4716 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
4717 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4718 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
4719 stbi__pic_packet packets[10];
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 // 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
4722 // for the same channel in multiple packets.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4723 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4724 stbi__pic_packet *packet;
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 if (num_packets==sizeof(packets)/sizeof(packets[0]))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4727 return stbi__errpuc("bad format","too many packets");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4728
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4729 packet = &packets[num_packets++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4730
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4731 chained = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4732 packet->size = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4733 packet->type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4734 packet->channel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4735
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4736 act_comp |= packet->channel;
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 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
4739 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
4740 } while (chained);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4741
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4742 *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
4743
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4744 for(y=0; y<height; ++y) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4745 int packet_idx;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4746
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4747 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
4748 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
4749 Uint8 *dest = result+y*width*4;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4750
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4751 switch (packet->type) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4752 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4753 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
4754
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4755 case 0: {//uncompressed
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4756 int x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4757
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4758 for(x=0;x<width;++x, dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4759 if (!stbi__readval(s,packet->channel,dest))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4760 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4761 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4762 }
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 case 1://Pure RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4765 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4766 int left=width, i;
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 while (left>0) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4769 Uint8 count,value[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4770
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4771 count=stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4772 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
4773
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4774 if (count > left)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4775 count = (Uint8) left;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4776
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4777 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
4778
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4779 for(i=0; i<count; ++i,dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4780 stbi__copyval(packet->channel,dest,value);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4781 left -= count;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4784 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4785
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4786 case 2: {//Mixed RLE
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4787 int left=width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4788 while (left>0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4789 int count = stbi__get8(s), i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4790 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
4791
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4792 if (count >= 128) { // Repeated
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4793 Uint8 value[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4794 int i;
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 if (count==128)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4797 count = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4798 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4799 count -= 127;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4800 if (count > left)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4801 return stbi__errpuc("bad file","scanline overrun");
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 if (!stbi__readval(s,packet->channel,value))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4804 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4805
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4806 for(i=0;i<count;++i, dest += 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4807 stbi__copyval(packet->channel,dest,value);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4808 } else { // Raw
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4809 ++count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4810 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
4811
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4812 for(i=0;i<count;++i, dest+=4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4813 if (!stbi__readval(s,packet->channel,dest))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4814 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4815 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4816 left-=count;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4817 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4818 break;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4821 }
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4824 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4825 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4826
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4827 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
4828 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4829 Uint8 *result;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4830 int i, x,y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4831
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4832 for (i=0; i<92; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4833 stbi__get8(s);
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 x = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4836 y = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4837 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
4838 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
4839
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4840 stbi__get32be(s); //skip `ratio'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4841 stbi__get16be(s); //skip `fields'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4842 stbi__get16be(s); //skip `pad'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4843
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4844 // intermediate buffer is RGBA
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4845 result = (Uint8 *) dmMalloc(x*y*4);
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4846 dmMemset(result, 0xff, x*y*4);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4847
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4848 if (!stbi__pic_load_core(s,x,y,comp, result)) {
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
4849 dmFree(result);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4850 result=0;
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 *px = x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4853 *py = y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4854 if (req_comp == 0) req_comp = *comp;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4855 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
4856
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4857 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4858 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4859
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4860 static int stbi__pic_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4861 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4862 int r = stbi__pic_test_core(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4863 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4864 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4865 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4866 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4867
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 // 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
4870
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4871 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4872 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4873 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4874 Sint16 prefix;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4875 Uint8 first;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4876 Uint8 suffix;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4877 } stbi__gif_lzw;
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 typedef struct
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4880 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4881 int w,h;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4882 Uint8 *out; // output buffer (always 4 components)
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4883 int flags, bgindex, ratio, transparent, eflags;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4884 Uint8 pal[256][4];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4885 Uint8 lpal[256][4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4886 stbi__gif_lzw codes[4096];
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4887 Uint8 *color_table;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4888 int parse, step;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4889 int lflags;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4890 int start_x, start_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4891 int max_x, max_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4892 int cur_x, cur_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4893 int line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4894 } stbi__gif;
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 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
4897 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4898 int sz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4899 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
4900 sz = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4901 if (sz != '9' && sz != '7') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4902 if (stbi__get8(s) != 'a') return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4903 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4904 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4905
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4906 static int stbi__gif_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4907 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4908 int r = stbi__gif_test_raw(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4909 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4910 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4911 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4912
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4913 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
4914 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4915 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4916 for (i=0; i < num_entries; ++i) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4917 pal[i][2] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4918 pal[i][1] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4919 pal[i][0] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4920 pal[i][3] = transp == i ? 0 : 255;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4924 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
4925 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4926 Uint8 version;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4927 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
4928 return stbi__err("not GIF", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4929
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4930 version = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4931 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
4932 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
4933
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4934 stbi__g_failure_reason = "";
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4935 g->w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4936 g->h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4937 g->flags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4938 g->bgindex = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4939 g->ratio = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4940 g->transparent = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4941
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4942 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
4943
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4944 if (is_info) return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4945
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4946 if (g->flags & 0x80)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4947 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
4948
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4949 return 1;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4952 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
4953 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4954 stbi__gif g;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4955 if (!stbi__gif_header(s, &g, comp, 1)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4956 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4957 return 0;
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 (x) *x = g.w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4960 if (y) *y = g.h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4961 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
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4964 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
4965 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4966 Uint8 *p, *c;
893
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 // 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
4969 // 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
4970 if (g->codes[code].prefix >= 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4971 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
4972
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4973 if (g->cur_y >= g->max_y) return;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4974
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4975 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
4976 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
4977
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4978 if (c[3] >= 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4979 p[0] = c[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4980 p[1] = c[1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4981 p[2] = c[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4982 p[3] = c[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4983 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4984 g->cur_x += 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4985
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4986 if (g->cur_x >= g->max_x) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4987 g->cur_x = g->start_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4988 g->cur_y += g->step;
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 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
4991 g->step = (1 << g->parse) * g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4992 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
4993 --g->parse;
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 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4996 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
4997
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
4998 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
4999 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5000 Uint8 lzw_cs;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5001 Sint32 len, code;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5002 Uint32 first;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5003 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
5004 stbi__gif_lzw *p;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5005
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5006 lzw_cs = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5007 clear = 1 << lzw_cs;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5008 first = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5009 codesize = lzw_cs + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5010 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5011 bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5012 valid_bits = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5013 for (code = 0; code < clear; code++) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5014 g->codes[code].prefix = -1;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5015 g->codes[code].first = (Uint8) code;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5016 g->codes[code].suffix = (Uint8) code;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5017 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5018
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5019 // support no starting clear code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5020 avail = clear+2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5021 oldcode = -1;
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 len = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5024 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5025 if (valid_bits < codesize) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5026 if (len == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5027 len = stbi__get8(s); // start new block
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5028 if (len == 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5029 return g->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5030 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5031 --len;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5032 bits |= (Sint32) stbi__get8(s) << valid_bits;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5033 valid_bits += 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5034 } else {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5035 Sint32 code = bits & codemask;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5036 bits >>= codesize;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5037 valid_bits -= codesize;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5038 // @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
5039 if (code == clear) { // clear code
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5040 codesize = lzw_cs + 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5041 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5042 avail = clear + 2;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5043 oldcode = -1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5044 first = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5045 } 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
5046 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5047 while ((len = stbi__get8(s)) > 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5048 stbi__skip(s,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5049 return g->out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5050 } else if (code <= avail) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5051 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
5052
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5053 if (oldcode >= 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5054 p = &g->codes[avail++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5055 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
5056 p->prefix = (Sint16) oldcode;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5057 p->first = g->codes[oldcode].first;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5058 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
5059 } else if (code == avail)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5060 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
5061
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5062 stbi__out_gif_code(g, (Uint16) code);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5063
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5064 if ((avail & codemask) == 0 && avail <= 0x0FFF) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5065 codesize++;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5066 codemask = (1 << codesize) - 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5067 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5068
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5069 oldcode = code;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5070 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5071 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
5072 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5073 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5074 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5075 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5076
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5077 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
5078 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5079 int i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5080 Uint8 *c = g->pal[g->bgindex];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5081 // @OPTIMIZE: write a dword at a time
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5082 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
5083 Uint8 *p = &g->out[i];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5084 p[0] = c[2];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5085 p[1] = c[1];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5086 p[2] = c[0];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5087 p[3] = c[3];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5088 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5089 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5090
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5091 // 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
5092 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
5093 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5094 int i;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5095 Uint8 *old_out = 0;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5096
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5097 if (g->out == 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5098 if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5099 g->out = (Uint8 *) dmMalloc(4 * g->w * g->h);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5100 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
5101 stbi__fill_gif_background(g);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5102 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5103 // animated-gif-only path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5104 if (((g->eflags & 0x1C) >> 2) == 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5105 old_out = g->out;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5106 g->out = (Uint8 *) dmMalloc(4 * g->w * g->h);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5107 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
5108 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
5109 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5110 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5111
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5112 for (;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5113 switch (stbi__get8(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5114 case 0x2C: /* Image Descriptor */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5115 {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5116 Sint32 x, y, w, h;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5117 Uint8 *o;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5118
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5119 x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5120 y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5121 w = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5122 h = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5123 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
5124 return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5125
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5126 g->line_size = g->w * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5127 g->start_x = x * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5128 g->start_y = y * g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5129 g->max_x = g->start_x + w * 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5130 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
5131 g->cur_x = g->start_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5132 g->cur_y = g->start_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5133
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5134 g->lflags = stbi__get8(s);
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 if (g->lflags & 0x40) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5137 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
5138 g->parse = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5139 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5140 g->step = g->line_size;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5141 g->parse = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5142 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5143
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5144 if (g->lflags & 0x80) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5145 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
5146 g->color_table = (Uint8 *) g->lpal;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5147 } else if (g->flags & 0x80) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5148 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
5149 g->pal[i][3] = 255;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5150 if (g->transparent >= 0 && (g->eflags & 0x01))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5151 g->pal[g->transparent][3] = 0;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5152 g->color_table = (Uint8 *) g->pal;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5153 } else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5154 return stbi__errpuc("missing color table", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5155
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5156 o = stbi__process_gif_raster(s, g);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5157 if (o == NULL) return NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5158
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5159 if (req_comp && req_comp != 4)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5160 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
5161 return o;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5162 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5163
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5164 case 0x21: // Comment Extension.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5165 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5166 int len;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5167 if (stbi__get8(s) == 0xF9) { // Graphic Control Extension.
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5168 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5169 if (len == 4) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5170 g->eflags = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5171 stbi__get16le(s); // delay
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5172 g->transparent = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5173 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5174 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5175 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5176 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5177 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5178 while ((len = stbi__get8(s)) != 0)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5179 stbi__skip(s, len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5180 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5181 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5182
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5183 case 0x3B: // gif stream termination code
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5184 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
5185
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5186 default:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5187 return stbi__errpuc("unknown code", "Corrupt GIF");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5188 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5189 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5190 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5191
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5192 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
5193 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5194 Uint8 *u = 0;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5195 stbi__gif g;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5196 dmMemset(&g, 0, sizeof(g));
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5197
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5198 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
5199 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
5200 if (u) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5201 *x = g.w;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5202 *y = g.h;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5203 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5204
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5205 return u;
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 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
5209 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5210 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
5211 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5212 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5213
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5214 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5215 // Radiance RGBE HDR loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5216 // originally by Nicolas Schulz
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5217 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5218 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
5219 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5220 const char *signature = "#?RADIANCE\n";
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5221 int i;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5222 for (i=0; signature[i]; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5223 if (stbi__get8(s) != signature[i])
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5224 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5225 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5226 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5227
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5228 static int stbi__hdr_test(stbi__context* s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5229 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5230 int r = stbi__hdr_test_core(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5231 stbi__rewind(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5232 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5233 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5234
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5235 #define STBI__HDR_BUFLEN 1024
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5236 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
5237 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5238 int len=0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5239 char c = '\0';
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5240
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5241 c = (char) stbi__get8(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5242
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5243 while (!stbi__at_eof(z) && c != '\n') {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5244 buffer[len++] = c;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5245 if (len == STBI__HDR_BUFLEN-1) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5246 // flush to end of line
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5247 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
5248 ;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5249 break;
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 c = (char) stbi__get8(z);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5252 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5253
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5254 buffer[len] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5255 return buffer;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5256 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5257
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5258 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
5259 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5260 if ( input[3] != 0 ) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5261 float f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5262 // Exponent
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5263 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
5264 if (req_comp <= 2)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5265 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
5266 else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5267 output[0] = input[0] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5268 output[1] = input[1] * f1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5269 output[2] = input[2] * f1;
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 if (req_comp == 2) output[1] = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5272 if (req_comp == 4) output[3] = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5273 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5274 switch (req_comp) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5275 case 4: output[3] = 1; /* fallthrough */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5276 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
5277 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5278 case 2: output[1] = 1; /* fallthrough */
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5279 case 1: output[0] = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5280 break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5281 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5282 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5283 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5284
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5285 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
5286 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5287 char buffer[STBI__HDR_BUFLEN];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5288 char *token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5289 int valid = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5290 int width, height;
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5291 Uint8 *scanline;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5292 float *hdr_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5293 int len;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5294 Uint8 count, value;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5295 int i, j, k, c1,c2, z;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5296
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5297
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5298 // Check identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5299 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
5300 return stbi__errpf("not HDR", "Corrupt HDR image");
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 // Parse header
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5303 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5304 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5305 if (token[0] == 0) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5306 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
5307 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5308
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5309 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
5310
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5311 // Parse width and height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5312 // 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
5313 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5314 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
5315 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5316 height = (int) strtol(token, &token, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5317 while (*token == ' ') ++token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5318 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
5319 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5320 width = (int) strtol(token, NULL, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5321
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5322 *x = width;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5323 *y = height;
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 if (comp) *comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5326 if (req_comp == 0) req_comp = 3;
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 // Read data
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5329 hdr_data = (float *) dmMalloc(height * width * req_comp * sizeof(float));
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5330
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5331 // Load image data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5332 // 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
5333 if ( width < 8 || width >= 32768) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5334 // Read flat data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5335 for (j=0; j < height; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5336 for (i=0; i < width; ++i) {
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5337 Uint8 rgbe[4];
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5338 main_decode_loop:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5339 stbi__getn(s, rgbe, 4);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5340 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
5341 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5342 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5343 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5344 // Read RLE-encoded data
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5345 scanline = NULL;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5346
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5347 for (j = 0; j < height; ++j) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5348 c1 = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5349 c2 = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5350 len = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5351 if (c1 != 2 || c2 != 2 || (len & 0x80)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5352 // 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
5353 // 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
5354 Uint8 rgbe[4];
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5355 rgbe[0] = (Uint8) c1;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5356 rgbe[1] = (Uint8) c2;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5357 rgbe[2] = (Uint8) len;
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5358 rgbe[3] = (Uint8) stbi__get8(s);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5359 stbi__hdr_convert(hdr_data, rgbe, req_comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5360 i = 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5361 j = 0;
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5362 dmFree(scanline);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5363 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
5364 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5365 len <<= 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5366 len |= stbi__get8(s);
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5367 if (len != width) { dmFree(hdr_data); dmFree(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5368 if (scanline == NULL) scanline = (Uint8 *) dmMalloc(width * 4);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5369
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5370 for (k = 0; k < 4; ++k) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5371 i = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5372 while (i < width) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5373 count = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5374 if (count > 128) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5375 // Run
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5376 value = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5377 count -= 128;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5378 for (z = 0; z < count; ++z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5379 scanline[i++ * 4 + k] = value;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5380 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5381 // Dump
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5382 for (z = 0; z < count; ++z)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5383 scanline[i++ * 4 + k] = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5384 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5385 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5386 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5387 for (i=0; i < width; ++i)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5388 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
5389 }
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5390 dmFree(scanline);
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5391 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5392
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5393 return hdr_data;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5394 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5395
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5396 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
5397 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5398 char buffer[STBI__HDR_BUFLEN];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5399 char *token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5400 int valid = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5401
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5402 if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5403 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5404 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5405 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5406
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5407 for(;;) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5408 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5409 if (token[0] == 0) break;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5410 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
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 if (!valid) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5414 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5415 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5416 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5417 token = stbi__hdr_gettoken(s,buffer);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5418 if (strncmp(token, "-Y ", 3)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5419 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5420 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5421 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5422 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5423 *y = (int) strtol(token, &token, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5424 while (*token == ' ') ++token;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5425 if (strncmp(token, "+X ", 3)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5426 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5427 return 0;
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 token += 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5430 *x = (int) strtol(token, NULL, 10);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5431 *comp = 3;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5432 return 1;
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 #endif // STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5435
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5436 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5437 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
5438 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5439 int hsz;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5440 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
5441 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5442 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5443 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5444 stbi__skip(s,12);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5445 hsz = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5446 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
5447 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5448 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5449 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5450 if (hsz == 12) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5451 *x = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5452 *y = stbi__get16le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5453 } else {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5454 *x = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5455 *y = stbi__get32le(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5456 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5457 if (stbi__get16le(s) != 1) {
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 *comp = stbi__get16le(s) / 8;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5462 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5463 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5464 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5465
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5466 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5467 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
5468 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5469 int channelCount;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5470 if (stbi__get32be(s) != 0x38425053) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5471 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5472 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5473 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5474 if (stbi__get16be(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 stbi__skip(s, 6);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5479 channelCount = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5480 if (channelCount < 0 || channelCount > 16) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5481 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5482 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5483 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5484 *y = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5485 *x = stbi__get32be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5486 if (stbi__get16be(s) != 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5487 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5488 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5489 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5490 if (stbi__get16be(s) != 3) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5491 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5492 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5493 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5494 *comp = 4;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5495 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5496 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5497 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5498
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5499 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5500 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
5501 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5502 int act_comp=0,num_packets=0,chained;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5503 stbi__pic_packet packets[10];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5504
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5505 stbi__skip(s, 92);
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 *x = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5508 *y = stbi__get16be(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5509 if (stbi__at_eof(s)) return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5510 if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5511 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5512 return 0;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5515 stbi__skip(s, 8);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5516
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5517 do {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5518 stbi__pic_packet *packet;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5519
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5520 if (num_packets==sizeof(packets)/sizeof(packets[0]))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5521 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5522
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5523 packet = &packets[num_packets++];
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5524 chained = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5525 packet->size = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5526 packet->type = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5527 packet->channel = stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5528 act_comp |= packet->channel;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5529
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5530 if (stbi__at_eof(s)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5531 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5532 return 0;
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 if (packet->size != 8) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5535 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5536 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5537 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5538 } while (chained);
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 *comp = (act_comp & 0x10 ? 4 : 3);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5541
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5542 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5543 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5544 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5545
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5546 // *************************************************************************************************
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5547 // Portable Gray Map and Portable Pixel Map loader
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5548 // by Ken Miller
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5549 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5550 // PGM: http://netpbm.sourceforge.net/doc/pgm.html
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5551 // PPM: http://netpbm.sourceforge.net/doc/ppm.html
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5552 //
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5553 // Known limitations:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5554 // Does not support comments in the header section
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5555 // 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
5556 // Does not support 16-bit-per-channel
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5557
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5558 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5559
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5560 static int stbi__pnm_test(stbi__context *s)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5561 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5562 char p, t;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5563 p = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5564 t = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5565 if (p != 'P' || (t != '5' && t != '6')) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5566 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5567 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5568 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5569 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5570 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5571
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5572 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
5573 {
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5574 Uint8 *out;
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5575 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
5576 return 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5577 *x = s->img_x;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5578 *y = s->img_y;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5579 *comp = s->img_n;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5580
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5581 out = (Uint8 *) dmMalloc(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
5582 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
5583 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
5584
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5585 if (req_comp && req_comp != s->img_n) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5586 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
5587 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
5588 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5589 return out;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5590 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5591
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5592 static int stbi__pnm_isspace(char c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5593 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5594 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
5595 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5596
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5597 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
5598 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5599 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
5600 *c = (char) stbi__get8(s);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5603 static int stbi__pnm_isdigit(char c)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5604 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5605 return c >= '0' && c <= '9';
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5606 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5607
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5608 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
5609 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5610 int value = 0;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5611
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5612 while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5613 value = value*10 + (*c - '0');
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5614 *c = (char) stbi__get8(s);
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5617 return value;
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_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
5621 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5622 int maxv;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5623 char c, p, t;
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 stbi__rewind( s );
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 // Get identifier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5628 p = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5629 t = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5630 if (p != 'P' || (t != '5' && t != '6')) {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5631 stbi__rewind( s );
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5632 return 0;
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
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5635 *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
5636
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5637 c = (char) stbi__get8(s);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5638 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5639
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5640 *x = stbi__pnm_getinteger(s, &c); // read width
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5641 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5642
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5643 *y = stbi__pnm_getinteger(s, &c); // read height
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5644 stbi__pnm_skip_whitespace(s, &c);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5645
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5646 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
5647
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5648 if (maxv > 255)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5649 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
5650 else
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5651 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5652 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5653 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5654
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5655 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
5656 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5657 #ifndef STBI_NO_JPEG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5658 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
5659 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5660
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5661 #ifndef STBI_NO_PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5662 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
5663 #endif
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 #ifndef STBI_NO_GIF
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5666 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
5667 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5668
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5669 #ifndef STBI_NO_BMP
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5670 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
5671 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5672
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5673 #ifndef STBI_NO_PSD
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5674 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
5675 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5676
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5677 #ifndef STBI_NO_PIC
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5678 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
5679 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5680
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5681 #ifndef STBI_NO_PNM
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5682 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
5683 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5684
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5685 #ifndef STBI_NO_HDR
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5686 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
5687 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5688
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5689 // 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
5690 #ifndef STBI_NO_TGA
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5691 if (stbi__tga_info(s, x, y, comp))
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5692 return 1;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5693 #endif
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5694 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
5695 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5696
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5697 #ifndef STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5698 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
5699 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5700 FILE *f = stbi__fopen(filename, "rb");
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5701 int result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5702 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
5703 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
5704 fclose(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5705 return result;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5706 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5707
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5708 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
5709 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5710 int r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5711 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5712 long pos = ftell(f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5713 stbi__start_file(&s, f);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5714 r = stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5715 fseek(f,pos,SEEK_SET);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5716 return r;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5717 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5718 #endif // !STBI_NO_STDIO
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5719
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5720 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
5721 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5722 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5723 stbi__start_mem(&s,buffer,len);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5724 return stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5725 }
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 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
5728 {
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5729 stbi__context s;
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5730 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
5731 return stbi__info_main(&s,x,y,comp);
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5732 }
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5733
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5734 #endif // STB_IMAGE_IMPLEMENTATION
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5735
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5736 /*
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5737 revision history:
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5738 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
5739 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2
1165
737ae4718c8f Use dmMemset, dmMalloc, dmRealloc and dmFree directly.
Matti Hamalainen <ccr@tnsp.org>
parents: 1164
diff changeset
5740 2.00b (2014-12-25) fix dmMalloc in progressive JPEG
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5741 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
5742 progressive JPEG (stb)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5743 PGM/PPM support (Ken Miller)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5744 GIF bugfix -- seemingly never worked
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5745 STBI_NO_*, STBI_ONLY_*
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5746 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
5747 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
5748 optimize PNG (ryg)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5749 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
5750 1.46 (2014-08-26)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5751 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
5752 1.45 (2014-08-16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5753 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
5754 1.44 (2014-08-07)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5755 various warning fixes from Ronny Chevalier
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5756 1.43 (2014-07-15)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5757 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
5758 1.42 (2014-07-09)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5759 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
5760 fixes to stbi__cleanup_jpeg path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5761 added STBI_ASSERT to avoid requiring assert.h
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5762 1.41 (2014-06-25)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5763 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
5764 1.40 (2014-06-22)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5765 fix gcc struct-initialization warning
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5766 1.39 (2014-06-15)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5767 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
5768 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
5769 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
5770 1.38 (2014-06-06)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5771 suppress MSVC warnings on integer casts truncating values
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5772 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
5773 1.37 (2014-06-04)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5774 remove duplicate typedef
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5775 1.36 (2014-06-03)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5776 convert to header file single-file library
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5777 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
5778 1.35 (2014-05-27)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5779 various warnings
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5780 fix broken STBI_SIMD path
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5781 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
5782 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
5783 TGA optimization by Arseny Kapoulkine
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5784 1.34 (unknown)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5785 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
5786 1.33 (2011-07-14)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5787 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
5788 1.32 (2011-07-13)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5789 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
5790 1.31 (2011-06-20)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5791 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
5792 1.30 (2011-06-11)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5793 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
5794 removed deprecated format-specific test/load functions
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5795 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
5796 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
5797 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
5798 1.29 (2010-08-16)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5799 various warning fixes from Aurelien Pocheville
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5800 1.28 (2010-08-01)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5801 fix bug in GIF palette transparency (SpartanJ)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5802 1.27 (2010-08-01)
899
63fd1801f983 Mangle new stb_image to our purposes.
Matti Hamalainen <ccr@tnsp.org>
parents: 893
diff changeset
5803 cast-to-Uint8 to fix warnings
893
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5804 1.26 (2010-07-24)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5805 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
5806 1.25 (2010-07-17)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5807 refix trans_data warning (Won Chun)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5808 1.24 (2010-07-12)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5809 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
5810 minor perf improvements for jpeg
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5811 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
5812 attempt to fix trans_data warning (Won Chun)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5813 1.23 fixed bug in iPhone support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5814 1.22 (2010-07-10)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5815 removed image *writing* support
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5816 stbi_info support from Jetro Lauha
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5817 GIF support from Jean-Marc Lienher
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5818 iPhone PNG-extensions from James Brown
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5819 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
5820 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
5821 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
5822 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
5823 1.18 2008-08-02
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5824 fix a threading bug (local mutable static)
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5825 1.17 support interlaced PNG
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5826 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
5827 1.15 initialize some fields for thread safety
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5828 1.14 fix threadsafe conversion bug
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5829 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
5830 1.13 threadsafe
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5831 1.12 const qualifiers in the API
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5832 1.11 Support installable IDCT, colorspace conversion routines
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5833 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
5834 optimized upsampling by Fabian "ryg" Giesen
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5835 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
5836 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
5837 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
5838 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
5839 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
5840 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
5841 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
5842 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
5843 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
5844 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
5845 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
5846 0.99 correct handling of alpha in palette
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5847 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
5848 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
5849 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
5850 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
5851 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
5852 0.93 handle jpegtran output; verbose errors
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5853 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
5854 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
5855 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
5856 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
5857 0.60 fix compiling as c++
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5858 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
5859 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
5860 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
5861 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
5862 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
5863 0.54 allow NULL for 'int *comp'
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5864 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
5865 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
5866 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
5867 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
5868 0.50 first released version
83a8881c782b Import newer version of stb_image.
Matti Hamalainen <ccr@tnsp.org>
parents: 870
diff changeset
5869 */