stb_image.c revision 1.9 1 1.1 jmcneill /* stbi-1.29 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c
2 1.1 jmcneill when you control the images you're loading
3 1.1 jmcneill no warranty implied; use at your own risk
4 1.1 jmcneill
5 1.1 jmcneill QUICK NOTES:
6 1.1 jmcneill Primarily of interest to game developers and other people who can
7 1.1 jmcneill avoid problematic images and only need the trivial interface
8 1.1 jmcneill
9 1.1 jmcneill JPEG baseline (no JPEG progressive)
10 1.1 jmcneill PNG 8-bit only
11 1.1 jmcneill
12 1.1 jmcneill TGA (not sure what subset, if a subset)
13 1.1 jmcneill BMP non-1bpp, non-RLE
14 1.1 jmcneill PSD (composited view only, no extra channels)
15 1.1 jmcneill
16 1.1 jmcneill GIF (*comp always reports as 4-channel)
17 1.1 jmcneill HDR (radiance rgbE format)
18 1.1 jmcneill PIC (Softimage PIC)
19 1.1 jmcneill
20 1.1 jmcneill - decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code)
21 1.1 jmcneill - supports installable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD)
22 1.1 jmcneill
23 1.1 jmcneill Latest revisions:
24 1.1 jmcneill 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville
25 1.1 jmcneill 1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ)
26 1.1 jmcneill 1.27 (2010-08-01) cast-to-uint8 to fix warnings (Laurent Gomila)
27 1.1 jmcneill allow trailing 0s at end of image data (Laurent Gomila)
28 1.1 jmcneill 1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ
29 1.1 jmcneill 1.25 (2010-07-17) refix trans_data warning (Won Chun)
30 1.1 jmcneill 1.24 (2010-07-12) perf improvements reading from files
31 1.1 jmcneill minor perf improvements for jpeg
32 1.1 jmcneill deprecated type-specific functions in hope of feedback
33 1.1 jmcneill attempt to fix trans_data warning (Won Chun)
34 1.1 jmcneill 1.23 fixed bug in iPhone support
35 1.1 jmcneill 1.22 (2010-07-10) removed image *writing* support to stb_image_write.h
36 1.1 jmcneill stbi_info support from Jetro Lauha
37 1.1 jmcneill GIF support from Jean-Marc Lienher
38 1.1 jmcneill iPhone PNG-extensions from James Brown
39 1.1 jmcneill warning-fixes from Nicolas Schulz and Janez Zemva
40 1.1 jmcneill 1.21 fix use of 'uint8' in header (reported by jon blow)
41 1.1 jmcneill 1.20 added support for Softimage PIC, by Tom Seddon
42 1.1 jmcneill
43 1.1 jmcneill See end of file for full revision history.
44 1.1 jmcneill
45 1.1 jmcneill TODO:
46 1.1 jmcneill stbi_info support for BMP,PSD,HDR,PIC
47 1.1 jmcneill rewrite stbi_info and load_file variations to share file handling code
48 1.1 jmcneill (current system allows individual functions to be called directly,
49 1.1 jmcneill since each does all the work, but I doubt anyone uses this in practice)
50 1.1 jmcneill
51 1.1 jmcneill
52 1.1 jmcneill ============================ Contributors =========================
53 1.1 jmcneill
54 1.1 jmcneill Image formats Optimizations & bugfixes
55 1.1 jmcneill Sean Barrett (jpeg, png, bmp) Fabian "ryg" Giesen
56 1.1 jmcneill Nicolas Schulz (hdr, psd)
57 1.1 jmcneill Jonathan Dummer (tga) Bug fixes & warning fixes
58 1.1 jmcneill Jean-Marc Lienher (gif) Marc LeBlanc
59 1.1 jmcneill Tom Seddon (pic) Christpher Lloyd
60 1.1 jmcneill Thatcher Ulrich (psd) Dave Moore
61 1.1 jmcneill Won Chun
62 1.1 jmcneill the Horde3D community
63 1.1 jmcneill Extensions, features Janez Zemva
64 1.1 jmcneill Jetro Lauha (stbi_info) Jonathan Blow
65 1.1 jmcneill James "moose2000" Brown (iPhone PNG) Laurent Gomila
66 1.1 jmcneill Aruelien Pocheville
67 1.1 jmcneill
68 1.1 jmcneill If your name should be here but isn't, let Sean know.
69 1.1 jmcneill
70 1.1 jmcneill */
71 1.1 jmcneill
72 1.1 jmcneill #ifdef _KERNEL
73 1.1 jmcneill #include <dev/stbi/stbiconfig.h>
74 1.1 jmcneill #endif
75 1.1 jmcneill
76 1.1 jmcneill #ifndef STBI_INCLUDE_STB_IMAGE_H
77 1.1 jmcneill #define STBI_INCLUDE_STB_IMAGE_H
78 1.1 jmcneill
79 1.1 jmcneill // To get a header file for this, either cut and paste the header,
80 1.1 jmcneill // or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and
81 1.1 jmcneill // then include stb_image.c from it.
82 1.1 jmcneill
83 1.1 jmcneill //// begin header file ////////////////////////////////////////////////////
84 1.1 jmcneill //
85 1.1 jmcneill // Limitations:
86 1.1 jmcneill // - no jpeg progressive support
87 1.1 jmcneill // - non-HDR formats support 8-bit samples only (jpeg, png)
88 1.1 jmcneill // - no delayed line count (jpeg) -- IJG doesn't support either
89 1.1 jmcneill // - no 1-bit BMP
90 1.1 jmcneill // - GIF always returns *comp=4
91 1.1 jmcneill //
92 1.1 jmcneill // Basic usage (see HDR discussion below):
93 1.1 jmcneill // int x,y,n;
94 1.1 jmcneill // unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
95 1.1 jmcneill // // ... process data if not NULL ...
96 1.1 jmcneill // // ... x = width, y = height, n = # 8-bit components per pixel ...
97 1.1 jmcneill // // ... replace '0' with '1'..'4' to force that many components per pixel
98 1.1 jmcneill // stbi_image_free(data)
99 1.1 jmcneill //
100 1.1 jmcneill // Standard parameters:
101 1.1 jmcneill // int *x -- outputs image width in pixels
102 1.1 jmcneill // int *y -- outputs image height in pixels
103 1.1 jmcneill // int *comp -- outputs # of image components in image file
104 1.1 jmcneill // int req_comp -- if non-zero, # of image components requested in result
105 1.1 jmcneill //
106 1.1 jmcneill // The return value from an image loader is an 'unsigned char *' which points
107 1.1 jmcneill // to the pixel data. The pixel data consists of *y scanlines of *x pixels,
108 1.1 jmcneill // with each pixel consisting of N interleaved 8-bit components; the first
109 1.1 jmcneill // pixel pointed to is top-left-most in the image. There is no padding between
110 1.1 jmcneill // image scanlines or between pixels, regardless of format. The number of
111 1.1 jmcneill // components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.
112 1.1 jmcneill // If req_comp is non-zero, *comp has the number of components that _would_
113 1.1 jmcneill // have been output otherwise. E.g. if you set req_comp to 4, you will always
114 1.1 jmcneill // get RGBA output, but you can check *comp to easily see if it's opaque.
115 1.1 jmcneill //
116 1.1 jmcneill // An output image with N components has the following components interleaved
117 1.1 jmcneill // in this order in each pixel:
118 1.1 jmcneill //
119 1.1 jmcneill // N=#comp components
120 1.1 jmcneill // 1 grey
121 1.1 jmcneill // 2 grey, alpha
122 1.1 jmcneill // 3 red, green, blue
123 1.1 jmcneill // 4 red, green, blue, alpha
124 1.1 jmcneill //
125 1.1 jmcneill // If image loading fails for any reason, the return value will be NULL,
126 1.1 jmcneill // and *x, *y, *comp will be unchanged. The function stbi_failure_reason()
127 1.1 jmcneill // can be queried for an extremely brief, end-user unfriendly explanation
128 1.1 jmcneill // of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid
129 1.1 jmcneill // compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
130 1.1 jmcneill // more user-friendly ones.
131 1.1 jmcneill //
132 1.1 jmcneill // Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
133 1.1 jmcneill //
134 1.1 jmcneill // ===========================================================================
135 1.1 jmcneill //
136 1.1 jmcneill // iPhone PNG support:
137 1.1 jmcneill //
138 1.1 jmcneill // By default we convert iphone-formatted PNGs back to RGB; nominally they
139 1.1 jmcneill // would silently load as BGR, except the existing code should have just
140 1.1 jmcneill // failed on such iPhone PNGs. But you can disable this conversion by
141 1.1 jmcneill // by calling stbi_convert_iphone_png_to_rgb(0), in which case
142 1.1 jmcneill // you will always just get the native iphone "format" through.
143 1.1 jmcneill //
144 1.1 jmcneill // Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
145 1.1 jmcneill // pixel to remove any premultiplied alpha *only* if the image file explicitly
146 1.1 jmcneill // says there's premultiplied data (currently only happens in iPhone images,
147 1.1 jmcneill // and only if iPhone convert-to-rgb processing is on).
148 1.1 jmcneill //
149 1.1 jmcneill // ===========================================================================
150 1.1 jmcneill //
151 1.1 jmcneill // HDR image support (disable by defining STBI_NO_HDR)
152 1.1 jmcneill //
153 1.1 jmcneill // stb_image now supports loading HDR images in general, and currently
154 1.1 jmcneill // the Radiance .HDR file format, although the support is provided
155 1.1 jmcneill // generically. You can still load any file through the existing interface;
156 1.1 jmcneill // if you attempt to load an HDR file, it will be automatically remapped to
157 1.1 jmcneill // LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
158 1.1 jmcneill // both of these constants can be reconfigured through this interface:
159 1.1 jmcneill //
160 1.1 jmcneill // stbi_hdr_to_ldr_gamma(2.2f);
161 1.1 jmcneill // stbi_hdr_to_ldr_scale(1.0f);
162 1.1 jmcneill //
163 1.1 jmcneill // (note, do not use _inverse_ constants; stbi_image will invert them
164 1.1 jmcneill // appropriately).
165 1.1 jmcneill //
166 1.1 jmcneill // Additionally, there is a new, parallel interface for loading files as
167 1.1 jmcneill // (linear) floats to preserve the full dynamic range:
168 1.1 jmcneill //
169 1.1 jmcneill // float *data = stbi_loadf(filename, &x, &y, &n, 0);
170 1.1 jmcneill //
171 1.1 jmcneill // If you load LDR images through this interface, those images will
172 1.1 jmcneill // be promoted to floating point values, run through the inverse of
173 1.1 jmcneill // constants corresponding to the above:
174 1.1 jmcneill //
175 1.1 jmcneill // stbi_ldr_to_hdr_scale(1.0f);
176 1.1 jmcneill // stbi_ldr_to_hdr_gamma(2.2f);
177 1.1 jmcneill //
178 1.1 jmcneill // Finally, given a filename (or an open file or memory block--see header
179 1.1 jmcneill // file for details) containing image data, you can query for the "most
180 1.1 jmcneill // appropriate" interface to use (that is, whether the image is HDR or
181 1.1 jmcneill // not), using:
182 1.1 jmcneill //
183 1.1 jmcneill // stbi_is_hdr(char *filename);
184 1.1 jmcneill
185 1.1 jmcneill #ifndef STBI_NO_STDIO
186 1.1 jmcneill #include <stdio.h>
187 1.1 jmcneill #endif
188 1.1 jmcneill
189 1.1 jmcneill #define STBI_VERSION 1
190 1.1 jmcneill
191 1.1 jmcneill enum
192 1.1 jmcneill {
193 1.1 jmcneill STBI_default = 0, // only used for req_comp
194 1.1 jmcneill
195 1.1 jmcneill STBI_grey = 1,
196 1.1 jmcneill STBI_grey_alpha = 2,
197 1.1 jmcneill STBI_rgb = 3,
198 1.1 jmcneill STBI_rgb_alpha = 4
199 1.1 jmcneill };
200 1.1 jmcneill
201 1.1 jmcneill typedef unsigned char stbi_uc;
202 1.1 jmcneill
203 1.1 jmcneill #ifdef __cplusplus
204 1.1 jmcneill extern "C" {
205 1.1 jmcneill #endif
206 1.1 jmcneill
207 1.1 jmcneill // PRIMARY API - works on images of any type
208 1.1 jmcneill
209 1.1 jmcneill // load image by filename, open file, or memory buffer
210 1.1 jmcneill extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
211 1.1 jmcneill
212 1.1 jmcneill #ifndef STBI_NO_STDIO
213 1.1 jmcneill extern stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp);
214 1.1 jmcneill extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
215 1.1 jmcneill // for stbi_load_from_file, file pointer is left pointing immediately after image
216 1.1 jmcneill #endif
217 1.1 jmcneill
218 1.1 jmcneill #ifndef STBI_NO_HDR
219 1.1 jmcneill extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
220 1.1 jmcneill
221 1.1 jmcneill #ifndef STBI_NO_STDIO
222 1.1 jmcneill extern float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp);
223 1.1 jmcneill extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
224 1.1 jmcneill #endif
225 1.1 jmcneill
226 1.1 jmcneill extern void stbi_hdr_to_ldr_gamma(float gamma);
227 1.1 jmcneill extern void stbi_hdr_to_ldr_scale(float scale);
228 1.1 jmcneill
229 1.1 jmcneill extern void stbi_ldr_to_hdr_gamma(float gamma);
230 1.1 jmcneill extern void stbi_ldr_to_hdr_scale(float scale);
231 1.1 jmcneill #endif // STBI_NO_HDR
232 1.1 jmcneill
233 1.1 jmcneill // get a VERY brief reason for failure
234 1.1 jmcneill // NOT THREADSAFE
235 1.1 jmcneill extern const char *stbi_failure_reason (void);
236 1.1 jmcneill
237 1.1 jmcneill // free the loaded image -- this is just free()
238 1.1 jmcneill extern void stbi_image_free (void *retval_from_stbi_load);
239 1.1 jmcneill
240 1.1 jmcneill // get image dimensions & components without fully decoding
241 1.1 jmcneill extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
242 1.1 jmcneill extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
243 1.1 jmcneill
244 1.1 jmcneill #ifndef STBI_NO_STDIO
245 1.1 jmcneill extern int stbi_info (char const *filename, int *x, int *y, int *comp);
246 1.1 jmcneill extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
247 1.1 jmcneill
248 1.1 jmcneill extern int stbi_is_hdr (char const *filename);
249 1.1 jmcneill extern int stbi_is_hdr_from_file(FILE *f);
250 1.1 jmcneill #endif
251 1.1 jmcneill
252 1.1 jmcneill // for image formats that explicitly notate that they have premultiplied alpha,
253 1.1 jmcneill // we just return the colors as stored in the file. set this flag to force
254 1.1 jmcneill // unpremultiplication. results are undefined if the unpremultiply overflow.
255 1.1 jmcneill extern void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
256 1.1 jmcneill
257 1.1 jmcneill // indicate whether we should process iphone images back to canonical format,
258 1.1 jmcneill // or just pass them through "as-is"
259 1.1 jmcneill extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
260 1.1 jmcneill
261 1.1 jmcneill
262 1.1 jmcneill // ZLIB client - used by PNG, available for other purposes
263 1.1 jmcneill
264 1.1 jmcneill extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
265 1.1 jmcneill extern char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);
266 1.1 jmcneill extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
267 1.1 jmcneill extern int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
268 1.1 jmcneill
269 1.1 jmcneill extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
270 1.1 jmcneill extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
271 1.1 jmcneill
272 1.1 jmcneill // define new loaders
273 1.1 jmcneill typedef struct
274 1.1 jmcneill {
275 1.1 jmcneill int (*test_memory)(stbi_uc const *buffer, int len);
276 1.1 jmcneill stbi_uc * (*load_from_memory)(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
277 1.1 jmcneill #ifndef STBI_NO_STDIO
278 1.1 jmcneill int (*test_file)(FILE *f);
279 1.1 jmcneill stbi_uc * (*load_from_file)(FILE *f, int *x, int *y, int *comp, int req_comp);
280 1.1 jmcneill #endif
281 1.1 jmcneill } stbi_loader;
282 1.1 jmcneill
283 1.1 jmcneill // register a loader by filling out the above structure (you must define ALL functions)
284 1.1 jmcneill // returns 1 if added or already added, 0 if not added (too many loaders)
285 1.1 jmcneill // NOT THREADSAFE
286 1.1 jmcneill extern int stbi_register_loader(stbi_loader *loader);
287 1.1 jmcneill
288 1.1 jmcneill // define faster low-level operations (typically SIMD support)
289 1.1 jmcneill #ifdef STBI_SIMD
290 1.1 jmcneill typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize);
291 1.1 jmcneill // compute an integer IDCT on "input"
292 1.1 jmcneill // input[x] = data[x] * dequantize[x]
293 1.1 jmcneill // write results to 'out': 64 samples, each run of 8 spaced by 'out_stride'
294 1.1 jmcneill // CLAMP results to 0..255
295 1.1 jmcneill typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step);
296 1.1 jmcneill // compute a conversion from YCbCr to RGB
297 1.1 jmcneill // 'count' pixels
298 1.1 jmcneill // write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B
299 1.1 jmcneill // y: Y input channel
300 1.1 jmcneill // cb: Cb input channel; scale/biased to be 0..255
301 1.1 jmcneill // cr: Cr input channel; scale/biased to be 0..255
302 1.1 jmcneill
303 1.1 jmcneill extern void stbi_install_idct(stbi_idct_8x8 func);
304 1.1 jmcneill extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func);
305 1.1 jmcneill #endif // STBI_SIMD
306 1.1 jmcneill
307 1.1 jmcneill
308 1.1 jmcneill
309 1.1 jmcneill
310 1.1 jmcneill // TYPE-SPECIFIC ACCESS
311 1.1 jmcneill
312 1.1 jmcneill #ifdef STBI_TYPE_SPECIFIC_FUNCTIONS
313 1.1 jmcneill
314 1.1 jmcneill // is it a jpeg?
315 1.1 jmcneill extern int stbi_jpeg_test_memory (stbi_uc const *buffer, int len);
316 1.1 jmcneill extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
317 1.1 jmcneill extern int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
318 1.1 jmcneill
319 1.1 jmcneill #ifndef STBI_NO_STDIO
320 1.1 jmcneill extern stbi_uc *stbi_jpeg_load (char const *filename, int *x, int *y, int *comp, int req_comp);
321 1.1 jmcneill extern int stbi_jpeg_test_file (FILE *f);
322 1.1 jmcneill extern stbi_uc *stbi_jpeg_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
323 1.1 jmcneill
324 1.1 jmcneill extern int stbi_jpeg_info (char const *filename, int *x, int *y, int *comp);
325 1.1 jmcneill extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp);
326 1.1 jmcneill #endif
327 1.1 jmcneill
328 1.1 jmcneill // is it a png?
329 1.1 jmcneill extern int stbi_png_test_memory (stbi_uc const *buffer, int len);
330 1.1 jmcneill extern stbi_uc *stbi_png_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
331 1.1 jmcneill extern int stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
332 1.1 jmcneill
333 1.1 jmcneill #ifndef STBI_NO_STDIO
334 1.1 jmcneill extern stbi_uc *stbi_png_load (char const *filename, int *x, int *y, int *comp, int req_comp);
335 1.1 jmcneill extern int stbi_png_info (char const *filename, int *x, int *y, int *comp);
336 1.1 jmcneill extern int stbi_png_test_file (FILE *f);
337 1.1 jmcneill extern stbi_uc *stbi_png_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
338 1.1 jmcneill extern int stbi_png_info_from_file (FILE *f, int *x, int *y, int *comp);
339 1.1 jmcneill #endif
340 1.1 jmcneill
341 1.1 jmcneill // is it a bmp?
342 1.1 jmcneill extern int stbi_bmp_test_memory (stbi_uc const *buffer, int len);
343 1.1 jmcneill
344 1.1 jmcneill extern stbi_uc *stbi_bmp_load (char const *filename, int *x, int *y, int *comp, int req_comp);
345 1.1 jmcneill extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
346 1.1 jmcneill #ifndef STBI_NO_STDIO
347 1.1 jmcneill extern int stbi_bmp_test_file (FILE *f);
348 1.1 jmcneill extern stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
349 1.1 jmcneill #endif
350 1.1 jmcneill
351 1.1 jmcneill // is it a tga?
352 1.1 jmcneill extern int stbi_tga_test_memory (stbi_uc const *buffer, int len);
353 1.1 jmcneill
354 1.1 jmcneill extern stbi_uc *stbi_tga_load (char const *filename, int *x, int *y, int *comp, int req_comp);
355 1.1 jmcneill extern stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
356 1.1 jmcneill extern int stbi_tga_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
357 1.1 jmcneill #ifndef STBI_NO_STDIO
358 1.1 jmcneill extern int stbi_tga_info_from_file (FILE *f, int *x, int *y, int *comp);
359 1.1 jmcneill extern int stbi_tga_test_file (FILE *f);
360 1.1 jmcneill extern stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
361 1.1 jmcneill #endif
362 1.1 jmcneill
363 1.1 jmcneill // is it a psd?
364 1.1 jmcneill extern int stbi_psd_test_memory (stbi_uc const *buffer, int len);
365 1.1 jmcneill
366 1.1 jmcneill extern stbi_uc *stbi_psd_load (char const *filename, int *x, int *y, int *comp, int req_comp);
367 1.1 jmcneill extern stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
368 1.1 jmcneill #ifndef STBI_NO_STDIO
369 1.1 jmcneill extern int stbi_psd_test_file (FILE *f);
370 1.1 jmcneill extern stbi_uc *stbi_psd_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
371 1.1 jmcneill #endif
372 1.1 jmcneill
373 1.1 jmcneill // is it an hdr?
374 1.1 jmcneill extern int stbi_hdr_test_memory (stbi_uc const *buffer, int len);
375 1.1 jmcneill
376 1.1 jmcneill extern float * stbi_hdr_load (char const *filename, int *x, int *y, int *comp, int req_comp);
377 1.1 jmcneill extern float * stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
378 1.1 jmcneill #ifndef STBI_NO_STDIO
379 1.1 jmcneill extern int stbi_hdr_test_file (FILE *f);
380 1.1 jmcneill extern float * stbi_hdr_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
381 1.1 jmcneill #endif
382 1.1 jmcneill
383 1.1 jmcneill // is it a pic?
384 1.1 jmcneill extern int stbi_pic_test_memory (stbi_uc const *buffer, int len);
385 1.1 jmcneill
386 1.1 jmcneill extern stbi_uc *stbi_pic_load (char const *filename, int *x, int *y, int *comp, int req_comp);
387 1.1 jmcneill extern stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
388 1.1 jmcneill #ifndef STBI_NO_STDIO
389 1.1 jmcneill extern int stbi_pic_test_file (FILE *f);
390 1.1 jmcneill extern stbi_uc *stbi_pic_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
391 1.1 jmcneill #endif
392 1.1 jmcneill
393 1.1 jmcneill // is it a gif?
394 1.1 jmcneill extern int stbi_gif_test_memory (stbi_uc const *buffer, int len);
395 1.1 jmcneill
396 1.1 jmcneill extern stbi_uc *stbi_gif_load (char const *filename, int *x, int *y, int *comp, int req_comp);
397 1.1 jmcneill extern stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
398 1.1 jmcneill extern int stbi_gif_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
399 1.1 jmcneill
400 1.1 jmcneill #ifndef STBI_NO_STDIO
401 1.1 jmcneill extern int stbi_gif_test_file (FILE *f);
402 1.1 jmcneill extern stbi_uc *stbi_gif_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
403 1.1 jmcneill extern int stbi_gif_info (char const *filename, int *x, int *y, int *comp);
404 1.1 jmcneill extern int stbi_gif_info_from_file (FILE *f, int *x, int *y, int *comp);
405 1.1 jmcneill #endif
406 1.1 jmcneill
407 1.1 jmcneill #endif//STBI_TYPE_SPECIFIC_FUNCTIONS
408 1.1 jmcneill
409 1.1 jmcneill
410 1.1 jmcneill
411 1.1 jmcneill
412 1.1 jmcneill #ifdef __cplusplus
413 1.1 jmcneill }
414 1.1 jmcneill #endif
415 1.1 jmcneill
416 1.1 jmcneill //
417 1.1 jmcneill //
418 1.1 jmcneill //// end header file /////////////////////////////////////////////////////
419 1.1 jmcneill #endif // STBI_INCLUDE_STB_IMAGE_H
420 1.1 jmcneill
421 1.1 jmcneill #ifndef STBI_HEADER_FILE_ONLY
422 1.1 jmcneill
423 1.1 jmcneill #ifndef STBI_NO_HDR
424 1.1 jmcneill #include <math.h> // ldexp
425 1.1 jmcneill #include <string.h> // strcmp
426 1.1 jmcneill #endif
427 1.1 jmcneill
428 1.1 jmcneill #ifndef STBI_NO_STDIO
429 1.1 jmcneill #include <stdio.h>
430 1.1 jmcneill #endif
431 1.1 jmcneill #ifdef _KERNEL
432 1.1 jmcneill #include <sys/cdefs.h>
433 1.9 mrg __KERNEL_RCSID(0, "$NetBSD: stb_image.c,v 1.9 2018/02/04 09:18:44 mrg Exp $");
434 1.1 jmcneill #include <sys/param.h>
435 1.1 jmcneill #include <sys/systm.h>
436 1.1 jmcneill #include <sys/kernel.h>
437 1.1 jmcneill #include <sys/types.h>
438 1.1 jmcneill #include <sys/malloc.h>
439 1.1 jmcneill #else
440 1.1 jmcneill #include <stdlib.h>
441 1.1 jmcneill #include <memory.h>
442 1.1 jmcneill #include <assert.h>
443 1.1 jmcneill #include <stdarg.h>
444 1.1 jmcneill #endif
445 1.1 jmcneill
446 1.1 jmcneill #ifdef _KERNEL
447 1.1 jmcneill #define MALLOC(size) malloc((size), M_TEMP, M_WAITOK)
448 1.1 jmcneill #define REALLOC(ptr, size) realloc((ptr), (size), M_TEMP, M_WAITOK)
449 1.3 christos #define FREE(ptr) \
450 1.3 christos do { if (ptr) free((ptr), M_TEMP); } while (/*CONSTCOND*/0)
451 1.1 jmcneill #else
452 1.1 jmcneill #define MALLOC(size) malloc((size))
453 1.1 jmcneill #define REALLOC(ptr, size) realloc((ptr), (size))
454 1.1 jmcneill #define FREE(ptr) free((ptr))
455 1.1 jmcneill #endif
456 1.1 jmcneill
457 1.1 jmcneill #ifndef _MSC_VER
458 1.1 jmcneill #ifdef __cplusplus
459 1.1 jmcneill #define __forceinline inline
460 1.1 jmcneill #else
461 1.1 jmcneill #define __forceinline
462 1.1 jmcneill #endif
463 1.1 jmcneill #endif
464 1.1 jmcneill
465 1.1 jmcneill
466 1.1 jmcneill // implementation:
467 1.1 jmcneill typedef unsigned char uint8;
468 1.1 jmcneill typedef unsigned short uint16;
469 1.1 jmcneill typedef signed short int16;
470 1.1 jmcneill typedef unsigned int uint32;
471 1.1 jmcneill typedef signed int int32;
472 1.1 jmcneill #ifndef __NetBSD__
473 1.1 jmcneill typedef unsigned int uint;
474 1.1 jmcneill #endif
475 1.1 jmcneill
476 1.1 jmcneill // should produce compiler error if size is wrong
477 1.1 jmcneill typedef unsigned char validate_uint32[sizeof(uint32)==4 ? 1 : -1];
478 1.1 jmcneill
479 1.1 jmcneill #if defined(STBI_NO_STDIO) && !defined(STBI_NO_WRITE)
480 1.1 jmcneill #define STBI_NO_WRITE
481 1.1 jmcneill #endif
482 1.1 jmcneill
483 1.1 jmcneill #define STBI_NOTUSED(v) v=v
484 1.1 jmcneill
485 1.1 jmcneill #ifdef _MSC_VER
486 1.1 jmcneill #define STBI_HAS_LRTOL
487 1.1 jmcneill #endif
488 1.1 jmcneill
489 1.1 jmcneill #ifdef STBI_HAS_LRTOL
490 1.1 jmcneill #define stbi_lrot(x,y) _lrotl(x,y)
491 1.1 jmcneill #else
492 1.1 jmcneill #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))
493 1.1 jmcneill #endif
494 1.1 jmcneill
495 1.1 jmcneill //////////////////////////////////////////////////////////////////////////////
496 1.1 jmcneill //
497 1.1 jmcneill // Generic API that works on all image types
498 1.1 jmcneill //
499 1.1 jmcneill
500 1.1 jmcneill // deprecated functions
501 1.1 jmcneill
502 1.1 jmcneill // is it a jpeg?
503 1.1 jmcneill extern int stbi_jpeg_test_memory (stbi_uc const *buffer, int len);
504 1.1 jmcneill extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
505 1.1 jmcneill extern int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
506 1.1 jmcneill
507 1.1 jmcneill #ifndef STBI_NO_STDIO
508 1.1 jmcneill extern stbi_uc *stbi_jpeg_load (char const *filename, int *x, int *y, int *comp, int req_comp);
509 1.1 jmcneill extern int stbi_jpeg_test_file (FILE *f);
510 1.1 jmcneill extern stbi_uc *stbi_jpeg_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
511 1.1 jmcneill
512 1.1 jmcneill extern int stbi_jpeg_info (char const *filename, int *x, int *y, int *comp);
513 1.1 jmcneill extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp);
514 1.1 jmcneill #endif
515 1.1 jmcneill
516 1.1 jmcneill // is it a png?
517 1.1 jmcneill extern int stbi_png_test_memory (stbi_uc const *buffer, int len);
518 1.1 jmcneill extern stbi_uc *stbi_png_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
519 1.1 jmcneill extern int stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
520 1.1 jmcneill
521 1.1 jmcneill #ifndef STBI_NO_STDIO
522 1.1 jmcneill extern stbi_uc *stbi_png_load (char const *filename, int *x, int *y, int *comp, int req_comp);
523 1.1 jmcneill extern int stbi_png_info (char const *filename, int *x, int *y, int *comp);
524 1.1 jmcneill extern int stbi_png_test_file (FILE *f);
525 1.1 jmcneill extern stbi_uc *stbi_png_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
526 1.1 jmcneill extern int stbi_png_info_from_file (FILE *f, int *x, int *y, int *comp);
527 1.1 jmcneill #endif
528 1.1 jmcneill
529 1.1 jmcneill // is it a bmp?
530 1.1 jmcneill extern int stbi_bmp_test_memory (stbi_uc const *buffer, int len);
531 1.1 jmcneill
532 1.1 jmcneill extern stbi_uc *stbi_bmp_load (char const *filename, int *x, int *y, int *comp, int req_comp);
533 1.1 jmcneill extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
534 1.1 jmcneill #ifndef STBI_NO_STDIO
535 1.1 jmcneill extern int stbi_bmp_test_file (FILE *f);
536 1.1 jmcneill extern stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
537 1.1 jmcneill #endif
538 1.1 jmcneill
539 1.1 jmcneill // is it a tga?
540 1.1 jmcneill extern int stbi_tga_test_memory (stbi_uc const *buffer, int len);
541 1.1 jmcneill
542 1.1 jmcneill extern stbi_uc *stbi_tga_load (char const *filename, int *x, int *y, int *comp, int req_comp);
543 1.1 jmcneill extern stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
544 1.1 jmcneill #ifndef STBI_NO_STDIO
545 1.1 jmcneill extern int stbi_tga_test_file (FILE *f);
546 1.1 jmcneill extern stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
547 1.1 jmcneill #endif
548 1.1 jmcneill
549 1.1 jmcneill // is it a psd?
550 1.1 jmcneill extern int stbi_psd_test_memory (stbi_uc const *buffer, int len);
551 1.1 jmcneill
552 1.1 jmcneill extern stbi_uc *stbi_psd_load (char const *filename, int *x, int *y, int *comp, int req_comp);
553 1.1 jmcneill extern stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
554 1.1 jmcneill #ifndef STBI_NO_STDIO
555 1.1 jmcneill extern int stbi_psd_test_file (FILE *f);
556 1.1 jmcneill extern stbi_uc *stbi_psd_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
557 1.1 jmcneill #endif
558 1.1 jmcneill
559 1.1 jmcneill // is it an hdr?
560 1.1 jmcneill extern int stbi_hdr_test_memory (stbi_uc const *buffer, int len);
561 1.1 jmcneill
562 1.1 jmcneill extern float * stbi_hdr_load (char const *filename, int *x, int *y, int *comp, int req_comp);
563 1.1 jmcneill extern float * stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
564 1.1 jmcneill #ifndef STBI_NO_STDIO
565 1.1 jmcneill extern int stbi_hdr_test_file (FILE *f);
566 1.1 jmcneill extern float * stbi_hdr_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
567 1.1 jmcneill #endif
568 1.1 jmcneill
569 1.1 jmcneill // is it a pic?
570 1.1 jmcneill extern int stbi_pic_test_memory (stbi_uc const *buffer, int len);
571 1.1 jmcneill
572 1.1 jmcneill extern stbi_uc *stbi_pic_load (char const *filename, int *x, int *y, int *comp, int req_comp);
573 1.1 jmcneill extern stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
574 1.1 jmcneill #ifndef STBI_NO_STDIO
575 1.1 jmcneill extern int stbi_pic_test_file (FILE *f);
576 1.1 jmcneill extern stbi_uc *stbi_pic_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
577 1.1 jmcneill #endif
578 1.1 jmcneill
579 1.1 jmcneill // is it a gif?
580 1.1 jmcneill extern int stbi_gif_test_memory (stbi_uc const *buffer, int len);
581 1.1 jmcneill
582 1.1 jmcneill extern stbi_uc *stbi_gif_load (char const *filename, int *x, int *y, int *comp, int req_comp);
583 1.1 jmcneill extern stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
584 1.1 jmcneill extern int stbi_gif_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
585 1.1 jmcneill
586 1.1 jmcneill #ifndef STBI_NO_STDIO
587 1.1 jmcneill extern int stbi_gif_test_file (FILE *f);
588 1.1 jmcneill extern stbi_uc *stbi_gif_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
589 1.1 jmcneill extern int stbi_gif_info (char const *filename, int *x, int *y, int *comp);
590 1.1 jmcneill extern int stbi_gif_info_from_file (FILE *f, int *x, int *y, int *comp);
591 1.1 jmcneill #endif
592 1.1 jmcneill
593 1.1 jmcneill
594 1.1 jmcneill // this is not threadsafe
595 1.1 jmcneill static const char *failure_reason;
596 1.1 jmcneill
597 1.1 jmcneill const char *stbi_failure_reason(void)
598 1.1 jmcneill {
599 1.1 jmcneill return failure_reason;
600 1.1 jmcneill }
601 1.1 jmcneill
602 1.1 jmcneill #ifndef STBI_NO_FAILURE_STRINGS
603 1.1 jmcneill static int e(const char *str)
604 1.1 jmcneill {
605 1.1 jmcneill failure_reason = str;
606 1.1 jmcneill return 0;
607 1.1 jmcneill }
608 1.1 jmcneill #endif
609 1.1 jmcneill
610 1.1 jmcneill #ifdef STBI_NO_FAILURE_STRINGS
611 1.1 jmcneill #define e(x,y) 0
612 1.1 jmcneill #elif defined(STBI_FAILURE_USERMSG)
613 1.1 jmcneill #define e(x,y) e(y)
614 1.1 jmcneill #else
615 1.1 jmcneill #define e(x,y) e(x)
616 1.1 jmcneill #endif
617 1.1 jmcneill
618 1.1 jmcneill #define epf(x,y) ((float *) (e(x,y)?NULL:NULL))
619 1.1 jmcneill #define epuc(x,y) ((unsigned char *) (e(x,y)?NULL:NULL))
620 1.1 jmcneill
621 1.1 jmcneill void stbi_image_free(void *retval_from_stbi_load)
622 1.1 jmcneill {
623 1.1 jmcneill FREE(retval_from_stbi_load);
624 1.1 jmcneill }
625 1.1 jmcneill
626 1.1 jmcneill #define MAX_LOADERS 32
627 1.1 jmcneill stbi_loader *loaders[MAX_LOADERS];
628 1.1 jmcneill static int max_loaders = 0;
629 1.1 jmcneill
630 1.1 jmcneill int stbi_register_loader(stbi_loader *loader)
631 1.1 jmcneill {
632 1.1 jmcneill int i;
633 1.1 jmcneill for (i=0; i < MAX_LOADERS; ++i) {
634 1.1 jmcneill // already present?
635 1.1 jmcneill if (loaders[i] == loader)
636 1.1 jmcneill return 1;
637 1.1 jmcneill // end of the list?
638 1.1 jmcneill if (loaders[i] == NULL) {
639 1.1 jmcneill loaders[i] = loader;
640 1.1 jmcneill max_loaders = i+1;
641 1.1 jmcneill return 1;
642 1.1 jmcneill }
643 1.1 jmcneill }
644 1.1 jmcneill // no room for it
645 1.1 jmcneill return 0;
646 1.1 jmcneill }
647 1.1 jmcneill
648 1.1 jmcneill #ifndef STBI_NO_HDR
649 1.1 jmcneill static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
650 1.1 jmcneill static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp);
651 1.1 jmcneill #endif
652 1.1 jmcneill
653 1.1 jmcneill #ifndef STBI_NO_STDIO
654 1.1 jmcneill unsigned char *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)
655 1.1 jmcneill {
656 1.1 jmcneill FILE *f = fopen(filename, "rb");
657 1.1 jmcneill unsigned char *result;
658 1.1 jmcneill if (!f) return epuc("can't fopen", "Unable to open file");
659 1.1 jmcneill result = stbi_load_from_file(f,x,y,comp,req_comp);
660 1.1 jmcneill fclose(f);
661 1.1 jmcneill return result;
662 1.1 jmcneill }
663 1.1 jmcneill
664 1.1 jmcneill unsigned char *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
665 1.1 jmcneill {
666 1.1 jmcneill int i;
667 1.1 jmcneill if (stbi_jpeg_test_file(f)) return stbi_jpeg_load_from_file(f,x,y,comp,req_comp);
668 1.1 jmcneill if (stbi_png_test_file(f)) return stbi_png_load_from_file(f,x,y,comp,req_comp);
669 1.1 jmcneill if (stbi_bmp_test_file(f)) return stbi_bmp_load_from_file(f,x,y,comp,req_comp);
670 1.1 jmcneill if (stbi_gif_test_file(f)) return stbi_gif_load_from_file(f,x,y,comp,req_comp);
671 1.1 jmcneill if (stbi_psd_test_file(f)) return stbi_psd_load_from_file(f,x,y,comp,req_comp);
672 1.1 jmcneill if (stbi_pic_test_file(f)) return stbi_pic_load_from_file(f,x,y,comp,req_comp);
673 1.1 jmcneill
674 1.1 jmcneill #ifndef STBI_NO_HDR
675 1.1 jmcneill if (stbi_hdr_test_file(f)) {
676 1.1 jmcneill float *hdr = stbi_hdr_load_from_file(f, x,y,comp,req_comp);
677 1.1 jmcneill return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
678 1.1 jmcneill }
679 1.1 jmcneill #endif
680 1.1 jmcneill
681 1.1 jmcneill for (i=0; i < max_loaders; ++i)
682 1.1 jmcneill if (loaders[i]->test_file(f))
683 1.1 jmcneill return loaders[i]->load_from_file(f,x,y,comp,req_comp);
684 1.1 jmcneill // test tga last because it's a crappy test!
685 1.1 jmcneill if (stbi_tga_test_file(f))
686 1.1 jmcneill return stbi_tga_load_from_file(f,x,y,comp,req_comp);
687 1.1 jmcneill return epuc("unknown image type", "Image not of any known type, or corrupt");
688 1.1 jmcneill }
689 1.1 jmcneill #endif
690 1.1 jmcneill
691 1.1 jmcneill unsigned char *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
692 1.1 jmcneill {
693 1.1 jmcneill int i;
694 1.1 jmcneill if (stbi_jpeg_test_memory(buffer,len)) return stbi_jpeg_load_from_memory(buffer,len,x,y,comp,req_comp);
695 1.1 jmcneill if (stbi_png_test_memory(buffer,len)) return stbi_png_load_from_memory(buffer,len,x,y,comp,req_comp);
696 1.1 jmcneill if (stbi_bmp_test_memory(buffer,len)) return stbi_bmp_load_from_memory(buffer,len,x,y,comp,req_comp);
697 1.1 jmcneill if (stbi_gif_test_memory(buffer,len)) return stbi_gif_load_from_memory(buffer,len,x,y,comp,req_comp);
698 1.1 jmcneill if (stbi_psd_test_memory(buffer,len)) return stbi_psd_load_from_memory(buffer,len,x,y,comp,req_comp);
699 1.1 jmcneill if (stbi_pic_test_memory(buffer,len)) return stbi_pic_load_from_memory(buffer,len,x,y,comp,req_comp);
700 1.1 jmcneill
701 1.1 jmcneill #ifndef STBI_NO_HDR
702 1.1 jmcneill if (stbi_hdr_test_memory(buffer, len)) {
703 1.1 jmcneill float *hdr = stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp);
704 1.1 jmcneill return hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);
705 1.1 jmcneill }
706 1.1 jmcneill #endif
707 1.1 jmcneill
708 1.1 jmcneill for (i=0; i < max_loaders; ++i)
709 1.1 jmcneill if (loaders[i]->test_memory(buffer,len))
710 1.1 jmcneill return loaders[i]->load_from_memory(buffer,len,x,y,comp,req_comp);
711 1.1 jmcneill // test tga last because it's a crappy test!
712 1.1 jmcneill if (stbi_tga_test_memory(buffer,len))
713 1.1 jmcneill return stbi_tga_load_from_memory(buffer,len,x,y,comp,req_comp);
714 1.1 jmcneill return epuc("unknown image type", "Image not of any known type, or corrupt");
715 1.1 jmcneill }
716 1.1 jmcneill
717 1.1 jmcneill #ifndef STBI_NO_HDR
718 1.1 jmcneill
719 1.1 jmcneill #ifndef STBI_NO_STDIO
720 1.1 jmcneill float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)
721 1.1 jmcneill {
722 1.1 jmcneill FILE *f = fopen(filename, "rb");
723 1.1 jmcneill float *result;
724 1.1 jmcneill if (!f) return epf("can't fopen", "Unable to open file");
725 1.1 jmcneill result = stbi_loadf_from_file(f,x,y,comp,req_comp);
726 1.1 jmcneill fclose(f);
727 1.1 jmcneill return result;
728 1.1 jmcneill }
729 1.1 jmcneill
730 1.1 jmcneill float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
731 1.1 jmcneill {
732 1.1 jmcneill unsigned char *data;
733 1.1 jmcneill #ifndef STBI_NO_HDR
734 1.1 jmcneill if (stbi_hdr_test_file(f))
735 1.1 jmcneill return stbi_hdr_load_from_file(f,x,y,comp,req_comp);
736 1.1 jmcneill #endif
737 1.1 jmcneill data = stbi_load_from_file(f, x, y, comp, req_comp);
738 1.1 jmcneill if (data)
739 1.1 jmcneill return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
740 1.1 jmcneill return epf("unknown image type", "Image not of any known type, or corrupt");
741 1.1 jmcneill }
742 1.1 jmcneill #endif
743 1.1 jmcneill
744 1.1 jmcneill float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
745 1.1 jmcneill {
746 1.1 jmcneill stbi_uc *data;
747 1.1 jmcneill #ifndef STBI_NO_HDR
748 1.1 jmcneill if (stbi_hdr_test_memory(buffer, len))
749 1.1 jmcneill return stbi_hdr_load_from_memory(buffer, len,x,y,comp,req_comp);
750 1.1 jmcneill #endif
751 1.1 jmcneill data = stbi_load_from_memory(buffer, len, x, y, comp, req_comp);
752 1.1 jmcneill if (data)
753 1.1 jmcneill return ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);
754 1.1 jmcneill return epf("unknown image type", "Image not of any known type, or corrupt");
755 1.1 jmcneill }
756 1.1 jmcneill #endif
757 1.1 jmcneill
758 1.1 jmcneill // these is-hdr-or-not is defined independent of whether STBI_NO_HDR is
759 1.1 jmcneill // defined, for API simplicity; if STBI_NO_HDR is defined, it always
760 1.1 jmcneill // reports false!
761 1.1 jmcneill
762 1.1 jmcneill int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
763 1.1 jmcneill {
764 1.1 jmcneill #ifndef STBI_NO_HDR
765 1.1 jmcneill return stbi_hdr_test_memory(buffer, len);
766 1.1 jmcneill #else
767 1.1 jmcneill STBI_NOTUSED(buffer);
768 1.1 jmcneill STBI_NOTUSED(len);
769 1.1 jmcneill return 0;
770 1.1 jmcneill #endif
771 1.1 jmcneill }
772 1.1 jmcneill
773 1.1 jmcneill #ifndef STBI_NO_STDIO
774 1.1 jmcneill extern int stbi_is_hdr (char const *filename)
775 1.1 jmcneill {
776 1.1 jmcneill FILE *f = fopen(filename, "rb");
777 1.1 jmcneill int result=0;
778 1.1 jmcneill if (f) {
779 1.1 jmcneill result = stbi_is_hdr_from_file(f);
780 1.1 jmcneill fclose(f);
781 1.1 jmcneill }
782 1.1 jmcneill return result;
783 1.1 jmcneill }
784 1.1 jmcneill
785 1.1 jmcneill extern int stbi_is_hdr_from_file(FILE *f)
786 1.1 jmcneill {
787 1.1 jmcneill #ifndef STBI_NO_HDR
788 1.1 jmcneill return stbi_hdr_test_file(f);
789 1.1 jmcneill #else
790 1.1 jmcneill return 0;
791 1.1 jmcneill #endif
792 1.1 jmcneill }
793 1.1 jmcneill
794 1.1 jmcneill #endif
795 1.1 jmcneill
796 1.1 jmcneill #ifndef STBI_NO_HDR
797 1.1 jmcneill static float h2l_gamma_i=1.0f/2.2f, h2l_scale_i=1.0f;
798 1.1 jmcneill static float l2h_gamma=2.2f, l2h_scale=1.0f;
799 1.1 jmcneill
800 1.1 jmcneill void stbi_hdr_to_ldr_gamma(float gamma) { h2l_gamma_i = 1/gamma; }
801 1.1 jmcneill void stbi_hdr_to_ldr_scale(float scale) { h2l_scale_i = 1/scale; }
802 1.1 jmcneill
803 1.1 jmcneill void stbi_ldr_to_hdr_gamma(float gamma) { l2h_gamma = gamma; }
804 1.1 jmcneill void stbi_ldr_to_hdr_scale(float scale) { l2h_scale = scale; }
805 1.1 jmcneill #endif
806 1.1 jmcneill
807 1.1 jmcneill
808 1.1 jmcneill //////////////////////////////////////////////////////////////////////////////
809 1.1 jmcneill //
810 1.1 jmcneill // Common code used by all image loaders
811 1.1 jmcneill //
812 1.1 jmcneill
813 1.1 jmcneill enum
814 1.1 jmcneill {
815 1.1 jmcneill SCAN_load=0,
816 1.1 jmcneill SCAN_type,
817 1.1 jmcneill SCAN_header
818 1.1 jmcneill };
819 1.1 jmcneill
820 1.1 jmcneill typedef struct
821 1.1 jmcneill {
822 1.1 jmcneill uint32 img_x, img_y;
823 1.1 jmcneill int img_n, img_out_n;
824 1.1 jmcneill
825 1.1 jmcneill #ifndef STBI_NO_STDIO
826 1.1 jmcneill FILE *img_file;
827 1.1 jmcneill int buflen;
828 1.1 jmcneill uint8 buffer_start[128];
829 1.1 jmcneill int from_file;
830 1.1 jmcneill #endif
831 1.1 jmcneill uint8 const *img_buffer, *img_buffer_end;
832 1.1 jmcneill } stbi;
833 1.1 jmcneill
834 1.1 jmcneill #ifndef STBI_NO_STDIO
835 1.1 jmcneill static void start_file(stbi *s, FILE *f)
836 1.1 jmcneill {
837 1.1 jmcneill s->img_file = f;
838 1.1 jmcneill s->buflen = sizeof(s->buffer_start);
839 1.1 jmcneill s->img_buffer_end = s->buffer_start + s->buflen;
840 1.1 jmcneill s->img_buffer = s->img_buffer_end;
841 1.1 jmcneill s->from_file = 1;
842 1.1 jmcneill }
843 1.1 jmcneill #endif
844 1.1 jmcneill
845 1.1 jmcneill static void start_mem(stbi *s, uint8 const *buffer, int len)
846 1.1 jmcneill {
847 1.1 jmcneill #ifndef STBI_NO_STDIO
848 1.1 jmcneill s->img_file = NULL;
849 1.1 jmcneill s->from_file = 0;
850 1.1 jmcneill #endif
851 1.1 jmcneill s->img_buffer = (uint8 const *) buffer;
852 1.1 jmcneill s->img_buffer_end = (uint8 const *) buffer+len;
853 1.1 jmcneill }
854 1.1 jmcneill
855 1.1 jmcneill #ifndef STBI_NO_STDIO
856 1.1 jmcneill static void refill_buffer(stbi *s)
857 1.1 jmcneill {
858 1.1 jmcneill int n = fread(s->buffer_start, 1, s->buflen, s->img_file);
859 1.1 jmcneill if (n == 0) {
860 1.1 jmcneill s->from_file = 0;
861 1.1 jmcneill s->img_buffer = s->img_buffer_end-1;
862 1.1 jmcneill #if 0
863 1.1 jmcneill *s->img_buffer = 0;
864 1.1 jmcneill #endif
865 1.1 jmcneill } else {
866 1.1 jmcneill s->img_buffer = s->buffer_start;
867 1.1 jmcneill s->img_buffer_end = s->buffer_start + n;
868 1.1 jmcneill }
869 1.1 jmcneill }
870 1.1 jmcneill #endif
871 1.1 jmcneill
872 1.1 jmcneill __forceinline static int get8(stbi *s)
873 1.1 jmcneill {
874 1.1 jmcneill if (s->img_buffer < s->img_buffer_end)
875 1.1 jmcneill return *s->img_buffer++;
876 1.1 jmcneill #ifndef STBI_NO_STDIO
877 1.1 jmcneill if (s->from_file) {
878 1.1 jmcneill refill_buffer(s);
879 1.1 jmcneill return *s->img_buffer++;
880 1.1 jmcneill }
881 1.1 jmcneill #endif
882 1.1 jmcneill return 0;
883 1.1 jmcneill }
884 1.1 jmcneill
885 1.1 jmcneill __forceinline static int at_eof(stbi *s)
886 1.1 jmcneill {
887 1.1 jmcneill #ifndef STBI_NO_STDIO
888 1.1 jmcneill if (s->img_file) {
889 1.1 jmcneill if (!feof(s->img_file)) return 0;
890 1.1 jmcneill // if feof() is true, check if buffer = end
891 1.1 jmcneill // special case: we've only got the special 0 character at the end
892 1.1 jmcneill if (s->from_file == 0) return 1;
893 1.1 jmcneill }
894 1.1 jmcneill #endif
895 1.1 jmcneill return s->img_buffer >= s->img_buffer_end;
896 1.1 jmcneill }
897 1.1 jmcneill
898 1.1 jmcneill __forceinline static uint8 get8u(stbi *s)
899 1.1 jmcneill {
900 1.1 jmcneill return (uint8) get8(s);
901 1.1 jmcneill }
902 1.1 jmcneill
903 1.1 jmcneill static void skip(stbi *s, int n)
904 1.1 jmcneill {
905 1.1 jmcneill #ifndef STBI_NO_STDIO
906 1.1 jmcneill if (s->img_file) {
907 1.1 jmcneill int blen = s->img_buffer_end - s->img_buffer;
908 1.1 jmcneill if (blen < n) {
909 1.1 jmcneill s->img_buffer = s->img_buffer_end;
910 1.1 jmcneill fseek(s->img_file, n - blen, SEEK_CUR);
911 1.1 jmcneill return;
912 1.1 jmcneill }
913 1.1 jmcneill }
914 1.1 jmcneill #endif
915 1.1 jmcneill s->img_buffer += n;
916 1.1 jmcneill }
917 1.1 jmcneill
918 1.1 jmcneill static int getn(stbi *s, stbi_uc *buffer, int n)
919 1.1 jmcneill {
920 1.1 jmcneill #ifndef STBI_NO_STDIO
921 1.1 jmcneill if (s->img_file) {
922 1.1 jmcneill int blen = s->img_buffer_end - s->img_buffer;
923 1.1 jmcneill if (blen < n) {
924 1.1 jmcneill int res;
925 1.1 jmcneill memcpy(buffer, s->img_buffer, blen);
926 1.1 jmcneill res = ((int) fread(buffer + blen, 1, n - blen, s->img_file) == (n-blen));
927 1.1 jmcneill s->img_buffer = s->img_buffer_end;
928 1.1 jmcneill return res;
929 1.1 jmcneill }
930 1.1 jmcneill }
931 1.1 jmcneill #endif
932 1.1 jmcneill if (s->img_buffer+n <= s->img_buffer_end) {
933 1.1 jmcneill memcpy(buffer, s->img_buffer, n);
934 1.1 jmcneill s->img_buffer += n;
935 1.1 jmcneill return 1;
936 1.1 jmcneill } else
937 1.1 jmcneill return 0;
938 1.1 jmcneill }
939 1.1 jmcneill
940 1.1 jmcneill static int get16(stbi *s)
941 1.1 jmcneill {
942 1.1 jmcneill int z = get8(s);
943 1.1 jmcneill return (z << 8) + get8(s);
944 1.1 jmcneill }
945 1.1 jmcneill
946 1.1 jmcneill static uint32 get32(stbi *s)
947 1.1 jmcneill {
948 1.1 jmcneill uint32 z = get16(s);
949 1.1 jmcneill return (z << 16) + get16(s);
950 1.1 jmcneill }
951 1.1 jmcneill
952 1.1 jmcneill static int get16le(stbi *s)
953 1.1 jmcneill {
954 1.1 jmcneill int z = get8(s);
955 1.1 jmcneill return z + (get8(s) << 8);
956 1.1 jmcneill }
957 1.1 jmcneill
958 1.1 jmcneill static uint32 get32le(stbi *s)
959 1.1 jmcneill {
960 1.1 jmcneill uint32 z = get16le(s);
961 1.1 jmcneill return z + (get16le(s) << 16);
962 1.1 jmcneill }
963 1.1 jmcneill
964 1.1 jmcneill //////////////////////////////////////////////////////////////////////////////
965 1.1 jmcneill //
966 1.1 jmcneill // generic converter from built-in img_n to req_comp
967 1.1 jmcneill // individual types do this automatically as much as possible (e.g. jpeg
968 1.1 jmcneill // does all cases internally since it needs to colorspace convert anyway,
969 1.1 jmcneill // and it never has alpha, so very few cases ). png can automatically
970 1.1 jmcneill // interleave an alpha=255 channel, but falls back to this for other cases
971 1.1 jmcneill //
972 1.1 jmcneill // assume data buffer is malloced, so malloc a new one and free that one
973 1.1 jmcneill // only failure mode is malloc failing
974 1.1 jmcneill
975 1.1 jmcneill static uint8 compute_y(int r, int g, int b)
976 1.1 jmcneill {
977 1.1 jmcneill return (uint8) (((r*77) + (g*150) + (29*b)) >> 8);
978 1.1 jmcneill }
979 1.1 jmcneill
980 1.1 jmcneill static unsigned char *convert_format(unsigned char *data, int img_n, int req_comp, uint x, uint y)
981 1.1 jmcneill {
982 1.1 jmcneill int i,j;
983 1.1 jmcneill unsigned char *good;
984 1.1 jmcneill
985 1.1 jmcneill if (req_comp == img_n) return data;
986 1.1 jmcneill assert(req_comp >= 1 && req_comp <= 4);
987 1.1 jmcneill
988 1.7 christos good = MALLOC(req_comp * x * y);
989 1.1 jmcneill if (good == NULL) {
990 1.1 jmcneill FREE(data);
991 1.1 jmcneill return epuc("outofmem", "Out of memory");
992 1.1 jmcneill }
993 1.1 jmcneill
994 1.1 jmcneill for (j=0; j < (int) y; ++j) {
995 1.1 jmcneill unsigned char *src = data + j * x * img_n ;
996 1.1 jmcneill unsigned char *dest = good + j * x * req_comp;
997 1.1 jmcneill
998 1.1 jmcneill #define COMBO(a,b) ((a)*8+(b))
999 1.1 jmcneill #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)
1000 1.1 jmcneill // convert source image with img_n components to one with req_comp components;
1001 1.1 jmcneill // avoid switch per pixel, so use switch per scanline and massive macros
1002 1.1 jmcneill switch (COMBO(img_n, req_comp)) {
1003 1.9 mrg CASE(1,2) dest[0]=src[0], dest[1]=255;
1004 1.9 mrg break;
1005 1.9 mrg CASE(1,3) dest[0]=dest[1]=dest[2]=src[0];
1006 1.9 mrg break;
1007 1.9 mrg CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255;
1008 1.9 mrg break;
1009 1.9 mrg CASE(2,1) dest[0]=src[0];
1010 1.9 mrg break;
1011 1.9 mrg CASE(2,3) dest[0]=dest[1]=dest[2]=src[0];
1012 1.9 mrg break;
1013 1.9 mrg CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1];
1014 1.9 mrg break;
1015 1.9 mrg CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255;
1016 1.9 mrg break;
1017 1.9 mrg CASE(3,1) dest[0]=compute_y(src[0],src[1],src[2]);
1018 1.9 mrg break;
1019 1.9 mrg CASE(3,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = 255;
1020 1.9 mrg break;
1021 1.9 mrg CASE(4,1) dest[0]=compute_y(src[0],src[1],src[2]);
1022 1.9 mrg break;
1023 1.9 mrg CASE(4,2) dest[0]=compute_y(src[0],src[1],src[2]), dest[1] = src[3];
1024 1.9 mrg break;
1025 1.9 mrg CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2];
1026 1.9 mrg break;
1027 1.1 jmcneill default: assert(0);
1028 1.1 jmcneill }
1029 1.1 jmcneill #undef CASE
1030 1.1 jmcneill }
1031 1.1 jmcneill
1032 1.1 jmcneill FREE(data);
1033 1.1 jmcneill return good;
1034 1.1 jmcneill }
1035 1.1 jmcneill
1036 1.1 jmcneill #ifndef STBI_NO_HDR
1037 1.1 jmcneill static float *ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
1038 1.1 jmcneill {
1039 1.1 jmcneill int i,k,n;
1040 1.7 christos float *output = MALLOC(x * y * comp * sizeof(float));
1041 1.1 jmcneill if (output == NULL) { FREE(data); return epf("outofmem", "Out of memory"); }
1042 1.1 jmcneill // compute number of non-alpha components
1043 1.1 jmcneill if (comp & 1) n = comp; else n = comp-1;
1044 1.1 jmcneill for (i=0; i < x*y; ++i) {
1045 1.1 jmcneill for (k=0; k < n; ++k) {
1046 1.1 jmcneill output[i*comp + k] = (float) pow(data[i*comp+k]/255.0f, l2h_gamma) * l2h_scale;
1047 1.1 jmcneill }
1048 1.1 jmcneill if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f;
1049 1.1 jmcneill }
1050 1.1 jmcneill FREE(data);
1051 1.1 jmcneill return output;
1052 1.1 jmcneill }
1053 1.1 jmcneill
1054 1.1 jmcneill #define float2int(x) ((int) (x))
1055 1.1 jmcneill static stbi_uc *hdr_to_ldr(float *data, int x, int y, int comp)
1056 1.1 jmcneill {
1057 1.1 jmcneill int i,k,n;
1058 1.7 christos stbi_uc *output = MALLOC(x * y * comp);
1059 1.1 jmcneill if (output == NULL) { FREE(data); return epuc("outofmem", "Out of memory"); }
1060 1.1 jmcneill // compute number of non-alpha components
1061 1.1 jmcneill if (comp & 1) n = comp; else n = comp-1;
1062 1.1 jmcneill for (i=0; i < x*y; ++i) {
1063 1.1 jmcneill for (k=0; k < n; ++k) {
1064 1.1 jmcneill float z = (float) pow(data[i*comp+k]*h2l_scale_i, h2l_gamma_i) * 255 + 0.5f;
1065 1.1 jmcneill if (z < 0) z = 0;
1066 1.1 jmcneill if (z > 255) z = 255;
1067 1.1 jmcneill output[i*comp + k] = (uint8) float2int(z);
1068 1.1 jmcneill }
1069 1.1 jmcneill if (k < comp) {
1070 1.1 jmcneill float z = data[i*comp+k] * 255 + 0.5f;
1071 1.1 jmcneill if (z < 0) z = 0;
1072 1.1 jmcneill if (z > 255) z = 255;
1073 1.1 jmcneill output[i*comp + k] = (uint8) float2int(z);
1074 1.1 jmcneill }
1075 1.1 jmcneill }
1076 1.1 jmcneill FREE(data);
1077 1.1 jmcneill return output;
1078 1.1 jmcneill }
1079 1.1 jmcneill #endif
1080 1.1 jmcneill
1081 1.1 jmcneill //////////////////////////////////////////////////////////////////////////////
1082 1.1 jmcneill //
1083 1.1 jmcneill // "baseline" JPEG/JFIF decoder (not actually fully baseline implementation)
1084 1.1 jmcneill //
1085 1.1 jmcneill // simple implementation
1086 1.1 jmcneill // - channel subsampling of at most 2 in each dimension
1087 1.1 jmcneill // - doesn't support delayed output of y-dimension
1088 1.1 jmcneill // - simple interface (only one output format: 8-bit interleaved RGB)
1089 1.1 jmcneill // - doesn't try to recover corrupt jpegs
1090 1.1 jmcneill // - doesn't allow partial loading, loading multiple at once
1091 1.1 jmcneill // - still fast on x86 (copying globals into locals doesn't help x86)
1092 1.1 jmcneill // - allocates lots of intermediate memory (full size of all components)
1093 1.1 jmcneill // - non-interleaved case requires this anyway
1094 1.1 jmcneill // - allows good upsampling (see next)
1095 1.1 jmcneill // high-quality
1096 1.1 jmcneill // - upsampled channels are bilinearly interpolated, even across blocks
1097 1.1 jmcneill // - quality integer IDCT derived from IJG's 'slow'
1098 1.1 jmcneill // performance
1099 1.1 jmcneill // - fast huffman; reasonable integer IDCT
1100 1.1 jmcneill // - uses a lot of intermediate memory, could cache poorly
1101 1.1 jmcneill // - load http://nothings.org/remote/anemones.jpg 3 times on 2.8Ghz P4
1102 1.1 jmcneill // stb_jpeg: 1.34 seconds (MSVC6, default release build)
1103 1.1 jmcneill // stb_jpeg: 1.06 seconds (MSVC6, processor = Pentium Pro)
1104 1.1 jmcneill // IJL11.dll: 1.08 seconds (compiled by intel)
1105 1.1 jmcneill // IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG)
1106 1.1 jmcneill // IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro)
1107 1.1 jmcneill
1108 1.1 jmcneill // huffman decoding acceleration
1109 1.1 jmcneill #define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
1110 1.1 jmcneill
1111 1.1 jmcneill typedef struct
1112 1.1 jmcneill {
1113 1.1 jmcneill uint8 fast[1 << FAST_BITS];
1114 1.1 jmcneill // weirdly, repacking this into AoS is a 10% speed loss, instead of a win
1115 1.1 jmcneill uint16 code[256];
1116 1.1 jmcneill uint8 values[256];
1117 1.1 jmcneill uint8 size[257];
1118 1.1 jmcneill unsigned int maxcode[18];
1119 1.1 jmcneill int delta[17]; // old 'firstsymbol' - old 'firstcode'
1120 1.1 jmcneill } huffman;
1121 1.1 jmcneill
1122 1.1 jmcneill typedef struct
1123 1.1 jmcneill {
1124 1.1 jmcneill #ifdef STBI_SIMD
1125 1.1 jmcneill unsigned short dequant2[4][64];
1126 1.1 jmcneill #endif
1127 1.1 jmcneill stbi s;
1128 1.1 jmcneill huffman huff_dc[4];
1129 1.1 jmcneill huffman huff_ac[4];
1130 1.1 jmcneill uint8 dequant[4][64];
1131 1.1 jmcneill
1132 1.1 jmcneill // sizes for components, interleaved MCUs
1133 1.1 jmcneill int img_h_max, img_v_max;
1134 1.1 jmcneill int img_mcu_x, img_mcu_y;
1135 1.1 jmcneill int img_mcu_w, img_mcu_h;
1136 1.1 jmcneill
1137 1.1 jmcneill // definition of jpeg image component
1138 1.1 jmcneill struct
1139 1.1 jmcneill {
1140 1.1 jmcneill int id;
1141 1.1 jmcneill int h,v;
1142 1.1 jmcneill int tq;
1143 1.1 jmcneill int hd,ha;
1144 1.1 jmcneill int dc_pred;
1145 1.1 jmcneill
1146 1.1 jmcneill int x,y,w2,h2;
1147 1.1 jmcneill uint8 *data;
1148 1.1 jmcneill void *raw_data;
1149 1.1 jmcneill uint8 *linebuf;
1150 1.1 jmcneill } img_comp[4];
1151 1.1 jmcneill
1152 1.1 jmcneill uint32 code_buffer; // jpeg entropy-coded buffer
1153 1.1 jmcneill int code_bits; // number of valid bits
1154 1.1 jmcneill unsigned char marker; // marker seen while filling entropy buffer
1155 1.1 jmcneill int nomore; // flag if we saw a marker so must stop
1156 1.1 jmcneill
1157 1.1 jmcneill int scan_n, order[4];
1158 1.1 jmcneill int restart_interval, todo;
1159 1.1 jmcneill } jpeg;
1160 1.1 jmcneill
1161 1.1 jmcneill static int build_huffman(huffman *h, int *count)
1162 1.1 jmcneill {
1163 1.1 jmcneill int i,j,k=0,code;
1164 1.1 jmcneill // build size list for each symbol (from JPEG spec)
1165 1.1 jmcneill for (i=0; i < 16; ++i)
1166 1.1 jmcneill for (j=0; j < count[i]; ++j)
1167 1.1 jmcneill h->size[k++] = (uint8) (i+1);
1168 1.1 jmcneill h->size[k] = 0;
1169 1.1 jmcneill
1170 1.1 jmcneill // compute actual symbols (from jpeg spec)
1171 1.1 jmcneill code = 0;
1172 1.1 jmcneill k = 0;
1173 1.1 jmcneill for(j=1; j <= 16; ++j) {
1174 1.1 jmcneill // compute delta to add to code to compute symbol id
1175 1.1 jmcneill h->delta[j] = k - code;
1176 1.1 jmcneill if (h->size[k] == j) {
1177 1.1 jmcneill while (h->size[k] == j)
1178 1.1 jmcneill h->code[k++] = (uint16) (code++);
1179 1.1 jmcneill if (code-1 >= (1 << j)) return e("bad code lengths","Corrupt JPEG");
1180 1.1 jmcneill }
1181 1.1 jmcneill // compute largest code + 1 for this size, preshifted as needed later
1182 1.1 jmcneill h->maxcode[j] = code << (16-j);
1183 1.1 jmcneill code <<= 1;
1184 1.1 jmcneill }
1185 1.1 jmcneill h->maxcode[j] = 0xffffffff;
1186 1.1 jmcneill
1187 1.1 jmcneill // build non-spec acceleration table; 255 is flag for not-accelerated
1188 1.1 jmcneill memset(h->fast, 255, 1 << FAST_BITS);
1189 1.1 jmcneill for (i=0; i < k; ++i) {
1190 1.1 jmcneill int s = h->size[i];
1191 1.1 jmcneill if (s <= FAST_BITS) {
1192 1.1 jmcneill int c = h->code[i] << (FAST_BITS-s);
1193 1.1 jmcneill int m = 1 << (FAST_BITS-s);
1194 1.1 jmcneill for (j=0; j < m; ++j) {
1195 1.1 jmcneill h->fast[c+j] = (uint8) i;
1196 1.1 jmcneill }
1197 1.1 jmcneill }
1198 1.1 jmcneill }
1199 1.1 jmcneill return 1;
1200 1.1 jmcneill }
1201 1.1 jmcneill
1202 1.1 jmcneill static void grow_buffer_unsafe(jpeg *j)
1203 1.1 jmcneill {
1204 1.1 jmcneill do {
1205 1.1 jmcneill int b = j->nomore ? 0 : get8(&j->s);
1206 1.1 jmcneill if (b == 0xff) {
1207 1.1 jmcneill int c = get8(&j->s);
1208 1.1 jmcneill if (c != 0) {
1209 1.1 jmcneill j->marker = (unsigned char) c;
1210 1.1 jmcneill j->nomore = 1;
1211 1.1 jmcneill return;
1212 1.1 jmcneill }
1213 1.1 jmcneill }
1214 1.1 jmcneill j->code_buffer |= b << (24 - j->code_bits);
1215 1.1 jmcneill j->code_bits += 8;
1216 1.1 jmcneill } while (j->code_bits <= 24);
1217 1.1 jmcneill }
1218 1.1 jmcneill
1219 1.1 jmcneill // (1 << n) - 1
1220 1.1 jmcneill static uint32 bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};
1221 1.1 jmcneill
1222 1.1 jmcneill // decode a jpeg huffman value from the bitstream
1223 1.1 jmcneill __forceinline static int decode(jpeg *j, huffman *h)
1224 1.1 jmcneill {
1225 1.1 jmcneill unsigned int temp;
1226 1.1 jmcneill int c,k;
1227 1.1 jmcneill
1228 1.1 jmcneill if (j->code_bits < 16) grow_buffer_unsafe(j);
1229 1.1 jmcneill
1230 1.1 jmcneill // look at the top FAST_BITS and determine what symbol ID it is,
1231 1.1 jmcneill // if the code is <= FAST_BITS
1232 1.1 jmcneill c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);
1233 1.1 jmcneill k = h->fast[c];
1234 1.1 jmcneill if (k < 255) {
1235 1.1 jmcneill int s = h->size[k];
1236 1.1 jmcneill if (s > j->code_bits)
1237 1.1 jmcneill return -1;
1238 1.1 jmcneill j->code_buffer <<= s;
1239 1.1 jmcneill j->code_bits -= s;
1240 1.1 jmcneill return h->values[k];
1241 1.1 jmcneill }
1242 1.1 jmcneill
1243 1.1 jmcneill // naive test is to shift the code_buffer down so k bits are
1244 1.1 jmcneill // valid, then test against maxcode. To speed this up, we've
1245 1.1 jmcneill // preshifted maxcode left so that it has (16-k) 0s at the
1246 1.1 jmcneill // end; in other words, regardless of the number of bits, it
1247 1.1 jmcneill // wants to be compared against something shifted to have 16;
1248 1.1 jmcneill // that way we don't need to shift inside the loop.
1249 1.1 jmcneill temp = j->code_buffer >> 16;
1250 1.1 jmcneill for (k=FAST_BITS+1 ; ; ++k)
1251 1.1 jmcneill if (temp < h->maxcode[k])
1252 1.1 jmcneill break;
1253 1.1 jmcneill if (k == 17) {
1254 1.1 jmcneill // error! code not found
1255 1.1 jmcneill j->code_bits -= 16;
1256 1.1 jmcneill return -1;
1257 1.1 jmcneill }
1258 1.1 jmcneill
1259 1.1 jmcneill if (k > j->code_bits)
1260 1.1 jmcneill return -1;
1261 1.1 jmcneill
1262 1.1 jmcneill // convert the huffman code to the symbol id
1263 1.1 jmcneill c = ((j->code_buffer >> (32 - k)) & bmask[k]) + h->delta[k];
1264 1.1 jmcneill assert((((j->code_buffer) >> (32 - h->size[c])) & bmask[h->size[c]]) == h->code[c]);
1265 1.1 jmcneill
1266 1.1 jmcneill // convert the id to a symbol
1267 1.1 jmcneill j->code_bits -= k;
1268 1.1 jmcneill j->code_buffer <<= k;
1269 1.1 jmcneill return h->values[c];
1270 1.1 jmcneill }
1271 1.1 jmcneill
1272 1.1 jmcneill // combined JPEG 'receive' and JPEG 'extend', since baseline
1273 1.1 jmcneill // always extends everything it receives.
1274 1.1 jmcneill __forceinline static int extend_receive(jpeg *j, int n)
1275 1.1 jmcneill {
1276 1.1 jmcneill unsigned int m = 1 << (n-1);
1277 1.1 jmcneill unsigned int k;
1278 1.1 jmcneill if (j->code_bits < n) grow_buffer_unsafe(j);
1279 1.1 jmcneill
1280 1.1 jmcneill #if 1
1281 1.1 jmcneill k = stbi_lrot(j->code_buffer, n);
1282 1.1 jmcneill j->code_buffer = k & ~bmask[n];
1283 1.1 jmcneill k &= bmask[n];
1284 1.1 jmcneill j->code_bits -= n;
1285 1.1 jmcneill #else
1286 1.1 jmcneill k = (j->code_buffer >> (32 - n)) & bmask[n];
1287 1.1 jmcneill j->code_bits -= n;
1288 1.1 jmcneill j->code_buffer <<= n;
1289 1.1 jmcneill #endif
1290 1.1 jmcneill // the following test is probably a random branch that won't
1291 1.1 jmcneill // predict well. I tried to table accelerate it but failed.
1292 1.1 jmcneill // maybe it's compiling as a conditional move?
1293 1.1 jmcneill if (k < m)
1294 1.9 mrg return (UINT_MAX << n) + k + 1;
1295 1.1 jmcneill else
1296 1.1 jmcneill return k;
1297 1.1 jmcneill }
1298 1.1 jmcneill
1299 1.1 jmcneill // given a value that's at position X in the zigzag stream,
1300 1.1 jmcneill // where does it appear in the 8x8 matrix coded as row-major?
1301 1.1 jmcneill static uint8 dezigzag[64+15] =
1302 1.1 jmcneill {
1303 1.1 jmcneill 0, 1, 8, 16, 9, 2, 3, 10,
1304 1.1 jmcneill 17, 24, 32, 25, 18, 11, 4, 5,
1305 1.1 jmcneill 12, 19, 26, 33, 40, 48, 41, 34,
1306 1.1 jmcneill 27, 20, 13, 6, 7, 14, 21, 28,
1307 1.1 jmcneill 35, 42, 49, 56, 57, 50, 43, 36,
1308 1.1 jmcneill 29, 22, 15, 23, 30, 37, 44, 51,
1309 1.1 jmcneill 58, 59, 52, 45, 38, 31, 39, 46,
1310 1.1 jmcneill 53, 60, 61, 54, 47, 55, 62, 63,
1311 1.1 jmcneill // let corrupt input sample past end
1312 1.1 jmcneill 63, 63, 63, 63, 63, 63, 63, 63,
1313 1.1 jmcneill 63, 63, 63, 63, 63, 63, 63
1314 1.1 jmcneill };
1315 1.1 jmcneill
1316 1.1 jmcneill // decode one 64-entry block--
1317 1.1 jmcneill static int decode_block(jpeg *j, short data[64], huffman *hdc, huffman *hac, int b)
1318 1.1 jmcneill {
1319 1.1 jmcneill int diff,dc,k;
1320 1.1 jmcneill int t = decode(j, hdc);
1321 1.1 jmcneill if (t < 0) return e("bad huffman code","Corrupt JPEG");
1322 1.1 jmcneill
1323 1.1 jmcneill // 0 all the ac values now so we can do it 32-bits at a time
1324 1.1 jmcneill memset(data,0,64*sizeof(data[0]));
1325 1.1 jmcneill
1326 1.1 jmcneill diff = t ? extend_receive(j, t) : 0;
1327 1.1 jmcneill dc = j->img_comp[b].dc_pred + diff;
1328 1.1 jmcneill j->img_comp[b].dc_pred = dc;
1329 1.1 jmcneill data[0] = (short) dc;
1330 1.1 jmcneill
1331 1.1 jmcneill // decode AC components, see JPEG spec
1332 1.1 jmcneill k = 1;
1333 1.1 jmcneill do {
1334 1.1 jmcneill int r,s;
1335 1.1 jmcneill int rs = decode(j, hac);
1336 1.1 jmcneill if (rs < 0) return e("bad huffman code","Corrupt JPEG");
1337 1.1 jmcneill s = rs & 15;
1338 1.1 jmcneill r = rs >> 4;
1339 1.1 jmcneill if (s == 0) {
1340 1.1 jmcneill if (rs != 0xf0) break; // end block
1341 1.1 jmcneill k += 16;
1342 1.1 jmcneill } else {
1343 1.1 jmcneill k += r;
1344 1.1 jmcneill // decode into unzigzag'd location
1345 1.1 jmcneill data[dezigzag[k++]] = (short) extend_receive(j,s);
1346 1.1 jmcneill }
1347 1.1 jmcneill } while (k < 64);
1348 1.1 jmcneill return 1;
1349 1.1 jmcneill }
1350 1.1 jmcneill
1351 1.1 jmcneill // take a -128..127 value and clamp it and convert to 0..255
1352 1.1 jmcneill __forceinline static uint8 clamp(int x)
1353 1.1 jmcneill {
1354 1.1 jmcneill // trick to use a single test to catch both cases
1355 1.1 jmcneill if ((unsigned int) x > 255) {
1356 1.1 jmcneill if (x < 0) return 0;
1357 1.1 jmcneill if (x > 255) return 255;
1358 1.1 jmcneill }
1359 1.1 jmcneill return (uint8) x;
1360 1.1 jmcneill }
1361 1.1 jmcneill
1362 1.1 jmcneill #define f2f(x) (int) (((x) * 4096 + 0.5))
1363 1.1 jmcneill #define fsh(x) ((x) << 12)
1364 1.1 jmcneill
1365 1.1 jmcneill // derived from jidctint -- DCT_ISLOW
1366 1.1 jmcneill #define IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \
1367 1.1 jmcneill int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \
1368 1.1 jmcneill p2 = s2; \
1369 1.1 jmcneill p3 = s6; \
1370 1.1 jmcneill p1 = (p2+p3) * f2f(0.5411961f); \
1371 1.1 jmcneill t2 = p1 + p3*f2f(-1.847759065f); \
1372 1.1 jmcneill t3 = p1 + p2*f2f( 0.765366865f); \
1373 1.1 jmcneill p2 = s0; \
1374 1.1 jmcneill p3 = s4; \
1375 1.1 jmcneill t0 = fsh(p2+p3); \
1376 1.1 jmcneill t1 = fsh(p2-p3); \
1377 1.1 jmcneill x0 = t0+t3; \
1378 1.1 jmcneill x3 = t0-t3; \
1379 1.1 jmcneill x1 = t1+t2; \
1380 1.1 jmcneill x2 = t1-t2; \
1381 1.1 jmcneill t0 = s7; \
1382 1.1 jmcneill t1 = s5; \
1383 1.1 jmcneill t2 = s3; \
1384 1.1 jmcneill t3 = s1; \
1385 1.1 jmcneill p3 = t0+t2; \
1386 1.1 jmcneill p4 = t1+t3; \
1387 1.1 jmcneill p1 = t0+t3; \
1388 1.1 jmcneill p2 = t1+t2; \
1389 1.1 jmcneill p5 = (p3+p4)*f2f( 1.175875602f); \
1390 1.1 jmcneill t0 = t0*f2f( 0.298631336f); \
1391 1.1 jmcneill t1 = t1*f2f( 2.053119869f); \
1392 1.1 jmcneill t2 = t2*f2f( 3.072711026f); \
1393 1.1 jmcneill t3 = t3*f2f( 1.501321110f); \
1394 1.1 jmcneill p1 = p5 + p1*f2f(-0.899976223f); \
1395 1.1 jmcneill p2 = p5 + p2*f2f(-2.562915447f); \
1396 1.1 jmcneill p3 = p3*f2f(-1.961570560f); \
1397 1.1 jmcneill p4 = p4*f2f(-0.390180644f); \
1398 1.1 jmcneill t3 += p1+p4; \
1399 1.1 jmcneill t2 += p2+p3; \
1400 1.1 jmcneill t1 += p2+p4; \
1401 1.1 jmcneill t0 += p1+p3;
1402 1.1 jmcneill
1403 1.1 jmcneill #ifdef STBI_SIMD
1404 1.1 jmcneill typedef unsigned short stbi_dequantize_t;
1405 1.1 jmcneill #else
1406 1.1 jmcneill typedef uint8 stbi_dequantize_t;
1407 1.1 jmcneill #endif
1408 1.1 jmcneill
1409 1.1 jmcneill // .344 seconds on 3*anemones.jpg
1410 1.1 jmcneill static void idct_block(uint8 *out, int out_stride, short data[64], stbi_dequantize_t *dequantize)
1411 1.1 jmcneill {
1412 1.1 jmcneill int i,val[64],*v=val;
1413 1.1 jmcneill stbi_dequantize_t *dq = dequantize;
1414 1.1 jmcneill uint8 *o;
1415 1.1 jmcneill short *d = data;
1416 1.1 jmcneill
1417 1.1 jmcneill // columns
1418 1.1 jmcneill for (i=0; i < 8; ++i,++d,++dq, ++v) {
1419 1.1 jmcneill // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing
1420 1.1 jmcneill if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0
1421 1.1 jmcneill && d[40]==0 && d[48]==0 && d[56]==0) {
1422 1.1 jmcneill // no shortcut 0 seconds
1423 1.1 jmcneill // (1|2|3|4|5|6|7)==0 0 seconds
1424 1.1 jmcneill // all separate -0.047 seconds
1425 1.1 jmcneill // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds
1426 1.1 jmcneill int dcterm = d[0] * dq[0] << 2;
1427 1.1 jmcneill v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;
1428 1.1 jmcneill } else {
1429 1.1 jmcneill IDCT_1D(d[ 0]*dq[ 0],d[ 8]*dq[ 8],d[16]*dq[16],d[24]*dq[24],
1430 1.1 jmcneill d[32]*dq[32],d[40]*dq[40],d[48]*dq[48],d[56]*dq[56])
1431 1.1 jmcneill // constants scaled things up by 1<<12; let's bring them back
1432 1.1 jmcneill // down, but keep 2 extra bits of precision
1433 1.1 jmcneill x0 += 512; x1 += 512; x2 += 512; x3 += 512;
1434 1.1 jmcneill v[ 0] = (x0+t3) >> 10;
1435 1.1 jmcneill v[56] = (x0-t3) >> 10;
1436 1.1 jmcneill v[ 8] = (x1+t2) >> 10;
1437 1.1 jmcneill v[48] = (x1-t2) >> 10;
1438 1.1 jmcneill v[16] = (x2+t1) >> 10;
1439 1.1 jmcneill v[40] = (x2-t1) >> 10;
1440 1.1 jmcneill v[24] = (x3+t0) >> 10;
1441 1.1 jmcneill v[32] = (x3-t0) >> 10;
1442 1.1 jmcneill }
1443 1.1 jmcneill }
1444 1.1 jmcneill
1445 1.1 jmcneill for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {
1446 1.1 jmcneill // no fast case since the first 1D IDCT spread components out
1447 1.1 jmcneill IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])
1448 1.1 jmcneill // constants scaled things up by 1<<12, plus we had 1<<2 from first
1449 1.1 jmcneill // loop, plus horizontal and vertical each scale by sqrt(8) so together
1450 1.1 jmcneill // we've got an extra 1<<3, so 1<<17 total we need to remove.
1451 1.1 jmcneill // so we want to round that, which means adding 0.5 * 1<<17,
1452 1.1 jmcneill // aka 65536. Also, we'll end up with -128 to 127 that we want
1453 1.1 jmcneill // to encode as 0..255 by adding 128, so we'll add that before the shift
1454 1.1 jmcneill x0 += 65536 + (128<<17);
1455 1.1 jmcneill x1 += 65536 + (128<<17);
1456 1.1 jmcneill x2 += 65536 + (128<<17);
1457 1.1 jmcneill x3 += 65536 + (128<<17);
1458 1.1 jmcneill // tried computing the shifts into temps, or'ing the temps to see
1459 1.1 jmcneill // if any were out of range, but that was slower
1460 1.1 jmcneill o[0] = clamp((x0+t3) >> 17);
1461 1.1 jmcneill o[7] = clamp((x0-t3) >> 17);
1462 1.1 jmcneill o[1] = clamp((x1+t2) >> 17);
1463 1.1 jmcneill o[6] = clamp((x1-t2) >> 17);
1464 1.1 jmcneill o[2] = clamp((x2+t1) >> 17);
1465 1.1 jmcneill o[5] = clamp((x2-t1) >> 17);
1466 1.1 jmcneill o[3] = clamp((x3+t0) >> 17);
1467 1.1 jmcneill o[4] = clamp((x3-t0) >> 17);
1468 1.1 jmcneill }
1469 1.1 jmcneill }
1470 1.1 jmcneill
1471 1.1 jmcneill #ifdef STBI_SIMD
1472 1.1 jmcneill static stbi_idct_8x8 stbi_idct_installed = idct_block;
1473 1.1 jmcneill
1474 1.1 jmcneill extern void stbi_install_idct(stbi_idct_8x8 func)
1475 1.1 jmcneill {
1476 1.1 jmcneill stbi_idct_installed = func;
1477 1.1 jmcneill }
1478 1.1 jmcneill #endif
1479 1.1 jmcneill
1480 1.1 jmcneill #define MARKER_none 0xff
1481 1.1 jmcneill // if there's a pending marker from the entropy stream, return that
1482 1.1 jmcneill // otherwise, fetch from the stream and get a marker. if there's no
1483 1.1 jmcneill // marker, return 0xff, which is never a valid marker value
1484 1.1 jmcneill static uint8 get_marker(jpeg *j)
1485 1.1 jmcneill {
1486 1.1 jmcneill uint8 x;
1487 1.1 jmcneill if (j->marker != MARKER_none) { x = j->marker; j->marker = MARKER_none; return x; }
1488 1.1 jmcneill x = get8u(&j->s);
1489 1.1 jmcneill if (x != 0xff) return MARKER_none;
1490 1.1 jmcneill while (x == 0xff)
1491 1.1 jmcneill x = get8u(&j->s);
1492 1.1 jmcneill return x;
1493 1.1 jmcneill }
1494 1.1 jmcneill
1495 1.1 jmcneill // in each scan, we'll have scan_n components, and the order
1496 1.1 jmcneill // of the components is specified by order[]
1497 1.1 jmcneill #define RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)
1498 1.1 jmcneill
1499 1.1 jmcneill // after a restart interval, reset the entropy decoder and
1500 1.1 jmcneill // the dc prediction
1501 1.1 jmcneill static void reset(jpeg *j)
1502 1.1 jmcneill {
1503 1.1 jmcneill j->code_bits = 0;
1504 1.1 jmcneill j->code_buffer = 0;
1505 1.1 jmcneill j->nomore = 0;
1506 1.1 jmcneill j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0;
1507 1.1 jmcneill j->marker = MARKER_none;
1508 1.1 jmcneill j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;
1509 1.1 jmcneill // no more than 1<<31 MCUs if no restart_interal? that's plenty safe,
1510 1.1 jmcneill // since we don't even allow 1<<30 pixels
1511 1.1 jmcneill }
1512 1.1 jmcneill
1513 1.1 jmcneill static int parse_entropy_coded_data(jpeg *z)
1514 1.1 jmcneill {
1515 1.1 jmcneill reset(z);
1516 1.1 jmcneill if (z->scan_n == 1) {
1517 1.1 jmcneill int i,j;
1518 1.1 jmcneill #ifdef STBI_SIMD
1519 1.1 jmcneill __declspec(align(16))
1520 1.1 jmcneill #endif
1521 1.1 jmcneill short data[64];
1522 1.1 jmcneill int n = z->order[0];
1523 1.1 jmcneill // non-interleaved data, we just need to process one block at a time,
1524 1.1 jmcneill // in trivial scanline order
1525 1.1 jmcneill // number of blocks to do just depends on how many actual "pixels" this
1526 1.1 jmcneill // component has, independent of interleaved MCU blocking and such
1527 1.1 jmcneill int w = (z->img_comp[n].x+7) >> 3;
1528 1.1 jmcneill int h = (z->img_comp[n].y+7) >> 3;
1529 1.1 jmcneill for (j=0; j < h; ++j) {
1530 1.1 jmcneill for (i=0; i < w; ++i) {
1531 1.1 jmcneill if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0;
1532 1.1 jmcneill #ifdef STBI_SIMD
1533 1.1 jmcneill stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1534 1.1 jmcneill #else
1535 1.1 jmcneill idct_block(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1536 1.1 jmcneill #endif
1537 1.1 jmcneill // every data block is an MCU, so countdown the restart interval
1538 1.1 jmcneill if (--z->todo <= 0) {
1539 1.1 jmcneill if (z->code_bits < 24) grow_buffer_unsafe(z);
1540 1.1 jmcneill // if it's NOT a restart, then just bail, so we get corrupt data
1541 1.1 jmcneill // rather than no data
1542 1.1 jmcneill if (!RESTART(z->marker)) return 1;
1543 1.1 jmcneill reset(z);
1544 1.1 jmcneill }
1545 1.1 jmcneill }
1546 1.1 jmcneill }
1547 1.1 jmcneill } else { // interleaved!
1548 1.1 jmcneill int i,j,k,x,y;
1549 1.1 jmcneill short data[64];
1550 1.1 jmcneill for (j=0; j < z->img_mcu_y; ++j) {
1551 1.1 jmcneill for (i=0; i < z->img_mcu_x; ++i) {
1552 1.1 jmcneill // scan an interleaved mcu... process scan_n components in order
1553 1.1 jmcneill for (k=0; k < z->scan_n; ++k) {
1554 1.1 jmcneill int n = z->order[k];
1555 1.1 jmcneill // scan out an mcu's worth of this component; that's just determined
1556 1.1 jmcneill // by the basic H and V specified for the component
1557 1.1 jmcneill for (y=0; y < z->img_comp[n].v; ++y) {
1558 1.1 jmcneill for (x=0; x < z->img_comp[n].h; ++x) {
1559 1.1 jmcneill int x2 = (i*z->img_comp[n].h + x)*8;
1560 1.1 jmcneill int y2 = (j*z->img_comp[n].v + y)*8;
1561 1.1 jmcneill if (!decode_block(z, data, z->huff_dc+z->img_comp[n].hd, z->huff_ac+z->img_comp[n].ha, n)) return 0;
1562 1.1 jmcneill #ifdef STBI_SIMD
1563 1.1 jmcneill stbi_idct_installed(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant2[z->img_comp[n].tq]);
1564 1.1 jmcneill #else
1565 1.1 jmcneill idct_block(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data, z->dequant[z->img_comp[n].tq]);
1566 1.1 jmcneill #endif
1567 1.1 jmcneill }
1568 1.1 jmcneill }
1569 1.1 jmcneill }
1570 1.1 jmcneill // after all interleaved components, that's an interleaved MCU,
1571 1.1 jmcneill // so now count down the restart interval
1572 1.1 jmcneill if (--z->todo <= 0) {
1573 1.1 jmcneill if (z->code_bits < 24) grow_buffer_unsafe(z);
1574 1.1 jmcneill // if it's NOT a restart, then just bail, so we get corrupt data
1575 1.1 jmcneill // rather than no data
1576 1.1 jmcneill if (!RESTART(z->marker)) return 1;
1577 1.1 jmcneill reset(z);
1578 1.1 jmcneill }
1579 1.1 jmcneill }
1580 1.1 jmcneill }
1581 1.1 jmcneill }
1582 1.1 jmcneill return 1;
1583 1.1 jmcneill }
1584 1.1 jmcneill
1585 1.1 jmcneill static int process_marker(jpeg *z, int marker)
1586 1.1 jmcneill {
1587 1.1 jmcneill int L;
1588 1.1 jmcneill switch (marker) {
1589 1.1 jmcneill case MARKER_none: // no marker found
1590 1.1 jmcneill return e("expected marker","Corrupt JPEG");
1591 1.1 jmcneill
1592 1.1 jmcneill case 0xC2: // SOF - progressive
1593 1.1 jmcneill return e("progressive jpeg","JPEG format not supported (progressive)");
1594 1.1 jmcneill
1595 1.1 jmcneill case 0xDD: // DRI - specify restart interval
1596 1.1 jmcneill if (get16(&z->s) != 4) return e("bad DRI len","Corrupt JPEG");
1597 1.1 jmcneill z->restart_interval = get16(&z->s);
1598 1.1 jmcneill return 1;
1599 1.1 jmcneill
1600 1.1 jmcneill case 0xDB: // DQT - define quantization table
1601 1.1 jmcneill L = get16(&z->s)-2;
1602 1.1 jmcneill while (L > 0) {
1603 1.1 jmcneill int q = get8(&z->s);
1604 1.1 jmcneill int p = q >> 4;
1605 1.1 jmcneill int t = q & 15,i;
1606 1.1 jmcneill if (p != 0) return e("bad DQT type","Corrupt JPEG");
1607 1.1 jmcneill if (t > 3) return e("bad DQT table","Corrupt JPEG");
1608 1.1 jmcneill for (i=0; i < 64; ++i)
1609 1.1 jmcneill z->dequant[t][dezigzag[i]] = get8u(&z->s);
1610 1.1 jmcneill #ifdef STBI_SIMD
1611 1.1 jmcneill for (i=0; i < 64; ++i)
1612 1.1 jmcneill z->dequant2[t][i] = z->dequant[t][i];
1613 1.1 jmcneill #endif
1614 1.1 jmcneill L -= 65;
1615 1.1 jmcneill }
1616 1.1 jmcneill return L==0;
1617 1.1 jmcneill
1618 1.1 jmcneill case 0xC4: // DHT - define huffman table
1619 1.1 jmcneill L = get16(&z->s)-2;
1620 1.1 jmcneill while (L > 0) {
1621 1.1 jmcneill uint8 *v;
1622 1.1 jmcneill int sizes[16],i,m=0;
1623 1.1 jmcneill int q = get8(&z->s);
1624 1.1 jmcneill int tc = q >> 4;
1625 1.1 jmcneill int th = q & 15;
1626 1.1 jmcneill if (tc > 1 || th > 3) return e("bad DHT header","Corrupt JPEG");
1627 1.1 jmcneill for (i=0; i < 16; ++i) {
1628 1.1 jmcneill sizes[i] = get8(&z->s);
1629 1.1 jmcneill m += sizes[i];
1630 1.1 jmcneill }
1631 1.1 jmcneill L -= 17;
1632 1.1 jmcneill if (tc == 0) {
1633 1.1 jmcneill if (!build_huffman(z->huff_dc+th, sizes)) return 0;
1634 1.1 jmcneill v = z->huff_dc[th].values;
1635 1.1 jmcneill } else {
1636 1.1 jmcneill if (!build_huffman(z->huff_ac+th, sizes)) return 0;
1637 1.1 jmcneill v = z->huff_ac[th].values;
1638 1.1 jmcneill }
1639 1.1 jmcneill for (i=0; i < m; ++i)
1640 1.1 jmcneill v[i] = get8u(&z->s);
1641 1.1 jmcneill L -= m;
1642 1.1 jmcneill }
1643 1.1 jmcneill return L==0;
1644 1.1 jmcneill }
1645 1.1 jmcneill // check for comment block or APP blocks
1646 1.1 jmcneill if ((marker >= 0xE0 && marker <= 0xEF) || marker == 0xFE) {
1647 1.1 jmcneill skip(&z->s, get16(&z->s)-2);
1648 1.1 jmcneill return 1;
1649 1.1 jmcneill }
1650 1.1 jmcneill return 0;
1651 1.1 jmcneill }
1652 1.1 jmcneill
1653 1.1 jmcneill // after we see SOS
1654 1.1 jmcneill static int process_scan_header(jpeg *z)
1655 1.1 jmcneill {
1656 1.1 jmcneill int i;
1657 1.1 jmcneill int Ls = get16(&z->s);
1658 1.1 jmcneill z->scan_n = get8(&z->s);
1659 1.1 jmcneill if (z->scan_n < 1 || z->scan_n > 4 || z->scan_n > (int) z->s.img_n) return e("bad SOS component count","Corrupt JPEG");
1660 1.1 jmcneill if (Ls != 6+2*z->scan_n) return e("bad SOS len","Corrupt JPEG");
1661 1.1 jmcneill for (i=0; i < z->scan_n; ++i) {
1662 1.1 jmcneill int id = get8(&z->s), which;
1663 1.1 jmcneill int q = get8(&z->s);
1664 1.1 jmcneill for (which = 0; which < z->s.img_n; ++which)
1665 1.1 jmcneill if (z->img_comp[which].id == id)
1666 1.1 jmcneill break;
1667 1.1 jmcneill if (which == z->s.img_n) return 0;
1668 1.1 jmcneill z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return e("bad DC huff","Corrupt JPEG");
1669 1.1 jmcneill z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return e("bad AC huff","Corrupt JPEG");
1670 1.1 jmcneill z->order[i] = which;
1671 1.1 jmcneill }
1672 1.1 jmcneill if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG");
1673 1.1 jmcneill get8(&z->s); // should be 63, but might be 0
1674 1.1 jmcneill if (get8(&z->s) != 0) return e("bad SOS","Corrupt JPEG");
1675 1.1 jmcneill
1676 1.1 jmcneill return 1;
1677 1.1 jmcneill }
1678 1.1 jmcneill
1679 1.1 jmcneill static int process_frame_header(jpeg *z, int scan)
1680 1.1 jmcneill {
1681 1.1 jmcneill stbi *s = &z->s;
1682 1.1 jmcneill int Lf,p,i,q, h_max=1,v_max=1,c;
1683 1.1 jmcneill Lf = get16(s); if (Lf < 11) return e("bad SOF len","Corrupt JPEG"); // JPEG
1684 1.1 jmcneill p = get8(s); if (p != 8) return e("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline
1685 1.1 jmcneill s->img_y = get16(s); if (s->img_y == 0) return e("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG
1686 1.1 jmcneill s->img_x = get16(s); if (s->img_x == 0) return e("0 width","Corrupt JPEG"); // JPEG requires
1687 1.1 jmcneill c = get8(s);
1688 1.1 jmcneill if (c != 3 && c != 1) return e("bad component count","Corrupt JPEG"); // JFIF requires
1689 1.1 jmcneill s->img_n = c;
1690 1.1 jmcneill for (i=0; i < c; ++i) {
1691 1.1 jmcneill z->img_comp[i].data = NULL;
1692 1.1 jmcneill z->img_comp[i].linebuf = NULL;
1693 1.1 jmcneill }
1694 1.1 jmcneill
1695 1.1 jmcneill if (Lf != 8+3*s->img_n) return e("bad SOF len","Corrupt JPEG");
1696 1.1 jmcneill
1697 1.1 jmcneill for (i=0; i < s->img_n; ++i) {
1698 1.1 jmcneill z->img_comp[i].id = get8(s);
1699 1.1 jmcneill if (z->img_comp[i].id != i+1) // JFIF requires
1700 1.1 jmcneill if (z->img_comp[i].id != i) // some version of jpegtran outputs non-JFIF-compliant files!
1701 1.1 jmcneill return e("bad component ID","Corrupt JPEG");
1702 1.1 jmcneill q = get8(s);
1703 1.1 jmcneill z->img_comp[i].h = (q >> 4); if (!z->img_comp[i].h || z->img_comp[i].h > 4) return e("bad H","Corrupt JPEG");
1704 1.1 jmcneill z->img_comp[i].v = q & 15; if (!z->img_comp[i].v || z->img_comp[i].v > 4) return e("bad V","Corrupt JPEG");
1705 1.1 jmcneill z->img_comp[i].tq = get8(s); if (z->img_comp[i].tq > 3) return e("bad TQ","Corrupt JPEG");
1706 1.1 jmcneill }
1707 1.1 jmcneill
1708 1.1 jmcneill if (scan != SCAN_load) return 1;
1709 1.1 jmcneill
1710 1.1 jmcneill if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode");
1711 1.1 jmcneill
1712 1.1 jmcneill for (i=0; i < s->img_n; ++i) {
1713 1.1 jmcneill if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;
1714 1.1 jmcneill if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;
1715 1.1 jmcneill }
1716 1.1 jmcneill
1717 1.1 jmcneill // compute interleaved mcu info
1718 1.1 jmcneill z->img_h_max = h_max;
1719 1.1 jmcneill z->img_v_max = v_max;
1720 1.1 jmcneill z->img_mcu_w = h_max * 8;
1721 1.1 jmcneill z->img_mcu_h = v_max * 8;
1722 1.1 jmcneill z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;
1723 1.1 jmcneill z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;
1724 1.1 jmcneill
1725 1.1 jmcneill for (i=0; i < s->img_n; ++i) {
1726 1.1 jmcneill // number of effective pixels (e.g. for non-interleaved MCU)
1727 1.1 jmcneill z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;
1728 1.1 jmcneill z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;
1729 1.1 jmcneill // to simplify generation, we'll allocate enough memory to decode
1730 1.1 jmcneill // the bogus oversized data from using interleaved MCUs and their
1731 1.1 jmcneill // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't
1732 1.1 jmcneill // discard the extra data until colorspace conversion
1733 1.1 jmcneill z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;
1734 1.1 jmcneill z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;
1735 1.1 jmcneill z->img_comp[i].raw_data = MALLOC(z->img_comp[i].w2 * z->img_comp[i].h2+15);
1736 1.1 jmcneill if (z->img_comp[i].raw_data == NULL) {
1737 1.1 jmcneill for(--i; i >= 0; --i) {
1738 1.1 jmcneill FREE(z->img_comp[i].raw_data);
1739 1.1 jmcneill z->img_comp[i].data = NULL;
1740 1.1 jmcneill }
1741 1.1 jmcneill return e("outofmem", "Out of memory");
1742 1.1 jmcneill }
1743 1.1 jmcneill // align blocks for installable-idct using mmx/sse
1744 1.1 jmcneill z->img_comp[i].data = (uint8*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);
1745 1.1 jmcneill z->img_comp[i].linebuf = NULL;
1746 1.1 jmcneill }
1747 1.1 jmcneill
1748 1.1 jmcneill return 1;
1749 1.1 jmcneill }
1750 1.1 jmcneill
1751 1.1 jmcneill // use comparisons since in some cases we handle more than one case (e.g. SOF)
1752 1.1 jmcneill #define DNL(x) ((x) == 0xdc)
1753 1.1 jmcneill #define SOI(x) ((x) == 0xd8)
1754 1.1 jmcneill #define EOI(x) ((x) == 0xd9)
1755 1.1 jmcneill #define SOF(x) ((x) == 0xc0 || (x) == 0xc1)
1756 1.1 jmcneill #define SOS(x) ((x) == 0xda)
1757 1.1 jmcneill
1758 1.1 jmcneill static int decode_jpeg_header(jpeg *z, int scan)
1759 1.1 jmcneill {
1760 1.1 jmcneill int m;
1761 1.1 jmcneill z->marker = MARKER_none; // initialize cached marker to empty
1762 1.1 jmcneill m = get_marker(z);
1763 1.1 jmcneill if (!SOI(m)) return e("no SOI","Corrupt JPEG");
1764 1.1 jmcneill if (scan == SCAN_type) return 1;
1765 1.1 jmcneill m = get_marker(z);
1766 1.1 jmcneill while (!SOF(m)) {
1767 1.1 jmcneill if (!process_marker(z,m)) return 0;
1768 1.1 jmcneill m = get_marker(z);
1769 1.1 jmcneill while (m == MARKER_none) {
1770 1.1 jmcneill // some files have extra padding after their blocks, so ok, we'll scan
1771 1.1 jmcneill if (at_eof(&z->s)) return e("no SOF", "Corrupt JPEG");
1772 1.1 jmcneill m = get_marker(z);
1773 1.1 jmcneill }
1774 1.1 jmcneill }
1775 1.1 jmcneill if (!process_frame_header(z, scan)) return 0;
1776 1.1 jmcneill return 1;
1777 1.1 jmcneill }
1778 1.1 jmcneill
1779 1.1 jmcneill static int decode_jpeg_image(jpeg *j)
1780 1.1 jmcneill {
1781 1.1 jmcneill int m;
1782 1.1 jmcneill j->restart_interval = 0;
1783 1.1 jmcneill if (!decode_jpeg_header(j, SCAN_load)) return 0;
1784 1.1 jmcneill m = get_marker(j);
1785 1.1 jmcneill while (!EOI(m)) {
1786 1.1 jmcneill if (SOS(m)) {
1787 1.1 jmcneill if (!process_scan_header(j)) return 0;
1788 1.1 jmcneill if (!parse_entropy_coded_data(j)) return 0;
1789 1.1 jmcneill if (j->marker == MARKER_none ) {
1790 1.1 jmcneill // handle 0s at the end of image data from IP Kamera 9060
1791 1.1 jmcneill while (!at_eof(&j->s)) {
1792 1.1 jmcneill int x = get8(&j->s);
1793 1.1 jmcneill if (x == 255) {
1794 1.1 jmcneill j->marker = get8u(&j->s);
1795 1.1 jmcneill break;
1796 1.1 jmcneill } else if (x != 0) {
1797 1.1 jmcneill return 0;
1798 1.1 jmcneill }
1799 1.1 jmcneill }
1800 1.1 jmcneill // if we reach eof without hitting a marker, get_marker() below will fail and we'll eventually return 0
1801 1.1 jmcneill }
1802 1.1 jmcneill } else {
1803 1.1 jmcneill if (!process_marker(j, m)) return 0;
1804 1.1 jmcneill }
1805 1.1 jmcneill m = get_marker(j);
1806 1.1 jmcneill }
1807 1.1 jmcneill return 1;
1808 1.1 jmcneill }
1809 1.1 jmcneill
1810 1.1 jmcneill // static jfif-centered resampling (across block boundaries)
1811 1.1 jmcneill
1812 1.1 jmcneill typedef uint8 *(*resample_row_func)(uint8 *out, uint8 *in0, uint8 *in1,
1813 1.1 jmcneill int w, int hs);
1814 1.1 jmcneill
1815 1.1 jmcneill #define div4(x) ((uint8) ((x) >> 2))
1816 1.1 jmcneill
1817 1.1 jmcneill static uint8 *resample_row_1(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1818 1.1 jmcneill {
1819 1.1 jmcneill STBI_NOTUSED(out);
1820 1.1 jmcneill STBI_NOTUSED(in_far);
1821 1.1 jmcneill STBI_NOTUSED(w);
1822 1.1 jmcneill STBI_NOTUSED(hs);
1823 1.1 jmcneill return in_near;
1824 1.1 jmcneill }
1825 1.1 jmcneill
1826 1.1 jmcneill static uint8* resample_row_v_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1827 1.1 jmcneill {
1828 1.1 jmcneill // need to generate two samples vertically for every one in input
1829 1.1 jmcneill int i;
1830 1.1 jmcneill STBI_NOTUSED(hs);
1831 1.1 jmcneill for (i=0; i < w; ++i)
1832 1.1 jmcneill out[i] = div4(3*in_near[i] + in_far[i] + 2);
1833 1.1 jmcneill return out;
1834 1.1 jmcneill }
1835 1.1 jmcneill
1836 1.1 jmcneill static uint8* resample_row_h_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1837 1.1 jmcneill {
1838 1.1 jmcneill // need to generate two samples horizontally for every one in input
1839 1.1 jmcneill int i;
1840 1.1 jmcneill uint8 *input = in_near;
1841 1.1 jmcneill
1842 1.1 jmcneill if (w == 1) {
1843 1.1 jmcneill // if only one sample, can't do any interpolation
1844 1.1 jmcneill out[0] = out[1] = input[0];
1845 1.1 jmcneill return out;
1846 1.1 jmcneill }
1847 1.1 jmcneill
1848 1.1 jmcneill out[0] = input[0];
1849 1.1 jmcneill out[1] = div4(input[0]*3 + input[1] + 2);
1850 1.1 jmcneill for (i=1; i < w-1; ++i) {
1851 1.1 jmcneill int n = 3*input[i]+2;
1852 1.1 jmcneill out[i*2+0] = div4(n+input[i-1]);
1853 1.1 jmcneill out[i*2+1] = div4(n+input[i+1]);
1854 1.1 jmcneill }
1855 1.1 jmcneill out[i*2+0] = div4(input[w-2]*3 + input[w-1] + 2);
1856 1.1 jmcneill out[i*2+1] = input[w-1];
1857 1.1 jmcneill
1858 1.1 jmcneill STBI_NOTUSED(in_far);
1859 1.1 jmcneill STBI_NOTUSED(hs);
1860 1.1 jmcneill
1861 1.1 jmcneill return out;
1862 1.1 jmcneill }
1863 1.1 jmcneill
1864 1.1 jmcneill #define div16(x) ((uint8) ((x) >> 4))
1865 1.1 jmcneill
1866 1.1 jmcneill static uint8 *resample_row_hv_2(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1867 1.1 jmcneill {
1868 1.1 jmcneill // need to generate 2x2 samples for every one in input
1869 1.1 jmcneill int i,t0,t1;
1870 1.1 jmcneill if (w == 1) {
1871 1.1 jmcneill out[0] = out[1] = div4(3*in_near[0] + in_far[0] + 2);
1872 1.1 jmcneill return out;
1873 1.1 jmcneill }
1874 1.1 jmcneill
1875 1.1 jmcneill t1 = 3*in_near[0] + in_far[0];
1876 1.1 jmcneill out[0] = div4(t1+2);
1877 1.1 jmcneill for (i=1; i < w; ++i) {
1878 1.1 jmcneill t0 = t1;
1879 1.1 jmcneill t1 = 3*in_near[i]+in_far[i];
1880 1.1 jmcneill out[i*2-1] = div16(3*t0 + t1 + 8);
1881 1.1 jmcneill out[i*2 ] = div16(3*t1 + t0 + 8);
1882 1.1 jmcneill }
1883 1.1 jmcneill out[w*2-1] = div4(t1+2);
1884 1.1 jmcneill
1885 1.1 jmcneill STBI_NOTUSED(hs);
1886 1.1 jmcneill
1887 1.1 jmcneill return out;
1888 1.1 jmcneill }
1889 1.1 jmcneill
1890 1.1 jmcneill static uint8 *resample_row_generic(uint8 *out, uint8 *in_near, uint8 *in_far, int w, int hs)
1891 1.1 jmcneill {
1892 1.1 jmcneill // resample with nearest-neighbor
1893 1.1 jmcneill int i,j;
1894 1.1 jmcneill in_far = in_far;
1895 1.1 jmcneill for (i=0; i < w; ++i)
1896 1.1 jmcneill for (j=0; j < hs; ++j)
1897 1.1 jmcneill out[i*hs+j] = in_near[i];
1898 1.1 jmcneill return out;
1899 1.1 jmcneill }
1900 1.1 jmcneill
1901 1.1 jmcneill #define float2fixed(x) ((int) ((x) * 65536 + 0.5))
1902 1.1 jmcneill
1903 1.1 jmcneill // 0.38 seconds on 3*anemones.jpg (0.25 with processor = Pro)
1904 1.1 jmcneill // VC6 without processor=Pro is generating multiple LEAs per multiply!
1905 1.1 jmcneill static void YCbCr_to_RGB_row(uint8 *out, const uint8 *y, const uint8 *pcb, const uint8 *pcr, int count, int step)
1906 1.1 jmcneill {
1907 1.1 jmcneill int i;
1908 1.1 jmcneill for (i=0; i < count; ++i) {
1909 1.1 jmcneill int y_fixed = (y[i] << 16) + 32768; // rounding
1910 1.1 jmcneill int r,g,b;
1911 1.1 jmcneill int cr = pcr[i] - 128;
1912 1.1 jmcneill int cb = pcb[i] - 128;
1913 1.1 jmcneill r = y_fixed + cr*float2fixed(1.40200f);
1914 1.1 jmcneill g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f);
1915 1.1 jmcneill b = y_fixed + cb*float2fixed(1.77200f);
1916 1.1 jmcneill r >>= 16;
1917 1.1 jmcneill g >>= 16;
1918 1.1 jmcneill b >>= 16;
1919 1.1 jmcneill if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }
1920 1.1 jmcneill if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }
1921 1.1 jmcneill if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }
1922 1.1 jmcneill out[0] = (uint8)r;
1923 1.1 jmcneill out[1] = (uint8)g;
1924 1.1 jmcneill out[2] = (uint8)b;
1925 1.1 jmcneill out[3] = 255;
1926 1.1 jmcneill out += step;
1927 1.1 jmcneill }
1928 1.1 jmcneill }
1929 1.1 jmcneill
1930 1.1 jmcneill #ifdef STBI_SIMD
1931 1.1 jmcneill static stbi_YCbCr_to_RGB_run stbi_YCbCr_installed = YCbCr_to_RGB_row;
1932 1.1 jmcneill
1933 1.1 jmcneill void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func)
1934 1.1 jmcneill {
1935 1.1 jmcneill stbi_YCbCr_installed = func;
1936 1.1 jmcneill }
1937 1.1 jmcneill #endif
1938 1.1 jmcneill
1939 1.1 jmcneill
1940 1.1 jmcneill // clean up the temporary component buffers
1941 1.1 jmcneill static void cleanup_jpeg(jpeg *j)
1942 1.1 jmcneill {
1943 1.1 jmcneill int i;
1944 1.1 jmcneill for (i=0; i < j->s.img_n; ++i) {
1945 1.1 jmcneill if (j->img_comp[i].data) {
1946 1.1 jmcneill FREE(j->img_comp[i].raw_data);
1947 1.1 jmcneill j->img_comp[i].data = NULL;
1948 1.1 jmcneill }
1949 1.1 jmcneill if (j->img_comp[i].linebuf) {
1950 1.1 jmcneill FREE(j->img_comp[i].linebuf);
1951 1.1 jmcneill j->img_comp[i].linebuf = NULL;
1952 1.1 jmcneill }
1953 1.1 jmcneill }
1954 1.1 jmcneill }
1955 1.1 jmcneill
1956 1.1 jmcneill typedef struct
1957 1.1 jmcneill {
1958 1.1 jmcneill resample_row_func resample;
1959 1.1 jmcneill uint8 *line0,*line1;
1960 1.1 jmcneill int hs,vs; // expansion factor in each axis
1961 1.1 jmcneill int w_lores; // horizontal pixels pre-expansion
1962 1.1 jmcneill int ystep; // how far through vertical expansion we are
1963 1.1 jmcneill int ypos; // which pre-expansion row we're on
1964 1.1 jmcneill } stbi_resample;
1965 1.1 jmcneill
1966 1.1 jmcneill static uint8 *load_jpeg_image(jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)
1967 1.1 jmcneill {
1968 1.1 jmcneill int n, decode_n;
1969 1.1 jmcneill // validate req_comp
1970 1.1 jmcneill if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error");
1971 1.1 jmcneill z->s.img_n = 0;
1972 1.1 jmcneill
1973 1.1 jmcneill // load a jpeg image from whichever source
1974 1.1 jmcneill if (!decode_jpeg_image(z)) { cleanup_jpeg(z); return NULL; }
1975 1.1 jmcneill
1976 1.1 jmcneill // determine actual number of components to generate
1977 1.1 jmcneill n = req_comp ? req_comp : z->s.img_n;
1978 1.1 jmcneill
1979 1.1 jmcneill if (z->s.img_n == 3 && n < 3)
1980 1.1 jmcneill decode_n = 1;
1981 1.1 jmcneill else
1982 1.1 jmcneill decode_n = z->s.img_n;
1983 1.1 jmcneill
1984 1.1 jmcneill // resample and color-convert
1985 1.1 jmcneill {
1986 1.1 jmcneill int k;
1987 1.1 jmcneill uint i,j;
1988 1.1 jmcneill uint8 *output;
1989 1.1 jmcneill uint8 *coutput[4];
1990 1.1 jmcneill
1991 1.1 jmcneill stbi_resample res_comp[4];
1992 1.1 jmcneill
1993 1.1 jmcneill for (k=0; k < decode_n; ++k) {
1994 1.1 jmcneill stbi_resample *r = &res_comp[k];
1995 1.1 jmcneill
1996 1.1 jmcneill // allocate line buffer big enough for upsampling off the edges
1997 1.1 jmcneill // with upsample factor of 4
1998 1.7 christos z->img_comp[k].linebuf = MALLOC(z->s.img_x + 3);
1999 1.1 jmcneill if (!z->img_comp[k].linebuf) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); }
2000 1.1 jmcneill
2001 1.1 jmcneill r->hs = z->img_h_max / z->img_comp[k].h;
2002 1.1 jmcneill r->vs = z->img_v_max / z->img_comp[k].v;
2003 1.1 jmcneill r->ystep = r->vs >> 1;
2004 1.1 jmcneill r->w_lores = (z->s.img_x + r->hs-1) / r->hs;
2005 1.1 jmcneill r->ypos = 0;
2006 1.1 jmcneill r->line0 = r->line1 = z->img_comp[k].data;
2007 1.1 jmcneill
2008 1.1 jmcneill if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;
2009 1.1 jmcneill else if (r->hs == 1 && r->vs == 2) r->resample = resample_row_v_2;
2010 1.1 jmcneill else if (r->hs == 2 && r->vs == 1) r->resample = resample_row_h_2;
2011 1.1 jmcneill else if (r->hs == 2 && r->vs == 2) r->resample = resample_row_hv_2;
2012 1.1 jmcneill else r->resample = resample_row_generic;
2013 1.1 jmcneill }
2014 1.1 jmcneill
2015 1.1 jmcneill // can't error after this so, this is safe
2016 1.7 christos output = MALLOC(n * z->s.img_x * z->s.img_y + 1);
2017 1.1 jmcneill if (!output) { cleanup_jpeg(z); return epuc("outofmem", "Out of memory"); }
2018 1.1 jmcneill
2019 1.1 jmcneill // now go ahead and resample
2020 1.1 jmcneill for (j=0; j < z->s.img_y; ++j) {
2021 1.1 jmcneill uint8 *out = output + n * z->s.img_x * j;
2022 1.1 jmcneill for (k=0; k < decode_n; ++k) {
2023 1.1 jmcneill stbi_resample *r = &res_comp[k];
2024 1.1 jmcneill int y_bot = r->ystep >= (r->vs >> 1);
2025 1.1 jmcneill coutput[k] = r->resample(z->img_comp[k].linebuf,
2026 1.1 jmcneill y_bot ? r->line1 : r->line0,
2027 1.1 jmcneill y_bot ? r->line0 : r->line1,
2028 1.1 jmcneill r->w_lores, r->hs);
2029 1.1 jmcneill if (++r->ystep >= r->vs) {
2030 1.1 jmcneill r->ystep = 0;
2031 1.1 jmcneill r->line0 = r->line1;
2032 1.1 jmcneill if (++r->ypos < z->img_comp[k].y)
2033 1.1 jmcneill r->line1 += z->img_comp[k].w2;
2034 1.1 jmcneill }
2035 1.1 jmcneill }
2036 1.1 jmcneill if (n >= 3) {
2037 1.1 jmcneill uint8 *y = coutput[0];
2038 1.1 jmcneill if (z->s.img_n == 3) {
2039 1.1 jmcneill #ifdef STBI_SIMD
2040 1.1 jmcneill stbi_YCbCr_installed(out, y, coutput[1], coutput[2], z->s.img_x, n);
2041 1.1 jmcneill #else
2042 1.1 jmcneill YCbCr_to_RGB_row(out, y, coutput[1], coutput[2], z->s.img_x, n);
2043 1.1 jmcneill #endif
2044 1.1 jmcneill } else
2045 1.1 jmcneill for (i=0; i < z->s.img_x; ++i) {
2046 1.1 jmcneill out[0] = out[1] = out[2] = y[i];
2047 1.1 jmcneill out[3] = 255; // not used if n==3
2048 1.1 jmcneill out += n;
2049 1.1 jmcneill }
2050 1.1 jmcneill } else {
2051 1.1 jmcneill uint8 *y = coutput[0];
2052 1.1 jmcneill if (n == 1)
2053 1.1 jmcneill for (i=0; i < z->s.img_x; ++i) out[i] = y[i];
2054 1.1 jmcneill else
2055 1.1 jmcneill for (i=0; i < z->s.img_x; ++i) *out++ = y[i], *out++ = 255;
2056 1.1 jmcneill }
2057 1.1 jmcneill }
2058 1.1 jmcneill cleanup_jpeg(z);
2059 1.1 jmcneill *out_x = z->s.img_x;
2060 1.1 jmcneill *out_y = z->s.img_y;
2061 1.1 jmcneill if (comp) *comp = z->s.img_n; // report original components, not output
2062 1.1 jmcneill return output;
2063 1.1 jmcneill }
2064 1.1 jmcneill }
2065 1.1 jmcneill
2066 1.1 jmcneill #ifndef STBI_NO_STDIO
2067 1.1 jmcneill unsigned char *stbi_jpeg_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
2068 1.1 jmcneill {
2069 1.1 jmcneill jpeg j;
2070 1.1 jmcneill start_file(&j.s, f);
2071 1.1 jmcneill return load_jpeg_image(&j, x,y,comp,req_comp);
2072 1.1 jmcneill }
2073 1.1 jmcneill
2074 1.1 jmcneill unsigned char *stbi_jpeg_load(char const *filename, int *x, int *y, int *comp, int req_comp)
2075 1.1 jmcneill {
2076 1.1 jmcneill unsigned char *data;
2077 1.1 jmcneill FILE *f = fopen(filename, "rb");
2078 1.1 jmcneill if (!f) return NULL;
2079 1.1 jmcneill data = stbi_jpeg_load_from_file(f,x,y,comp,req_comp);
2080 1.1 jmcneill fclose(f);
2081 1.1 jmcneill return data;
2082 1.1 jmcneill }
2083 1.1 jmcneill #endif
2084 1.1 jmcneill
2085 1.1 jmcneill unsigned char *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
2086 1.1 jmcneill {
2087 1.1 jmcneill #ifdef STBI_SMALL_STACK
2088 1.1 jmcneill unsigned char *result;
2089 1.7 christos jpeg *j = MALLOC(sizeof(*j));
2090 1.1 jmcneill start_mem(&j->s, buffer, len);
2091 1.1 jmcneill result = load_jpeg_image(j,x,y,comp,req_comp);
2092 1.1 jmcneill FREE(j);
2093 1.1 jmcneill return result;
2094 1.1 jmcneill #else
2095 1.1 jmcneill jpeg j;
2096 1.1 jmcneill start_mem(&j.s, buffer,len);
2097 1.1 jmcneill return load_jpeg_image(&j, x,y,comp,req_comp);
2098 1.1 jmcneill #endif
2099 1.1 jmcneill }
2100 1.1 jmcneill
2101 1.1 jmcneill static int stbi_jpeg_info_raw(jpeg *j, int *x, int *y, int *comp)
2102 1.1 jmcneill {
2103 1.1 jmcneill if (!decode_jpeg_header(j, SCAN_header))
2104 1.1 jmcneill return 0;
2105 1.1 jmcneill if (x) *x = j->s.img_x;
2106 1.1 jmcneill if (y) *y = j->s.img_y;
2107 1.1 jmcneill if (comp) *comp = j->s.img_n;
2108 1.1 jmcneill return 1;
2109 1.1 jmcneill }
2110 1.1 jmcneill
2111 1.1 jmcneill #ifndef STBI_NO_STDIO
2112 1.1 jmcneill int stbi_jpeg_test_file(FILE *f)
2113 1.1 jmcneill {
2114 1.1 jmcneill int n,r;
2115 1.1 jmcneill jpeg j;
2116 1.1 jmcneill n = ftell(f);
2117 1.1 jmcneill start_file(&j.s, f);
2118 1.1 jmcneill r = decode_jpeg_header(&j, SCAN_type);
2119 1.1 jmcneill fseek(f,n,SEEK_SET);
2120 1.1 jmcneill return r;
2121 1.1 jmcneill }
2122 1.1 jmcneill
2123 1.1 jmcneill int stbi_jpeg_info_from_file(FILE *f, int *x, int *y, int *comp)
2124 1.1 jmcneill {
2125 1.1 jmcneill jpeg j;
2126 1.1 jmcneill long n = ftell(f);
2127 1.1 jmcneill int res;
2128 1.1 jmcneill start_file(&j.s, f);
2129 1.1 jmcneill res = stbi_jpeg_info_raw(&j, x, y, comp);
2130 1.1 jmcneill fseek(f, n, SEEK_SET);
2131 1.1 jmcneill return res;
2132 1.1 jmcneill }
2133 1.1 jmcneill
2134 1.1 jmcneill int stbi_jpeg_info(char const *filename, int *x, int *y, int *comp)
2135 1.1 jmcneill {
2136 1.1 jmcneill FILE *f = fopen(filename, "rb");
2137 1.1 jmcneill int result;
2138 1.1 jmcneill if (!f) return e("can't fopen", "Unable to open file");
2139 1.1 jmcneill result = stbi_jpeg_info_from_file(f, x, y, comp);
2140 1.1 jmcneill fclose(f);
2141 1.1 jmcneill return result;
2142 1.1 jmcneill }
2143 1.1 jmcneill #endif
2144 1.1 jmcneill
2145 1.1 jmcneill int stbi_jpeg_test_memory(stbi_uc const *buffer, int len)
2146 1.1 jmcneill {
2147 1.1 jmcneill jpeg j;
2148 1.1 jmcneill start_mem(&j.s, buffer,len);
2149 1.1 jmcneill return decode_jpeg_header(&j, SCAN_type);
2150 1.1 jmcneill }
2151 1.1 jmcneill
2152 1.1 jmcneill int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
2153 1.1 jmcneill {
2154 1.1 jmcneill jpeg j;
2155 1.1 jmcneill start_mem(&j.s, buffer, len);
2156 1.1 jmcneill return stbi_jpeg_info_raw(&j, x, y, comp);
2157 1.1 jmcneill }
2158 1.1 jmcneill
2159 1.1 jmcneill #ifndef STBI_NO_STDIO
2160 1.1 jmcneill extern int stbi_jpeg_info (char const *filename, int *x, int *y, int *comp);
2161 1.1 jmcneill extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp);
2162 1.1 jmcneill #endif
2163 1.1 jmcneill extern int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
2164 1.1 jmcneill
2165 1.1 jmcneill // public domain zlib decode v0.2 Sean Barrett 2006-11-18
2166 1.1 jmcneill // simple implementation
2167 1.1 jmcneill // - all input must be provided in an upfront buffer
2168 1.1 jmcneill // - all output is written to a single output buffer (can malloc/realloc)
2169 1.1 jmcneill // performance
2170 1.1 jmcneill // - fast huffman
2171 1.1 jmcneill
2172 1.1 jmcneill // fast-way is faster to check than jpeg huffman, but slow way is slower
2173 1.1 jmcneill #define ZFAST_BITS 9 // accelerate all cases in default tables
2174 1.1 jmcneill #define ZFAST_MASK ((1 << ZFAST_BITS) - 1)
2175 1.1 jmcneill
2176 1.1 jmcneill // zlib-style huffman encoding
2177 1.1 jmcneill // (jpegs packs from left, zlib from right, so can't share code)
2178 1.1 jmcneill typedef struct
2179 1.1 jmcneill {
2180 1.1 jmcneill uint16 fast[1 << ZFAST_BITS];
2181 1.1 jmcneill uint16 firstcode[16];
2182 1.1 jmcneill int maxcode[17];
2183 1.1 jmcneill uint16 firstsymbol[16];
2184 1.1 jmcneill uint8 size[288];
2185 1.1 jmcneill uint16 value[288];
2186 1.1 jmcneill } zhuffman;
2187 1.1 jmcneill
2188 1.1 jmcneill __forceinline static int bitreverse16(int n)
2189 1.1 jmcneill {
2190 1.1 jmcneill n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);
2191 1.1 jmcneill n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);
2192 1.1 jmcneill n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);
2193 1.1 jmcneill n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);
2194 1.1 jmcneill return n;
2195 1.1 jmcneill }
2196 1.1 jmcneill
2197 1.1 jmcneill __forceinline static int bit_reverse(int v, int bits)
2198 1.1 jmcneill {
2199 1.1 jmcneill assert(bits <= 16);
2200 1.1 jmcneill // to bit reverse n bits, reverse 16 and shift
2201 1.1 jmcneill // e.g. 11 bits, bit reverse and shift away 5
2202 1.1 jmcneill return bitreverse16(v) >> (16-bits);
2203 1.1 jmcneill }
2204 1.1 jmcneill
2205 1.1 jmcneill static int zbuild_huffman(zhuffman *z, uint8 *sizelist, int num)
2206 1.1 jmcneill {
2207 1.1 jmcneill int i,k=0;
2208 1.1 jmcneill int code, next_code[16], sizes[17];
2209 1.1 jmcneill
2210 1.1 jmcneill // DEFLATE spec for generating codes
2211 1.1 jmcneill memset(sizes, 0, sizeof(sizes));
2212 1.1 jmcneill memset(z->fast, 255, sizeof(z->fast));
2213 1.1 jmcneill for (i=0; i < num; ++i)
2214 1.1 jmcneill ++sizes[sizelist[i]];
2215 1.1 jmcneill sizes[0] = 0;
2216 1.1 jmcneill for (i=1; i < 16; ++i)
2217 1.1 jmcneill assert(sizes[i] <= (1 << i));
2218 1.1 jmcneill code = 0;
2219 1.1 jmcneill for (i=1; i < 16; ++i) {
2220 1.1 jmcneill next_code[i] = code;
2221 1.1 jmcneill z->firstcode[i] = (uint16) code;
2222 1.1 jmcneill z->firstsymbol[i] = (uint16) k;
2223 1.1 jmcneill code = (code + sizes[i]);
2224 1.1 jmcneill if (sizes[i])
2225 1.1 jmcneill if (code-1 >= (1 << i)) return e("bad codelengths","Corrupt JPEG");
2226 1.1 jmcneill z->maxcode[i] = code << (16-i); // preshift for inner loop
2227 1.1 jmcneill code <<= 1;
2228 1.1 jmcneill k += sizes[i];
2229 1.1 jmcneill }
2230 1.1 jmcneill z->maxcode[16] = 0x10000; // sentinel
2231 1.1 jmcneill for (i=0; i < num; ++i) {
2232 1.1 jmcneill int s = sizelist[i];
2233 1.1 jmcneill if (s) {
2234 1.1 jmcneill int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];
2235 1.1 jmcneill z->size[c] = (uint8)s;
2236 1.1 jmcneill z->value[c] = (uint16)i;
2237 1.1 jmcneill if (s <= ZFAST_BITS) {
2238 1.1 jmcneill int m = bit_reverse(next_code[s],s);
2239 1.1 jmcneill while (m < (1 << ZFAST_BITS)) {
2240 1.1 jmcneill z->fast[m] = (uint16) c;
2241 1.1 jmcneill m += (1 << s);
2242 1.1 jmcneill }
2243 1.1 jmcneill }
2244 1.1 jmcneill ++next_code[s];
2245 1.1 jmcneill }
2246 1.1 jmcneill }
2247 1.1 jmcneill return 1;
2248 1.1 jmcneill }
2249 1.1 jmcneill
2250 1.1 jmcneill // zlib-from-memory implementation for PNG reading
2251 1.1 jmcneill // because PNG allows splitting the zlib stream arbitrarily,
2252 1.1 jmcneill // and it's annoying structurally to have PNG call ZLIB call PNG,
2253 1.1 jmcneill // we require PNG read all the IDATs and combine them into a single
2254 1.1 jmcneill // memory buffer
2255 1.1 jmcneill
2256 1.1 jmcneill typedef struct
2257 1.1 jmcneill {
2258 1.1 jmcneill uint8 const *zbuffer, *zbuffer_end;
2259 1.1 jmcneill int num_bits;
2260 1.1 jmcneill uint32 code_buffer;
2261 1.1 jmcneill
2262 1.1 jmcneill char *zout;
2263 1.1 jmcneill char *zout_start;
2264 1.1 jmcneill char *zout_end;
2265 1.1 jmcneill int z_expandable;
2266 1.1 jmcneill
2267 1.1 jmcneill zhuffman z_length, z_distance;
2268 1.1 jmcneill } zbuf;
2269 1.1 jmcneill
2270 1.1 jmcneill __forceinline static int zget8(zbuf *z)
2271 1.1 jmcneill {
2272 1.1 jmcneill if (z->zbuffer >= z->zbuffer_end) return 0;
2273 1.1 jmcneill return *z->zbuffer++;
2274 1.1 jmcneill }
2275 1.1 jmcneill
2276 1.1 jmcneill static void fill_bits(zbuf *z)
2277 1.1 jmcneill {
2278 1.1 jmcneill do {
2279 1.1 jmcneill assert(z->code_buffer < (1U << z->num_bits));
2280 1.1 jmcneill z->code_buffer |= zget8(z) << z->num_bits;
2281 1.1 jmcneill z->num_bits += 8;
2282 1.1 jmcneill } while (z->num_bits <= 24);
2283 1.1 jmcneill }
2284 1.1 jmcneill
2285 1.1 jmcneill __forceinline static unsigned int zreceive(zbuf *z, int n)
2286 1.1 jmcneill {
2287 1.1 jmcneill unsigned int k;
2288 1.1 jmcneill if (z->num_bits < n) fill_bits(z);
2289 1.1 jmcneill k = z->code_buffer & ((1 << n) - 1);
2290 1.1 jmcneill z->code_buffer >>= n;
2291 1.1 jmcneill z->num_bits -= n;
2292 1.1 jmcneill return k;
2293 1.1 jmcneill }
2294 1.1 jmcneill
2295 1.1 jmcneill __forceinline static int zhuffman_decode(zbuf *a, zhuffman *z)
2296 1.1 jmcneill {
2297 1.1 jmcneill int b,s,k;
2298 1.1 jmcneill if (a->num_bits < 16) fill_bits(a);
2299 1.1 jmcneill b = z->fast[a->code_buffer & ZFAST_MASK];
2300 1.1 jmcneill if (b < 0xffff) {
2301 1.1 jmcneill s = z->size[b];
2302 1.1 jmcneill a->code_buffer >>= s;
2303 1.1 jmcneill a->num_bits -= s;
2304 1.1 jmcneill return z->value[b];
2305 1.1 jmcneill }
2306 1.1 jmcneill
2307 1.1 jmcneill // not resolved by fast table, so compute it the slow way
2308 1.1 jmcneill // use jpeg approach, which requires MSbits at top
2309 1.1 jmcneill k = bit_reverse(a->code_buffer, 16);
2310 1.1 jmcneill for (s=ZFAST_BITS+1; ; ++s)
2311 1.1 jmcneill if (k < z->maxcode[s])
2312 1.1 jmcneill break;
2313 1.1 jmcneill if (s == 16) return -1; // invalid code!
2314 1.1 jmcneill // code size is s, so:
2315 1.1 jmcneill b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];
2316 1.1 jmcneill assert(z->size[b] == s);
2317 1.1 jmcneill a->code_buffer >>= s;
2318 1.1 jmcneill a->num_bits -= s;
2319 1.1 jmcneill return z->value[b];
2320 1.1 jmcneill }
2321 1.1 jmcneill
2322 1.1 jmcneill static int expand(zbuf *z, int n) // need to make room for n bytes
2323 1.1 jmcneill {
2324 1.1 jmcneill char *q;
2325 1.1 jmcneill int cur, limit;
2326 1.1 jmcneill if (!z->z_expandable) return e("output buffer limit","Corrupt PNG");
2327 1.1 jmcneill cur = (int) (z->zout - z->zout_start);
2328 1.1 jmcneill limit = (int) (z->zout_end - z->zout_start);
2329 1.1 jmcneill while (cur + n > limit)
2330 1.1 jmcneill limit *= 2;
2331 1.1 jmcneill q = (char *) REALLOC(z->zout_start, limit);
2332 1.1 jmcneill if (q == NULL) return e("outofmem", "Out of memory");
2333 1.1 jmcneill z->zout_start = q;
2334 1.1 jmcneill z->zout = q + cur;
2335 1.1 jmcneill z->zout_end = q + limit;
2336 1.1 jmcneill return 1;
2337 1.1 jmcneill }
2338 1.1 jmcneill
2339 1.1 jmcneill static int length_base[31] = {
2340 1.1 jmcneill 3,4,5,6,7,8,9,10,11,13,
2341 1.1 jmcneill 15,17,19,23,27,31,35,43,51,59,
2342 1.1 jmcneill 67,83,99,115,131,163,195,227,258,0,0 };
2343 1.1 jmcneill
2344 1.1 jmcneill static int length_extra[31]=
2345 1.1 jmcneill { 0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0,0,0 };
2346 1.1 jmcneill
2347 1.1 jmcneill static int dist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,
2348 1.1 jmcneill 257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};
2349 1.1 jmcneill
2350 1.1 jmcneill static int dist_extra[32] =
2351 1.1 jmcneill { 0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
2352 1.1 jmcneill
2353 1.1 jmcneill static int parse_huffman_block(zbuf *a)
2354 1.1 jmcneill {
2355 1.1 jmcneill for(;;) {
2356 1.1 jmcneill int z = zhuffman_decode(a, &a->z_length);
2357 1.1 jmcneill if (z < 256) {
2358 1.1 jmcneill if (z < 0) return e("bad huffman code","Corrupt PNG"); // error in huffman codes
2359 1.1 jmcneill if (a->zout >= a->zout_end) if (!expand(a, 1)) return 0;
2360 1.1 jmcneill *a->zout++ = (char) z;
2361 1.1 jmcneill } else {
2362 1.1 jmcneill uint8 *p;
2363 1.1 jmcneill int len,dist;
2364 1.1 jmcneill if (z == 256) return 1;
2365 1.1 jmcneill z -= 257;
2366 1.1 jmcneill len = length_base[z];
2367 1.1 jmcneill if (length_extra[z]) len += zreceive(a, length_extra[z]);
2368 1.1 jmcneill z = zhuffman_decode(a, &a->z_distance);
2369 1.1 jmcneill if (z < 0) return e("bad huffman code","Corrupt PNG");
2370 1.1 jmcneill dist = dist_base[z];
2371 1.1 jmcneill if (dist_extra[z]) dist += zreceive(a, dist_extra[z]);
2372 1.1 jmcneill if (a->zout - a->zout_start < dist) return e("bad dist","Corrupt PNG");
2373 1.1 jmcneill if (a->zout + len > a->zout_end) if (!expand(a, len)) return 0;
2374 1.1 jmcneill p = (uint8 *) (a->zout - dist);
2375 1.1 jmcneill while (len--)
2376 1.1 jmcneill *a->zout++ = *p++;
2377 1.1 jmcneill }
2378 1.1 jmcneill }
2379 1.1 jmcneill }
2380 1.1 jmcneill
2381 1.1 jmcneill static int compute_huffman_codes(zbuf *a)
2382 1.1 jmcneill {
2383 1.1 jmcneill static uint8 length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 };
2384 1.1 jmcneill zhuffman z_codelength;
2385 1.1 jmcneill uint8 lencodes[286+32+137];//padding for maximum single op
2386 1.1 jmcneill uint8 codelength_sizes[19];
2387 1.1 jmcneill int i,n;
2388 1.1 jmcneill
2389 1.1 jmcneill int hlit = zreceive(a,5) + 257;
2390 1.1 jmcneill int hdist = zreceive(a,5) + 1;
2391 1.1 jmcneill int hclen = zreceive(a,4) + 4;
2392 1.1 jmcneill
2393 1.1 jmcneill memset(codelength_sizes, 0, sizeof(codelength_sizes));
2394 1.1 jmcneill for (i=0; i < hclen; ++i) {
2395 1.1 jmcneill int s = zreceive(a,3);
2396 1.1 jmcneill codelength_sizes[length_dezigzag[i]] = (uint8) s;
2397 1.1 jmcneill }
2398 1.1 jmcneill if (!zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;
2399 1.1 jmcneill
2400 1.1 jmcneill n = 0;
2401 1.1 jmcneill while (n < hlit + hdist) {
2402 1.1 jmcneill int c = zhuffman_decode(a, &z_codelength);
2403 1.1 jmcneill assert(c >= 0 && c < 19);
2404 1.1 jmcneill if (c < 16)
2405 1.1 jmcneill lencodes[n++] = (uint8) c;
2406 1.1 jmcneill else if (c == 16) {
2407 1.1 jmcneill c = zreceive(a,2)+3;
2408 1.1 jmcneill memset(lencodes+n, lencodes[n-1], c);
2409 1.1 jmcneill n += c;
2410 1.1 jmcneill } else if (c == 17) {
2411 1.1 jmcneill c = zreceive(a,3)+3;
2412 1.1 jmcneill memset(lencodes+n, 0, c);
2413 1.1 jmcneill n += c;
2414 1.1 jmcneill } else {
2415 1.1 jmcneill assert(c == 18);
2416 1.1 jmcneill c = zreceive(a,7)+11;
2417 1.1 jmcneill memset(lencodes+n, 0, c);
2418 1.1 jmcneill n += c;
2419 1.1 jmcneill }
2420 1.1 jmcneill }
2421 1.1 jmcneill if (n != hlit+hdist) return e("bad codelengths","Corrupt PNG");
2422 1.1 jmcneill if (!zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;
2423 1.1 jmcneill if (!zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;
2424 1.1 jmcneill return 1;
2425 1.1 jmcneill }
2426 1.1 jmcneill
2427 1.1 jmcneill static int parse_uncompressed_block(zbuf *a)
2428 1.1 jmcneill {
2429 1.1 jmcneill uint8 header[4];
2430 1.1 jmcneill int len,nlen,k;
2431 1.1 jmcneill if (a->num_bits & 7)
2432 1.1 jmcneill zreceive(a, a->num_bits & 7); // discard
2433 1.1 jmcneill // drain the bit-packed data into header
2434 1.1 jmcneill k = 0;
2435 1.1 jmcneill while (a->num_bits > 0) {
2436 1.1 jmcneill header[k++] = (uint8) (a->code_buffer & 255); // wtf this warns?
2437 1.1 jmcneill a->code_buffer >>= 8;
2438 1.1 jmcneill a->num_bits -= 8;
2439 1.1 jmcneill }
2440 1.1 jmcneill assert(a->num_bits == 0);
2441 1.1 jmcneill // now fill header the normal way
2442 1.1 jmcneill while (k < 4)
2443 1.1 jmcneill header[k++] = (uint8) zget8(a);
2444 1.1 jmcneill len = header[1] * 256 + header[0];
2445 1.1 jmcneill nlen = header[3] * 256 + header[2];
2446 1.1 jmcneill if (nlen != (len ^ 0xffff)) return e("zlib corrupt","Corrupt PNG");
2447 1.1 jmcneill if (a->zbuffer + len > a->zbuffer_end) return e("read past buffer","Corrupt PNG");
2448 1.1 jmcneill if (a->zout + len > a->zout_end)
2449 1.1 jmcneill if (!expand(a, len)) return 0;
2450 1.1 jmcneill memcpy(a->zout, a->zbuffer, len);
2451 1.1 jmcneill a->zbuffer += len;
2452 1.1 jmcneill a->zout += len;
2453 1.1 jmcneill return 1;
2454 1.1 jmcneill }
2455 1.1 jmcneill
2456 1.1 jmcneill static int parse_zlib_header(zbuf *a)
2457 1.1 jmcneill {
2458 1.1 jmcneill int cmf = zget8(a);
2459 1.1 jmcneill int cm = cmf & 15;
2460 1.1 jmcneill /* int cinfo = cmf >> 4; */
2461 1.1 jmcneill int flg = zget8(a);
2462 1.1 jmcneill if ((cmf*256+flg) % 31 != 0) return e("bad zlib header","Corrupt PNG"); // zlib spec
2463 1.1 jmcneill if (flg & 32) return e("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png
2464 1.1 jmcneill if (cm != 8) return e("bad compression","Corrupt PNG"); // DEFLATE required for png
2465 1.1 jmcneill // window = 1 << (8 + cinfo)... but who cares, we fully buffer output
2466 1.1 jmcneill return 1;
2467 1.1 jmcneill }
2468 1.1 jmcneill
2469 1.1 jmcneill // @TODO: should statically initialize these for optimal thread safety
2470 1.1 jmcneill static uint8 default_length[288], default_distance[32];
2471 1.1 jmcneill static void init_defaults(void)
2472 1.1 jmcneill {
2473 1.1 jmcneill int i; // use <= to match clearly with spec
2474 1.1 jmcneill for (i=0; i <= 143; ++i) default_length[i] = 8;
2475 1.1 jmcneill for ( ; i <= 255; ++i) default_length[i] = 9;
2476 1.1 jmcneill for ( ; i <= 279; ++i) default_length[i] = 7;
2477 1.1 jmcneill for ( ; i <= 287; ++i) default_length[i] = 8;
2478 1.1 jmcneill
2479 1.1 jmcneill for (i=0; i <= 31; ++i) default_distance[i] = 5;
2480 1.1 jmcneill }
2481 1.1 jmcneill
2482 1.1 jmcneill int stbi_png_partial; // a quick hack to only allow decoding some of a PNG... I should implement real streaming support instead
2483 1.1 jmcneill static int parse_zlib(zbuf *a, int parse_header)
2484 1.1 jmcneill {
2485 1.1 jmcneill int final, type;
2486 1.1 jmcneill if (parse_header)
2487 1.1 jmcneill if (!parse_zlib_header(a)) return 0;
2488 1.1 jmcneill a->num_bits = 0;
2489 1.1 jmcneill a->code_buffer = 0;
2490 1.1 jmcneill do {
2491 1.1 jmcneill final = zreceive(a,1);
2492 1.1 jmcneill type = zreceive(a,2);
2493 1.1 jmcneill if (type == 0) {
2494 1.1 jmcneill if (!parse_uncompressed_block(a)) return 0;
2495 1.1 jmcneill } else if (type == 3) {
2496 1.1 jmcneill return 0;
2497 1.1 jmcneill } else {
2498 1.1 jmcneill if (type == 1) {
2499 1.1 jmcneill // use fixed code lengths
2500 1.1 jmcneill if (!default_distance[31]) init_defaults();
2501 1.1 jmcneill if (!zbuild_huffman(&a->z_length , default_length , 288)) return 0;
2502 1.1 jmcneill if (!zbuild_huffman(&a->z_distance, default_distance, 32)) return 0;
2503 1.1 jmcneill } else {
2504 1.1 jmcneill if (!compute_huffman_codes(a)) return 0;
2505 1.1 jmcneill }
2506 1.1 jmcneill if (!parse_huffman_block(a)) return 0;
2507 1.1 jmcneill }
2508 1.1 jmcneill if (stbi_png_partial && a->zout - a->zout_start > 65536)
2509 1.1 jmcneill break;
2510 1.1 jmcneill } while (!final);
2511 1.1 jmcneill return 1;
2512 1.1 jmcneill }
2513 1.1 jmcneill
2514 1.1 jmcneill static int do_zlib(zbuf *a, char *obuf, int olen, int exp, int parse_header)
2515 1.1 jmcneill {
2516 1.1 jmcneill a->zout_start = obuf;
2517 1.1 jmcneill a->zout = obuf;
2518 1.1 jmcneill a->zout_end = obuf + olen;
2519 1.1 jmcneill a->z_expandable = exp;
2520 1.1 jmcneill
2521 1.1 jmcneill return parse_zlib(a, parse_header);
2522 1.1 jmcneill }
2523 1.1 jmcneill
2524 1.1 jmcneill char *stbi_zlib_decode_malloc_guesssize(const char * buffer, int len, int initial_size, int *outlen)
2525 1.1 jmcneill {
2526 1.1 jmcneill zbuf a;
2527 1.7 christos char *p = MALLOC(initial_size);
2528 1.1 jmcneill if (p == NULL) return NULL;
2529 1.1 jmcneill a.zbuffer = (uint8 const *) buffer;
2530 1.1 jmcneill a.zbuffer_end = (uint8 const *) buffer + len;
2531 1.1 jmcneill if (do_zlib(&a, p, initial_size, 1, 1)) {
2532 1.1 jmcneill if (outlen) *outlen = (int) (a.zout - a.zout_start);
2533 1.1 jmcneill return a.zout_start;
2534 1.1 jmcneill } else {
2535 1.1 jmcneill FREE(a.zout_start);
2536 1.1 jmcneill return NULL;
2537 1.1 jmcneill }
2538 1.1 jmcneill }
2539 1.1 jmcneill
2540 1.1 jmcneill char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)
2541 1.1 jmcneill {
2542 1.1 jmcneill return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);
2543 1.1 jmcneill }
2544 1.1 jmcneill
2545 1.1 jmcneill char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)
2546 1.1 jmcneill {
2547 1.1 jmcneill zbuf a;
2548 1.7 christos char *p = MALLOC(initial_size);
2549 1.1 jmcneill if (p == NULL) return NULL;
2550 1.1 jmcneill a.zbuffer = (uint8 const *) buffer;
2551 1.1 jmcneill a.zbuffer_end = (uint8 const *) buffer + len;
2552 1.1 jmcneill if (do_zlib(&a, p, initial_size, 1, parse_header)) {
2553 1.1 jmcneill if (outlen) *outlen = (int) (a.zout - a.zout_start);
2554 1.1 jmcneill return a.zout_start;
2555 1.1 jmcneill } else {
2556 1.1 jmcneill FREE(a.zout_start);
2557 1.1 jmcneill return NULL;
2558 1.1 jmcneill }
2559 1.1 jmcneill }
2560 1.1 jmcneill
2561 1.1 jmcneill int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)
2562 1.1 jmcneill {
2563 1.1 jmcneill zbuf a;
2564 1.1 jmcneill a.zbuffer = (uint8 const *) ibuffer;
2565 1.1 jmcneill a.zbuffer_end = (uint8 const *) ibuffer + ilen;
2566 1.1 jmcneill if (do_zlib(&a, obuffer, olen, 0, 1))
2567 1.1 jmcneill return (int) (a.zout - a.zout_start);
2568 1.1 jmcneill else
2569 1.1 jmcneill return -1;
2570 1.1 jmcneill }
2571 1.1 jmcneill
2572 1.1 jmcneill char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)
2573 1.1 jmcneill {
2574 1.1 jmcneill zbuf a;
2575 1.7 christos char *p = MALLOC(16384);
2576 1.1 jmcneill if (p == NULL) return NULL;
2577 1.1 jmcneill a.zbuffer = (uint8 const *) buffer;
2578 1.1 jmcneill a.zbuffer_end = (uint8 const *) buffer+len;
2579 1.1 jmcneill if (do_zlib(&a, p, 16384, 1, 0)) {
2580 1.1 jmcneill if (outlen) *outlen = (int) (a.zout - a.zout_start);
2581 1.1 jmcneill return a.zout_start;
2582 1.1 jmcneill } else {
2583 1.1 jmcneill FREE(a.zout_start);
2584 1.1 jmcneill return NULL;
2585 1.1 jmcneill }
2586 1.1 jmcneill }
2587 1.1 jmcneill
2588 1.1 jmcneill int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)
2589 1.1 jmcneill {
2590 1.1 jmcneill zbuf a;
2591 1.1 jmcneill a.zbuffer = (uint8 const *) ibuffer;
2592 1.1 jmcneill a.zbuffer_end = (uint8 const *) ibuffer + ilen;
2593 1.1 jmcneill if (do_zlib(&a, obuffer, olen, 0, 0))
2594 1.1 jmcneill return (int) (a.zout - a.zout_start);
2595 1.1 jmcneill else
2596 1.1 jmcneill return -1;
2597 1.1 jmcneill }
2598 1.1 jmcneill
2599 1.1 jmcneill // public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18
2600 1.1 jmcneill // simple implementation
2601 1.1 jmcneill // - only 8-bit samples
2602 1.1 jmcneill // - no CRC checking
2603 1.1 jmcneill // - allocates lots of intermediate memory
2604 1.1 jmcneill // - avoids problem of streaming data between subsystems
2605 1.1 jmcneill // - avoids explicit window management
2606 1.1 jmcneill // performance
2607 1.1 jmcneill // - uses stb_zlib, a PD zlib implementation with fast huffman decoding
2608 1.1 jmcneill
2609 1.1 jmcneill
2610 1.1 jmcneill typedef struct
2611 1.1 jmcneill {
2612 1.1 jmcneill uint32 length;
2613 1.1 jmcneill uint32 type;
2614 1.1 jmcneill } chunk;
2615 1.1 jmcneill
2616 1.1 jmcneill #define PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d))
2617 1.1 jmcneill
2618 1.1 jmcneill static chunk get_chunk_header(stbi *s)
2619 1.1 jmcneill {
2620 1.1 jmcneill chunk c;
2621 1.1 jmcneill c.length = get32(s);
2622 1.1 jmcneill c.type = get32(s);
2623 1.1 jmcneill return c;
2624 1.1 jmcneill }
2625 1.1 jmcneill
2626 1.1 jmcneill static int check_png_header(stbi *s)
2627 1.1 jmcneill {
2628 1.1 jmcneill static uint8 png_sig[8] = { 137,80,78,71,13,10,26,10 };
2629 1.1 jmcneill int i;
2630 1.1 jmcneill for (i=0; i < 8; ++i)
2631 1.1 jmcneill if (get8(s) != png_sig[i]) return e("bad png sig","Not a PNG");
2632 1.1 jmcneill return 1;
2633 1.1 jmcneill }
2634 1.1 jmcneill
2635 1.1 jmcneill typedef struct
2636 1.1 jmcneill {
2637 1.1 jmcneill stbi s;
2638 1.1 jmcneill uint8 *idata, *expanded, *out;
2639 1.1 jmcneill } png;
2640 1.1 jmcneill
2641 1.1 jmcneill
2642 1.1 jmcneill enum {
2643 1.1 jmcneill F_none=0, F_sub=1, F_up=2, F_avg=3, F_paeth=4,
2644 1.1 jmcneill F_avg_first, F_paeth_first
2645 1.1 jmcneill };
2646 1.1 jmcneill
2647 1.1 jmcneill static uint8 first_row_filter[5] =
2648 1.1 jmcneill {
2649 1.1 jmcneill F_none, F_sub, F_none, F_avg_first, F_paeth_first
2650 1.1 jmcneill };
2651 1.1 jmcneill
2652 1.1 jmcneill static int paeth(int a, int b, int c)
2653 1.1 jmcneill {
2654 1.1 jmcneill int p = a + b - c;
2655 1.1 jmcneill int pa = abs(p-a);
2656 1.1 jmcneill int pb = abs(p-b);
2657 1.1 jmcneill int pc = abs(p-c);
2658 1.1 jmcneill if (pa <= pb && pa <= pc) return a;
2659 1.1 jmcneill if (pb <= pc) return b;
2660 1.1 jmcneill return c;
2661 1.1 jmcneill }
2662 1.1 jmcneill
2663 1.1 jmcneill // create the png data from post-deflated data
2664 1.1 jmcneill static int create_png_image_raw(png *a, uint8 *raw, uint32 raw_len, int out_n, uint32 x, uint32 y)
2665 1.1 jmcneill {
2666 1.1 jmcneill stbi *s = &a->s;
2667 1.1 jmcneill uint32 i,j,stride = x*out_n;
2668 1.1 jmcneill int k;
2669 1.1 jmcneill int img_n = s->img_n; // copy it into a local for later
2670 1.1 jmcneill assert(out_n == s->img_n || out_n == s->img_n+1);
2671 1.1 jmcneill if (stbi_png_partial) y = 1;
2672 1.7 christos a->out = MALLOC(x * y * out_n);
2673 1.1 jmcneill if (!a->out) return e("outofmem", "Out of memory");
2674 1.1 jmcneill if (!stbi_png_partial) {
2675 1.1 jmcneill if (s->img_x == x && s->img_y == y) {
2676 1.1 jmcneill if (raw_len != (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG");
2677 1.1 jmcneill } else { // interlaced:
2678 1.1 jmcneill if (raw_len < (img_n * x + 1) * y) return e("not enough pixels","Corrupt PNG");
2679 1.1 jmcneill }
2680 1.1 jmcneill }
2681 1.1 jmcneill for (j=0; j < y; ++j) {
2682 1.1 jmcneill uint8 *cur = a->out + stride*j;
2683 1.1 jmcneill uint8 *prior = cur - stride;
2684 1.1 jmcneill int filter = *raw++;
2685 1.1 jmcneill if (filter > 4) return e("invalid filter","Corrupt PNG");
2686 1.1 jmcneill // if first row, use special filter that doesn't sample previous row
2687 1.1 jmcneill if (j == 0) filter = first_row_filter[filter];
2688 1.1 jmcneill // handle first pixel explicitly
2689 1.1 jmcneill for (k=0; k < img_n; ++k) {
2690 1.1 jmcneill switch (filter) {
2691 1.1 jmcneill case F_none : cur[k] = raw[k]; break;
2692 1.1 jmcneill case F_sub : cur[k] = raw[k]; break;
2693 1.1 jmcneill case F_up : cur[k] = raw[k] + prior[k]; break;
2694 1.1 jmcneill case F_avg : cur[k] = raw[k] + (prior[k]>>1); break;
2695 1.1 jmcneill case F_paeth : cur[k] = (uint8) (raw[k] + paeth(0,prior[k],0)); break;
2696 1.1 jmcneill case F_avg_first : cur[k] = raw[k]; break;
2697 1.1 jmcneill case F_paeth_first: cur[k] = raw[k]; break;
2698 1.1 jmcneill }
2699 1.1 jmcneill }
2700 1.1 jmcneill if (img_n != out_n) cur[img_n] = 255;
2701 1.1 jmcneill raw += img_n;
2702 1.1 jmcneill cur += out_n;
2703 1.1 jmcneill prior += out_n;
2704 1.1 jmcneill // this is a little gross, so that we don't switch per-pixel or per-component
2705 1.1 jmcneill if (img_n == out_n) {
2706 1.1 jmcneill #define CASE(f) \
2707 1.1 jmcneill case f: \
2708 1.1 jmcneill for (i=x-1; i >= 1; --i, raw+=img_n,cur+=img_n,prior+=img_n) \
2709 1.1 jmcneill for (k=0; k < img_n; ++k)
2710 1.1 jmcneill switch (filter) {
2711 1.9 mrg CASE(F_none) cur[k] = raw[k];
2712 1.9 mrg break;
2713 1.9 mrg CASE(F_sub) cur[k] = raw[k] + cur[k-img_n];
2714 1.9 mrg break;
2715 1.9 mrg CASE(F_up) cur[k] = raw[k] + prior[k];
2716 1.9 mrg break;
2717 1.9 mrg CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-img_n])>>1);
2718 1.9 mrg break;
2719 1.9 mrg CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],prior[k],prior[k-img_n]));
2720 1.9 mrg break;
2721 1.9 mrg CASE(F_avg_first) cur[k] = raw[k] + (cur[k-img_n] >> 1);
2722 1.9 mrg break;
2723 1.9 mrg CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-img_n],0,0));
2724 1.9 mrg break;
2725 1.1 jmcneill }
2726 1.1 jmcneill #undef CASE
2727 1.1 jmcneill } else {
2728 1.1 jmcneill assert(img_n+1 == out_n);
2729 1.1 jmcneill #define CASE(f) \
2730 1.1 jmcneill case f: \
2731 1.1 jmcneill for (i=x-1; i >= 1; --i, cur[img_n]=255,raw+=img_n,cur+=out_n,prior+=out_n) \
2732 1.1 jmcneill for (k=0; k < img_n; ++k)
2733 1.1 jmcneill switch (filter) {
2734 1.9 mrg CASE(F_none) cur[k] = raw[k];
2735 1.9 mrg break;
2736 1.9 mrg CASE(F_sub) cur[k] = raw[k] + cur[k-out_n];
2737 1.9 mrg break;
2738 1.9 mrg CASE(F_up) cur[k] = raw[k] + prior[k];
2739 1.9 mrg break;
2740 1.9 mrg CASE(F_avg) cur[k] = raw[k] + ((prior[k] + cur[k-out_n])>>1);
2741 1.9 mrg break;
2742 1.9 mrg CASE(F_paeth) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],prior[k],prior[k-out_n]));
2743 1.9 mrg break;
2744 1.9 mrg CASE(F_avg_first) cur[k] = raw[k] + (cur[k-out_n] >> 1);
2745 1.9 mrg break;
2746 1.9 mrg CASE(F_paeth_first) cur[k] = (uint8) (raw[k] + paeth(cur[k-out_n],0,0));
2747 1.9 mrg break;
2748 1.1 jmcneill }
2749 1.1 jmcneill #undef CASE
2750 1.1 jmcneill }
2751 1.1 jmcneill }
2752 1.1 jmcneill return 1;
2753 1.1 jmcneill }
2754 1.1 jmcneill
2755 1.1 jmcneill static int create_png_image(png *a, uint8 *raw, uint32 raw_len, int out_n, int interlaced)
2756 1.1 jmcneill {
2757 1.1 jmcneill uint8 *final;
2758 1.1 jmcneill int p;
2759 1.1 jmcneill int save;
2760 1.1 jmcneill if (!interlaced)
2761 1.1 jmcneill return create_png_image_raw(a, raw, raw_len, out_n, a->s.img_x, a->s.img_y);
2762 1.1 jmcneill save = stbi_png_partial;
2763 1.1 jmcneill stbi_png_partial = 0;
2764 1.1 jmcneill
2765 1.1 jmcneill // de-interlacing
2766 1.7 christos final = MALLOC(a->s.img_x * a->s.img_y * out_n);
2767 1.1 jmcneill for (p=0; p < 7; ++p) {
2768 1.1 jmcneill int xorig[] = { 0,4,0,2,0,1,0 };
2769 1.1 jmcneill int yorig[] = { 0,0,4,0,2,0,1 };
2770 1.1 jmcneill int xspc[] = { 8,8,4,4,2,2,1 };
2771 1.1 jmcneill int yspc[] = { 8,8,8,4,4,2,2 };
2772 1.1 jmcneill int i,j,x,y;
2773 1.1 jmcneill // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1
2774 1.1 jmcneill x = (a->s.img_x - xorig[p] + xspc[p]-1) / xspc[p];
2775 1.1 jmcneill y = (a->s.img_y - yorig[p] + yspc[p]-1) / yspc[p];
2776 1.1 jmcneill if (x && y) {
2777 1.1 jmcneill if (!create_png_image_raw(a, raw, raw_len, out_n, x, y)) {
2778 1.1 jmcneill FREE(final);
2779 1.1 jmcneill return 0;
2780 1.1 jmcneill }
2781 1.1 jmcneill for (j=0; j < y; ++j)
2782 1.1 jmcneill for (i=0; i < x; ++i)
2783 1.1 jmcneill memcpy(final + (j*yspc[p]+yorig[p])*a->s.img_x*out_n + (i*xspc[p]+xorig[p])*out_n,
2784 1.1 jmcneill a->out + (j*x+i)*out_n, out_n);
2785 1.1 jmcneill FREE(a->out);
2786 1.1 jmcneill raw += (x*out_n+1)*y;
2787 1.1 jmcneill raw_len -= (x*out_n+1)*y;
2788 1.1 jmcneill }
2789 1.1 jmcneill }
2790 1.1 jmcneill a->out = final;
2791 1.1 jmcneill
2792 1.1 jmcneill stbi_png_partial = save;
2793 1.1 jmcneill return 1;
2794 1.1 jmcneill }
2795 1.1 jmcneill
2796 1.1 jmcneill static int compute_transparency(png *z, uint8 tc[3], int out_n)
2797 1.1 jmcneill {
2798 1.1 jmcneill stbi *s = &z->s;
2799 1.1 jmcneill uint32 i, pixel_count = s->img_x * s->img_y;
2800 1.1 jmcneill uint8 *p = z->out;
2801 1.1 jmcneill
2802 1.1 jmcneill // compute color-based transparency, assuming we've
2803 1.1 jmcneill // already got 255 as the alpha value in the output
2804 1.1 jmcneill assert(out_n == 2 || out_n == 4);
2805 1.1 jmcneill
2806 1.1 jmcneill if (out_n == 2) {
2807 1.1 jmcneill for (i=0; i < pixel_count; ++i) {
2808 1.1 jmcneill p[1] = (p[0] == tc[0] ? 0 : 255);
2809 1.1 jmcneill p += 2;
2810 1.1 jmcneill }
2811 1.1 jmcneill } else {
2812 1.1 jmcneill for (i=0; i < pixel_count; ++i) {
2813 1.1 jmcneill if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])
2814 1.1 jmcneill p[3] = 0;
2815 1.1 jmcneill p += 4;
2816 1.1 jmcneill }
2817 1.1 jmcneill }
2818 1.1 jmcneill return 1;
2819 1.1 jmcneill }
2820 1.1 jmcneill
2821 1.1 jmcneill static int expand_palette(png *a, uint8 *palette, int len, int pal_img_n)
2822 1.1 jmcneill {
2823 1.1 jmcneill uint32 i, pixel_count = a->s.img_x * a->s.img_y;
2824 1.1 jmcneill uint8 *p, *temp_out, *orig = a->out;
2825 1.1 jmcneill
2826 1.7 christos p = MALLOC(pixel_count * pal_img_n);
2827 1.1 jmcneill if (p == NULL) return e("outofmem", "Out of memory");
2828 1.1 jmcneill
2829 1.5 mbalmer // between here and FREE(out) below, exiting would leak
2830 1.1 jmcneill temp_out = p;
2831 1.1 jmcneill
2832 1.1 jmcneill if (pal_img_n == 3) {
2833 1.1 jmcneill for (i=0; i < pixel_count; ++i) {
2834 1.1 jmcneill int n = orig[i]*4;
2835 1.1 jmcneill p[0] = palette[n ];
2836 1.1 jmcneill p[1] = palette[n+1];
2837 1.1 jmcneill p[2] = palette[n+2];
2838 1.1 jmcneill p += 3;
2839 1.1 jmcneill }
2840 1.1 jmcneill } else {
2841 1.1 jmcneill for (i=0; i < pixel_count; ++i) {
2842 1.1 jmcneill int n = orig[i]*4;
2843 1.1 jmcneill p[0] = palette[n ];
2844 1.1 jmcneill p[1] = palette[n+1];
2845 1.1 jmcneill p[2] = palette[n+2];
2846 1.1 jmcneill p[3] = palette[n+3];
2847 1.1 jmcneill p += 4;
2848 1.1 jmcneill }
2849 1.1 jmcneill }
2850 1.1 jmcneill FREE(a->out);
2851 1.1 jmcneill a->out = temp_out;
2852 1.1 jmcneill
2853 1.1 jmcneill STBI_NOTUSED(len);
2854 1.1 jmcneill
2855 1.1 jmcneill return 1;
2856 1.1 jmcneill }
2857 1.1 jmcneill
2858 1.1 jmcneill static int stbi_unpremultiply_on_load = 0;
2859 1.1 jmcneill static int stbi_de_iphone_flag = 0;
2860 1.1 jmcneill
2861 1.1 jmcneill void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)
2862 1.1 jmcneill {
2863 1.1 jmcneill stbi_unpremultiply_on_load = flag_true_if_should_unpremultiply;
2864 1.1 jmcneill }
2865 1.1 jmcneill void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)
2866 1.1 jmcneill {
2867 1.1 jmcneill stbi_de_iphone_flag = flag_true_if_should_convert;
2868 1.1 jmcneill }
2869 1.1 jmcneill
2870 1.1 jmcneill static void stbi_de_iphone(png *z)
2871 1.1 jmcneill {
2872 1.1 jmcneill stbi *s = &z->s;
2873 1.1 jmcneill uint32 i, pixel_count = s->img_x * s->img_y;
2874 1.1 jmcneill uint8 *p = z->out;
2875 1.1 jmcneill
2876 1.1 jmcneill if (s->img_out_n == 3) { // convert bgr to rgb
2877 1.1 jmcneill for (i=0; i < pixel_count; ++i) {
2878 1.1 jmcneill uint8 t = p[0];
2879 1.1 jmcneill p[0] = p[2];
2880 1.1 jmcneill p[2] = t;
2881 1.1 jmcneill p += 3;
2882 1.1 jmcneill }
2883 1.1 jmcneill } else {
2884 1.1 jmcneill assert(s->img_out_n == 4);
2885 1.1 jmcneill if (stbi_unpremultiply_on_load) {
2886 1.1 jmcneill // convert bgr to rgb and unpremultiply
2887 1.1 jmcneill for (i=0; i < pixel_count; ++i) {
2888 1.1 jmcneill uint8 a = p[3];
2889 1.1 jmcneill uint8 t = p[0];
2890 1.1 jmcneill if (a) {
2891 1.1 jmcneill p[0] = p[2] * 255 / a;
2892 1.1 jmcneill p[1] = p[1] * 255 / a;
2893 1.1 jmcneill p[2] = t * 255 / a;
2894 1.1 jmcneill } else {
2895 1.1 jmcneill p[0] = p[2];
2896 1.1 jmcneill p[2] = t;
2897 1.1 jmcneill }
2898 1.1 jmcneill p += 4;
2899 1.1 jmcneill }
2900 1.1 jmcneill } else {
2901 1.1 jmcneill // convert bgr to rgb
2902 1.1 jmcneill for (i=0; i < pixel_count; ++i) {
2903 1.1 jmcneill uint8 t = p[0];
2904 1.1 jmcneill p[0] = p[2];
2905 1.1 jmcneill p[2] = t;
2906 1.1 jmcneill p += 4;
2907 1.1 jmcneill }
2908 1.1 jmcneill }
2909 1.1 jmcneill }
2910 1.1 jmcneill }
2911 1.1 jmcneill
2912 1.1 jmcneill static int parse_png_file(png *z, int scan, int req_comp)
2913 1.1 jmcneill {
2914 1.1 jmcneill uint8 palette[1024], pal_img_n=0;
2915 1.1 jmcneill uint8 has_trans=0, tc[3];
2916 1.1 jmcneill uint32 ioff=0, idata_limit=0, i, pal_len=0;
2917 1.1 jmcneill int first=1,k,interlace=0, iphone=0;
2918 1.1 jmcneill stbi *s = &z->s;
2919 1.1 jmcneill
2920 1.1 jmcneill if (!check_png_header(s)) return 0;
2921 1.1 jmcneill
2922 1.1 jmcneill if (scan == SCAN_type) return 1;
2923 1.1 jmcneill
2924 1.1 jmcneill for (;;) {
2925 1.1 jmcneill chunk c = get_chunk_header(s);
2926 1.1 jmcneill switch (c.type) {
2927 1.1 jmcneill case PNG_TYPE('C','g','B','I'):
2928 1.1 jmcneill iphone = stbi_de_iphone_flag;
2929 1.1 jmcneill skip(s, c.length);
2930 1.1 jmcneill break;
2931 1.1 jmcneill case PNG_TYPE('I','H','D','R'): {
2932 1.1 jmcneill int depth,color,comp,filter;
2933 1.1 jmcneill if (!first) return e("multiple IHDR","Corrupt PNG");
2934 1.1 jmcneill first = 0;
2935 1.1 jmcneill if (c.length != 13) return e("bad IHDR len","Corrupt PNG");
2936 1.1 jmcneill s->img_x = get32(s); if (s->img_x > (1 << 24)) return e("too large","Very large image (corrupt?)");
2937 1.1 jmcneill s->img_y = get32(s); if (s->img_y > (1 << 24)) return e("too large","Very large image (corrupt?)");
2938 1.1 jmcneill depth = get8(s); if (depth != 8) return e("8bit only","PNG not supported: 8-bit only");
2939 1.1 jmcneill color = get8(s); if (color > 6) return e("bad ctype","Corrupt PNG");
2940 1.1 jmcneill if (color == 3) pal_img_n = 3; else if (color & 1) return e("bad ctype","Corrupt PNG");
2941 1.1 jmcneill comp = get8(s); if (comp) return e("bad comp method","Corrupt PNG");
2942 1.1 jmcneill filter= get8(s); if (filter) return e("bad filter method","Corrupt PNG");
2943 1.1 jmcneill interlace = get8(s); if (interlace>1) return e("bad interlace method","Corrupt PNG");
2944 1.1 jmcneill if (!s->img_x || !s->img_y) return e("0-pixel image","Corrupt PNG");
2945 1.1 jmcneill if (!pal_img_n) {
2946 1.1 jmcneill s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);
2947 1.1 jmcneill if ((1 << 30) / s->img_x / s->img_n < s->img_y) return e("too large", "Image too large to decode");
2948 1.1 jmcneill if (scan == SCAN_header) return 1;
2949 1.1 jmcneill } else {
2950 1.1 jmcneill // if paletted, then pal_n is our final components, and
2951 1.1 jmcneill // img_n is # components to decompress/filter.
2952 1.1 jmcneill s->img_n = 1;
2953 1.1 jmcneill if ((1 << 30) / s->img_x / 4 < s->img_y) return e("too large","Corrupt PNG");
2954 1.1 jmcneill // if SCAN_header, have to scan to see if we have a tRNS
2955 1.1 jmcneill }
2956 1.1 jmcneill break;
2957 1.1 jmcneill }
2958 1.1 jmcneill
2959 1.1 jmcneill case PNG_TYPE('P','L','T','E'): {
2960 1.1 jmcneill if (first) return e("first not IHDR", "Corrupt PNG");
2961 1.1 jmcneill if (c.length > 256*3) return e("invalid PLTE","Corrupt PNG");
2962 1.1 jmcneill pal_len = c.length / 3;
2963 1.1 jmcneill if (pal_len * 3 != c.length) return e("invalid PLTE","Corrupt PNG");
2964 1.1 jmcneill for (i=0; i < pal_len; ++i) {
2965 1.1 jmcneill palette[i*4+0] = get8u(s);
2966 1.1 jmcneill palette[i*4+1] = get8u(s);
2967 1.1 jmcneill palette[i*4+2] = get8u(s);
2968 1.1 jmcneill palette[i*4+3] = 255;
2969 1.1 jmcneill }
2970 1.1 jmcneill break;
2971 1.1 jmcneill }
2972 1.1 jmcneill
2973 1.1 jmcneill case PNG_TYPE('t','R','N','S'): {
2974 1.1 jmcneill if (first) return e("first not IHDR", "Corrupt PNG");
2975 1.1 jmcneill if (z->idata) return e("tRNS after IDAT","Corrupt PNG");
2976 1.1 jmcneill if (pal_img_n) {
2977 1.1 jmcneill if (scan == SCAN_header) { s->img_n = 4; return 1; }
2978 1.1 jmcneill if (pal_len == 0) return e("tRNS before PLTE","Corrupt PNG");
2979 1.1 jmcneill if (c.length > pal_len) return e("bad tRNS len","Corrupt PNG");
2980 1.1 jmcneill pal_img_n = 4;
2981 1.1 jmcneill for (i=0; i < c.length; ++i)
2982 1.1 jmcneill palette[i*4+3] = get8u(s);
2983 1.1 jmcneill } else {
2984 1.1 jmcneill if (!(s->img_n & 1)) return e("tRNS with alpha","Corrupt PNG");
2985 1.1 jmcneill if (c.length != (uint32) s->img_n*2) return e("bad tRNS len","Corrupt PNG");
2986 1.1 jmcneill has_trans = 1;
2987 1.1 jmcneill for (k=0; k < s->img_n; ++k)
2988 1.1 jmcneill tc[k] = (uint8) get16(s); // non 8-bit images will be larger
2989 1.1 jmcneill }
2990 1.1 jmcneill break;
2991 1.1 jmcneill }
2992 1.1 jmcneill
2993 1.1 jmcneill case PNG_TYPE('I','D','A','T'): {
2994 1.1 jmcneill if (first) return e("first not IHDR", "Corrupt PNG");
2995 1.1 jmcneill if (pal_img_n && !pal_len) return e("no PLTE","Corrupt PNG");
2996 1.1 jmcneill if (scan == SCAN_header) { s->img_n = pal_img_n; return 1; }
2997 1.1 jmcneill if (ioff + c.length > idata_limit) {
2998 1.1 jmcneill uint8 *p;
2999 1.1 jmcneill if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;
3000 1.1 jmcneill while (ioff + c.length > idata_limit)
3001 1.1 jmcneill idata_limit *= 2;
3002 1.1 jmcneill p = (uint8 *) REALLOC(z->idata, idata_limit); if (p == NULL) return e("outofmem", "Out of memory");
3003 1.1 jmcneill z->idata = p;
3004 1.1 jmcneill }
3005 1.1 jmcneill if (!getn(s, z->idata+ioff,c.length)) return e("outofdata","Corrupt PNG");
3006 1.1 jmcneill ioff += c.length;
3007 1.1 jmcneill break;
3008 1.1 jmcneill }
3009 1.1 jmcneill
3010 1.1 jmcneill case PNG_TYPE('I','E','N','D'): {
3011 1.1 jmcneill uint32 raw_len;
3012 1.1 jmcneill if (first) return e("first not IHDR", "Corrupt PNG");
3013 1.1 jmcneill if (scan != SCAN_load) return 1;
3014 1.1 jmcneill if (z->idata == NULL) return e("no IDAT","Corrupt PNG");
3015 1.1 jmcneill z->expanded = (uint8 *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, 16384, (int *) &raw_len, !iphone);
3016 1.1 jmcneill if (z->expanded == NULL) return 0; // zlib should set error
3017 1.1 jmcneill FREE(z->idata); z->idata = NULL;
3018 1.1 jmcneill if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)
3019 1.1 jmcneill s->img_out_n = s->img_n+1;
3020 1.1 jmcneill else
3021 1.1 jmcneill s->img_out_n = s->img_n;
3022 1.1 jmcneill if (!create_png_image(z, z->expanded, raw_len, s->img_out_n, interlace)) return 0;
3023 1.1 jmcneill if (has_trans)
3024 1.1 jmcneill if (!compute_transparency(z, tc, s->img_out_n)) return 0;
3025 1.1 jmcneill if (iphone && s->img_out_n > 2)
3026 1.1 jmcneill stbi_de_iphone(z);
3027 1.1 jmcneill if (pal_img_n) {
3028 1.1 jmcneill // pal_img_n == 3 or 4
3029 1.1 jmcneill s->img_n = pal_img_n; // record the actual colors we had
3030 1.1 jmcneill s->img_out_n = pal_img_n;
3031 1.1 jmcneill if (req_comp >= 3) s->img_out_n = req_comp;
3032 1.1 jmcneill if (!expand_palette(z, palette, pal_len, s->img_out_n))
3033 1.1 jmcneill return 0;
3034 1.1 jmcneill }
3035 1.1 jmcneill FREE(z->expanded); z->expanded = NULL;
3036 1.1 jmcneill return 1;
3037 1.1 jmcneill }
3038 1.1 jmcneill
3039 1.1 jmcneill default:
3040 1.1 jmcneill // if critical, fail
3041 1.1 jmcneill if (first) return e("first not IHDR", "Corrupt PNG");
3042 1.1 jmcneill if ((c.type & (1 << 29)) == 0) {
3043 1.1 jmcneill #ifndef STBI_NO_FAILURE_STRINGS
3044 1.1 jmcneill // not threadsafe
3045 1.1 jmcneill static char invalid_chunk[] = "XXXX chunk not known";
3046 1.1 jmcneill invalid_chunk[0] = (uint8) (c.type >> 24);
3047 1.1 jmcneill invalid_chunk[1] = (uint8) (c.type >> 16);
3048 1.1 jmcneill invalid_chunk[2] = (uint8) (c.type >> 8);
3049 1.1 jmcneill invalid_chunk[3] = (uint8) (c.type >> 0);
3050 1.1 jmcneill #endif
3051 1.1 jmcneill return e(invalid_chunk, "PNG not supported: unknown chunk type");
3052 1.1 jmcneill }
3053 1.1 jmcneill skip(s, c.length);
3054 1.1 jmcneill break;
3055 1.1 jmcneill }
3056 1.1 jmcneill // end of chunk, read and skip CRC
3057 1.1 jmcneill get32(s);
3058 1.1 jmcneill }
3059 1.1 jmcneill }
3060 1.1 jmcneill
3061 1.1 jmcneill static unsigned char *do_png(png *p, int *x, int *y, int *n, int req_comp)
3062 1.1 jmcneill {
3063 1.1 jmcneill unsigned char *result=NULL;
3064 1.1 jmcneill p->expanded = NULL;
3065 1.1 jmcneill p->idata = NULL;
3066 1.1 jmcneill p->out = NULL;
3067 1.1 jmcneill if (req_comp < 0 || req_comp > 4) return epuc("bad req_comp", "Internal error");
3068 1.1 jmcneill if (parse_png_file(p, SCAN_load, req_comp)) {
3069 1.1 jmcneill result = p->out;
3070 1.1 jmcneill p->out = NULL;
3071 1.1 jmcneill if (req_comp && req_comp != p->s.img_out_n) {
3072 1.1 jmcneill result = convert_format(result, p->s.img_out_n, req_comp, p->s.img_x, p->s.img_y);
3073 1.1 jmcneill p->s.img_out_n = req_comp;
3074 1.1 jmcneill if (result == NULL) return result;
3075 1.1 jmcneill }
3076 1.1 jmcneill *x = p->s.img_x;
3077 1.1 jmcneill *y = p->s.img_y;
3078 1.1 jmcneill if (n) *n = p->s.img_n;
3079 1.1 jmcneill }
3080 1.1 jmcneill FREE(p->expanded); p->expanded = NULL;
3081 1.1 jmcneill FREE(p->idata); p->idata = NULL;
3082 1.1 jmcneill
3083 1.1 jmcneill return result;
3084 1.1 jmcneill }
3085 1.1 jmcneill
3086 1.1 jmcneill #ifndef STBI_NO_STDIO
3087 1.1 jmcneill unsigned char *stbi_png_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
3088 1.1 jmcneill {
3089 1.1 jmcneill png p;
3090 1.1 jmcneill start_file(&p.s, f);
3091 1.1 jmcneill return do_png(&p, x,y,comp,req_comp);
3092 1.1 jmcneill }
3093 1.1 jmcneill
3094 1.1 jmcneill unsigned char *stbi_png_load(char const *filename, int *x, int *y, int *comp, int req_comp)
3095 1.1 jmcneill {
3096 1.1 jmcneill unsigned char *data;
3097 1.1 jmcneill FILE *f = fopen(filename, "rb");
3098 1.1 jmcneill if (!f) return NULL;
3099 1.1 jmcneill data = stbi_png_load_from_file(f,x,y,comp,req_comp);
3100 1.1 jmcneill fclose(f);
3101 1.1 jmcneill return data;
3102 1.1 jmcneill }
3103 1.1 jmcneill #endif
3104 1.1 jmcneill
3105 1.1 jmcneill unsigned char *stbi_png_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
3106 1.1 jmcneill {
3107 1.1 jmcneill png p;
3108 1.1 jmcneill start_mem(&p.s, buffer,len);
3109 1.1 jmcneill return do_png(&p, x,y,comp,req_comp);
3110 1.1 jmcneill }
3111 1.1 jmcneill
3112 1.1 jmcneill #ifndef STBI_NO_STDIO
3113 1.1 jmcneill int stbi_png_test_file(FILE *f)
3114 1.1 jmcneill {
3115 1.1 jmcneill png p;
3116 1.1 jmcneill int n,r;
3117 1.1 jmcneill n = ftell(f);
3118 1.1 jmcneill start_file(&p.s, f);
3119 1.1 jmcneill r = parse_png_file(&p, SCAN_type,STBI_default);
3120 1.1 jmcneill fseek(f,n,SEEK_SET);
3121 1.1 jmcneill return r;
3122 1.1 jmcneill }
3123 1.1 jmcneill #endif
3124 1.1 jmcneill
3125 1.1 jmcneill int stbi_png_test_memory(stbi_uc const *buffer, int len)
3126 1.1 jmcneill {
3127 1.1 jmcneill png p;
3128 1.1 jmcneill start_mem(&p.s, buffer, len);
3129 1.1 jmcneill return parse_png_file(&p, SCAN_type,STBI_default);
3130 1.1 jmcneill }
3131 1.1 jmcneill
3132 1.1 jmcneill static int stbi_png_info_raw(png *p, int *x, int *y, int *comp)
3133 1.1 jmcneill {
3134 1.1 jmcneill if (!parse_png_file(p, SCAN_header, 0))
3135 1.1 jmcneill return 0;
3136 1.1 jmcneill if (x) *x = p->s.img_x;
3137 1.1 jmcneill if (y) *y = p->s.img_y;
3138 1.1 jmcneill if (comp) *comp = p->s.img_n;
3139 1.1 jmcneill return 1;
3140 1.1 jmcneill }
3141 1.1 jmcneill
3142 1.1 jmcneill #ifndef STBI_NO_STDIO
3143 1.1 jmcneill int stbi_png_info (char const *filename, int *x, int *y, int *comp)
3144 1.1 jmcneill {
3145 1.1 jmcneill int res;
3146 1.1 jmcneill FILE *f = fopen(filename, "rb");
3147 1.1 jmcneill if (!f) return 0;
3148 1.1 jmcneill res = stbi_png_info_from_file(f, x, y, comp);
3149 1.1 jmcneill fclose(f);
3150 1.1 jmcneill return res;
3151 1.1 jmcneill }
3152 1.1 jmcneill
3153 1.1 jmcneill int stbi_png_info_from_file(FILE *f, int *x, int *y, int *comp)
3154 1.1 jmcneill {
3155 1.1 jmcneill png p;
3156 1.1 jmcneill int res;
3157 1.1 jmcneill long n = ftell(f);
3158 1.1 jmcneill start_file(&p.s, f);
3159 1.1 jmcneill res = stbi_png_info_raw(&p, x, y, comp);
3160 1.1 jmcneill fseek(f, n, SEEK_SET);
3161 1.1 jmcneill return res;
3162 1.1 jmcneill }
3163 1.1 jmcneill #endif // !STBI_NO_STDIO
3164 1.1 jmcneill
3165 1.1 jmcneill int stbi_png_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
3166 1.1 jmcneill {
3167 1.1 jmcneill png p;
3168 1.1 jmcneill start_mem(&p.s, buffer, len);
3169 1.1 jmcneill return stbi_png_info_raw(&p, x, y, comp);
3170 1.1 jmcneill }
3171 1.1 jmcneill
3172 1.1 jmcneill // Microsoft/Windows BMP image
3173 1.1 jmcneill
3174 1.1 jmcneill static int bmp_test(stbi *s)
3175 1.1 jmcneill {
3176 1.1 jmcneill int sz;
3177 1.1 jmcneill if (get8(s) != 'B') return 0;
3178 1.1 jmcneill if (get8(s) != 'M') return 0;
3179 1.1 jmcneill get32le(s); // discard filesize
3180 1.1 jmcneill get16le(s); // discard reserved
3181 1.1 jmcneill get16le(s); // discard reserved
3182 1.1 jmcneill get32le(s); // discard data offset
3183 1.1 jmcneill sz = get32le(s);
3184 1.1 jmcneill if (sz == 12 || sz == 40 || sz == 56 || sz == 108) return 1;
3185 1.1 jmcneill return 0;
3186 1.1 jmcneill }
3187 1.1 jmcneill
3188 1.1 jmcneill #ifndef STBI_NO_STDIO
3189 1.1 jmcneill int stbi_bmp_test_file (FILE *f)
3190 1.1 jmcneill {
3191 1.1 jmcneill stbi s;
3192 1.1 jmcneill int r,n = ftell(f);
3193 1.1 jmcneill start_file(&s,f);
3194 1.1 jmcneill r = bmp_test(&s);
3195 1.1 jmcneill fseek(f,n,SEEK_SET);
3196 1.1 jmcneill return r;
3197 1.1 jmcneill }
3198 1.1 jmcneill #endif
3199 1.1 jmcneill
3200 1.1 jmcneill int stbi_bmp_test_memory (stbi_uc const *buffer, int len)
3201 1.1 jmcneill {
3202 1.1 jmcneill stbi s;
3203 1.1 jmcneill start_mem(&s, buffer, len);
3204 1.1 jmcneill return bmp_test(&s);
3205 1.1 jmcneill }
3206 1.1 jmcneill
3207 1.1 jmcneill // returns 0..31 for the highest set bit
3208 1.1 jmcneill static int high_bit(unsigned int z)
3209 1.1 jmcneill {
3210 1.1 jmcneill int n=0;
3211 1.1 jmcneill if (z == 0) return -1;
3212 1.1 jmcneill if (z >= 0x10000) n += 16, z >>= 16;
3213 1.1 jmcneill if (z >= 0x00100) n += 8, z >>= 8;
3214 1.1 jmcneill if (z >= 0x00010) n += 4, z >>= 4;
3215 1.1 jmcneill if (z >= 0x00004) n += 2, z >>= 2;
3216 1.1 jmcneill if (z >= 0x00002) n += 1, z >>= 1;
3217 1.1 jmcneill return n;
3218 1.1 jmcneill }
3219 1.1 jmcneill
3220 1.1 jmcneill static int bitcount(unsigned int a)
3221 1.1 jmcneill {
3222 1.1 jmcneill a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2
3223 1.1 jmcneill a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4
3224 1.1 jmcneill a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits
3225 1.1 jmcneill a = (a + (a >> 8)); // max 16 per 8 bits
3226 1.1 jmcneill a = (a + (a >> 16)); // max 32 per 8 bits
3227 1.1 jmcneill return a & 0xff;
3228 1.1 jmcneill }
3229 1.1 jmcneill
3230 1.1 jmcneill static int shiftsigned(int v, int shift, int bits)
3231 1.1 jmcneill {
3232 1.1 jmcneill int result;
3233 1.1 jmcneill int z=0;
3234 1.1 jmcneill
3235 1.1 jmcneill if (shift < 0) v <<= -shift;
3236 1.1 jmcneill else v >>= shift;
3237 1.1 jmcneill result = v;
3238 1.1 jmcneill
3239 1.1 jmcneill z = bits;
3240 1.1 jmcneill while (z < 8) {
3241 1.1 jmcneill result += v >> z;
3242 1.1 jmcneill z += bits;
3243 1.1 jmcneill }
3244 1.1 jmcneill return result;
3245 1.1 jmcneill }
3246 1.1 jmcneill
3247 1.1 jmcneill static stbi_uc *bmp_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3248 1.1 jmcneill {
3249 1.1 jmcneill uint8 *out;
3250 1.6 martin unsigned int mr=0,mg=0,mb=0,ma=0;
3251 1.1 jmcneill stbi_uc pal[256][4];
3252 1.1 jmcneill int psize=0,i,j,compress=0,width;
3253 1.1 jmcneill int bpp, flip_vertically, pad, target, offset, hsz;
3254 1.1 jmcneill if (get8(s) != 'B' || get8(s) != 'M') return epuc("not BMP", "Corrupt BMP");
3255 1.1 jmcneill get32le(s); // discard filesize
3256 1.1 jmcneill get16le(s); // discard reserved
3257 1.1 jmcneill get16le(s); // discard reserved
3258 1.1 jmcneill offset = get32le(s);
3259 1.1 jmcneill hsz = get32le(s);
3260 1.1 jmcneill if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108) return epuc("unknown BMP", "BMP type not supported: unknown");
3261 1.1 jmcneill if (hsz == 12) {
3262 1.1 jmcneill s->img_x = get16le(s);
3263 1.1 jmcneill s->img_y = get16le(s);
3264 1.1 jmcneill } else {
3265 1.1 jmcneill s->img_x = get32le(s);
3266 1.1 jmcneill s->img_y = get32le(s);
3267 1.1 jmcneill }
3268 1.1 jmcneill if (get16le(s) != 1) return epuc("bad BMP", "bad BMP");
3269 1.1 jmcneill bpp = get16le(s);
3270 1.1 jmcneill if (bpp == 1) return epuc("monochrome", "BMP type not supported: 1-bit");
3271 1.1 jmcneill flip_vertically = ((int) s->img_y) > 0;
3272 1.1 jmcneill s->img_y = abs((int) s->img_y);
3273 1.1 jmcneill if (hsz == 12) {
3274 1.1 jmcneill if (bpp < 24)
3275 1.1 jmcneill psize = (offset - 14 - 24) / 3;
3276 1.1 jmcneill } else {
3277 1.1 jmcneill compress = get32le(s);
3278 1.1 jmcneill if (compress == 1 || compress == 2) return epuc("BMP RLE", "BMP type not supported: RLE");
3279 1.1 jmcneill get32le(s); // discard sizeof
3280 1.1 jmcneill get32le(s); // discard hres
3281 1.1 jmcneill get32le(s); // discard vres
3282 1.1 jmcneill get32le(s); // discard colorsused
3283 1.1 jmcneill get32le(s); // discard max important
3284 1.1 jmcneill if (hsz == 40 || hsz == 56) {
3285 1.1 jmcneill if (hsz == 56) {
3286 1.1 jmcneill get32le(s);
3287 1.1 jmcneill get32le(s);
3288 1.1 jmcneill get32le(s);
3289 1.1 jmcneill get32le(s);
3290 1.1 jmcneill }
3291 1.1 jmcneill if (bpp == 16 || bpp == 32) {
3292 1.1 jmcneill mr = mg = mb = 0;
3293 1.1 jmcneill if (compress == 0) {
3294 1.1 jmcneill if (bpp == 32) {
3295 1.1 jmcneill mr = 0xffu << 16;
3296 1.1 jmcneill mg = 0xffu << 8;
3297 1.1 jmcneill mb = 0xffu << 0;
3298 1.1 jmcneill ma = 0xffu << 24;
3299 1.1 jmcneill } else {
3300 1.1 jmcneill mr = 31u << 10;
3301 1.1 jmcneill mg = 31u << 5;
3302 1.1 jmcneill mb = 31u << 0;
3303 1.1 jmcneill }
3304 1.1 jmcneill } else if (compress == 3) {
3305 1.1 jmcneill mr = get32le(s);
3306 1.1 jmcneill mg = get32le(s);
3307 1.1 jmcneill mb = get32le(s);
3308 1.1 jmcneill // not documented, but generated by photoshop and handled by mspaint
3309 1.1 jmcneill if (mr == mg && mg == mb) {
3310 1.1 jmcneill // ?!?!?
3311 1.1 jmcneill return epuc("bad BMP", "bad BMP");
3312 1.1 jmcneill }
3313 1.1 jmcneill } else
3314 1.1 jmcneill return epuc("bad BMP", "bad BMP");
3315 1.1 jmcneill }
3316 1.1 jmcneill } else {
3317 1.1 jmcneill assert(hsz == 108);
3318 1.1 jmcneill mr = get32le(s);
3319 1.1 jmcneill mg = get32le(s);
3320 1.1 jmcneill mb = get32le(s);
3321 1.1 jmcneill ma = get32le(s);
3322 1.1 jmcneill get32le(s); // discard color space
3323 1.1 jmcneill for (i=0; i < 12; ++i)
3324 1.1 jmcneill get32le(s); // discard color space parameters
3325 1.1 jmcneill }
3326 1.1 jmcneill if (bpp < 16)
3327 1.1 jmcneill psize = (offset - 14 - hsz) >> 2;
3328 1.1 jmcneill }
3329 1.1 jmcneill s->img_n = ma ? 4 : 3;
3330 1.1 jmcneill if (req_comp && req_comp >= 3) // we can directly decode 3 or 4
3331 1.1 jmcneill target = req_comp;
3332 1.1 jmcneill else
3333 1.1 jmcneill target = s->img_n; // if they want monochrome, we'll post-convert
3334 1.7 christos out = MALLOC(target * s->img_x * s->img_y);
3335 1.1 jmcneill if (!out) return epuc("outofmem", "Out of memory");
3336 1.1 jmcneill if (bpp < 16) {
3337 1.1 jmcneill int z=0;
3338 1.1 jmcneill if (psize == 0 || psize > 256) { FREE(out); return epuc("invalid", "Corrupt BMP"); }
3339 1.1 jmcneill for (i=0; i < psize; ++i) {
3340 1.1 jmcneill pal[i][2] = get8u(s);
3341 1.1 jmcneill pal[i][1] = get8u(s);
3342 1.1 jmcneill pal[i][0] = get8u(s);
3343 1.1 jmcneill if (hsz != 12) get8(s);
3344 1.1 jmcneill pal[i][3] = 255;
3345 1.1 jmcneill }
3346 1.1 jmcneill skip(s, offset - 14 - hsz - psize * (hsz == 12 ? 3 : 4));
3347 1.1 jmcneill if (bpp == 4) width = (s->img_x + 1) >> 1;
3348 1.1 jmcneill else if (bpp == 8) width = s->img_x;
3349 1.1 jmcneill else { FREE(out); return epuc("bad bpp", "Corrupt BMP"); }
3350 1.1 jmcneill pad = (-width)&3;
3351 1.1 jmcneill for (j=0; j < (int) s->img_y; ++j) {
3352 1.1 jmcneill for (i=0; i < (int) s->img_x; i += 2) {
3353 1.1 jmcneill int v=get8(s),v2=0;
3354 1.1 jmcneill if (bpp == 4) {
3355 1.1 jmcneill v2 = v & 15;
3356 1.1 jmcneill v >>= 4;
3357 1.1 jmcneill }
3358 1.1 jmcneill out[z++] = pal[v][0];
3359 1.1 jmcneill out[z++] = pal[v][1];
3360 1.1 jmcneill out[z++] = pal[v][2];
3361 1.1 jmcneill if (target == 4) out[z++] = 255;
3362 1.1 jmcneill if (i+1 == (int) s->img_x) break;
3363 1.1 jmcneill v = (bpp == 8) ? get8(s) : v2;
3364 1.1 jmcneill out[z++] = pal[v][0];
3365 1.1 jmcneill out[z++] = pal[v][1];
3366 1.1 jmcneill out[z++] = pal[v][2];
3367 1.1 jmcneill if (target == 4) out[z++] = 255;
3368 1.1 jmcneill }
3369 1.1 jmcneill skip(s, pad);
3370 1.1 jmcneill }
3371 1.1 jmcneill } else {
3372 1.1 jmcneill int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;
3373 1.1 jmcneill int z = 0;
3374 1.1 jmcneill int easy=0;
3375 1.1 jmcneill skip(s, offset - 14 - hsz);
3376 1.1 jmcneill if (bpp == 24) width = 3 * s->img_x;
3377 1.1 jmcneill else if (bpp == 16) width = 2*s->img_x;
3378 1.1 jmcneill else /* bpp = 32 and pad = 0 */ width=0;
3379 1.1 jmcneill pad = (-width) & 3;
3380 1.1 jmcneill if (bpp == 24) {
3381 1.1 jmcneill easy = 1;
3382 1.1 jmcneill } else if (bpp == 32) {
3383 1.1 jmcneill if (mb == 0xff && mg == 0xff00 && mr == 0xff000000 && ma == 0xff000000)
3384 1.1 jmcneill easy = 2;
3385 1.1 jmcneill }
3386 1.1 jmcneill if (!easy) {
3387 1.8 christos if (!mr || !mg || !mb) {
3388 1.8 christos FREE(out);
3389 1.8 christos return epuc("bad masks", "Corrupt BMP");
3390 1.8 christos }
3391 1.1 jmcneill // right shift amt to put high bit in position #7
3392 1.1 jmcneill rshift = high_bit(mr)-7; rcount = bitcount(mr);
3393 1.1 jmcneill gshift = high_bit(mg)-7; gcount = bitcount(mr);
3394 1.1 jmcneill bshift = high_bit(mb)-7; bcount = bitcount(mr);
3395 1.1 jmcneill ashift = high_bit(ma)-7; acount = bitcount(mr);
3396 1.1 jmcneill }
3397 1.1 jmcneill for (j=0; j < (int) s->img_y; ++j) {
3398 1.1 jmcneill if (easy) {
3399 1.1 jmcneill for (i=0; i < (int) s->img_x; ++i) {
3400 1.1 jmcneill int a;
3401 1.1 jmcneill out[z+2] = get8u(s);
3402 1.1 jmcneill out[z+1] = get8u(s);
3403 1.1 jmcneill out[z+0] = get8u(s);
3404 1.1 jmcneill z += 3;
3405 1.1 jmcneill a = (easy == 2 ? get8(s) : 255);
3406 1.1 jmcneill if (target == 4) out[z++] = (uint8) a;
3407 1.1 jmcneill }
3408 1.1 jmcneill } else {
3409 1.1 jmcneill for (i=0; i < (int) s->img_x; ++i) {
3410 1.1 jmcneill uint32 v = (bpp == 16 ? get16le(s) : get32le(s));
3411 1.1 jmcneill int a;
3412 1.1 jmcneill out[z++] = (uint8) shiftsigned(v & mr, rshift, rcount);
3413 1.1 jmcneill out[z++] = (uint8) shiftsigned(v & mg, gshift, gcount);
3414 1.1 jmcneill out[z++] = (uint8) shiftsigned(v & mb, bshift, bcount);
3415 1.1 jmcneill a = (ma ? shiftsigned(v & ma, ashift, acount) : 255);
3416 1.1 jmcneill if (target == 4) out[z++] = (uint8) a;
3417 1.1 jmcneill }
3418 1.1 jmcneill }
3419 1.1 jmcneill skip(s, pad);
3420 1.1 jmcneill }
3421 1.1 jmcneill }
3422 1.1 jmcneill if (flip_vertically) {
3423 1.1 jmcneill stbi_uc t;
3424 1.1 jmcneill for (j=0; j < (int) s->img_y>>1; ++j) {
3425 1.1 jmcneill stbi_uc *p1 = out + j *s->img_x*target;
3426 1.1 jmcneill stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;
3427 1.1 jmcneill for (i=0; i < (int) s->img_x*target; ++i) {
3428 1.1 jmcneill t = p1[i], p1[i] = p2[i], p2[i] = t;
3429 1.1 jmcneill }
3430 1.1 jmcneill }
3431 1.1 jmcneill }
3432 1.1 jmcneill
3433 1.1 jmcneill if (req_comp && req_comp != target) {
3434 1.1 jmcneill out = convert_format(out, target, req_comp, s->img_x, s->img_y);
3435 1.1 jmcneill if (out == NULL) return out; // convert_format frees input on failure
3436 1.1 jmcneill }
3437 1.1 jmcneill
3438 1.1 jmcneill *x = s->img_x;
3439 1.1 jmcneill *y = s->img_y;
3440 1.1 jmcneill if (comp) *comp = target;
3441 1.1 jmcneill return out;
3442 1.1 jmcneill }
3443 1.1 jmcneill
3444 1.1 jmcneill #ifndef STBI_NO_STDIO
3445 1.1 jmcneill stbi_uc *stbi_bmp_load (char const *filename, int *x, int *y, int *comp, int req_comp)
3446 1.1 jmcneill {
3447 1.1 jmcneill stbi_uc *data;
3448 1.1 jmcneill FILE *f = fopen(filename, "rb");
3449 1.1 jmcneill if (!f) return NULL;
3450 1.1 jmcneill data = stbi_bmp_load_from_file(f, x,y,comp,req_comp);
3451 1.1 jmcneill fclose(f);
3452 1.1 jmcneill return data;
3453 1.1 jmcneill }
3454 1.1 jmcneill
3455 1.1 jmcneill stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp)
3456 1.1 jmcneill {
3457 1.1 jmcneill stbi s;
3458 1.1 jmcneill start_file(&s, f);
3459 1.1 jmcneill return bmp_load(&s, x,y,comp,req_comp);
3460 1.1 jmcneill }
3461 1.1 jmcneill #endif
3462 1.1 jmcneill
3463 1.1 jmcneill stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
3464 1.1 jmcneill {
3465 1.1 jmcneill stbi s;
3466 1.1 jmcneill start_mem(&s, buffer, len);
3467 1.1 jmcneill return bmp_load(&s, x,y,comp,req_comp);
3468 1.1 jmcneill }
3469 1.1 jmcneill
3470 1.1 jmcneill // Targa Truevision - TGA
3471 1.1 jmcneill // by Jonathan Dummer
3472 1.1 jmcneill
3473 1.1 jmcneill static int tga_info(stbi *s, int *x, int *y, int *comp)
3474 1.1 jmcneill {
3475 1.1 jmcneill int tga_w, tga_h, tga_comp;
3476 1.1 jmcneill int sz;
3477 1.1 jmcneill get8u(s); // discard Offset
3478 1.1 jmcneill sz = get8u(s); // color type
3479 1.1 jmcneill if( sz > 1 ) return 0; // only RGB or indexed allowed
3480 1.1 jmcneill sz = get8u(s); // image type
3481 1.1 jmcneill // only RGB or grey allowed, +/- RLE
3482 1.1 jmcneill if ((sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11)) return 0;
3483 1.1 jmcneill get16le(s); // discard palette start
3484 1.1 jmcneill get16le(s); // discard palette length
3485 1.1 jmcneill get8(s); // discard bits per palette color entry
3486 1.1 jmcneill get16le(s); // discard x origin
3487 1.1 jmcneill get16le(s); // discard y origin
3488 1.1 jmcneill tga_w = get16le(s);
3489 1.1 jmcneill if( tga_w < 1 ) return 0; // test width
3490 1.1 jmcneill tga_h = get16le(s);
3491 1.1 jmcneill if( tga_h < 1 ) return 0; // test height
3492 1.1 jmcneill sz = get8(s); // bits per pixel
3493 1.1 jmcneill // only RGB or RGBA or grey allowed
3494 1.1 jmcneill if ((sz != 8) && (sz != 16) && (sz != 24) && (sz != 32)) return 0;
3495 1.1 jmcneill tga_comp = sz;
3496 1.1 jmcneill if (x) *x = tga_w;
3497 1.1 jmcneill if (y) *y = tga_h;
3498 1.1 jmcneill if (comp) *comp = tga_comp / 8;
3499 1.1 jmcneill return 1; // seems to have passed everything
3500 1.1 jmcneill }
3501 1.1 jmcneill
3502 1.1 jmcneill #ifndef STBI_NO_STDIO
3503 1.1 jmcneill int stbi_tga_info_from_file(FILE *f, int *x, int *y, int *comp)
3504 1.1 jmcneill {
3505 1.1 jmcneill stbi s;
3506 1.1 jmcneill int r;
3507 1.1 jmcneill long n = ftell(f);
3508 1.1 jmcneill start_file(&s, f);
3509 1.1 jmcneill r = tga_info(&s, x, y, comp);
3510 1.1 jmcneill fseek(f, n, SEEK_SET);
3511 1.1 jmcneill return r;
3512 1.1 jmcneill }
3513 1.1 jmcneill #endif
3514 1.1 jmcneill
3515 1.1 jmcneill int stbi_tga_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
3516 1.1 jmcneill {
3517 1.1 jmcneill stbi s;
3518 1.1 jmcneill start_mem(&s, buffer, len);
3519 1.1 jmcneill return tga_info(&s, x, y, comp);
3520 1.1 jmcneill }
3521 1.1 jmcneill
3522 1.1 jmcneill static int tga_test(stbi *s)
3523 1.1 jmcneill {
3524 1.1 jmcneill int sz;
3525 1.1 jmcneill get8u(s); // discard Offset
3526 1.1 jmcneill sz = get8u(s); // color type
3527 1.1 jmcneill if ( sz > 1 ) return 0; // only RGB or indexed allowed
3528 1.1 jmcneill sz = get8u(s); // image type
3529 1.1 jmcneill if ( (sz != 1) && (sz != 2) && (sz != 3) && (sz != 9) && (sz != 10) && (sz != 11) ) return 0; // only RGB or grey allowed, +/- RLE
3530 1.1 jmcneill get16(s); // discard palette start
3531 1.1 jmcneill get16(s); // discard palette length
3532 1.1 jmcneill get8(s); // discard bits per palette color entry
3533 1.1 jmcneill get16(s); // discard x origin
3534 1.1 jmcneill get16(s); // discard y origin
3535 1.1 jmcneill if ( get16(s) < 1 ) return 0; // test width
3536 1.1 jmcneill if ( get16(s) < 1 ) return 0; // test height
3537 1.1 jmcneill sz = get8(s); // bits per pixel
3538 1.1 jmcneill if ( (sz != 8) && (sz != 16) && (sz != 24) && (sz != 32) ) return 0; // only RGB or RGBA or grey allowed
3539 1.1 jmcneill return 1; // seems to have passed everything
3540 1.1 jmcneill }
3541 1.1 jmcneill
3542 1.1 jmcneill #ifndef STBI_NO_STDIO
3543 1.1 jmcneill int stbi_tga_test_file (FILE *f)
3544 1.1 jmcneill {
3545 1.1 jmcneill stbi s;
3546 1.1 jmcneill int r,n = ftell(f);
3547 1.1 jmcneill start_file(&s, f);
3548 1.1 jmcneill r = tga_test(&s);
3549 1.1 jmcneill fseek(f,n,SEEK_SET);
3550 1.1 jmcneill return r;
3551 1.1 jmcneill }
3552 1.1 jmcneill #endif
3553 1.1 jmcneill
3554 1.1 jmcneill int stbi_tga_test_memory (stbi_uc const *buffer, int len)
3555 1.1 jmcneill {
3556 1.1 jmcneill stbi s;
3557 1.1 jmcneill start_mem(&s, buffer, len);
3558 1.1 jmcneill return tga_test(&s);
3559 1.1 jmcneill }
3560 1.1 jmcneill
3561 1.1 jmcneill static stbi_uc *tga_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3562 1.1 jmcneill {
3563 1.1 jmcneill // read in the TGA header stuff
3564 1.1 jmcneill int tga_offset = get8u(s);
3565 1.1 jmcneill int tga_indexed = get8u(s);
3566 1.1 jmcneill int tga_image_type = get8u(s);
3567 1.1 jmcneill int tga_is_RLE = 0;
3568 1.1 jmcneill int tga_palette_start = get16le(s);
3569 1.1 jmcneill int tga_palette_len = get16le(s);
3570 1.1 jmcneill int tga_palette_bits = get8u(s);
3571 1.1 jmcneill int tga_x_origin = get16le(s);
3572 1.1 jmcneill int tga_y_origin = get16le(s);
3573 1.1 jmcneill int tga_width = get16le(s);
3574 1.1 jmcneill int tga_height = get16le(s);
3575 1.1 jmcneill int tga_bits_per_pixel = get8u(s);
3576 1.1 jmcneill int tga_inverted = get8u(s);
3577 1.1 jmcneill // image data
3578 1.1 jmcneill unsigned char *tga_data;
3579 1.1 jmcneill unsigned char *tga_palette = NULL;
3580 1.1 jmcneill int i, j;
3581 1.1 jmcneill unsigned char raw_data[4];
3582 1.1 jmcneill unsigned char trans_data[4];
3583 1.1 jmcneill int RLE_count = 0;
3584 1.1 jmcneill int RLE_repeating = 0;
3585 1.1 jmcneill int read_next_pixel = 1;
3586 1.1 jmcneill
3587 1.1 jmcneill // do a tiny bit of precessing
3588 1.1 jmcneill if ( tga_image_type >= 8 )
3589 1.1 jmcneill {
3590 1.1 jmcneill tga_image_type -= 8;
3591 1.1 jmcneill tga_is_RLE = 1;
3592 1.1 jmcneill }
3593 1.1 jmcneill /* int tga_alpha_bits = tga_inverted & 15; */
3594 1.1 jmcneill tga_inverted = 1 - ((tga_inverted >> 5) & 1);
3595 1.1 jmcneill
3596 1.1 jmcneill // error check
3597 1.1 jmcneill if ( //(tga_indexed) ||
3598 1.1 jmcneill (tga_width < 1) || (tga_height < 1) ||
3599 1.1 jmcneill (tga_image_type < 1) || (tga_image_type > 3) ||
3600 1.1 jmcneill ((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16) &&
3601 1.1 jmcneill (tga_bits_per_pixel != 24) && (tga_bits_per_pixel != 32))
3602 1.1 jmcneill )
3603 1.1 jmcneill {
3604 1.1 jmcneill return NULL;
3605 1.1 jmcneill }
3606 1.1 jmcneill
3607 1.1 jmcneill // If I'm paletted, then I'll use the number of bits from the palette
3608 1.1 jmcneill if ( tga_indexed )
3609 1.1 jmcneill {
3610 1.1 jmcneill tga_bits_per_pixel = tga_palette_bits;
3611 1.1 jmcneill }
3612 1.1 jmcneill
3613 1.1 jmcneill // tga info
3614 1.1 jmcneill *x = tga_width;
3615 1.1 jmcneill *y = tga_height;
3616 1.1 jmcneill if ( (req_comp < 1) || (req_comp > 4) )
3617 1.1 jmcneill {
3618 1.1 jmcneill // just use whatever the file was
3619 1.1 jmcneill req_comp = tga_bits_per_pixel / 8;
3620 1.1 jmcneill *comp = req_comp;
3621 1.1 jmcneill } else
3622 1.1 jmcneill {
3623 1.1 jmcneill // force a new number of components
3624 1.1 jmcneill *comp = tga_bits_per_pixel/8;
3625 1.1 jmcneill }
3626 1.7 christos tga_data = MALLOC( tga_width * tga_height * req_comp );
3627 1.1 jmcneill
3628 1.1 jmcneill // skip to the data's starting position (offset usually = 0)
3629 1.1 jmcneill skip(s, tga_offset );
3630 1.1 jmcneill // do I need to load a palette?
3631 1.1 jmcneill if ( tga_indexed )
3632 1.1 jmcneill {
3633 1.1 jmcneill // any data to skip? (offset usually = 0)
3634 1.1 jmcneill skip(s, tga_palette_start );
3635 1.1 jmcneill // load the palette
3636 1.7 christos tga_palette = MALLOC( tga_palette_len * tga_palette_bits / 8 );
3637 1.1 jmcneill if (!getn(s, tga_palette, tga_palette_len * tga_palette_bits / 8 ))
3638 1.1 jmcneill return NULL;
3639 1.1 jmcneill }
3640 1.1 jmcneill // load the data
3641 1.1 jmcneill trans_data[0] = trans_data[1] = trans_data[2] = trans_data[3] = 0;
3642 1.1 jmcneill for (i=0; i < tga_width * tga_height; ++i)
3643 1.1 jmcneill {
3644 1.1 jmcneill // if I'm in RLE mode, do I need to get a RLE chunk?
3645 1.1 jmcneill if ( tga_is_RLE )
3646 1.1 jmcneill {
3647 1.1 jmcneill if ( RLE_count == 0 )
3648 1.1 jmcneill {
3649 1.1 jmcneill // yep, get the next byte as a RLE command
3650 1.1 jmcneill int RLE_cmd = get8u(s);
3651 1.1 jmcneill RLE_count = 1 + (RLE_cmd & 127);
3652 1.1 jmcneill RLE_repeating = RLE_cmd >> 7;
3653 1.1 jmcneill read_next_pixel = 1;
3654 1.1 jmcneill } else if ( !RLE_repeating )
3655 1.1 jmcneill {
3656 1.1 jmcneill read_next_pixel = 1;
3657 1.1 jmcneill }
3658 1.1 jmcneill } else
3659 1.1 jmcneill {
3660 1.1 jmcneill read_next_pixel = 1;
3661 1.1 jmcneill }
3662 1.1 jmcneill // OK, if I need to read a pixel, do it now
3663 1.1 jmcneill if ( read_next_pixel )
3664 1.1 jmcneill {
3665 1.1 jmcneill // load however much data we did have
3666 1.1 jmcneill if ( tga_indexed )
3667 1.1 jmcneill {
3668 1.1 jmcneill // read in 1 byte, then perform the lookup
3669 1.1 jmcneill int pal_idx = get8u(s);
3670 1.1 jmcneill if ( pal_idx >= tga_palette_len )
3671 1.1 jmcneill {
3672 1.1 jmcneill // invalid index
3673 1.1 jmcneill pal_idx = 0;
3674 1.1 jmcneill }
3675 1.1 jmcneill pal_idx *= tga_bits_per_pixel / 8;
3676 1.1 jmcneill for (j = 0; j*8 < tga_bits_per_pixel; ++j)
3677 1.1 jmcneill {
3678 1.1 jmcneill raw_data[j] = tga_palette[pal_idx+j];
3679 1.1 jmcneill }
3680 1.1 jmcneill } else
3681 1.1 jmcneill {
3682 1.1 jmcneill // read in the data raw
3683 1.1 jmcneill for (j = 0; j*8 < tga_bits_per_pixel; ++j)
3684 1.1 jmcneill {
3685 1.1 jmcneill raw_data[j] = get8u(s);
3686 1.1 jmcneill }
3687 1.1 jmcneill }
3688 1.1 jmcneill // convert raw to the intermediate format
3689 1.1 jmcneill switch (tga_bits_per_pixel)
3690 1.1 jmcneill {
3691 1.1 jmcneill case 8:
3692 1.1 jmcneill // Luminous => RGBA
3693 1.1 jmcneill trans_data[0] = raw_data[0];
3694 1.1 jmcneill trans_data[1] = raw_data[0];
3695 1.1 jmcneill trans_data[2] = raw_data[0];
3696 1.1 jmcneill trans_data[3] = 255;
3697 1.1 jmcneill break;
3698 1.1 jmcneill case 16:
3699 1.1 jmcneill // Luminous,Alpha => RGBA
3700 1.1 jmcneill trans_data[0] = raw_data[0];
3701 1.1 jmcneill trans_data[1] = raw_data[0];
3702 1.1 jmcneill trans_data[2] = raw_data[0];
3703 1.1 jmcneill trans_data[3] = raw_data[1];
3704 1.1 jmcneill break;
3705 1.1 jmcneill case 24:
3706 1.1 jmcneill // BGR => RGBA
3707 1.1 jmcneill trans_data[0] = raw_data[2];
3708 1.1 jmcneill trans_data[1] = raw_data[1];
3709 1.1 jmcneill trans_data[2] = raw_data[0];
3710 1.1 jmcneill trans_data[3] = 255;
3711 1.1 jmcneill break;
3712 1.1 jmcneill case 32:
3713 1.1 jmcneill // BGRA => RGBA
3714 1.1 jmcneill trans_data[0] = raw_data[2];
3715 1.1 jmcneill trans_data[1] = raw_data[1];
3716 1.1 jmcneill trans_data[2] = raw_data[0];
3717 1.1 jmcneill trans_data[3] = raw_data[3];
3718 1.1 jmcneill break;
3719 1.1 jmcneill }
3720 1.1 jmcneill // clear the reading flag for the next pixel
3721 1.1 jmcneill read_next_pixel = 0;
3722 1.1 jmcneill } // end of reading a pixel
3723 1.1 jmcneill // convert to final format
3724 1.1 jmcneill switch (req_comp)
3725 1.1 jmcneill {
3726 1.1 jmcneill case 1:
3727 1.1 jmcneill // RGBA => Luminance
3728 1.1 jmcneill tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]);
3729 1.1 jmcneill break;
3730 1.1 jmcneill case 2:
3731 1.1 jmcneill // RGBA => Luminance,Alpha
3732 1.1 jmcneill tga_data[i*req_comp+0] = compute_y(trans_data[0],trans_data[1],trans_data[2]);
3733 1.1 jmcneill tga_data[i*req_comp+1] = trans_data[3];
3734 1.1 jmcneill break;
3735 1.1 jmcneill case 3:
3736 1.1 jmcneill // RGBA => RGB
3737 1.1 jmcneill tga_data[i*req_comp+0] = trans_data[0];
3738 1.1 jmcneill tga_data[i*req_comp+1] = trans_data[1];
3739 1.1 jmcneill tga_data[i*req_comp+2] = trans_data[2];
3740 1.1 jmcneill break;
3741 1.1 jmcneill case 4:
3742 1.1 jmcneill // RGBA => RGBA
3743 1.1 jmcneill tga_data[i*req_comp+0] = trans_data[0];
3744 1.1 jmcneill tga_data[i*req_comp+1] = trans_data[1];
3745 1.1 jmcneill tga_data[i*req_comp+2] = trans_data[2];
3746 1.1 jmcneill tga_data[i*req_comp+3] = trans_data[3];
3747 1.1 jmcneill break;
3748 1.1 jmcneill }
3749 1.1 jmcneill // in case we're in RLE mode, keep counting down
3750 1.1 jmcneill --RLE_count;
3751 1.1 jmcneill }
3752 1.1 jmcneill // do I need to invert the image?
3753 1.1 jmcneill if ( tga_inverted )
3754 1.1 jmcneill {
3755 1.1 jmcneill for (j = 0; j*2 < tga_height; ++j)
3756 1.1 jmcneill {
3757 1.1 jmcneill int index1 = j * tga_width * req_comp;
3758 1.1 jmcneill int index2 = (tga_height - 1 - j) * tga_width * req_comp;
3759 1.1 jmcneill for (i = tga_width * req_comp; i > 0; --i)
3760 1.1 jmcneill {
3761 1.1 jmcneill unsigned char temp = tga_data[index1];
3762 1.1 jmcneill tga_data[index1] = tga_data[index2];
3763 1.1 jmcneill tga_data[index2] = temp;
3764 1.1 jmcneill ++index1;
3765 1.1 jmcneill ++index2;
3766 1.1 jmcneill }
3767 1.1 jmcneill }
3768 1.1 jmcneill }
3769 1.1 jmcneill // clear my palette, if I had one
3770 1.1 jmcneill if ( tga_palette != NULL )
3771 1.1 jmcneill {
3772 1.1 jmcneill FREE( tga_palette );
3773 1.1 jmcneill }
3774 1.1 jmcneill // the things I do to get rid of an error message, and yet keep
3775 1.1 jmcneill // Microsoft's C compilers happy... [8^(
3776 1.1 jmcneill tga_palette_start = tga_palette_len = tga_palette_bits =
3777 1.1 jmcneill tga_x_origin = tga_y_origin = 0;
3778 1.1 jmcneill // OK, done
3779 1.1 jmcneill return tga_data;
3780 1.1 jmcneill }
3781 1.1 jmcneill
3782 1.1 jmcneill #ifndef STBI_NO_STDIO
3783 1.1 jmcneill stbi_uc *stbi_tga_load (char const *filename, int *x, int *y, int *comp, int req_comp)
3784 1.1 jmcneill {
3785 1.1 jmcneill stbi_uc *data;
3786 1.1 jmcneill FILE *f = fopen(filename, "rb");
3787 1.1 jmcneill if (!f) return NULL;
3788 1.1 jmcneill data = stbi_tga_load_from_file(f, x,y,comp,req_comp);
3789 1.1 jmcneill fclose(f);
3790 1.1 jmcneill return data;
3791 1.1 jmcneill }
3792 1.1 jmcneill
3793 1.1 jmcneill stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp)
3794 1.1 jmcneill {
3795 1.1 jmcneill stbi s;
3796 1.1 jmcneill start_file(&s, f);
3797 1.1 jmcneill return tga_load(&s, x,y,comp,req_comp);
3798 1.1 jmcneill }
3799 1.1 jmcneill #endif
3800 1.1 jmcneill
3801 1.1 jmcneill stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
3802 1.1 jmcneill {
3803 1.1 jmcneill stbi s;
3804 1.1 jmcneill start_mem(&s, buffer, len);
3805 1.1 jmcneill return tga_load(&s, x,y,comp,req_comp);
3806 1.1 jmcneill }
3807 1.1 jmcneill
3808 1.1 jmcneill
3809 1.1 jmcneill // *************************************************************************************************
3810 1.1 jmcneill // Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
3811 1.1 jmcneill
3812 1.1 jmcneill static int psd_test(stbi *s)
3813 1.1 jmcneill {
3814 1.1 jmcneill if (get32(s) != 0x38425053) return 0; // "8BPS"
3815 1.1 jmcneill else return 1;
3816 1.1 jmcneill }
3817 1.1 jmcneill
3818 1.1 jmcneill #ifndef STBI_NO_STDIO
3819 1.1 jmcneill int stbi_psd_test_file(FILE *f)
3820 1.1 jmcneill {
3821 1.1 jmcneill stbi s;
3822 1.1 jmcneill int r,n = ftell(f);
3823 1.1 jmcneill start_file(&s, f);
3824 1.1 jmcneill r = psd_test(&s);
3825 1.1 jmcneill fseek(f,n,SEEK_SET);
3826 1.1 jmcneill return r;
3827 1.1 jmcneill }
3828 1.1 jmcneill #endif
3829 1.1 jmcneill
3830 1.1 jmcneill int stbi_psd_test_memory(stbi_uc const *buffer, int len)
3831 1.1 jmcneill {
3832 1.1 jmcneill stbi s;
3833 1.1 jmcneill start_mem(&s, buffer, len);
3834 1.1 jmcneill return psd_test(&s);
3835 1.1 jmcneill }
3836 1.1 jmcneill
3837 1.1 jmcneill static stbi_uc *psd_load(stbi *s, int *x, int *y, int *comp, int req_comp)
3838 1.1 jmcneill {
3839 1.1 jmcneill int pixelCount;
3840 1.1 jmcneill int channelCount, compression;
3841 1.1 jmcneill int channel, i, count, len;
3842 1.1 jmcneill int w,h;
3843 1.1 jmcneill uint8 *out;
3844 1.1 jmcneill
3845 1.1 jmcneill // Check identifier
3846 1.1 jmcneill if (get32(s) != 0x38425053) // "8BPS"
3847 1.1 jmcneill return epuc("not PSD", "Corrupt PSD image");
3848 1.1 jmcneill
3849 1.1 jmcneill // Check file type version.
3850 1.1 jmcneill if (get16(s) != 1)
3851 1.1 jmcneill return epuc("wrong version", "Unsupported version of PSD image");
3852 1.1 jmcneill
3853 1.1 jmcneill // Skip 6 reserved bytes.
3854 1.1 jmcneill skip(s, 6 );
3855 1.1 jmcneill
3856 1.1 jmcneill // Read the number of channels (R, G, B, A, etc).
3857 1.1 jmcneill channelCount = get16(s);
3858 1.1 jmcneill if (channelCount < 0 || channelCount > 16)
3859 1.1 jmcneill return epuc("wrong channel count", "Unsupported number of channels in PSD image");
3860 1.1 jmcneill
3861 1.1 jmcneill // Read the rows and columns of the image.
3862 1.1 jmcneill h = get32(s);
3863 1.1 jmcneill w = get32(s);
3864 1.1 jmcneill
3865 1.1 jmcneill // Make sure the depth is 8 bits.
3866 1.1 jmcneill if (get16(s) != 8)
3867 1.1 jmcneill return epuc("unsupported bit depth", "PSD bit depth is not 8 bit");
3868 1.1 jmcneill
3869 1.1 jmcneill // Make sure the color mode is RGB.
3870 1.1 jmcneill // Valid options are:
3871 1.1 jmcneill // 0: Bitmap
3872 1.1 jmcneill // 1: Grayscale
3873 1.1 jmcneill // 2: Indexed color
3874 1.1 jmcneill // 3: RGB color
3875 1.1 jmcneill // 4: CMYK color
3876 1.1 jmcneill // 7: Multichannel
3877 1.1 jmcneill // 8: Duotone
3878 1.1 jmcneill // 9: Lab color
3879 1.1 jmcneill if (get16(s) != 3)
3880 1.1 jmcneill return epuc("wrong color format", "PSD is not in RGB color format");
3881 1.1 jmcneill
3882 1.1 jmcneill // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.)
3883 1.1 jmcneill skip(s,get32(s) );
3884 1.1 jmcneill
3885 1.1 jmcneill // Skip the image resources. (resolution, pen tool paths, etc)
3886 1.1 jmcneill skip(s, get32(s) );
3887 1.1 jmcneill
3888 1.1 jmcneill // Skip the reserved data.
3889 1.1 jmcneill skip(s, get32(s) );
3890 1.1 jmcneill
3891 1.1 jmcneill // Find out if the data is compressed.
3892 1.1 jmcneill // Known values:
3893 1.1 jmcneill // 0: no compression
3894 1.1 jmcneill // 1: RLE compressed
3895 1.1 jmcneill compression = get16(s);
3896 1.1 jmcneill if (compression > 1)
3897 1.1 jmcneill return epuc("bad compression", "PSD has an unknown compression format");
3898 1.1 jmcneill
3899 1.1 jmcneill // Create the destination image.
3900 1.7 christos out = MALLOC(4 * w*h);
3901 1.1 jmcneill if (!out) return epuc("outofmem", "Out of memory");
3902 1.1 jmcneill pixelCount = w*h;
3903 1.1 jmcneill
3904 1.1 jmcneill // Initialize the data to zero.
3905 1.1 jmcneill //memset( out, 0, pixelCount * 4 );
3906 1.1 jmcneill
3907 1.1 jmcneill // Finally, the image data.
3908 1.1 jmcneill if (compression) {
3909 1.1 jmcneill // RLE as used by .PSD and .TIFF
3910 1.1 jmcneill // Loop until you get the number of unpacked bytes you are expecting:
3911 1.1 jmcneill // Read the next source byte into n.
3912 1.1 jmcneill // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.
3913 1.1 jmcneill // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.
3914 1.1 jmcneill // Else if n is 128, noop.
3915 1.1 jmcneill // Endloop
3916 1.1 jmcneill
3917 1.1 jmcneill // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data,
3918 1.1 jmcneill // which we're going to just skip.
3919 1.1 jmcneill skip(s, h * channelCount * 2 );
3920 1.1 jmcneill
3921 1.1 jmcneill // Read the RLE data by channel.
3922 1.1 jmcneill for (channel = 0; channel < 4; channel++) {
3923 1.1 jmcneill uint8 *p;
3924 1.1 jmcneill
3925 1.1 jmcneill p = out+channel;
3926 1.1 jmcneill if (channel >= channelCount) {
3927 1.1 jmcneill // Fill this channel with default data.
3928 1.1 jmcneill for (i = 0; i < pixelCount; i++) *p = (channel == 3 ? 255 : 0), p += 4;
3929 1.1 jmcneill } else {
3930 1.1 jmcneill // Read the RLE data.
3931 1.1 jmcneill count = 0;
3932 1.1 jmcneill while (count < pixelCount) {
3933 1.1 jmcneill len = get8(s);
3934 1.1 jmcneill if (len == 128) {
3935 1.1 jmcneill // No-op.
3936 1.1 jmcneill } else if (len < 128) {
3937 1.1 jmcneill // Copy next len+1 bytes literally.
3938 1.1 jmcneill len++;
3939 1.1 jmcneill count += len;
3940 1.1 jmcneill while (len) {
3941 1.1 jmcneill *p = get8u(s);
3942 1.1 jmcneill p += 4;
3943 1.1 jmcneill len--;
3944 1.1 jmcneill }
3945 1.1 jmcneill } else if (len > 128) {
3946 1.1 jmcneill uint8 val;
3947 1.1 jmcneill // Next -len+1 bytes in the dest are replicated from next source byte.
3948 1.1 jmcneill // (Interpret len as a negative 8-bit int.)
3949 1.1 jmcneill len ^= 0x0FF;
3950 1.1 jmcneill len += 2;
3951 1.1 jmcneill val = get8u(s);
3952 1.1 jmcneill count += len;
3953 1.1 jmcneill while (len) {
3954 1.1 jmcneill *p = val;
3955 1.1 jmcneill p += 4;
3956 1.1 jmcneill len--;
3957 1.1 jmcneill }
3958 1.1 jmcneill }
3959 1.1 jmcneill }
3960 1.1 jmcneill }
3961 1.1 jmcneill }
3962 1.1 jmcneill
3963 1.1 jmcneill } else {
3964 1.1 jmcneill // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...)
3965 1.1 jmcneill // where each channel consists of an 8-bit value for each pixel in the image.
3966 1.1 jmcneill
3967 1.1 jmcneill // Read the data by channel.
3968 1.1 jmcneill for (channel = 0; channel < 4; channel++) {
3969 1.1 jmcneill uint8 *p;
3970 1.1 jmcneill
3971 1.1 jmcneill p = out + channel;
3972 1.1 jmcneill if (channel > channelCount) {
3973 1.1 jmcneill // Fill this channel with default data.
3974 1.1 jmcneill for (i = 0; i < pixelCount; i++) *p = channel == 3 ? 255 : 0, p += 4;
3975 1.1 jmcneill } else {
3976 1.1 jmcneill // Read the data.
3977 1.1 jmcneill for (i = 0; i < pixelCount; i++)
3978 1.1 jmcneill *p = get8u(s), p += 4;
3979 1.1 jmcneill }
3980 1.1 jmcneill }
3981 1.1 jmcneill }
3982 1.1 jmcneill
3983 1.1 jmcneill if (req_comp && req_comp != 4) {
3984 1.1 jmcneill out = convert_format(out, 4, req_comp, w, h);
3985 1.1 jmcneill if (out == NULL) return out; // convert_format frees input on failure
3986 1.1 jmcneill }
3987 1.1 jmcneill
3988 1.1 jmcneill if (comp) *comp = channelCount;
3989 1.1 jmcneill *y = h;
3990 1.1 jmcneill *x = w;
3991 1.1 jmcneill
3992 1.1 jmcneill return out;
3993 1.1 jmcneill }
3994 1.1 jmcneill
3995 1.1 jmcneill #ifndef STBI_NO_STDIO
3996 1.1 jmcneill stbi_uc *stbi_psd_load(char const *filename, int *x, int *y, int *comp, int req_comp)
3997 1.1 jmcneill {
3998 1.1 jmcneill stbi_uc *data;
3999 1.1 jmcneill FILE *f = fopen(filename, "rb");
4000 1.1 jmcneill if (!f) return NULL;
4001 1.1 jmcneill data = stbi_psd_load_from_file(f, x,y,comp,req_comp);
4002 1.1 jmcneill fclose(f);
4003 1.1 jmcneill return data;
4004 1.1 jmcneill }
4005 1.1 jmcneill
4006 1.1 jmcneill stbi_uc *stbi_psd_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
4007 1.1 jmcneill {
4008 1.1 jmcneill stbi s;
4009 1.1 jmcneill start_file(&s, f);
4010 1.1 jmcneill return psd_load(&s, x,y,comp,req_comp);
4011 1.1 jmcneill }
4012 1.1 jmcneill #endif
4013 1.1 jmcneill
4014 1.1 jmcneill stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
4015 1.1 jmcneill {
4016 1.1 jmcneill stbi s;
4017 1.1 jmcneill start_mem(&s, buffer, len);
4018 1.1 jmcneill return psd_load(&s, x,y,comp,req_comp);
4019 1.1 jmcneill }
4020 1.1 jmcneill
4021 1.1 jmcneill // *************************************************************************************************
4022 1.1 jmcneill // Softimage PIC loader
4023 1.1 jmcneill // by Tom Seddon
4024 1.1 jmcneill //
4025 1.1 jmcneill // See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
4026 1.1 jmcneill // See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
4027 1.1 jmcneill
4028 1.1 jmcneill static int pic_is4(stbi *s,const char *str)
4029 1.1 jmcneill {
4030 1.1 jmcneill int i;
4031 1.1 jmcneill for (i=0; i<4; ++i)
4032 1.1 jmcneill if (get8(s) != (stbi_uc)str[i])
4033 1.1 jmcneill return 0;
4034 1.1 jmcneill
4035 1.1 jmcneill return 1;
4036 1.1 jmcneill }
4037 1.1 jmcneill
4038 1.1 jmcneill static int pic_test(stbi *s)
4039 1.1 jmcneill {
4040 1.1 jmcneill int i;
4041 1.1 jmcneill
4042 1.1 jmcneill if (!pic_is4(s,"\x53\x80\xF6\x34"))
4043 1.1 jmcneill return 0;
4044 1.1 jmcneill
4045 1.1 jmcneill for(i=0;i<84;++i)
4046 1.1 jmcneill get8(s);
4047 1.1 jmcneill
4048 1.1 jmcneill if (!pic_is4(s,"PICT"))
4049 1.1 jmcneill return 0;
4050 1.1 jmcneill
4051 1.1 jmcneill return 1;
4052 1.1 jmcneill }
4053 1.1 jmcneill
4054 1.1 jmcneill typedef struct
4055 1.1 jmcneill {
4056 1.1 jmcneill stbi_uc size,type,channel;
4057 1.1 jmcneill } pic_packet_t;
4058 1.1 jmcneill
4059 1.1 jmcneill static stbi_uc *pic_readval(stbi *s, int channel, stbi_uc *dest)
4060 1.1 jmcneill {
4061 1.1 jmcneill int mask=0x80, i;
4062 1.1 jmcneill
4063 1.1 jmcneill for (i=0; i<4; ++i, mask>>=1) {
4064 1.1 jmcneill if (channel & mask) {
4065 1.1 jmcneill if (at_eof(s)) return epuc("bad file","PIC file too short");
4066 1.1 jmcneill dest[i]=get8u(s);
4067 1.1 jmcneill }
4068 1.1 jmcneill }
4069 1.1 jmcneill
4070 1.1 jmcneill return dest;
4071 1.1 jmcneill }
4072 1.1 jmcneill
4073 1.1 jmcneill static void pic_copyval(int channel,stbi_uc *dest,const stbi_uc *src)
4074 1.1 jmcneill {
4075 1.1 jmcneill int mask=0x80,i;
4076 1.1 jmcneill
4077 1.1 jmcneill for (i=0;i<4; ++i, mask>>=1)
4078 1.1 jmcneill if (channel&mask)
4079 1.1 jmcneill dest[i]=src[i];
4080 1.1 jmcneill }
4081 1.1 jmcneill
4082 1.1 jmcneill static stbi_uc *pic_load2(stbi *s,int width,int height,int *comp, stbi_uc *result)
4083 1.1 jmcneill {
4084 1.1 jmcneill int act_comp=0,num_packets=0,y,chained;
4085 1.1 jmcneill pic_packet_t packets[10];
4086 1.1 jmcneill
4087 1.1 jmcneill // this will (should...) cater for even some bizarre stuff like having data
4088 1.1 jmcneill // for the same channel in multiple packets.
4089 1.1 jmcneill do {
4090 1.1 jmcneill pic_packet_t *packet;
4091 1.1 jmcneill
4092 1.1 jmcneill if (num_packets==sizeof(packets)/sizeof(packets[0]))
4093 1.1 jmcneill return epuc("bad format","too many packets");
4094 1.1 jmcneill
4095 1.1 jmcneill packet = &packets[num_packets++];
4096 1.1 jmcneill
4097 1.1 jmcneill chained = get8(s);
4098 1.1 jmcneill packet->size = get8u(s);
4099 1.1 jmcneill packet->type = get8u(s);
4100 1.1 jmcneill packet->channel = get8u(s);
4101 1.1 jmcneill
4102 1.1 jmcneill act_comp |= packet->channel;
4103 1.1 jmcneill
4104 1.1 jmcneill if (at_eof(s)) return epuc("bad file","file too short (reading packets)");
4105 1.1 jmcneill if (packet->size != 8) return epuc("bad format","packet isn't 8bpp");
4106 1.1 jmcneill } while (chained);
4107 1.1 jmcneill
4108 1.1 jmcneill *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?
4109 1.1 jmcneill
4110 1.1 jmcneill for(y=0; y<height; ++y) {
4111 1.1 jmcneill int packet_idx;
4112 1.1 jmcneill
4113 1.1 jmcneill for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {
4114 1.1 jmcneill pic_packet_t *packet = &packets[packet_idx];
4115 1.1 jmcneill stbi_uc *dest = result+y*width*4;
4116 1.1 jmcneill
4117 1.1 jmcneill switch (packet->type) {
4118 1.1 jmcneill default:
4119 1.1 jmcneill return epuc("bad format","packet has bad compression type");
4120 1.1 jmcneill
4121 1.1 jmcneill case 0: {//uncompressed
4122 1.1 jmcneill int x;
4123 1.1 jmcneill
4124 1.1 jmcneill for(x=0;x<width;++x, dest+=4)
4125 1.1 jmcneill if (!pic_readval(s,packet->channel,dest))
4126 1.1 jmcneill return 0;
4127 1.1 jmcneill break;
4128 1.1 jmcneill }
4129 1.1 jmcneill
4130 1.1 jmcneill case 1://Pure RLE
4131 1.1 jmcneill {
4132 1.1 jmcneill int left=width, i;
4133 1.1 jmcneill
4134 1.1 jmcneill while (left>0) {
4135 1.1 jmcneill stbi_uc count,value[4];
4136 1.1 jmcneill
4137 1.1 jmcneill count=get8u(s);
4138 1.1 jmcneill if (at_eof(s)) return epuc("bad file","file too short (pure read count)");
4139 1.1 jmcneill
4140 1.1 jmcneill if (count > left)
4141 1.1 jmcneill count = (uint8) left;
4142 1.1 jmcneill
4143 1.1 jmcneill if (!pic_readval(s,packet->channel,value)) return 0;
4144 1.1 jmcneill
4145 1.1 jmcneill for(i=0; i<count; ++i,dest+=4)
4146 1.1 jmcneill pic_copyval(packet->channel,dest,value);
4147 1.1 jmcneill left -= count;
4148 1.1 jmcneill }
4149 1.1 jmcneill }
4150 1.1 jmcneill break;
4151 1.1 jmcneill
4152 1.1 jmcneill case 2: {//Mixed RLE
4153 1.1 jmcneill int left=width;
4154 1.1 jmcneill while (left>0) {
4155 1.1 jmcneill int count = get8(s), i;
4156 1.1 jmcneill if (at_eof(s)) return epuc("bad file","file too short (mixed read count)");
4157 1.1 jmcneill
4158 1.1 jmcneill if (count >= 128) { // Repeated
4159 1.1 jmcneill stbi_uc value[4];
4160 1.1 jmcneill
4161 1.1 jmcneill if (count==128)
4162 1.1 jmcneill count = get16(s);
4163 1.1 jmcneill else
4164 1.1 jmcneill count -= 127;
4165 1.1 jmcneill if (count > left)
4166 1.1 jmcneill return epuc("bad file","scanline overrun");
4167 1.1 jmcneill
4168 1.1 jmcneill if (!pic_readval(s,packet->channel,value))
4169 1.1 jmcneill return 0;
4170 1.1 jmcneill
4171 1.1 jmcneill for(i=0;i<count;++i, dest += 4)
4172 1.1 jmcneill pic_copyval(packet->channel,dest,value);
4173 1.1 jmcneill } else { // Raw
4174 1.1 jmcneill ++count;
4175 1.1 jmcneill if (count>left) return epuc("bad file","scanline overrun");
4176 1.1 jmcneill
4177 1.1 jmcneill for(i=0;i<count;++i, dest+=4)
4178 1.1 jmcneill if (!pic_readval(s,packet->channel,dest))
4179 1.1 jmcneill return 0;
4180 1.1 jmcneill }
4181 1.1 jmcneill left-=count;
4182 1.1 jmcneill }
4183 1.1 jmcneill break;
4184 1.1 jmcneill }
4185 1.1 jmcneill }
4186 1.1 jmcneill }
4187 1.1 jmcneill }
4188 1.1 jmcneill
4189 1.1 jmcneill return result;
4190 1.1 jmcneill }
4191 1.1 jmcneill
4192 1.1 jmcneill static stbi_uc *pic_load(stbi *s,int *px,int *py,int *comp,int req_comp)
4193 1.1 jmcneill {
4194 1.1 jmcneill stbi_uc *result;
4195 1.1 jmcneill int i, x,y;
4196 1.1 jmcneill
4197 1.1 jmcneill for (i=0; i<92; ++i)
4198 1.1 jmcneill get8(s);
4199 1.1 jmcneill
4200 1.1 jmcneill x = get16(s);
4201 1.1 jmcneill y = get16(s);
4202 1.1 jmcneill if (at_eof(s)) return epuc("bad file","file too short (pic header)");
4203 1.1 jmcneill if ((1 << 28) / x < y) return epuc("too large", "Image too large to decode");
4204 1.1 jmcneill
4205 1.1 jmcneill get32(s); //skip `ratio'
4206 1.1 jmcneill get16(s); //skip `fields'
4207 1.1 jmcneill get16(s); //skip `pad'
4208 1.1 jmcneill
4209 1.1 jmcneill // intermediate buffer is RGBA
4210 1.7 christos result = MALLOC(x*y*4);
4211 1.1 jmcneill memset(result, 0xff, x*y*4);
4212 1.1 jmcneill
4213 1.1 jmcneill if (!pic_load2(s,x,y,comp, result)) {
4214 1.1 jmcneill FREE(result);
4215 1.1 jmcneill result=0;
4216 1.1 jmcneill }
4217 1.1 jmcneill *px = x;
4218 1.1 jmcneill *py = y;
4219 1.1 jmcneill if (req_comp == 0) req_comp = *comp;
4220 1.1 jmcneill result=convert_format(result,4,req_comp,x,y);
4221 1.1 jmcneill
4222 1.1 jmcneill return result;
4223 1.1 jmcneill }
4224 1.1 jmcneill
4225 1.1 jmcneill int stbi_pic_test_memory(stbi_uc const *buffer, int len)
4226 1.1 jmcneill {
4227 1.1 jmcneill stbi s;
4228 1.1 jmcneill start_mem(&s,buffer,len);
4229 1.1 jmcneill return pic_test(&s);
4230 1.1 jmcneill }
4231 1.1 jmcneill
4232 1.1 jmcneill stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
4233 1.1 jmcneill {
4234 1.1 jmcneill stbi s;
4235 1.1 jmcneill start_mem(&s,buffer,len);
4236 1.1 jmcneill return pic_load(&s,x,y,comp,req_comp);
4237 1.1 jmcneill }
4238 1.1 jmcneill
4239 1.1 jmcneill #ifndef STBI_NO_STDIO
4240 1.1 jmcneill int stbi_pic_test_file(FILE *f)
4241 1.1 jmcneill {
4242 1.1 jmcneill int result;
4243 1.1 jmcneill long l = ftell(f);
4244 1.1 jmcneill stbi s;
4245 1.1 jmcneill start_file(&s,f);
4246 1.1 jmcneill result = pic_test(&s);
4247 1.1 jmcneill fseek(f,l,SEEK_SET);
4248 1.1 jmcneill return result;
4249 1.1 jmcneill }
4250 1.1 jmcneill
4251 1.1 jmcneill stbi_uc *stbi_pic_load(char const *filename,int *x, int *y, int *comp, int req_comp)
4252 1.1 jmcneill {
4253 1.1 jmcneill stbi_uc *result;
4254 1.1 jmcneill FILE *f=fopen(filename,"rb");
4255 1.1 jmcneill if (!f) return 0;
4256 1.1 jmcneill result = stbi_pic_load_from_file(f,x,y,comp,req_comp);
4257 1.1 jmcneill fclose(f);
4258 1.1 jmcneill return result;
4259 1.1 jmcneill }
4260 1.1 jmcneill
4261 1.1 jmcneill stbi_uc *stbi_pic_load_from_file(FILE *f,int *x, int *y, int *comp, int req_comp)
4262 1.1 jmcneill {
4263 1.1 jmcneill stbi s;
4264 1.1 jmcneill start_file(&s,f);
4265 1.1 jmcneill return pic_load(&s,x,y,comp,req_comp);
4266 1.1 jmcneill }
4267 1.1 jmcneill #endif
4268 1.1 jmcneill
4269 1.1 jmcneill // *************************************************************************************************
4270 1.1 jmcneill // GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
4271 1.1 jmcneill typedef struct stbi_gif_lzw_struct {
4272 1.1 jmcneill int16 prefix;
4273 1.1 jmcneill uint8 first;
4274 1.1 jmcneill uint8 suffix;
4275 1.1 jmcneill } stbi_gif_lzw;
4276 1.1 jmcneill
4277 1.1 jmcneill typedef struct stbi_gif_struct
4278 1.1 jmcneill {
4279 1.1 jmcneill int w,h;
4280 1.1 jmcneill stbi_uc *out; // output buffer (always 4 components)
4281 1.1 jmcneill int flags, bgindex, ratio, transparent, eflags;
4282 1.1 jmcneill uint8 pal[256][4];
4283 1.1 jmcneill uint8 lpal[256][4];
4284 1.1 jmcneill stbi_gif_lzw codes[4096];
4285 1.1 jmcneill uint8 *color_table;
4286 1.1 jmcneill int parse, step;
4287 1.1 jmcneill int lflags;
4288 1.1 jmcneill int start_x, start_y;
4289 1.1 jmcneill int max_x, max_y;
4290 1.1 jmcneill int cur_x, cur_y;
4291 1.1 jmcneill int line_size;
4292 1.1 jmcneill } stbi_gif;
4293 1.1 jmcneill
4294 1.1 jmcneill static int gif_test(stbi *s)
4295 1.1 jmcneill {
4296 1.1 jmcneill int sz;
4297 1.1 jmcneill if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8') return 0;
4298 1.1 jmcneill sz = get8(s);
4299 1.1 jmcneill if (sz != '9' && sz != '7') return 0;
4300 1.1 jmcneill if (get8(s) != 'a') return 0;
4301 1.1 jmcneill return 1;
4302 1.1 jmcneill }
4303 1.1 jmcneill
4304 1.1 jmcneill #ifndef STBI_NO_STDIO
4305 1.1 jmcneill int stbi_gif_test_file (FILE *f)
4306 1.1 jmcneill {
4307 1.1 jmcneill stbi s;
4308 1.1 jmcneill int r,n = ftell(f);
4309 1.1 jmcneill start_file(&s,f);
4310 1.1 jmcneill r = gif_test(&s);
4311 1.1 jmcneill fseek(f,n,SEEK_SET);
4312 1.1 jmcneill return r;
4313 1.1 jmcneill }
4314 1.1 jmcneill #endif
4315 1.1 jmcneill
4316 1.1 jmcneill int stbi_gif_test_memory (stbi_uc const *buffer, int len)
4317 1.1 jmcneill {
4318 1.1 jmcneill stbi s;
4319 1.1 jmcneill start_mem(&s, buffer, len);
4320 1.1 jmcneill return gif_test(&s);
4321 1.1 jmcneill }
4322 1.1 jmcneill
4323 1.1 jmcneill static void stbi_gif_parse_colortable(stbi *s, uint8 pal[256][4], int num_entries, int transp)
4324 1.1 jmcneill {
4325 1.1 jmcneill int i;
4326 1.1 jmcneill for (i=0; i < num_entries; ++i) {
4327 1.1 jmcneill pal[i][2] = get8u(s);
4328 1.1 jmcneill pal[i][1] = get8u(s);
4329 1.1 jmcneill pal[i][0] = get8u(s);
4330 1.1 jmcneill pal[i][3] = transp ? 0 : 255;
4331 1.1 jmcneill }
4332 1.1 jmcneill }
4333 1.1 jmcneill
4334 1.1 jmcneill static int stbi_gif_header(stbi *s, stbi_gif *g, int *comp, int is_info)
4335 1.1 jmcneill {
4336 1.1 jmcneill uint8 ver;
4337 1.1 jmcneill if (get8(s) != 'G' || get8(s) != 'I' || get8(s) != 'F' || get8(s) != '8')
4338 1.1 jmcneill return e("not GIF", "Corrupt GIF");
4339 1.1 jmcneill
4340 1.1 jmcneill ver = get8u(s);
4341 1.1 jmcneill if (ver != '7' && ver != '9') return e("not GIF", "Corrupt GIF");
4342 1.1 jmcneill if (get8(s) != 'a') return e("not GIF", "Corrupt GIF");
4343 1.1 jmcneill
4344 1.1 jmcneill failure_reason = "";
4345 1.1 jmcneill g->w = get16le(s);
4346 1.1 jmcneill g->h = get16le(s);
4347 1.1 jmcneill g->flags = get8(s);
4348 1.1 jmcneill g->bgindex = get8(s);
4349 1.1 jmcneill g->ratio = get8(s);
4350 1.1 jmcneill g->transparent = -1;
4351 1.1 jmcneill
4352 1.1 jmcneill if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments
4353 1.1 jmcneill
4354 1.1 jmcneill if (is_info) return 1;
4355 1.1 jmcneill
4356 1.1 jmcneill if (g->flags & 0x80)
4357 1.1 jmcneill stbi_gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);
4358 1.1 jmcneill
4359 1.1 jmcneill return 1;
4360 1.1 jmcneill }
4361 1.1 jmcneill
4362 1.1 jmcneill static int stbi_gif_info_raw(stbi *s, int *x, int *y, int *comp)
4363 1.1 jmcneill {
4364 1.1 jmcneill stbi_gif g;
4365 1.1 jmcneill if (!stbi_gif_header(s, &g, comp, 1)) return 0;
4366 1.1 jmcneill if (x) *x = g.w;
4367 1.1 jmcneill if (y) *y = g.h;
4368 1.1 jmcneill return 1;
4369 1.1 jmcneill }
4370 1.1 jmcneill
4371 1.1 jmcneill static void stbi_out_gif_code(stbi_gif *g, uint16 code)
4372 1.1 jmcneill {
4373 1.1 jmcneill uint8 *p, *c;
4374 1.1 jmcneill
4375 1.1 jmcneill // recurse to decode the prefixes, since the linked-list is backwards,
4376 1.1 jmcneill // and working backwards through an interleaved image would be nasty
4377 1.1 jmcneill if (g->codes[code].prefix >= 0)
4378 1.1 jmcneill stbi_out_gif_code(g, g->codes[code].prefix);
4379 1.1 jmcneill
4380 1.1 jmcneill if (g->cur_y >= g->max_y) return;
4381 1.1 jmcneill
4382 1.1 jmcneill p = &g->out[g->cur_x + g->cur_y];
4383 1.1 jmcneill c = &g->color_table[g->codes[code].suffix * 4];
4384 1.1 jmcneill
4385 1.1 jmcneill if (c[3] >= 128) {
4386 1.1 jmcneill p[0] = c[2];
4387 1.1 jmcneill p[1] = c[1];
4388 1.1 jmcneill p[2] = c[0];
4389 1.1 jmcneill p[3] = c[3];
4390 1.1 jmcneill }
4391 1.1 jmcneill g->cur_x += 4;
4392 1.1 jmcneill
4393 1.1 jmcneill if (g->cur_x >= g->max_x) {
4394 1.1 jmcneill g->cur_x = g->start_x;
4395 1.1 jmcneill g->cur_y += g->step;
4396 1.1 jmcneill
4397 1.1 jmcneill while (g->cur_y >= g->max_y && g->parse > 0) {
4398 1.1 jmcneill g->step = (1 << g->parse) * g->line_size;
4399 1.1 jmcneill g->cur_y = g->start_y + (g->step >> 1);
4400 1.1 jmcneill --g->parse;
4401 1.1 jmcneill }
4402 1.1 jmcneill }
4403 1.1 jmcneill }
4404 1.1 jmcneill
4405 1.1 jmcneill static uint8 *stbi_process_gif_raster(stbi *s, stbi_gif *g)
4406 1.1 jmcneill {
4407 1.1 jmcneill uint8 lzw_cs;
4408 1.1 jmcneill int32 len, code;
4409 1.1 jmcneill uint32 first;
4410 1.1 jmcneill int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;
4411 1.1 jmcneill stbi_gif_lzw *p;
4412 1.1 jmcneill
4413 1.1 jmcneill lzw_cs = get8u(s);
4414 1.1 jmcneill clear = 1 << lzw_cs;
4415 1.1 jmcneill first = 1;
4416 1.1 jmcneill codesize = lzw_cs + 1;
4417 1.1 jmcneill codemask = (1 << codesize) - 1;
4418 1.1 jmcneill bits = 0;
4419 1.1 jmcneill valid_bits = 0;
4420 1.1 jmcneill for (code = 0; code < clear; code++) {
4421 1.1 jmcneill g->codes[code].prefix = -1;
4422 1.1 jmcneill g->codes[code].first = (uint8) code;
4423 1.1 jmcneill g->codes[code].suffix = (uint8) code;
4424 1.1 jmcneill }
4425 1.1 jmcneill
4426 1.1 jmcneill // support no starting clear code
4427 1.1 jmcneill avail = clear+2;
4428 1.1 jmcneill oldcode = -1;
4429 1.1 jmcneill
4430 1.1 jmcneill len = 0;
4431 1.1 jmcneill for(;;) {
4432 1.1 jmcneill if (valid_bits < codesize) {
4433 1.1 jmcneill if (len == 0) {
4434 1.1 jmcneill len = get8(s); // start new block
4435 1.1 jmcneill if (len == 0)
4436 1.1 jmcneill return g->out;
4437 1.1 jmcneill }
4438 1.1 jmcneill --len;
4439 1.1 jmcneill bits |= (int32) get8(s) << valid_bits;
4440 1.1 jmcneill valid_bits += 8;
4441 1.1 jmcneill } else {
4442 1.1 jmcneill code = bits & codemask;
4443 1.1 jmcneill bits >>= codesize;
4444 1.1 jmcneill valid_bits -= codesize;
4445 1.1 jmcneill // @OPTIMIZE: is there some way we can accelerate the non-clear path?
4446 1.1 jmcneill if (code == clear) { // clear code
4447 1.1 jmcneill codesize = lzw_cs + 1;
4448 1.1 jmcneill codemask = (1 << codesize) - 1;
4449 1.1 jmcneill avail = clear + 2;
4450 1.1 jmcneill oldcode = -1;
4451 1.1 jmcneill first = 0;
4452 1.1 jmcneill } else if (code == clear + 1) { // end of stream code
4453 1.1 jmcneill skip(s, len);
4454 1.1 jmcneill while ((len = get8(s)) > 0)
4455 1.1 jmcneill skip(s,len);
4456 1.1 jmcneill return g->out;
4457 1.1 jmcneill } else if (code <= avail) {
4458 1.1 jmcneill if (first) return epuc("no clear code", "Corrupt GIF");
4459 1.1 jmcneill
4460 1.1 jmcneill if (oldcode >= 0) {
4461 1.1 jmcneill p = &g->codes[avail++];
4462 1.1 jmcneill if (avail > 4096) return epuc("too many codes", "Corrupt GIF");
4463 1.1 jmcneill p->prefix = (int16) oldcode;
4464 1.1 jmcneill p->first = g->codes[oldcode].first;
4465 1.1 jmcneill p->suffix = (code == avail) ? p->first : g->codes[code].first;
4466 1.1 jmcneill } else if (code == avail)
4467 1.1 jmcneill return epuc("illegal code in raster", "Corrupt GIF");
4468 1.1 jmcneill
4469 1.1 jmcneill stbi_out_gif_code(g, (uint16) code);
4470 1.1 jmcneill
4471 1.1 jmcneill if ((avail & codemask) == 0 && avail <= 0x0FFF) {
4472 1.1 jmcneill codesize++;
4473 1.1 jmcneill codemask = (1 << codesize) - 1;
4474 1.1 jmcneill }
4475 1.1 jmcneill
4476 1.1 jmcneill oldcode = code;
4477 1.1 jmcneill } else {
4478 1.1 jmcneill return epuc("illegal code in raster", "Corrupt GIF");
4479 1.1 jmcneill }
4480 1.1 jmcneill }
4481 1.1 jmcneill }
4482 1.1 jmcneill }
4483 1.1 jmcneill
4484 1.1 jmcneill static void stbi_fill_gif_background(stbi_gif *g)
4485 1.1 jmcneill {
4486 1.1 jmcneill int i;
4487 1.1 jmcneill uint8 *c = g->pal[g->bgindex];
4488 1.1 jmcneill // @OPTIMIZE: write a dword at a time
4489 1.1 jmcneill for (i = 0; i < g->w * g->h * 4; i += 4) {
4490 1.1 jmcneill uint8 *p = &g->out[i];
4491 1.1 jmcneill p[0] = c[2];
4492 1.1 jmcneill p[1] = c[1];
4493 1.1 jmcneill p[2] = c[0];
4494 1.1 jmcneill p[3] = c[3];
4495 1.1 jmcneill }
4496 1.1 jmcneill }
4497 1.1 jmcneill
4498 1.1 jmcneill // this function is designed to support animated gifs, although stb_image doesn't support it
4499 1.1 jmcneill static uint8 *stbi_gif_load_next(stbi *s, stbi_gif *g, int *comp, int req_comp)
4500 1.1 jmcneill {
4501 1.1 jmcneill int i;
4502 1.1 jmcneill uint8 *old_out = 0;
4503 1.1 jmcneill
4504 1.1 jmcneill if (g->out == 0) {
4505 1.1 jmcneill if (!stbi_gif_header(s, g, comp,0)) return 0; // failure_reason set by stbi_gif_header
4506 1.7 christos g->out = MALLOC(4 * g->w * g->h);
4507 1.1 jmcneill if (g->out == 0) return epuc("outofmem", "Out of memory");
4508 1.1 jmcneill stbi_fill_gif_background(g);
4509 1.1 jmcneill } else {
4510 1.1 jmcneill // animated-gif-only path
4511 1.1 jmcneill if (((g->eflags & 0x1C) >> 2) == 3) {
4512 1.1 jmcneill old_out = g->out;
4513 1.7 christos g->out = MALLOC(4 * g->w * g->h);
4514 1.1 jmcneill if (g->out == 0) return epuc("outofmem", "Out of memory");
4515 1.1 jmcneill memcpy(g->out, old_out, g->w*g->h*4);
4516 1.1 jmcneill }
4517 1.1 jmcneill }
4518 1.1 jmcneill
4519 1.1 jmcneill for (;;) {
4520 1.1 jmcneill switch (get8(s)) {
4521 1.1 jmcneill case 0x2C: /* Image Descriptor */
4522 1.1 jmcneill {
4523 1.1 jmcneill int32 x, y, w, h;
4524 1.1 jmcneill uint8 *o;
4525 1.1 jmcneill
4526 1.1 jmcneill x = get16le(s);
4527 1.1 jmcneill y = get16le(s);
4528 1.1 jmcneill w = get16le(s);
4529 1.1 jmcneill h = get16le(s);
4530 1.1 jmcneill if (((x + w) > (g->w)) || ((y + h) > (g->h)))
4531 1.1 jmcneill return epuc("bad Image Descriptor", "Corrupt GIF");
4532 1.1 jmcneill
4533 1.1 jmcneill g->line_size = g->w * 4;
4534 1.1 jmcneill g->start_x = x * 4;
4535 1.1 jmcneill g->start_y = y * g->line_size;
4536 1.1 jmcneill g->max_x = g->start_x + w * 4;
4537 1.1 jmcneill g->max_y = g->start_y + h * g->line_size;
4538 1.1 jmcneill g->cur_x = g->start_x;
4539 1.1 jmcneill g->cur_y = g->start_y;
4540 1.1 jmcneill
4541 1.1 jmcneill g->lflags = get8(s);
4542 1.1 jmcneill
4543 1.1 jmcneill if (g->lflags & 0x40) {
4544 1.1 jmcneill g->step = 8 * g->line_size; // first interlaced spacing
4545 1.1 jmcneill g->parse = 3;
4546 1.1 jmcneill } else {
4547 1.1 jmcneill g->step = g->line_size;
4548 1.1 jmcneill g->parse = 0;
4549 1.1 jmcneill }
4550 1.1 jmcneill
4551 1.1 jmcneill if (g->lflags & 0x80) {
4552 1.1 jmcneill stbi_gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);
4553 1.1 jmcneill g->color_table = (uint8 *) g->lpal;
4554 1.1 jmcneill } else if (g->flags & 0x80) {
4555 1.1 jmcneill for (i=0; i < 256; ++i) // @OPTIMIZE: reset only the previous transparent
4556 1.1 jmcneill g->pal[i][3] = 255;
4557 1.1 jmcneill if (g->transparent >= 0 && (g->eflags & 0x01))
4558 1.1 jmcneill g->pal[g->transparent][3] = 0;
4559 1.1 jmcneill g->color_table = (uint8 *) g->pal;
4560 1.1 jmcneill } else
4561 1.1 jmcneill return epuc("missing color table", "Corrupt GIF");
4562 1.1 jmcneill
4563 1.1 jmcneill o = stbi_process_gif_raster(s, g);
4564 1.1 jmcneill if (o == NULL) return NULL;
4565 1.1 jmcneill
4566 1.1 jmcneill if (req_comp && req_comp != 4)
4567 1.1 jmcneill o = convert_format(o, 4, req_comp, g->w, g->h);
4568 1.1 jmcneill return o;
4569 1.1 jmcneill }
4570 1.1 jmcneill
4571 1.1 jmcneill case 0x21: // Comment Extension.
4572 1.1 jmcneill {
4573 1.1 jmcneill int len;
4574 1.1 jmcneill if (get8(s) == 0xF9) { // Graphic Control Extension.
4575 1.1 jmcneill len = get8(s);
4576 1.1 jmcneill if (len == 4) {
4577 1.1 jmcneill g->eflags = get8(s);
4578 1.1 jmcneill get16le(s); // delay
4579 1.1 jmcneill g->transparent = get8(s);
4580 1.1 jmcneill } else {
4581 1.1 jmcneill skip(s, len);
4582 1.1 jmcneill break;
4583 1.1 jmcneill }
4584 1.1 jmcneill }
4585 1.1 jmcneill while ((len = get8(s)) != 0)
4586 1.1 jmcneill skip(s, len);
4587 1.1 jmcneill break;
4588 1.1 jmcneill }
4589 1.1 jmcneill
4590 1.1 jmcneill case 0x3B: // gif stream termination code
4591 1.1 jmcneill return (uint8 *) 1;
4592 1.1 jmcneill
4593 1.1 jmcneill default:
4594 1.1 jmcneill return epuc("unknown code", "Corrupt GIF");
4595 1.1 jmcneill }
4596 1.1 jmcneill }
4597 1.1 jmcneill }
4598 1.1 jmcneill
4599 1.1 jmcneill #ifndef STBI_NO_STDIO
4600 1.1 jmcneill stbi_uc *stbi_gif_load (char const *filename, int *x, int *y, int *comp, int req_comp)
4601 1.1 jmcneill {
4602 1.1 jmcneill uint8 *data;
4603 1.1 jmcneill FILE *f = fopen(filename, "rb");
4604 1.1 jmcneill if (!f) return NULL;
4605 1.1 jmcneill data = stbi_gif_load_from_file(f, x,y,comp,req_comp);
4606 1.1 jmcneill fclose(f);
4607 1.1 jmcneill return data;
4608 1.1 jmcneill }
4609 1.1 jmcneill
4610 1.1 jmcneill stbi_uc *stbi_gif_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp)
4611 1.1 jmcneill {
4612 1.1 jmcneill uint8 *u = 0;
4613 1.1 jmcneill stbi s;
4614 1.1 jmcneill stbi_gif g={0};
4615 1.1 jmcneill start_file(&s, f);
4616 1.1 jmcneill
4617 1.1 jmcneill u = stbi_gif_load_next(&s, &g, comp, req_comp);
4618 1.1 jmcneill if (u == (void *) 1) u = 0; // end of animated gif marker
4619 1.1 jmcneill if (u) {
4620 1.1 jmcneill *x = g.w;
4621 1.1 jmcneill *y = g.h;
4622 1.1 jmcneill }
4623 1.1 jmcneill
4624 1.1 jmcneill return u;
4625 1.1 jmcneill }
4626 1.1 jmcneill #endif
4627 1.1 jmcneill
4628 1.1 jmcneill stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
4629 1.1 jmcneill {
4630 1.1 jmcneill uint8 *u = 0;
4631 1.1 jmcneill stbi s;
4632 1.2 jmcneill stbi_gif *pg;
4633 1.2 jmcneill
4634 1.2 jmcneill #ifdef STBI_SMALL_STACK
4635 1.7 christos pg = MALLOC(sizeof(*pg));
4636 1.2 jmcneill if (pg == NULL)
4637 1.2 jmcneill return NULL;
4638 1.2 jmcneill #else
4639 1.1 jmcneill stbi_gif g;
4640 1.2 jmcneill pg = &g;
4641 1.2 jmcneill #endif
4642 1.1 jmcneill
4643 1.2 jmcneill memset(pg, 0, sizeof(*pg));
4644 1.1 jmcneill start_mem(&s, buffer, len);
4645 1.2 jmcneill u = stbi_gif_load_next(&s, pg, comp, req_comp);
4646 1.1 jmcneill if (u == (void *) 1) u = 0; // end of animated gif marker
4647 1.1 jmcneill if (u) {
4648 1.2 jmcneill *x = pg->w;
4649 1.2 jmcneill *y = pg->h;
4650 1.1 jmcneill }
4651 1.2 jmcneill
4652 1.2 jmcneill #ifdef STBI_SMALL_STACK
4653 1.2 jmcneill FREE(pg);
4654 1.2 jmcneill #endif
4655 1.2 jmcneill
4656 1.1 jmcneill return u;
4657 1.1 jmcneill }
4658 1.1 jmcneill
4659 1.1 jmcneill #ifndef STBI_NO_STDIO
4660 1.1 jmcneill int stbi_gif_info (char const *filename, int *x, int *y, int *comp)
4661 1.1 jmcneill {
4662 1.1 jmcneill int res;
4663 1.1 jmcneill FILE *f = fopen(filename, "rb");
4664 1.1 jmcneill if (!f) return 0;
4665 1.1 jmcneill res = stbi_gif_info_from_file(f, x, y, comp);
4666 1.1 jmcneill fclose(f);
4667 1.1 jmcneill return res;
4668 1.1 jmcneill }
4669 1.1 jmcneill
4670 1.1 jmcneill int stbi_gif_info_from_file(FILE *f, int *x, int *y, int *comp)
4671 1.1 jmcneill {
4672 1.1 jmcneill stbi s;
4673 1.1 jmcneill int res;
4674 1.1 jmcneill long n = ftell(f);
4675 1.1 jmcneill start_file(&s, f);
4676 1.1 jmcneill res = stbi_gif_info_raw(&s, x, y, comp);
4677 1.1 jmcneill fseek(f, n, SEEK_SET);
4678 1.1 jmcneill return res;
4679 1.1 jmcneill }
4680 1.1 jmcneill #endif // !STBI_NO_STDIO
4681 1.1 jmcneill
4682 1.1 jmcneill int stbi_gif_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
4683 1.1 jmcneill {
4684 1.1 jmcneill stbi s;
4685 1.1 jmcneill start_mem(&s, buffer, len);
4686 1.1 jmcneill return stbi_gif_info_raw(&s, x, y, comp);
4687 1.1 jmcneill }
4688 1.1 jmcneill
4689 1.1 jmcneill
4690 1.1 jmcneill
4691 1.1 jmcneill
4692 1.1 jmcneill // *************************************************************************************************
4693 1.1 jmcneill // Radiance RGBE HDR loader
4694 1.1 jmcneill // originally by Nicolas Schulz
4695 1.1 jmcneill #ifndef STBI_NO_HDR
4696 1.1 jmcneill static int hdr_test(stbi *s)
4697 1.1 jmcneill {
4698 1.1 jmcneill const char *signature = "#?RADIANCE\n";
4699 1.1 jmcneill int i;
4700 1.1 jmcneill for (i=0; signature[i]; ++i)
4701 1.1 jmcneill if (get8(s) != signature[i])
4702 1.1 jmcneill return 0;
4703 1.1 jmcneill return 1;
4704 1.1 jmcneill }
4705 1.1 jmcneill
4706 1.1 jmcneill int stbi_hdr_test_memory(stbi_uc const *buffer, int len)
4707 1.1 jmcneill {
4708 1.1 jmcneill stbi s;
4709 1.1 jmcneill start_mem(&s, buffer, len);
4710 1.1 jmcneill return hdr_test(&s);
4711 1.1 jmcneill }
4712 1.1 jmcneill
4713 1.1 jmcneill #ifndef STBI_NO_STDIO
4714 1.1 jmcneill int stbi_hdr_test_file(FILE *f)
4715 1.1 jmcneill {
4716 1.1 jmcneill stbi s;
4717 1.1 jmcneill int r,n = ftell(f);
4718 1.1 jmcneill start_file(&s, f);
4719 1.1 jmcneill r = hdr_test(&s);
4720 1.1 jmcneill fseek(f,n,SEEK_SET);
4721 1.1 jmcneill return r;
4722 1.1 jmcneill }
4723 1.1 jmcneill #endif
4724 1.1 jmcneill
4725 1.1 jmcneill #define HDR_BUFLEN 1024
4726 1.1 jmcneill static char *hdr_gettoken(stbi *z, char *buffer)
4727 1.1 jmcneill {
4728 1.1 jmcneill int len=0;
4729 1.1 jmcneill char c = '\0';
4730 1.1 jmcneill
4731 1.1 jmcneill c = (char) get8(z);
4732 1.1 jmcneill
4733 1.1 jmcneill while (!at_eof(z) && c != '\n') {
4734 1.1 jmcneill buffer[len++] = c;
4735 1.1 jmcneill if (len == HDR_BUFLEN-1) {
4736 1.1 jmcneill // flush to end of line
4737 1.1 jmcneill while (!at_eof(z) && get8(z) != '\n')
4738 1.1 jmcneill ;
4739 1.1 jmcneill break;
4740 1.1 jmcneill }
4741 1.1 jmcneill c = (char) get8(z);
4742 1.1 jmcneill }
4743 1.1 jmcneill
4744 1.1 jmcneill buffer[len] = 0;
4745 1.1 jmcneill return buffer;
4746 1.1 jmcneill }
4747 1.1 jmcneill
4748 1.1 jmcneill static void hdr_convert(float *output, stbi_uc *input, int req_comp)
4749 1.1 jmcneill {
4750 1.1 jmcneill if ( input[3] != 0 ) {
4751 1.1 jmcneill float f1;
4752 1.1 jmcneill // Exponent
4753 1.1 jmcneill f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));
4754 1.1 jmcneill if (req_comp <= 2)
4755 1.1 jmcneill output[0] = (input[0] + input[1] + input[2]) * f1 / 3;
4756 1.1 jmcneill else {
4757 1.1 jmcneill output[0] = input[0] * f1;
4758 1.1 jmcneill output[1] = input[1] * f1;
4759 1.1 jmcneill output[2] = input[2] * f1;
4760 1.1 jmcneill }
4761 1.1 jmcneill if (req_comp == 2) output[1] = 1;
4762 1.1 jmcneill if (req_comp == 4) output[3] = 1;
4763 1.1 jmcneill } else {
4764 1.1 jmcneill switch (req_comp) {
4765 1.1 jmcneill case 4: output[3] = 1; /* fallthrough */
4766 1.1 jmcneill case 3: output[0] = output[1] = output[2] = 0;
4767 1.1 jmcneill break;
4768 1.1 jmcneill case 2: output[1] = 1; /* fallthrough */
4769 1.1 jmcneill case 1: output[0] = 0;
4770 1.1 jmcneill break;
4771 1.1 jmcneill }
4772 1.1 jmcneill }
4773 1.1 jmcneill }
4774 1.1 jmcneill
4775 1.1 jmcneill
4776 1.1 jmcneill static float *hdr_load(stbi *s, int *x, int *y, int *comp, int req_comp)
4777 1.1 jmcneill {
4778 1.1 jmcneill char buffer[HDR_BUFLEN];
4779 1.1 jmcneill char *token;
4780 1.1 jmcneill int valid = 0;
4781 1.1 jmcneill int width, height;
4782 1.1 jmcneill stbi_uc *scanline;
4783 1.1 jmcneill float *hdr_data;
4784 1.1 jmcneill int len;
4785 1.1 jmcneill unsigned char count, value;
4786 1.1 jmcneill int i, j, k, c1,c2, z;
4787 1.1 jmcneill
4788 1.1 jmcneill
4789 1.1 jmcneill // Check identifier
4790 1.1 jmcneill if (strcmp(hdr_gettoken(s,buffer), "#?RADIANCE") != 0)
4791 1.1 jmcneill return epf("not HDR", "Corrupt HDR image");
4792 1.1 jmcneill
4793 1.1 jmcneill // Parse header
4794 1.1 jmcneill for(;;) {
4795 1.1 jmcneill token = hdr_gettoken(s,buffer);
4796 1.1 jmcneill if (token[0] == 0) break;
4797 1.1 jmcneill if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;
4798 1.1 jmcneill }
4799 1.1 jmcneill
4800 1.1 jmcneill if (!valid) return epf("unsupported format", "Unsupported HDR format");
4801 1.1 jmcneill
4802 1.1 jmcneill // Parse width and height
4803 1.1 jmcneill // can't use sscanf() if we're not using stdio!
4804 1.1 jmcneill token = hdr_gettoken(s,buffer);
4805 1.1 jmcneill if (strncmp(token, "-Y ", 3)) return epf("unsupported data layout", "Unsupported HDR format");
4806 1.1 jmcneill token += 3;
4807 1.1 jmcneill height = strtol(token, &token, 10);
4808 1.1 jmcneill while (*token == ' ') ++token;
4809 1.1 jmcneill if (strncmp(token, "+X ", 3)) return epf("unsupported data layout", "Unsupported HDR format");
4810 1.1 jmcneill token += 3;
4811 1.1 jmcneill width = strtol(token, NULL, 10);
4812 1.1 jmcneill
4813 1.1 jmcneill *x = width;
4814 1.1 jmcneill *y = height;
4815 1.1 jmcneill
4816 1.1 jmcneill *comp = 3;
4817 1.1 jmcneill if (req_comp == 0) req_comp = 3;
4818 1.1 jmcneill
4819 1.1 jmcneill // Read data
4820 1.7 christos hdr_data = MALLOC(height * width * req_comp * sizeof(float));
4821 1.1 jmcneill
4822 1.1 jmcneill // Load image data
4823 1.1 jmcneill // image data is stored as some number of sca
4824 1.1 jmcneill if ( width < 8 || width >= 32768) {
4825 1.1 jmcneill // Read flat data
4826 1.1 jmcneill for (j=0; j < height; ++j) {
4827 1.1 jmcneill for (i=0; i < width; ++i) {
4828 1.1 jmcneill stbi_uc rgbe[4];
4829 1.1 jmcneill main_decode_loop:
4830 1.1 jmcneill getn(s, rgbe, 4);
4831 1.1 jmcneill hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);
4832 1.1 jmcneill }
4833 1.1 jmcneill }
4834 1.1 jmcneill } else {
4835 1.1 jmcneill // Read RLE-encoded data
4836 1.1 jmcneill scanline = NULL;
4837 1.1 jmcneill
4838 1.1 jmcneill for (j = 0; j < height; ++j) {
4839 1.1 jmcneill c1 = get8(s);
4840 1.1 jmcneill c2 = get8(s);
4841 1.1 jmcneill len = get8(s);
4842 1.1 jmcneill if (c1 != 2 || c2 != 2 || (len & 0x80)) {
4843 1.1 jmcneill // not run-length encoded, so we have to actually use THIS data as a decoded
4844 1.1 jmcneill // pixel (note this can't be a valid pixel--one of RGB must be >= 128)
4845 1.1 jmcneill uint8 rgbe[4];
4846 1.1 jmcneill rgbe[0] = (uint8) c1;
4847 1.1 jmcneill rgbe[1] = (uint8) c2;
4848 1.1 jmcneill rgbe[2] = (uint8) len;
4849 1.1 jmcneill rgbe[3] = (uint8) get8u(s);
4850 1.1 jmcneill hdr_convert(hdr_data, rgbe, req_comp);
4851 1.1 jmcneill i = 1;
4852 1.1 jmcneill j = 0;
4853 1.1 jmcneill FREE(scanline);
4854 1.1 jmcneill goto main_decode_loop; // yes, this makes no sense
4855 1.1 jmcneill }
4856 1.1 jmcneill len <<= 8;
4857 1.1 jmcneill len |= get8(s);
4858 1.1 jmcneill if (len != width) { FREE(hdr_data); FREE(scanline); return epf("invalid decoded scanline length", "corrupt HDR"); }
4859 1.7 christos if (scanline == NULL) scanline = MALLOC(width * 4);
4860 1.1 jmcneill
4861 1.1 jmcneill for (k = 0; k < 4; ++k) {
4862 1.1 jmcneill i = 0;
4863 1.1 jmcneill while (i < width) {
4864 1.1 jmcneill count = get8u(s);
4865 1.1 jmcneill if (count > 128) {
4866 1.1 jmcneill // Run
4867 1.1 jmcneill value = get8u(s);
4868 1.1 jmcneill count -= 128;
4869 1.1 jmcneill for (z = 0; z < count; ++z)
4870 1.1 jmcneill scanline[i++ * 4 + k] = value;
4871 1.1 jmcneill } else {
4872 1.1 jmcneill // Dump
4873 1.1 jmcneill for (z = 0; z < count; ++z)
4874 1.1 jmcneill scanline[i++ * 4 + k] = get8u(s);
4875 1.1 jmcneill }
4876 1.1 jmcneill }
4877 1.1 jmcneill }
4878 1.1 jmcneill for (i=0; i < width; ++i)
4879 1.1 jmcneill hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);
4880 1.1 jmcneill }
4881 1.1 jmcneill FREE(scanline);
4882 1.1 jmcneill }
4883 1.1 jmcneill
4884 1.1 jmcneill return hdr_data;
4885 1.1 jmcneill }
4886 1.1 jmcneill
4887 1.1 jmcneill #ifndef STBI_NO_STDIO
4888 1.1 jmcneill float *stbi_hdr_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)
4889 1.1 jmcneill {
4890 1.1 jmcneill stbi s;
4891 1.1 jmcneill start_file(&s,f);
4892 1.1 jmcneill return hdr_load(&s,x,y,comp,req_comp);
4893 1.1 jmcneill }
4894 1.1 jmcneill #endif
4895 1.1 jmcneill
4896 1.1 jmcneill float *stbi_hdr_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)
4897 1.1 jmcneill {
4898 1.1 jmcneill stbi s;
4899 1.1 jmcneill start_mem(&s,buffer, len);
4900 1.1 jmcneill return hdr_load(&s,x,y,comp,req_comp);
4901 1.1 jmcneill }
4902 1.1 jmcneill
4903 1.1 jmcneill #endif // STBI_NO_HDR
4904 1.1 jmcneill
4905 1.1 jmcneill
4906 1.1 jmcneill #ifndef STBI_NO_STDIO
4907 1.1 jmcneill int stbi_info(char const *filename, int *x, int *y, int *comp)
4908 1.1 jmcneill {
4909 1.1 jmcneill FILE *f = fopen(filename, "rb");
4910 1.1 jmcneill int result;
4911 1.1 jmcneill if (!f) return e("can't fopen", "Unable to open file");
4912 1.1 jmcneill result = stbi_info_from_file(f, x, y, comp);
4913 1.1 jmcneill fclose(f);
4914 1.1 jmcneill return result;
4915 1.1 jmcneill }
4916 1.1 jmcneill
4917 1.1 jmcneill int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)
4918 1.1 jmcneill {
4919 1.1 jmcneill if (stbi_jpeg_info_from_file(f, x, y, comp))
4920 1.1 jmcneill return 1;
4921 1.1 jmcneill if (stbi_png_info_from_file(f, x, y, comp))
4922 1.1 jmcneill return 1;
4923 1.1 jmcneill if (stbi_gif_info_from_file(f, x, y, comp))
4924 1.1 jmcneill return 1;
4925 1.1 jmcneill // @TODO: stbi_bmp_info_from_file
4926 1.1 jmcneill // @TODO: stbi_psd_info_from_file
4927 1.1 jmcneill #ifndef STBI_NO_HDR
4928 1.1 jmcneill // @TODO: stbi_hdr_info_from_file
4929 1.1 jmcneill #endif
4930 1.1 jmcneill // test tga last because it's a crappy test!
4931 1.1 jmcneill if (stbi_tga_info_from_file(f, x, y, comp))
4932 1.1 jmcneill return 1;
4933 1.1 jmcneill return e("unknown image type", "Image not of any known type, or corrupt");
4934 1.1 jmcneill }
4935 1.1 jmcneill #endif // !STBI_NO_STDIO
4936 1.1 jmcneill
4937 1.1 jmcneill int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)
4938 1.1 jmcneill {
4939 1.1 jmcneill if (stbi_jpeg_info_from_memory(buffer, len, x, y, comp))
4940 1.1 jmcneill return 1;
4941 1.1 jmcneill if (stbi_png_info_from_memory(buffer, len, x, y, comp))
4942 1.1 jmcneill return 1;
4943 1.1 jmcneill if (stbi_gif_info_from_memory(buffer, len, x, y, comp))
4944 1.1 jmcneill return 1;
4945 1.1 jmcneill // @TODO: stbi_bmp_info_from_memory
4946 1.1 jmcneill // @TODO: stbi_psd_info_from_memory
4947 1.1 jmcneill #ifndef STBI_NO_HDR
4948 1.1 jmcneill // @TODO: stbi_hdr_info_from_memory
4949 1.1 jmcneill #endif
4950 1.1 jmcneill // test tga last because it's a crappy test!
4951 1.1 jmcneill if (stbi_tga_info_from_memory(buffer, len, x, y, comp))
4952 1.1 jmcneill return 1;
4953 1.1 jmcneill return e("unknown image type", "Image not of any known type, or corrupt");
4954 1.1 jmcneill }
4955 1.1 jmcneill
4956 1.1 jmcneill #endif // STBI_HEADER_FILE_ONLY
4957 1.1 jmcneill
4958 1.1 jmcneill /*
4959 1.1 jmcneill revision history:
4960 1.1 jmcneill 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville
4961 1.1 jmcneill 1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ)
4962 1.1 jmcneill 1.27 (2010-08-01)
4963 1.1 jmcneill cast-to-uint8 to fix warnings
4964 1.1 jmcneill 1.26 (2010-07-24)
4965 1.1 jmcneill fix bug in file buffering for PNG reported by SpartanJ
4966 1.1 jmcneill 1.25 (2010-07-17)
4967 1.1 jmcneill refix trans_data warning (Won Chun)
4968 1.1 jmcneill 1.24 (2010-07-12)
4969 1.1 jmcneill perf improvements reading from files on platforms with lock-heavy fgetc()
4970 1.1 jmcneill minor perf improvements for jpeg
4971 1.1 jmcneill deprecated type-specific functions so we'll get feedback if they're needed
4972 1.1 jmcneill attempt to fix trans_data warning (Won Chun)
4973 1.1 jmcneill 1.23 fixed bug in iPhone support
4974 1.1 jmcneill 1.22 (2010-07-10)
4975 1.1 jmcneill removed image *writing* support
4976 1.1 jmcneill removed image *writing* support
4977 1.1 jmcneill stbi_info support from Jetro Lauha
4978 1.1 jmcneill GIF support from Jean-Marc Lienher
4979 1.1 jmcneill iPhone PNG-extensions from James Brown
4980 1.1 jmcneill warning-fixes from Nicolas Schulz and Janez Zemva (i.e. Janez (U+017D)emva)
4981 1.1 jmcneill 1.21 fix use of 'uint8' in header (reported by jon blow)
4982 1.1 jmcneill 1.20 added support for Softimage PIC, by Tom Seddon
4983 1.1 jmcneill 1.19 bug in interlaced PNG corruption check (found by ryg)
4984 1.1 jmcneill 1.18 2008-08-02
4985 1.1 jmcneill fix a threading bug (local mutable static)
4986 1.1 jmcneill 1.17 support interlaced PNG
4987 1.1 jmcneill 1.16 major bugfix - convert_format converted one too many pixels
4988 1.1 jmcneill 1.15 initialize some fields for thread safety
4989 1.1 jmcneill 1.14 fix threadsafe conversion bug
4990 1.1 jmcneill header-file-only version (#define STBI_HEADER_FILE_ONLY before including)
4991 1.1 jmcneill 1.13 threadsafe
4992 1.1 jmcneill 1.12 const qualifiers in the API
4993 1.1 jmcneill 1.11 Support installable IDCT, colorspace conversion routines
4994 1.1 jmcneill 1.10 Fixes for 64-bit (don't use "unsigned long")
4995 1.1 jmcneill optimized upsampling by Fabian "ryg" Giesen
4996 1.1 jmcneill 1.09 Fix format-conversion for PSD code (bad global variables!)
4997 1.1 jmcneill 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz
4998 1.1 jmcneill 1.07 attempt to fix C++ warning/errors again
4999 1.1 jmcneill 1.06 attempt to fix C++ warning/errors again
5000 1.1 jmcneill 1.05 fix TGA loading to return correct *comp and use good luminance calc
5001 1.1 jmcneill 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free
5002 1.1 jmcneill 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR
5003 1.1 jmcneill 1.02 support for (subset of) HDR files, float interface for preferred access to them
5004 1.1 jmcneill 1.01 fix bug: possible bug in handling right-side up bmps... not sure
5005 1.1 jmcneill fix bug: the stbi_bmp_load() and stbi_tga_load() functions didn't work at all
5006 1.1 jmcneill 1.00 interface to zlib that skips zlib header
5007 1.1 jmcneill 0.99 correct handling of alpha in palette
5008 1.1 jmcneill 0.98 TGA loader by lonesock; dynamically add loaders (untested)
5009 1.1 jmcneill 0.97 jpeg errors on too large a file; also catch another malloc failure
5010 1.1 jmcneill 0.96 fix detection of invalid v value - particleman@mollyrocket forum
5011 1.1 jmcneill 0.95 during header scan, seek to markers in case of padding
5012 1.1 jmcneill 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same
5013 1.1 jmcneill 0.93 handle jpegtran output; verbose errors
5014 1.1 jmcneill 0.92 read 4,8,16,24,32-bit BMP files of several formats
5015 1.1 jmcneill 0.91 output 24-bit Windows 3.0 BMP files
5016 1.1 jmcneill 0.90 fix a few more warnings; bump version number to approach 1.0
5017 1.1 jmcneill 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd
5018 1.1 jmcneill 0.60 fix compiling as c++
5019 1.1 jmcneill 0.59 fix warnings: merge Dave Moore's -Wall fixes
5020 1.1 jmcneill 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian
5021 1.1 jmcneill 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less
5022 1.1 jmcneill than 16 available
5023 1.1 jmcneill 0.56 fix bug: zlib uncompressed mode len vs. nlen
5024 1.1 jmcneill 0.55 fix bug: restart_interval not initialized to 0
5025 1.1 jmcneill 0.54 allow NULL for 'int *comp'
5026 1.1 jmcneill 0.53 fix bug in png 3->4; speedup png decoding
5027 1.1 jmcneill 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments
5028 1.1 jmcneill 0.51 obey req_comp requests, 1-component jpegs return as 1-component,
5029 1.1 jmcneill on 'test' only check type, not whether we support this variant
5030 1.1 jmcneill */
5031