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