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