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