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