yum-mirror/slang
Making it easier to work with shaders
git clone https://git.yummers.dev/yum-mirror/slang
58858297f
master
1/* stb_image - v2.28 - public domain image loader - http://nothings.org/stb 2no warranty implied; use at your own risk 3 4Do this: 5#define STB_IMAGE_IMPLEMENTATION 6before you include this file in *one* C or C++ file to create the implementation. 7 8// i.e. it should look like this: 9#include ... 10#include ... 11#include ... 12#define STB_IMAGE_IMPLEMENTATION 13#include "stb_image.h" 14 15You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. 16And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free 17 18 19QUICK NOTES: 20Primarily of interest to game developers and other people who can 21avoid problematic images and only need the trivial interface 22 23JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) 24PNG 1/2/4/8/16-bit-per-channel 25 26TGA (not sure what subset, if a subset) 27BMP non-1bpp, non-RLE 28PSD (composited view only, no extra channels, 8/16 bit-per-channel) 29 30GIF (*comp always reports as 4-channel) 31HDR (radiance rgbE format) 32PIC (Softimage PIC) 33PNM (PPM and PGM binary only) 34 35Animated GIF still needs a proper API, but here's one way to do it: 36http://gist.github.com/urraka/685d9a6340b26b830d49 37 38- decode from memory or through FILE (define STBI_NO_STDIO to remove code) 39- decode from arbitrary I/O callbacks 40- SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) 41 42Full documentation under "DOCUMENTATION" below. 43 44 45LICENSE 46 47See end of file for license information. 48 49RECENT REVISION HISTORY: 50 512.28 (2023-01-29) many error fixes, security errors, just tons of stuff 522.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes 532.26 (2020-07-13) many minor fixes 542.25 (2020-02-02) fix warnings 552.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically 562.23 (2019-08-11) fix clang static analysis warning 572.22 (2019-03-04) gif fixes, fix warnings 582.21 (2019-02-25) fix typo in comment 592.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs 602.19 (2018-02-11) fix warning 612.18 (2018-01-30) fix warnings 622.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings 632.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes 642.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC 652.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs 662.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes 672.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes 682.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 69RGB-format JPEG; remove white matting in PSD; 70allocate large structures on the stack; 71correct channel count for PNG & BMP 722.10 (2016-01-22) avoid warning introduced in 2.09 732.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED 74 75See end of file for full revision history. 76 77 78============================ Contributors ========================= 79 80Image formats Extensions, features 81Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) 82Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) 83Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) 84Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) 85Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) 86Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) 87Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) 88github:urraka (animated gif) Junggon Kim (PNM comments) 89Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) 90socks-the-fox (16-bit PNG) 91Jeremy Sawicki (handle all ImageNet JPGs) 92Optimizations & bugfixes Mikhail Morozov (1-bit BMP) 93Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) 94Arseny Kapoulkine Simon Breuss (16-bit PNM) 95John-Mark Allen 96Carmelo J Fdez-Aguera 97 98Bug & warning fixes 99Marc LeBlanc David Woo Guillaume George Martins Mozeiko 100Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski 101Phil Jordan Dave Moore Roy Eltham 102Hayaki Saito Nathan Reed Won Chun 103Luke Graham Johan Duparc Nick Verigakis the Horde3D community 104Thomas Ruf Ronny Chevalier github:rlyeh 105Janez Zemva John Bartholomew Michal Cichon github:romigrou 106Jonathan Blow Ken Hamada Tero Hanninen github:svdijk 107Eugene Golushkov Laurent Gomila Cort Stratton github:snagar 108Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex 109Cass Everitt Ryamond Barbiero github:grim210 110Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw 111Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus 112Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo 113Julian Raschke Gregory Mullen Christian Floisand github:darealshinji 114Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 115Brad Weinberger Matvey Cherevko github:mosra 116Luca Sas Alexander Veselov Zack Middleton [reserved] 117Ryan C. Gordon [reserved] [reserved] 118DO NOT ADD YOUR NAME HERE 119 120Jacko Dirks 121 122To add your name to the credits, pick a random blank space in the middle and fill it. 12380% of merge conflicts on stb PRs are due to people adding their name at the end 124of the credits. 125*/ 126 127#ifndef STBI_INCLUDE_STB_IMAGE_H 128#define STBI_INCLUDE_STB_IMAGE_H 129 130// DOCUMENTATION 131// 132// Limitations: 133// - no 12-bit-per-channel JPEG 134// - no JPEGs with arithmetic coding 135// - GIF always returns *comp=4 136// 137// Basic usage (see HDR discussion below for HDR usage): 138// int x,y,n; 139// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); 140// // ... process data if not NULL ... 141// // ... x = width, y = height, n = # 8-bit components per pixel ... 142// // ... replace '0' with '1'..'4' to force that many components per pixel 143// // ... but 'n' will always be the number that it would have been if you said 0 144// stbi_image_free(data); 145// 146// Standard parameters: 147// int *x -- outputs image width in pixels 148// int *y -- outputs image height in pixels 149// int *channels_in_file -- outputs # of image components in image file 150// int desired_channels -- if non-zero, # of image components requested in result 151// 152// The return value from an image loader is an 'unsigned char *' which points 153// to the pixel data, or NULL on an allocation failure or if the image is 154// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, 155// with each pixel consisting of N interleaved 8-bit components; the first 156// pixel pointed to is top-left-most in the image. There is no padding between 157// image scanlines or between pixels, regardless of format. The number of 158// components N is 'desired_channels' if desired_channels is non-zero, or 159// *channels_in_file otherwise. If desired_channels is non-zero, 160// *channels_in_file has the number of components that _would_ have been 161// output otherwise. E.g. if you set desired_channels to 4, you will always 162// get RGBA output, but you can check *channels_in_file to see if it's trivially 163// opaque because e.g. there were only 3 channels in the source image. 164// 165// An output image with N components has the following components interleaved 166// in this order in each pixel: 167// 168// N=#comp components 169// 1 grey 170// 2 grey, alpha 171// 3 red, green, blue 172// 4 red, green, blue, alpha 173// 174// If image loading fails for any reason, the return value will be NULL, 175// and *x, *y, *channels_in_file will be unchanged. The function 176// stbi_failure_reason() can be queried for an extremely brief, end-user 177// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS 178// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly 179// more user-friendly ones. 180// 181// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. 182// 183// To query the width, height and component count of an image without having to 184// decode the full file, you can use the stbi_info family of functions: 185// 186// int x,y,n,ok; 187// ok = stbi_info(filename, &x, &y, &n); 188// // returns ok=1 and sets x, y, n if image is a supported format, 189// // 0 otherwise. 190// 191// Note that stb_image pervasively uses ints in its public API for sizes, 192// including sizes of memory buffers. This is now part of the API and thus 193// hard to change without causing breakage. As a result, the various image 194// loaders all have certain limits on image size; these differ somewhat 195// by format but generally boil down to either just under 2GB or just under 196// 1GB. When the decoded image would be larger than this, stb_image decoding 197// will fail. 198// 199// Additionally, stb_image will reject image files that have any of their 200// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, 201// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, 202// the only way to have an image with such dimensions load correctly 203// is for it to have a rather extreme aspect ratio. Either way, the 204// assumption here is that such larger images are likely to be malformed 205// or malicious. If you do need to load an image with individual dimensions 206// larger than that, and it still fits in the overall size limit, you can 207// #define STBI_MAX_DIMENSIONS on your own to be something larger. 208// 209// =========================================================================== 210// 211// UNICODE: 212// 213// If compiling for Windows and you wish to use Unicode filenames, compile 214// with 215// #define STBI_WINDOWS_UTF8 216// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert 217// Windows wchar_t filenames to utf8. 218// 219// =========================================================================== 220// 221// Philosophy 222// 223// stb libraries are designed with the following priorities: 224// 225// 1. easy to use 226// 2. easy to maintain 227// 3. good performance 228// 229// Sometimes I let "good performance" creep up in priority over "easy to maintain", 230// and for best performance I may provide less-easy-to-use APIs that give higher 231// performance, in addition to the easy-to-use ones. Nevertheless, it's important 232// to keep in mind that from the standpoint of you, a client of this library, 233// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. 234// 235// Some secondary priorities arise directly from the first two, some of which 236// provide more explicit reasons why performance can't be emphasized. 237// 238// - Portable ("ease of use") 239// - Small source code footprint ("easy to maintain") 240// - No dependencies ("ease of use") 241// 242// =========================================================================== 243// 244// I/O callbacks 245// 246// I/O callbacks allow you to read from arbitrary sources, like packaged 247// files or some other source. Data read from callbacks are processed 248// through a small internal buffer (currently 128 bytes) to try to reduce 249// overhead. 250// 251// The three functions you must define are "read" (reads some bytes of data), 252// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). 253// 254// =========================================================================== 255// 256// SIMD support 257// 258// The JPEG decoder will try to automatically use SIMD kernels on x86 when 259// supported by the compiler. For ARM Neon support, you must explicitly 260// request it. 261// 262// (The old do-it-yourself SIMD API is no longer supported in the current 263// code.) 264// 265// On x86, SSE2 will automatically be used when available based on a run-time 266// test; if not, the generic C versions are used as a fall-back. On ARM targets, 267// the typical path is to have separate builds for NEON and non-NEON devices 268// (at least this is true for iOS and Android). Therefore, the NEON support is 269// toggled by a build flag: define STBI_NEON to get NEON loops. 270// 271// If for some reason you do not want to use any of SIMD code, or if 272// you have issues compiling it, you can disable it entirely by 273// defining STBI_NO_SIMD. 274// 275// =========================================================================== 276// 277// HDR image support (disable by defining STBI_NO_HDR) 278// 279// stb_image supports loading HDR images in general, and currently the Radiance 280// .HDR file format specifically. You can still load any file through the existing 281// interface; if you attempt to load an HDR file, it will be automatically remapped 282// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; 283// both of these constants can be reconfigured through this interface: 284// 285// stbi_hdr_to_ldr_gamma(2.2f); 286// stbi_hdr_to_ldr_scale(1.0f); 287// 288// (note, do not use _inverse_ constants; stbi_image will invert them 289// appropriately). 290// 291// Additionally, there is a new, parallel interface for loading files as 292// (linear) floats to preserve the full dynamic range: 293// 294// float *data = stbi_loadf(filename, &x, &y, &n, 0); 295// 296// If you load LDR images through this interface, those images will 297// be promoted to floating point values, run through the inverse of 298// constants corresponding to the above: 299// 300// stbi_ldr_to_hdr_scale(1.0f); 301// stbi_ldr_to_hdr_gamma(2.2f); 302// 303// Finally, given a filename (or an open file or memory block--see header 304// file for details) containing image data, you can query for the "most 305// appropriate" interface to use (that is, whether the image is HDR or 306// not), using: 307// 308// stbi_is_hdr(char *filename); 309// 310// =========================================================================== 311// 312// iPhone PNG support: 313// 314// We optionally support converting iPhone-formatted PNGs (which store 315// premultiplied BGRA) back to RGB, even though they're internally encoded 316// differently. To enable this conversion, call 317// stbi_convert_iphone_png_to_rgb(1). 318// 319// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per 320// pixel to remove any premultiplied alpha *only* if the image file explicitly 321// says there's premultiplied data (currently only happens in iPhone images, 322// and only if iPhone convert-to-rgb processing is on). 323// 324// =========================================================================== 325// 326// ADDITIONAL CONFIGURATION 327// 328// - You can suppress implementation of any of the decoders to reduce 329// your code footprint by #defining one or more of the following 330// symbols before creating the implementation. 331// 332// STBI_NO_JPEG 333// STBI_NO_PNG 334// STBI_NO_BMP 335// STBI_NO_PSD 336// STBI_NO_TGA 337// STBI_NO_GIF 338// STBI_NO_HDR 339// STBI_NO_PIC 340// STBI_NO_PNM (.ppm and .pgm) 341// 342// - You can request *only* certain decoders and suppress all other ones 343// (this will be more forward-compatible, as addition of new decoders 344// doesn't require you to disable them explicitly): 345// 346// STBI_ONLY_JPEG 347// STBI_ONLY_PNG 348// STBI_ONLY_BMP 349// STBI_ONLY_PSD 350// STBI_ONLY_TGA 351// STBI_ONLY_GIF 352// STBI_ONLY_HDR 353// STBI_ONLY_PIC 354// STBI_ONLY_PNM (.ppm and .pgm) 355// 356// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still 357// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB 358// 359// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater 360// than that size (in either width or height) without further processing. 361// This is to let programs in the wild set an upper bound to prevent 362// denial-of-service attacks on untrusted data, as one could generate a 363// valid image of gigantic dimensions and force stb_image to allocate a 364// huge block of memory and spend disproportionate time decoding it. By 365// default this is set to (1 << 24), which is 16777216, but that's still 366// very big. 367 368#ifndef STBI_NO_STDIO 369#include <stdio.h> 370#endif // STBI_NO_STDIO 371 372#define STBI_VERSION 1 373 374enum 375{ 376STBI_default = 0 ,// only used for desired_channels 377 378STBI_grey = 1 , 379STBI_grey_alpha = 2 , 380STBI_rgb = 3 , 381STBI_rgb_alpha = 4 382}; 383 384#include <stdlib.h> 385typedef unsigned char stbi_uc ; 386typedef unsigned short stbi_us ; 387 388#ifdef __cplusplus 389extern "C" { 390#endif 391 392#ifndef STBIDEF 393#ifdef STB_IMAGE_STATIC 394#define STBIDEF static 395#else 396#define STBIDEF extern 397#endif 398#endif 399 400////////////////////////////////////////////////////////////////////////////// 401// 402// PRIMARY API - works on images of any type 403// 404 405// 406// load image by filename, open file, or memory buffer 407// 408 409typedef struct 410{ 411int (* read ) (void * user ,char * data ,int size );// fill 'data' with 'size' bytes. return number of bytes actually read 412void (* skip ) (void * user ,int n );// skip the next 'n' bytes, or 'unget' the last -n bytes if negative 413int (* eof ) (void * user );// returns nonzero if we are at end of file/data 414}stbi_io_callbacks ; 415 416//////////////////////////////////// 417// 418// 8-bits-per-channel interface 419// 420 421STBIDEF stbi_uc * stbi_load_from_memory (stbi_uc const * buffer ,int len ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 422STBIDEF stbi_uc * stbi_load_from_callbacks (stbi_io_callbacks const * clbk ,void * user ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 423 424#ifndef STBI_NO_STDIO 425STBIDEF stbi_uc * stbi_load (char const * filename ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 426STBIDEF stbi_uc * stbi_load_from_file (FILE * f ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 427// for stbi_load_from_file, file pointer is left pointing immediately after image 428#endif 429 430#ifndef STBI_NO_GIF 431STBIDEF stbi_uc * stbi_load_gif_from_memory (stbi_uc const * buffer ,int len ,int ** delays ,int * x ,int * y ,int * z ,int * comp ,int req_comp ); 432#endif 433 434#ifdef STBI_WINDOWS_UTF8 435STBIDEF int stbi_convert_wchar_to_utf8 (char * buffer ,size_t bufferlen ,const wchar_t * input ); 436#endif 437 438//////////////////////////////////// 439// 440// 16-bits-per-channel interface 441// 442 443STBIDEF stbi_us * stbi_load_16_from_memory (stbi_uc const * buffer ,int len ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 444STBIDEF stbi_us * stbi_load_16_from_callbacks (stbi_io_callbacks const * clbk ,void * user ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 445 446#ifndef STBI_NO_STDIO 447STBIDEF stbi_us * stbi_load_16 (char const * filename ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 448STBIDEF stbi_us * stbi_load_from_file_16 (FILE * f ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 449#endif 450 451//////////////////////////////////// 452// 453// float-per-channel interface 454// 455#ifndef STBI_NO_LINEAR 456STBIDEF float * stbi_loadf_from_memory (stbi_uc const * buffer ,int len ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 457STBIDEF float * stbi_loadf_from_callbacks (stbi_io_callbacks const * clbk ,void * user ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 458 459#ifndef STBI_NO_STDIO 460STBIDEF float * stbi_loadf (char const * filename ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 461STBIDEF float * stbi_loadf_from_file (FILE * f ,int * x ,int * y ,int * channels_in_file ,int desired_channels ); 462#endif 463#endif 464 465#ifndef STBI_NO_HDR 466STBIDEF void stbi_hdr_to_ldr_gamma (float gamma ); 467STBIDEF void stbi_hdr_to_ldr_scale (float scale ); 468#endif // STBI_NO_HDR 469 470#ifndef STBI_NO_LINEAR 471STBIDEF void stbi_ldr_to_hdr_gamma (float gamma ); 472STBIDEF void stbi_ldr_to_hdr_scale (float scale ); 473#endif // STBI_NO_LINEAR 474 475// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR 476STBIDEF int stbi_is_hdr_from_callbacks (stbi_io_callbacks const * clbk ,void * user ); 477STBIDEF int stbi_is_hdr_from_memory (stbi_uc const * buffer ,int len ); 478#ifndef STBI_NO_STDIO 479STBIDEF int stbi_is_hdr (char const * filename ); 480STBIDEF int stbi_is_hdr_from_file (FILE * f ); 481#endif // STBI_NO_STDIO 482 483 484// get a VERY brief reason for failure 485// on most compilers (and ALL modern mainstream compilers) this is threadsafe 486STBIDEF const char * stbi_failure_reason (void ); 487 488// free the loaded image -- this is just free() 489STBIDEF void stbi_image_free (void * retval_from_stbi_load ); 490 491// get image dimensions & components without fully decoding 492STBIDEF int stbi_info_from_memory (stbi_uc const * buffer ,int len ,int * x ,int * y ,int * comp ); 493STBIDEF int stbi_info_from_callbacks (stbi_io_callbacks const * clbk ,void * user ,int * x ,int * y ,int * comp ); 494STBIDEF int stbi_is_16_bit_from_memory (stbi_uc const * buffer ,int len ); 495STBIDEF int stbi_is_16_bit_from_callbacks (stbi_io_callbacks const * clbk ,void * user ); 496 497#ifndef STBI_NO_STDIO 498STBIDEF int stbi_info (char const * filename ,int * x ,int * y ,int * comp ); 499STBIDEF int stbi_info_from_file (FILE * f ,int * x ,int * y ,int * comp ); 500STBIDEF int stbi_is_16_bit (char const * filename ); 501STBIDEF int stbi_is_16_bit_from_file (FILE * f ); 502#endif 503 504 505 506// for image formats that explicitly notate that they have premultiplied alpha, 507// we just return the colors as stored in the file. set this flag to force 508// unpremultiplication. results are undefined if the unpremultiply overflow. 509STBIDEF void stbi_set_unpremultiply_on_load (int flag_true_if_should_unpremultiply ); 510 511// indicate whether we should process iphone images back to canonical format, 512// or just pass them through "as-is" 513STBIDEF void stbi_convert_iphone_png_to_rgb (int flag_true_if_should_convert ); 514 515// flip the image vertically, so the first pixel in the output array is the bottom left 516STBIDEF void stbi_set_flip_vertically_on_load (int flag_true_if_should_flip ); 517 518// as above, but only applies to images loaded on the thread that calls the function 519// this function is only available if your compiler supports thread-local variables; 520// calling it will fail to link if your compiler doesn't 521STBIDEF void stbi_set_unpremultiply_on_load_thread (int flag_true_if_should_unpremultiply ); 522STBIDEF void stbi_convert_iphone_png_to_rgb_thread (int flag_true_if_should_convert ); 523STBIDEF void stbi_set_flip_vertically_on_load_thread (int flag_true_if_should_flip ); 524 525// ZLIB client - used by PNG, available for other purposes 526 527STBIDEF char * stbi_zlib_decode_malloc_guesssize (const char * buffer ,int len ,int initial_size ,int * outlen ); 528STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag (const char * buffer ,int len ,int initial_size ,int * outlen ,int parse_header ); 529STBIDEF char * stbi_zlib_decode_malloc (const char * buffer ,int len ,int * outlen ); 530STBIDEF int stbi_zlib_decode_buffer (char * obuffer ,int olen ,const char * ibuffer ,int ilen ); 531 532STBIDEF char * stbi_zlib_decode_noheader_malloc (const char * buffer ,int len ,int * outlen ); 533STBIDEF int stbi_zlib_decode_noheader_buffer (char * obuffer ,int olen ,const char * ibuffer ,int ilen ); 534 535 536#ifdef __cplusplus 537} 538#endif 539 540// 541// 542//// end header file ///////////////////////////////////////////////////// 543#endif // STBI_INCLUDE_STB_IMAGE_H 544 545#ifdef STB_IMAGE_IMPLEMENTATION 546 547#if defined(STBI_ONLY_JPEG )|| defined(STBI_ONLY_PNG )|| defined(STBI_ONLY_BMP ) \ 548|| defined(STBI_ONLY_TGA )|| defined(STBI_ONLY_GIF )|| defined(STBI_ONLY_PSD ) \ 549|| defined(STBI_ONLY_HDR )|| defined(STBI_ONLY_PIC )|| defined(STBI_ONLY_PNM ) \ 550|| defined(STBI_ONLY_ZLIB ) 551#ifndef STBI_ONLY_JPEG 552#define STBI_NO_JPEG 553#endif 554#ifndef STBI_ONLY_PNG 555#define STBI_NO_PNG 556#endif 557#ifndef STBI_ONLY_BMP 558#define STBI_NO_BMP 559#endif 560#ifndef STBI_ONLY_PSD 561#define STBI_NO_PSD 562#endif 563#ifndef STBI_ONLY_TGA 564#define STBI_NO_TGA 565#endif 566#ifndef STBI_ONLY_GIF 567#define STBI_NO_GIF 568#endif 569#ifndef STBI_ONLY_HDR 570#define STBI_NO_HDR 571#endif 572#ifndef STBI_ONLY_PIC 573#define STBI_NO_PIC 574#endif 575#ifndef STBI_ONLY_PNM 576#define STBI_NO_PNM 577#endif 578#endif 579 580#if defined(STBI_NO_PNG )&& !defined(STBI_SUPPORT_ZLIB )&& !defined(STBI_NO_ZLIB ) 581#define STBI_NO_ZLIB 582#endif 583 584 585#include <stdarg.h> 586#include <stddef.h> // ptrdiff_t on osx 587#include <stdlib.h> 588#include <string.h> 589#include <limits.h> 590 591#if !defined(STBI_NO_LINEAR )|| !defined(STBI_NO_HDR ) 592#include <math.h> // ldexp, pow 593#endif 594 595#ifndef STBI_NO_STDIO 596#include <stdio.h> 597#endif 598 599#ifndef STBI_ASSERT 600#include <assert.h> 601#define STBI_ASSERT (x ) assert(x) 602#endif 603 604#ifdef __cplusplus 605#define STBI_EXTERN extern "C" 606#else 607#define STBI_EXTERN extern 608#endif 609 610 611#ifndef _MSC_VER 612#ifdef __cplusplus 613#define stbi_inline inline 614#else 615#define stbi_inline 616#endif 617#else 618#define stbi_inline __forceinline 619#endif 620 621#ifndef STBI_NO_THREAD_LOCALS 622#if defined(__cplusplus )&& __cplusplus >=201103L 623#define STBI_THREAD_LOCAL thread_local 624#elif defined(__GNUC__ )&& __GNUC__ < 5 625#define STBI_THREAD_LOCAL __thread 626#elif defined(_MSC_VER ) 627#define STBI_THREAD_LOCAL __declspec(thread) 628#elif defined (__STDC_VERSION__ )&& __STDC_VERSION__ >=201112L && !defined(__STDC_NO_THREADS__ ) 629#define STBI_THREAD_LOCAL _Thread_local 630#endif 631 632#ifndef STBI_THREAD_LOCAL 633#if defined(__GNUC__ ) 634#define STBI_THREAD_LOCAL __thread 635#endif 636#endif 637#endif 638 639#if defined(_MSC_VER )|| defined(__SYMBIAN32__ ) 640typedef unsigned short stbi__uint16 ; 641typedef signed short stbi__int16 ; 642typedef unsigned int stbi__uint32 ; 643typedef signed int stbi__int32 ; 644#else 645#include <stdint.h> 646typedef uint16_t stbi__uint16 ; 647typedef int16_t stbi__int16 ; 648typedef uint32_t stbi__uint32 ; 649typedef int32_t stbi__int32 ; 650#endif 651 652// should produce compiler error if size is wrong 653typedef unsigned char validate_uint32 [sizeof (stbi__uint32 )== 4 ?1 :-1 ]; 654 655#ifdef _MSC_VER 656#define STBI_NOTUSED (v ) (void)(v) 657#else 658#define STBI_NOTUSED (v ) (void)sizeof(v) 659#endif 660 661#ifdef _MSC_VER 662#define STBI_HAS_LROTL 663#endif 664 665#ifdef STBI_HAS_LROTL 666#define stbi_lrot (x ,y ) _lrotl(x,y) 667#else 668#define stbi_lrot (x ,y ) (((x) << (y)) | ((x) >> (-(y) & 31))) 669#endif 670 671#if defined(STBI_MALLOC )&& defined(STBI_FREE )&& (defined(STBI_REALLOC )|| defined(STBI_REALLOC_SIZED )) 672// ok 673#elif !defined(STBI_MALLOC )&& !defined(STBI_FREE )&& !defined(STBI_REALLOC )&& !defined(STBI_REALLOC_SIZED ) 674// ok 675#else 676#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." 677#endif 678 679#ifndef STBI_MALLOC 680#define STBI_MALLOC (sz ) malloc(sz) 681#define STBI_REALLOC (p ,newsz ) realloc(p,newsz) 682#define STBI_FREE (p ) free(p) 683#endif 684 685#ifndef STBI_REALLOC_SIZED 686#define STBI_REALLOC_SIZED (p ,oldsz ,newsz ) STBI_REALLOC(p,newsz) 687#endif 688 689// x86/x64 detection 690#if defined(__x86_64__ )|| defined(_M_X64 ) 691#define STBI__X64_TARGET 692#elif defined(__i386 )|| defined(_M_IX86 ) 693#define STBI__X86_TARGET 694#endif 695 696#if defined(__GNUC__ )&& defined(STBI__X86_TARGET )&& !defined(__SSE2__ )&& !defined(STBI_NO_SIMD ) 697// gcc doesn't support sse2 intrinsics unless you compile with -msse2, 698// which in turn means it gets to use SSE2 everywhere. This is unfortunate, 699// but previous attempts to provide the SSE2 functions with runtime 700// detection caused numerous issues. The way architecture extensions are 701// exposed in GCC/Clang is, sadly, not really suited for one-file libs. 702// New behavior: if compiled with -msse2, we use SSE2 without any 703// detection; if not, we don't use it at all. 704#define STBI_NO_SIMD 705#endif 706 707#if defined(__MINGW32__ )&& defined(STBI__X86_TARGET )&& !defined(STBI_MINGW_ENABLE_SSE2 )&& !defined(STBI_NO_SIMD ) 708// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET 709// 710// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the 711// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. 712// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not 713// simultaneously enabling "-mstackrealign". 714// 715// See https://github.com/nothings/stb/issues/81 for more information. 716// 717// So default to no SSE2 on 32-bit MinGW. If you've read this far and added 718// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. 719#define STBI_NO_SIMD 720#endif 721 722#if !defined(STBI_NO_SIMD )&& (defined(STBI__X86_TARGET )|| defined(STBI__X64_TARGET )) 723#define STBI_SSE2 724#include <emmintrin.h> 725 726#ifdef _MSC_VER 727 728#if _MSC_VER >=1400 // not VC6 729#include <intrin.h> // __cpuid 730static int stbi__cpuid3 (void ) 731{ 732int info [4 ]; 733__cpuid (info ,1 ); 734return info [3 ]; 735} 736#else 737static int stbi__cpuid3 (void ) 738{ 739int res ; 740 __asm { 741mov eax ,1 742cpuid 743mov res ,edx 744 } 745return res ; 746} 747#endif 748 749#define STBI_SIMD_ALIGN (type ,name ) __declspec(align(16)) type name 750 751#if !defined(STBI_NO_JPEG )&& defined(STBI_SSE2 ) 752static int stbi__sse2_available (void ) 753{ 754int info3 = stbi__cpuid3 (); 755return ((info3 >>26 )& 1 )!= 0 ; 756} 757#endif 758 759#else // assume GCC-style if not VC++ 760#define STBI_SIMD_ALIGN (type ,name ) type name __attribute__((aligned(16))) 761 762#if !defined(STBI_NO_JPEG )&& defined(STBI_SSE2 ) 763static int stbi__sse2_available (void ) 764{ 765// If we're even attempting to compile this on GCC/Clang, that means 766// -msse2 is on, which means the compiler is allowed to use SSE2 767// instructions at will, and so are we. 768return 1 ; 769} 770#endif 771 772#endif 773#endif 774 775// ARM NEON 776#if defined(STBI_NO_SIMD )&& defined(STBI_NEON ) 777#undef STBI_NEON 778#endif 779 780#ifdef STBI_NEON 781#include <arm_neon.h> 782#ifdef _MSC_VER 783#define STBI_SIMD_ALIGN (type ,name ) __declspec(align(16)) type name 784#else 785#define STBI_SIMD_ALIGN (type ,name ) type name __attribute__((aligned(16))) 786#endif 787#endif 788 789#ifndef STBI_SIMD_ALIGN 790#define STBI_SIMD_ALIGN (type ,name ) type name 791#endif 792 793#ifndef STBI_MAX_DIMENSIONS 794#define STBI_MAX_DIMENSIONS (1 << 24) 795#endif 796 797/////////////////////////////////////////////// 798// 799// stbi__context struct and start_xxx functions 800 801// stbi__context structure is our basic context used by all images, so it 802// contains all the IO context, plus some basic image information 803typedef struct 804{ 805stbi__uint32 img_x ,img_y ; 806int img_n ,img_out_n ; 807 808stbi_io_callbacks io ; 809void * io_user_data ; 810 811int read_from_callbacks ; 812int buflen ; 813stbi_uc buffer_start [128 ]; 814int callback_already_read ; 815 816stbi_uc * img_buffer ,* img_buffer_end ; 817stbi_uc * img_buffer_original ,* img_buffer_original_end ; 818}stbi__context ; 819 820 821static void stbi__refill_buffer (stbi__context * s ); 822 823// initialize a memory-decode context 824static void stbi__start_mem (stbi__context * s ,stbi_uc const * buffer ,int len ) 825{ 826s -> io .read = NULL ; 827s -> read_from_callbacks = 0 ; 828s -> callback_already_read = 0 ; 829s -> img_buffer = s -> img_buffer_original = (stbi_uc * )buffer ; 830s -> img_buffer_end = s -> img_buffer_original_end = (stbi_uc * )buffer + len ; 831} 832 833// initialize a callback-based context 834static void stbi__start_callbacks (stbi__context * s ,stbi_io_callbacks * c ,void * user ) 835{ 836s -> io = * c ; 837s -> io_user_data = user ; 838s -> buflen = sizeof (s -> buffer_start ); 839s -> read_from_callbacks = 1 ; 840s -> callback_already_read = 0 ; 841s -> img_buffer = s -> img_buffer_original = s -> buffer_start ; 842stbi__refill_buffer (s ); 843s -> img_buffer_original_end = s -> img_buffer_end ; 844} 845 846#ifndef STBI_NO_STDIO 847 848static int stbi__stdio_read (void * user ,char * data ,int size ) 849{ 850return (int )fread (data ,1 ,size ,(FILE * )user ); 851} 852 853static void stbi__stdio_skip (void * user ,int n ) 854{ 855int ch ; 856fseek ((FILE * )user ,n ,SEEK_CUR ); 857ch = fgetc ((FILE * )user );/* have to read a byte to reset feof()'s flag */ 858if (ch != EOF ) { 859ungetc (ch , (FILE * )user );/* push byte back onto stream if valid. */ 860 } 861} 862 863static int stbi__stdio_eof (void * user ) 864{ 865return feof ((FILE * )user )|| ferror ((FILE * )user ); 866} 867 868static stbi_io_callbacks stbi__stdio_callbacks = 869{ 870stbi__stdio_read , 871stbi__stdio_skip , 872stbi__stdio_eof , 873}; 874 875static void stbi__start_file (stbi__context * s ,FILE * f ) 876{ 877stbi__start_callbacks (s ,& stbi__stdio_callbacks , (void * )f ); 878} 879 880//static void stop_file(stbi__context *s) { } 881 882#endif // !STBI_NO_STDIO 883 884static void stbi__rewind (stbi__context * s ) 885{ 886// conceptually rewind SHOULD rewind to the beginning of the stream, 887// but we just rewind to the beginning of the initial buffer, because 888// we only use it after doing 'test', which only ever looks at at most 92 bytes 889s -> img_buffer = s -> img_buffer_original ; 890s -> img_buffer_end = s -> img_buffer_original_end ; 891} 892 893enum 894{ 895STBI_ORDER_RGB , 896STBI_ORDER_BGR 897}; 898 899typedef struct 900{ 901int bits_per_channel ; 902int num_channels ; 903int channel_order ; 904}stbi__result_info ; 905 906#ifndef STBI_NO_JPEG 907static int stbi__jpeg_test (stbi__context * s ); 908static void * stbi__jpeg_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ); 909static int stbi__jpeg_info (stbi__context * s ,int * x ,int * y ,int * comp ); 910#endif 911 912#ifndef STBI_NO_PNG 913static int stbi__png_test (stbi__context * s ); 914static void * stbi__png_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ); 915static int stbi__png_info (stbi__context * s ,int * x ,int * y ,int * comp ); 916static int stbi__png_is16 (stbi__context * s ); 917#endif 918 919#ifndef STBI_NO_BMP 920static int stbi__bmp_test (stbi__context * s ); 921static void * stbi__bmp_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ); 922static int stbi__bmp_info (stbi__context * s ,int * x ,int * y ,int * comp ); 923#endif 924 925#ifndef STBI_NO_TGA 926static int stbi__tga_test (stbi__context * s ); 927static void * stbi__tga_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ); 928static int stbi__tga_info (stbi__context * s ,int * x ,int * y ,int * comp ); 929#endif 930 931#ifndef STBI_NO_PSD 932static int stbi__psd_test (stbi__context * s ); 933static void * stbi__psd_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ,int bpc ); 934static int stbi__psd_info (stbi__context * s ,int * x ,int * y ,int * comp ); 935static int stbi__psd_is16 (stbi__context * s ); 936#endif 937 938#ifndef STBI_NO_HDR 939static int stbi__hdr_test (stbi__context * s ); 940static float * stbi__hdr_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ); 941static int stbi__hdr_info (stbi__context * s ,int * x ,int * y ,int * comp ); 942#endif 943 944#ifndef STBI_NO_PIC 945static int stbi__pic_test (stbi__context * s ); 946static void * stbi__pic_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ); 947static int stbi__pic_info (stbi__context * s ,int * x ,int * y ,int * comp ); 948#endif 949 950#ifndef STBI_NO_GIF 951static int stbi__gif_test (stbi__context * s ); 952static void * stbi__gif_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ); 953static void * stbi__load_gif_main (stbi__context * s ,int ** delays ,int * x ,int * y ,int * z ,int * comp ,int req_comp ); 954static int stbi__gif_info (stbi__context * s ,int * x ,int * y ,int * comp ); 955#endif 956 957#ifndef STBI_NO_PNM 958static int stbi__pnm_test (stbi__context * s ); 959static void * stbi__pnm_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ); 960static int stbi__pnm_info (stbi__context * s ,int * x ,int * y ,int * comp ); 961static int stbi__pnm_is16 (stbi__context * s ); 962#endif 963 964static 965#ifdef STBI_THREAD_LOCAL 966STBI_THREAD_LOCAL 967#endif 968const char * stbi__g_failure_reason ; 969 970STBIDEF const char * stbi_failure_reason (void ) 971{ 972return stbi__g_failure_reason ; 973} 974 975#ifndef STBI_NO_FAILURE_STRINGS 976static int stbi__err (const char * str ) 977{ 978stbi__g_failure_reason = str ; 979return 0 ; 980} 981#endif 982 983static void * stbi__malloc (size_t size ) 984{ 985return STBI_MALLOC (size ); 986} 987 988// stb_image uses ints pervasively, including for offset calculations. 989// therefore the largest decoded image size we can support with the 990// current code, even on 64-bit targets, is INT_MAX. this is not a 991// significant limitation for the intended use case. 992// 993// we do, however, need to make sure our size calculations don't 994// overflow. hence a few helper functions for size calculations that 995// multiply integers together, making sure that they're non-negative 996// and no overflow occurs. 997 998// return 1 if the sum is valid, 0 on overflow. 999// negative terms are considered invalid. 1000static int stbi__addsizes_valid (int a ,int b ) 1001{ 1002if (b < 0 )return 0 ; 1003// now 0 <= b <= INT_MAX, hence also 1004// 0 <= INT_MAX - b <= INTMAX. 1005// And "a + b <= INT_MAX" (which might overflow) is the 1006// same as a <= INT_MAX - b (no overflow) 1007return a <=INT_MAX - b ; 1008} 1009 1010// returns 1 if the product is valid, 0 on overflow. 1011// negative factors are considered invalid. 1012static int stbi__mul2sizes_valid (int a ,int b ) 1013{ 1014if (a < 0 || b < 0 )return 0 ; 1015if (b == 0 )return 1 ;// mul-by-0 is always safe 1016// portable way to check for no overflows in a*b 1017return a <=INT_MAX /b ; 1018} 1019 1020#if !defined(STBI_NO_JPEG )|| !defined(STBI_NO_PNG )|| !defined(STBI_NO_TGA )|| !defined(STBI_NO_HDR ) 1021// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow 1022static int stbi__mad2sizes_valid (int a ,int b ,int add ) 1023{ 1024return stbi__mul2sizes_valid (a ,b )&& stbi__addsizes_valid (a * b ,add ); 1025} 1026#endif 1027 1028// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow 1029static int stbi__mad3sizes_valid (int a ,int b ,int c ,int add ) 1030{ 1031return stbi__mul2sizes_valid (a ,b )&& stbi__mul2sizes_valid (a * b ,c )&& 1032stbi__addsizes_valid (a * b * c ,add ); 1033} 1034 1035// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow 1036#if !defined(STBI_NO_LINEAR )|| !defined(STBI_NO_HDR )|| !defined(STBI_NO_PNM ) 1037static int stbi__mad4sizes_valid (int a ,int b ,int c ,int d ,int add ) 1038{ 1039return stbi__mul2sizes_valid (a ,b )&& stbi__mul2sizes_valid (a * b ,c )&& 1040stbi__mul2sizes_valid (a * b * c ,d )&& stbi__addsizes_valid (a * b * c * d ,add ); 1041} 1042#endif 1043 1044#if !defined(STBI_NO_JPEG )|| !defined(STBI_NO_PNG )|| !defined(STBI_NO_TGA )|| !defined(STBI_NO_HDR ) 1045// mallocs with size overflow checking 1046static void * stbi__malloc_mad2 (int a ,int b ,int add ) 1047{ 1048if (!stbi__mad2sizes_valid (a ,b ,add ))return NULL ; 1049return stbi__malloc (a * b + add ); 1050} 1051#endif 1052 1053static void * stbi__malloc_mad3 (int a ,int b ,int c ,int add ) 1054{ 1055if (!stbi__mad3sizes_valid (a ,b ,c ,add ))return NULL ; 1056return stbi__malloc (a * b * c + add ); 1057} 1058 1059#if !defined(STBI_NO_LINEAR )|| !defined(STBI_NO_HDR )|| !defined(STBI_NO_PNM ) 1060static void * stbi__malloc_mad4 (int a ,int b ,int c ,int d ,int add ) 1061{ 1062if (!stbi__mad4sizes_valid (a ,b ,c ,d ,add ))return NULL ; 1063return stbi__malloc (a * b * c * d + add ); 1064} 1065#endif 1066 1067// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. 1068static int stbi__addints_valid (int a ,int b ) 1069{ 1070if ((a >=0 )!= (b >=0 ))return 1 ;// a and b have different signs, so no overflow 1071if (a < 0 && b < 0 )return a >=INT_MIN - b ;// same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. 1072return a <=INT_MAX - b ; 1073} 1074 1075// returns 1 if the product of two signed shorts is valid, 0 on overflow. 1076static int stbi__mul2shorts_valid (short a ,short b ) 1077{ 1078if (b == 0 || b == -1 )return 1 ;// multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow 1079if ((a >=0 )== (b >=0 ))return a <=SHRT_MAX /b ;// product is positive, so similar to mul2sizes_valid 1080if (b < 0 )return a <=SHRT_MIN /b ;// same as a * b >= SHRT_MIN 1081return a >=SHRT_MIN /b ; 1082} 1083 1084// stbi__err - error 1085// stbi__errpf - error returning pointer to float 1086// stbi__errpuc - error returning pointer to unsigned char 1087 1088#ifdef STBI_NO_FAILURE_STRINGS 1089#define stbi__err (x ,y ) 0 1090#elif defined(STBI_FAILURE_USERMSG ) 1091#define stbi__err (x ,y ) stbi__err(y) 1092#else 1093#define stbi__err (x ,y ) stbi__err(x) 1094#endif 1095 1096#define stbi__errpf (x ,y ) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) 1097#define stbi__errpuc (x ,y ) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) 1098 1099STBIDEF void stbi_image_free (void * retval_from_stbi_load ) 1100{ 1101STBI_FREE (retval_from_stbi_load ); 1102} 1103 1104#ifndef STBI_NO_LINEAR 1105static float * stbi__ldr_to_hdr (stbi_uc * data ,int x ,int y ,int comp ); 1106#endif 1107 1108#ifndef STBI_NO_HDR 1109static stbi_uc * stbi__hdr_to_ldr (float * data ,int x ,int y ,int comp ); 1110#endif 1111 1112static int stbi__vertically_flip_on_load_global = 0 ; 1113 1114STBIDEF void stbi_set_flip_vertically_on_load (int flag_true_if_should_flip ) 1115{ 1116stbi__vertically_flip_on_load_global = flag_true_if_should_flip ; 1117} 1118 1119#ifndef STBI_THREAD_LOCAL 1120#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global 1121#else 1122static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local ,stbi__vertically_flip_on_load_set ; 1123 1124STBIDEF void stbi_set_flip_vertically_on_load_thread (int flag_true_if_should_flip ) 1125{ 1126stbi__vertically_flip_on_load_local = flag_true_if_should_flip ; 1127stbi__vertically_flip_on_load_set = 1 ; 1128} 1129 1130#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ 1131 ? stbi__vertically_flip_on_load_local \ 1132 : stbi__vertically_flip_on_load_global) 1133#endif // STBI_THREAD_LOCAL 1134 1135static void * stbi__load_main (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ,int bpc ) 1136{ 1137memset (ri ,0 ,sizeof (* ri ));// make sure it's initialized if we add new fields 1138ri -> bits_per_channel = 8 ;// default is 8 so most paths don't have to be changed 1139ri -> channel_order = STBI_ORDER_RGB ;// all current input & output are this, but this is here so we can add BGR order 1140ri -> num_channels = 0 ; 1141 1142// test the formats with a very explicit header first (at least a FOURCC 1143// or distinctive magic number first) 1144#ifndef STBI_NO_PNG 1145if (stbi__png_test (s ))return stbi__png_load (s ,x ,y ,comp ,req_comp ,ri ); 1146#endif 1147#ifndef STBI_NO_BMP 1148if (stbi__bmp_test (s ))return stbi__bmp_load (s ,x ,y ,comp ,req_comp ,ri ); 1149#endif 1150#ifndef STBI_NO_GIF 1151if (stbi__gif_test (s ))return stbi__gif_load (s ,x ,y ,comp ,req_comp ,ri ); 1152#endif 1153#ifndef STBI_NO_PSD 1154if (stbi__psd_test (s ))return stbi__psd_load (s ,x ,y ,comp ,req_comp ,ri ,bpc ); 1155#else 1156STBI_NOTUSED (bpc ); 1157#endif 1158#ifndef STBI_NO_PIC 1159if (stbi__pic_test (s ))return stbi__pic_load (s ,x ,y ,comp ,req_comp ,ri ); 1160#endif 1161 1162// then the formats that can end up attempting to load with just 1 or 2 1163// bytes matching expectations; these are prone to false positives, so 1164// try them later 1165#ifndef STBI_NO_JPEG 1166if (stbi__jpeg_test (s ))return stbi__jpeg_load (s ,x ,y ,comp ,req_comp ,ri ); 1167#endif 1168#ifndef STBI_NO_PNM 1169if (stbi__pnm_test (s ))return stbi__pnm_load (s ,x ,y ,comp ,req_comp ,ri ); 1170#endif 1171 1172#ifndef STBI_NO_HDR 1173if (stbi__hdr_test (s )) { 1174float * hdr = stbi__hdr_load (s ,x ,y ,comp ,req_comp ,ri ); 1175return stbi__hdr_to_ldr (hdr ,* x ,* y ,req_comp ?req_comp :* comp ); 1176 } 1177#endif 1178 1179#ifndef STBI_NO_TGA 1180// test tga last because it's a crappy test! 1181if (stbi__tga_test (s )) 1182return stbi__tga_load (s ,x ,y ,comp ,req_comp ,ri ); 1183#endif 1184 1185return stbi__errpuc ("unknown image type" ,"Image not of any known type, or corrupt" ); 1186} 1187 1188static stbi_uc * stbi__convert_16_to_8 (stbi__uint16 * orig ,int w ,int h ,int channels ) 1189{ 1190int i ; 1191int img_len = w * h * channels ; 1192stbi_uc * reduced ; 1193 1194reduced = (stbi_uc * )stbi__malloc (img_len ); 1195if (reduced == NULL )return stbi__errpuc ("outofmem" ,"Out of memory" ); 1196 1197for (i = 0 ;i < img_len ;++ i ) 1198reduced [i ]= (stbi_uc )((orig [i ] >>8 )& 0xFF );// top half of each byte is sufficient approx of 16->8 bit scaling 1199 1200STBI_FREE (orig ); 1201return reduced ; 1202} 1203 1204static stbi__uint16 * stbi__convert_8_to_16 (stbi_uc * orig ,int w ,int h ,int channels ) 1205{ 1206int i ; 1207int img_len = w * h * channels ; 1208stbi__uint16 * enlarged ; 1209 1210enlarged = (stbi__uint16 * )stbi__malloc (img_len * 2 ); 1211if (enlarged == NULL )return (stbi__uint16 * )stbi__errpuc ("outofmem" ,"Out of memory" ); 1212 1213for (i = 0 ;i < img_len ;++ i ) 1214enlarged [i ]= (stbi__uint16 )((orig [i ] <<8 )+ orig [i ]);// replicate to high and low byte, maps 0->0, 255->0xffff 1215 1216STBI_FREE (orig ); 1217return enlarged ; 1218} 1219 1220static void stbi__vertical_flip (void * image ,int w ,int h ,int bytes_per_pixel ) 1221{ 1222int row ; 1223size_t bytes_per_row = (size_t )w * bytes_per_pixel ; 1224stbi_uc temp [2048 ]; 1225stbi_uc * bytes = (stbi_uc * )image ; 1226 1227for (row = 0 ;row < (h >>1 );row ++ ) { 1228stbi_uc * row0 = bytes + row * bytes_per_row ; 1229stbi_uc * row1 = bytes + (h - row - 1 )* bytes_per_row ; 1230// swap row0 with row1 1231size_t bytes_left = bytes_per_row ; 1232while (bytes_left ) { 1233size_t bytes_copy = (bytes_left < sizeof (temp )) ?bytes_left :sizeof (temp ); 1234memcpy (temp ,row0 ,bytes_copy ); 1235memcpy (row0 ,row1 ,bytes_copy ); 1236memcpy (row1 ,temp ,bytes_copy ); 1237row0 += bytes_copy ; 1238row1 += bytes_copy ; 1239bytes_left -= bytes_copy ; 1240 } 1241 } 1242} 1243 1244#ifndef STBI_NO_GIF 1245static void stbi__vertical_flip_slices (void * image ,int w ,int h ,int z ,int bytes_per_pixel ) 1246{ 1247int slice ; 1248int slice_size = w * h * bytes_per_pixel ; 1249 1250stbi_uc * bytes = (stbi_uc * )image ; 1251for (slice = 0 ;slice < z ;++ slice ) { 1252stbi__vertical_flip (bytes ,w ,h ,bytes_per_pixel ); 1253bytes += slice_size ; 1254 } 1255} 1256#endif 1257 1258static unsigned char * stbi__load_and_postprocess_8bit (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ) 1259{ 1260stbi__result_info ri ; 1261void * result = stbi__load_main (s ,x ,y ,comp ,req_comp ,& ri ,8 ); 1262 1263if (result == NULL ) 1264return NULL ; 1265 1266// it is the responsibility of the loaders to make sure we get either 8 or 16 bit. 1267STBI_ASSERT (ri .bits_per_channel == 8 || ri .bits_per_channel == 16 ); 1268 1269if (ri .bits_per_channel != 8 ) { 1270result = stbi__convert_16_to_8 ((stbi__uint16 * )result ,* x ,* y ,req_comp == 0 ?* comp :req_comp ); 1271ri .bits_per_channel = 8 ; 1272 } 1273 1274// @TODO: move stbi__convert_format to here 1275 1276if (stbi__vertically_flip_on_load ) { 1277int channels = req_comp ?req_comp :* comp ; 1278stbi__vertical_flip (result ,* x ,* y ,channels * sizeof (stbi_uc )); 1279 } 1280 1281return (unsigned char * )result ; 1282} 1283 1284static stbi__uint16 * stbi__load_and_postprocess_16bit (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ) 1285{ 1286stbi__result_info ri ; 1287void * result = stbi__load_main (s ,x ,y ,comp ,req_comp ,& ri ,16 ); 1288 1289if (result == NULL ) 1290return NULL ; 1291 1292// it is the responsibility of the loaders to make sure we get either 8 or 16 bit. 1293STBI_ASSERT (ri .bits_per_channel == 8 || ri .bits_per_channel == 16 ); 1294 1295if (ri .bits_per_channel != 16 ) { 1296result = stbi__convert_8_to_16 ((stbi_uc * )result ,* x ,* y ,req_comp == 0 ?* comp :req_comp ); 1297ri .bits_per_channel = 16 ; 1298 } 1299 1300// @TODO: move stbi__convert_format16 to here 1301// @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision 1302 1303if (stbi__vertically_flip_on_load ) { 1304int channels = req_comp ?req_comp :* comp ; 1305stbi__vertical_flip (result ,* x ,* y ,channels * sizeof (stbi__uint16 )); 1306 } 1307 1308return (stbi__uint16 * )result ; 1309} 1310 1311#if !defined(STBI_NO_HDR )&& !defined(STBI_NO_LINEAR ) 1312static void stbi__float_postprocess (float * result ,int * x ,int * y ,int * comp ,int req_comp ) 1313{ 1314if (stbi__vertically_flip_on_load && result != NULL ) { 1315int channels = req_comp ?req_comp :* comp ; 1316stbi__vertical_flip (result ,* x ,* y ,channels * sizeof (float )); 1317 } 1318} 1319#endif 1320 1321#ifndef STBI_NO_STDIO 1322 1323#if defined(_WIN32 )&& defined(STBI_WINDOWS_UTF8 ) 1324STBI_EXTERN __declspec(dllimport )int __stdcallMultiByteToWideChar (unsigned int cp ,unsigned long flags ,const char * str ,int cbmb ,wchar_t * widestr ,int cchwide ); 1325STBI_EXTERN __declspec(dllimport )int __stdcallWideCharToMultiByte (unsigned int cp ,unsigned long flags ,const wchar_t * widestr ,int cchwide ,char * str ,int cbmb ,const char * defchar ,int * used_default ); 1326#endif 1327 1328#if defined(_WIN32 )&& defined(STBI_WINDOWS_UTF8 ) 1329STBIDEF int stbi_convert_wchar_to_utf8 (char * buffer ,size_t bufferlen ,const wchar_t * input ) 1330{ 1331return WideCharToMultiByte (65001 /* UTF8 */ ,0 ,input ,-1 ,buffer , (int )bufferlen ,NULL ,NULL ); 1332} 1333#endif 1334 1335static FILE * stbi__fopen (char const * filename ,char const * mode ) 1336{ 1337FILE * f ; 1338#if defined(_WIN32 )&& defined(STBI_WINDOWS_UTF8 ) 1339wchar_t wMode [64 ]; 1340wchar_t wFilename [1024 ]; 1341if (0 == MultiByteToWideChar (65001 /* UTF8 */ ,0 ,filename ,-1 ,wFilename ,sizeof (wFilename )/sizeof (* wFilename ))) 1342return 0 ; 1343 1344if (0 == MultiByteToWideChar (65001 /* UTF8 */ ,0 ,mode ,-1 ,wMode ,sizeof (wMode )/sizeof (* wMode ))) 1345return 0 ; 1346 1347#if defined(_MSC_VER )&& _MSC_VER >=1400 1348if (0 != _wfopen_s (& f ,wFilename ,wMode )) 1349f = 0 ; 1350#else 1351f = _wfopen (wFilename ,wMode ); 1352#endif 1353 1354#elif defined(_MSC_VER )&& _MSC_VER >=1400 1355if (0 != fopen_s (& f ,filename ,mode )) 1356f = 0 ; 1357#else 1358f = fopen (filename ,mode ); 1359#endif 1360return f ; 1361} 1362 1363 1364STBIDEF stbi_uc * stbi_load (char const * filename ,int * x ,int * y ,int * comp ,int req_comp ) 1365{ 1366FILE * f = stbi__fopen (filename ,"rb" ); 1367unsigned char * result ; 1368if (!f )return stbi__errpuc ("can't fopen" ,"Unable to open file" ); 1369result = stbi_load_from_file (f ,x ,y ,comp ,req_comp ); 1370fclose (f ); 1371return result ; 1372} 1373 1374STBIDEF stbi_uc * stbi_load_from_file (FILE * f ,int * x ,int * y ,int * comp ,int req_comp ) 1375{ 1376unsigned char * result ; 1377stbi__context s ; 1378stbi__start_file (& s ,f ); 1379result = stbi__load_and_postprocess_8bit (& s ,x ,y ,comp ,req_comp ); 1380if (result ) { 1381// need to 'unget' all the characters in the IO buffer 1382fseek (f ,- (int ) (s .img_buffer_end - s .img_buffer ),SEEK_CUR ); 1383 } 1384return result ; 1385} 1386 1387STBIDEF stbi__uint16 * stbi_load_from_file_16 (FILE * f ,int * x ,int * y ,int * comp ,int req_comp ) 1388{ 1389stbi__uint16 * result ; 1390stbi__context s ; 1391stbi__start_file (& s ,f ); 1392result = stbi__load_and_postprocess_16bit (& s ,x ,y ,comp ,req_comp ); 1393if (result ) { 1394// need to 'unget' all the characters in the IO buffer 1395fseek (f ,- (int ) (s .img_buffer_end - s .img_buffer ),SEEK_CUR ); 1396 } 1397return result ; 1398} 1399 1400STBIDEF stbi_us * stbi_load_16 (char const * filename ,int * x ,int * y ,int * comp ,int req_comp ) 1401{ 1402FILE * f = stbi__fopen (filename ,"rb" ); 1403stbi__uint16 * result ; 1404if (!f )return (stbi_us * )stbi__errpuc ("can't fopen" ,"Unable to open file" ); 1405result = stbi_load_from_file_16 (f ,x ,y ,comp ,req_comp ); 1406fclose (f ); 1407return result ; 1408} 1409 1410 1411#endif //!STBI_NO_STDIO 1412 1413STBIDEF stbi_us * stbi_load_16_from_memory (stbi_uc const * buffer ,int len ,int * x ,int * y ,int * channels_in_file ,int desired_channels ) 1414{ 1415stbi__context s ; 1416stbi__start_mem (& s ,buffer ,len ); 1417return stbi__load_and_postprocess_16bit (& s ,x ,y ,channels_in_file ,desired_channels ); 1418} 1419 1420STBIDEF stbi_us * stbi_load_16_from_callbacks (stbi_io_callbacks const * clbk ,void * user ,int * x ,int * y ,int * channels_in_file ,int desired_channels ) 1421{ 1422stbi__context s ; 1423stbi__start_callbacks (& s , (stbi_io_callbacks * )clbk ,user ); 1424return stbi__load_and_postprocess_16bit (& s ,x ,y ,channels_in_file ,desired_channels ); 1425} 1426 1427STBIDEF stbi_uc * stbi_load_from_memory (stbi_uc const * buffer ,int len ,int * x ,int * y ,int * comp ,int req_comp ) 1428{ 1429stbi__context s ; 1430stbi__start_mem (& s ,buffer ,len ); 1431return stbi__load_and_postprocess_8bit (& s ,x ,y ,comp ,req_comp ); 1432} 1433 1434STBIDEF stbi_uc * stbi_load_from_callbacks (stbi_io_callbacks const * clbk ,void * user ,int * x ,int * y ,int * comp ,int req_comp ) 1435{ 1436stbi__context s ; 1437stbi__start_callbacks (& s , (stbi_io_callbacks * )clbk ,user ); 1438return stbi__load_and_postprocess_8bit (& s ,x ,y ,comp ,req_comp ); 1439} 1440 1441#ifndef STBI_NO_GIF 1442STBIDEF stbi_uc * stbi_load_gif_from_memory (stbi_uc const * buffer ,int len ,int ** delays ,int * x ,int * y ,int * z ,int * comp ,int req_comp ) 1443{ 1444unsigned char * result ; 1445stbi__context s ; 1446stbi__start_mem (& s ,buffer ,len ); 1447 1448result = (unsigned char * )stbi__load_gif_main (& s ,delays ,x ,y ,z ,comp ,req_comp ); 1449if (stbi__vertically_flip_on_load ) { 1450stbi__vertical_flip_slices (result ,* x ,* y ,* z ,* comp ); 1451 } 1452 1453return result ; 1454} 1455#endif 1456 1457#ifndef STBI_NO_LINEAR 1458static float * stbi__loadf_main (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ) 1459{ 1460unsigned char * data ; 1461#ifndef STBI_NO_HDR 1462if (stbi__hdr_test (s )) { 1463stbi__result_info ri ; 1464float * hdr_data = stbi__hdr_load (s ,x ,y ,comp ,req_comp ,& ri ); 1465if (hdr_data ) 1466stbi__float_postprocess (hdr_data ,x ,y ,comp ,req_comp ); 1467return hdr_data ; 1468 } 1469#endif 1470data = stbi__load_and_postprocess_8bit (s ,x ,y ,comp ,req_comp ); 1471if (data ) 1472return stbi__ldr_to_hdr (data ,* x ,* y ,req_comp ?req_comp :* comp ); 1473return stbi__errpf ("unknown image type" ,"Image not of any known type, or corrupt" ); 1474} 1475 1476STBIDEF float * stbi_loadf_from_memory (stbi_uc const * buffer ,int len ,int * x ,int * y ,int * comp ,int req_comp ) 1477{ 1478stbi__context s ; 1479stbi__start_mem (& s ,buffer ,len ); 1480return stbi__loadf_main (& s ,x ,y ,comp ,req_comp ); 1481} 1482 1483STBIDEF float * stbi_loadf_from_callbacks (stbi_io_callbacks const * clbk ,void * user ,int * x ,int * y ,int * comp ,int req_comp ) 1484{ 1485stbi__context s ; 1486stbi__start_callbacks (& s , (stbi_io_callbacks * )clbk ,user ); 1487return stbi__loadf_main (& s ,x ,y ,comp ,req_comp ); 1488} 1489 1490#ifndef STBI_NO_STDIO 1491STBIDEF float * stbi_loadf (char const * filename ,int * x ,int * y ,int * comp ,int req_comp ) 1492{ 1493float * result ; 1494FILE * f = stbi__fopen (filename ,"rb" ); 1495if (!f )return stbi__errpf ("can't fopen" ,"Unable to open file" ); 1496result = stbi_loadf_from_file (f ,x ,y ,comp ,req_comp ); 1497fclose (f ); 1498return result ; 1499} 1500 1501STBIDEF float * stbi_loadf_from_file (FILE * f ,int * x ,int * y ,int * comp ,int req_comp ) 1502{ 1503stbi__context s ; 1504stbi__start_file (& s ,f ); 1505return stbi__loadf_main (& s ,x ,y ,comp ,req_comp ); 1506} 1507#endif // !STBI_NO_STDIO 1508 1509#endif // !STBI_NO_LINEAR 1510 1511// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is 1512// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always 1513// reports false! 1514 1515STBIDEF int stbi_is_hdr_from_memory (stbi_uc const * buffer ,int len ) 1516{ 1517#ifndef STBI_NO_HDR 1518stbi__context s ; 1519stbi__start_mem (& s ,buffer ,len ); 1520return stbi__hdr_test (& s ); 1521#else 1522STBI_NOTUSED (buffer ); 1523STBI_NOTUSED (len ); 1524return 0 ; 1525#endif 1526} 1527 1528#ifndef STBI_NO_STDIO 1529STBIDEF int stbi_is_hdr (char const * filename ) 1530{ 1531FILE * f = stbi__fopen (filename ,"rb" ); 1532int result = 0 ; 1533if (f ) { 1534result = stbi_is_hdr_from_file (f ); 1535fclose (f ); 1536 } 1537return result ; 1538} 1539 1540STBIDEF int stbi_is_hdr_from_file (FILE * f ) 1541{ 1542#ifndef STBI_NO_HDR 1543long pos = ftell (f ); 1544int res ; 1545stbi__context s ; 1546stbi__start_file (& s ,f ); 1547res = stbi__hdr_test (& s ); 1548fseek (f ,pos ,SEEK_SET ); 1549return res ; 1550#else 1551STBI_NOTUSED (f ); 1552return 0 ; 1553#endif 1554} 1555#endif // !STBI_NO_STDIO 1556 1557STBIDEF int stbi_is_hdr_from_callbacks (stbi_io_callbacks const * clbk ,void * user ) 1558{ 1559#ifndef STBI_NO_HDR 1560stbi__context s ; 1561stbi__start_callbacks (& s , (stbi_io_callbacks * )clbk ,user ); 1562return stbi__hdr_test (& s ); 1563#else 1564STBI_NOTUSED (clbk ); 1565STBI_NOTUSED (user ); 1566return 0 ; 1567#endif 1568} 1569 1570#ifndef STBI_NO_LINEAR 1571static float stbi__l2h_gamma = 2.2f ,stbi__l2h_scale = 1.0f ; 1572 1573STBIDEF void stbi_ldr_to_hdr_gamma (float gamma ) {stbi__l2h_gamma = gamma ; } 1574STBIDEF void stbi_ldr_to_hdr_scale (float scale ) {stbi__l2h_scale = scale ; } 1575#endif 1576 1577static float stbi__h2l_gamma_i = 1.0f /2.2f ,stbi__h2l_scale_i = 1.0f ; 1578 1579STBIDEF void stbi_hdr_to_ldr_gamma (float gamma ) {stbi__h2l_gamma_i = 1 /gamma ; } 1580STBIDEF void stbi_hdr_to_ldr_scale (float scale ) {stbi__h2l_scale_i = 1 /scale ; } 1581 1582 1583////////////////////////////////////////////////////////////////////////////// 1584// 1585// Common code used by all image loaders 1586// 1587 1588enum 1589{ 1590STBI__SCAN_load = 0 , 1591STBI__SCAN_type , 1592STBI__SCAN_header 1593}; 1594 1595static void stbi__refill_buffer (stbi__context * s ) 1596{ 1597int n = (s -> io .read )(s -> io_user_data ,(char * )s -> buffer_start ,s -> buflen ); 1598s -> callback_already_read += (int ) (s -> img_buffer - s -> img_buffer_original ); 1599if (n == 0 ) { 1600// at end of file, treat same as if from memory, but need to handle case 1601// where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file 1602s -> read_from_callbacks = 0 ; 1603s -> img_buffer = s -> buffer_start ; 1604s -> img_buffer_end = s -> buffer_start + 1 ; 1605* s -> img_buffer = 0 ; 1606 }else { 1607s -> img_buffer = s -> buffer_start ; 1608s -> img_buffer_end = s -> buffer_start + n ; 1609 } 1610} 1611 1612stbi_inline static stbi_uc stbi__get8 (stbi__context * s ) 1613{ 1614if (s -> img_buffer < s -> img_buffer_end ) 1615return * s -> img_buffer ++ ; 1616if (s -> read_from_callbacks ) { 1617stbi__refill_buffer (s ); 1618return * s -> img_buffer ++ ; 1619 } 1620return 0 ; 1621} 1622 1623#if defined(STBI_NO_JPEG )&& defined(STBI_NO_HDR )&& defined(STBI_NO_PIC )&& defined(STBI_NO_PNM ) 1624// nothing 1625#else 1626stbi_inline static int stbi__at_eof (stbi__context * s ) 1627{ 1628if (s -> io .read ) { 1629if (!(s -> io .eof )(s -> io_user_data ))return 0 ; 1630// if feof() is true, check if buffer = end 1631// special case: we've only got the special 0 character at the end 1632if (s -> read_from_callbacks == 0 )return 1 ; 1633 } 1634 1635return s -> img_buffer >=s -> img_buffer_end ; 1636} 1637#endif 1638 1639#if defined(STBI_NO_JPEG )&& defined(STBI_NO_PNG )&& defined(STBI_NO_BMP )&& defined(STBI_NO_PSD )&& defined(STBI_NO_TGA )&& defined(STBI_NO_GIF )&& defined(STBI_NO_PIC ) 1640// nothing 1641#else 1642static void stbi__skip (stbi__context * s ,int n ) 1643{ 1644if (n == 0 )return ;// already there! 1645if (n < 0 ) { 1646s -> img_buffer = s -> img_buffer_end ; 1647return ; 1648 } 1649if (s -> io .read ) { 1650int blen = (int ) (s -> img_buffer_end - s -> img_buffer ); 1651if (blen < n ) { 1652s -> img_buffer = s -> img_buffer_end ; 1653 (s -> io .skip )(s -> io_user_data ,n - blen ); 1654return ; 1655 } 1656 } 1657s -> img_buffer += n ; 1658} 1659#endif 1660 1661#if defined(STBI_NO_PNG )&& defined(STBI_NO_TGA )&& defined(STBI_NO_HDR )&& defined(STBI_NO_PNM ) 1662// nothing 1663#else 1664static int stbi__getn (stbi__context * s ,stbi_uc * buffer ,int n ) 1665{ 1666if (s -> io .read ) { 1667int blen = (int ) (s -> img_buffer_end - s -> img_buffer ); 1668if (blen < n ) { 1669int res ,count ; 1670 1671memcpy (buffer ,s -> img_buffer ,blen ); 1672 1673count = (s -> io .read )(s -> io_user_data , (char * )buffer + blen ,n - blen ); 1674res = (count == (n - blen )); 1675s -> img_buffer = s -> img_buffer_end ; 1676return res ; 1677 } 1678 } 1679 1680if (s -> img_buffer + n <=s -> img_buffer_end ) { 1681memcpy (buffer ,s -> img_buffer ,n ); 1682s -> img_buffer += n ; 1683return 1 ; 1684 }else 1685return 0 ; 1686} 1687#endif 1688 1689#if defined(STBI_NO_JPEG )&& defined(STBI_NO_PNG )&& defined(STBI_NO_PSD )&& defined(STBI_NO_PIC ) 1690// nothing 1691#else 1692static int stbi__get16be (stbi__context * s ) 1693{ 1694int z = stbi__get8 (s ); 1695return (z <<8 )+ stbi__get8 (s ); 1696} 1697#endif 1698 1699#if defined(STBI_NO_PNG )&& defined(STBI_NO_PSD )&& defined(STBI_NO_PIC ) 1700// nothing 1701#else 1702static stbi__uint32 stbi__get32be (stbi__context * s ) 1703{ 1704stbi__uint32 z = stbi__get16be (s ); 1705return (z <<16 )+ stbi__get16be (s ); 1706} 1707#endif 1708 1709#if defined(STBI_NO_BMP )&& defined(STBI_NO_TGA )&& defined(STBI_NO_GIF ) 1710// nothing 1711#else 1712static int stbi__get16le (stbi__context * s ) 1713{ 1714int z = stbi__get8 (s ); 1715return z + (stbi__get8 (s ) <<8 ); 1716} 1717#endif 1718 1719#ifndef STBI_NO_BMP 1720static stbi__uint32 stbi__get32le (stbi__context * s ) 1721{ 1722stbi__uint32 z = stbi__get16le (s ); 1723z += (stbi__uint32 )stbi__get16le (s ) <<16 ; 1724return z ; 1725} 1726#endif 1727 1728#define STBI__BYTECAST (x ) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings 1729 1730#if defined(STBI_NO_JPEG )&& defined(STBI_NO_PNG )&& defined(STBI_NO_BMP )&& defined(STBI_NO_PSD )&& defined(STBI_NO_TGA )&& defined(STBI_NO_GIF )&& defined(STBI_NO_PIC )&& defined(STBI_NO_PNM ) 1731// nothing 1732#else 1733////////////////////////////////////////////////////////////////////////////// 1734// 1735// generic converter from built-in img_n to req_comp 1736// individual types do this automatically as much as possible (e.g. jpeg 1737// does all cases internally since it needs to colorspace convert anyway, 1738// and it never has alpha, so very few cases ). png can automatically 1739// interleave an alpha=255 channel, but falls back to this for other cases 1740// 1741// assume data buffer is malloced, so malloc a new one and free that one 1742// only failure mode is malloc failing 1743 1744static stbi_uc stbi__compute_y (int r ,int g ,int b ) 1745{ 1746return (stbi_uc ) (((r * 77 )+ (g * 150 )+ (29 * b )) >>8 ); 1747} 1748#endif 1749 1750#if defined(STBI_NO_PNG )&& defined(STBI_NO_BMP )&& defined(STBI_NO_PSD )&& defined(STBI_NO_TGA )&& defined(STBI_NO_GIF )&& defined(STBI_NO_PIC )&& defined(STBI_NO_PNM ) 1751// nothing 1752#else 1753static unsigned char * stbi__convert_format (unsigned char * data ,int img_n ,int req_comp ,unsigned int x ,unsigned int y ) 1754{ 1755int i ,j ; 1756unsigned char * good ; 1757 1758if (req_comp == img_n )return data ; 1759STBI_ASSERT (req_comp >=1 && req_comp <=4 ); 1760 1761good = (unsigned char * )stbi__malloc_mad3 (req_comp ,x ,y ,0 ); 1762if (good == NULL ) { 1763STBI_FREE (data ); 1764return stbi__errpuc ("outofmem" ,"Out of memory" ); 1765 } 1766 1767for (j = 0 ;j < (int )y ;++ j ) { 1768unsigned char * src = data + j * x * img_n ; 1769unsigned char * dest = good + j * x * req_comp ; 1770 1771#define STBI__COMBO (a ,b ) ((a)*8+(b)) 1772#define STBI__CASE (a ,b ) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 1773// convert source image with img_n components to one with req_comp components; 1774// avoid switch per pixel, so use switch per scanline and massive macros 1775switch (STBI__COMBO (img_n ,req_comp )) { 1776STBI__CASE (1 ,2 ) {dest [0 ]= src [0 ];dest [1 ]= 255 ; }break ; 1777STBI__CASE (1 ,3 ) {dest [0 ]= dest [1 ]= dest [2 ]= src [0 ]; }break ; 1778STBI__CASE (1 ,4 ) {dest [0 ]= dest [1 ]= dest [2 ]= src [0 ];dest [3 ]= 255 ; }break ; 1779STBI__CASE (2 ,1 ) {dest [0 ]= src [0 ]; }break ; 1780STBI__CASE (2 ,3 ) {dest [0 ]= dest [1 ]= dest [2 ]= src [0 ]; }break ; 1781STBI__CASE (2 ,4 ) {dest [0 ]= dest [1 ]= dest [2 ]= src [0 ];dest [3 ]= src [1 ]; }break ; 1782STBI__CASE (3 ,4 ) {dest [0 ]= src [0 ];dest [1 ]= src [1 ];dest [2 ]= src [2 ];dest [3 ]= 255 ; }break ; 1783STBI__CASE (3 ,1 ) {dest [0 ]= stbi__compute_y (src [0 ],src [1 ],src [2 ]); }break ; 1784STBI__CASE (3 ,2 ) {dest [0 ]= stbi__compute_y (src [0 ],src [1 ],src [2 ]);dest [1 ]= 255 ; }break ; 1785STBI__CASE (4 ,1 ) {dest [0 ]= stbi__compute_y (src [0 ],src [1 ],src [2 ]); }break ; 1786STBI__CASE (4 ,2 ) {dest [0 ]= stbi__compute_y (src [0 ],src [1 ],src [2 ]);dest [1 ]= src [3 ]; }break ; 1787STBI__CASE (4 ,3 ) {dest [0 ]= src [0 ];dest [1 ]= src [1 ];dest [2 ]= src [2 ]; }break ; 1788default :STBI_ASSERT (0 );STBI_FREE (data );STBI_FREE (good );return stbi__errpuc ("unsupported" ,"Unsupported format conversion" ); 1789 } 1790#undef STBI__CASE 1791 } 1792 1793STBI_FREE (data ); 1794return good ; 1795} 1796#endif 1797 1798#if defined(STBI_NO_PNG )&& defined(STBI_NO_PSD ) 1799// nothing 1800#else 1801static stbi__uint16 stbi__compute_y_16 (int r ,int g ,int b ) 1802{ 1803return (stbi__uint16 ) (((r * 77 )+ (g * 150 )+ (29 * b )) >>8 ); 1804} 1805#endif 1806 1807#if defined(STBI_NO_PNG )&& defined(STBI_NO_PSD ) 1808// nothing 1809#else 1810static stbi__uint16 * stbi__convert_format16 (stbi__uint16 * data ,int img_n ,int req_comp ,unsigned int x ,unsigned int y ) 1811{ 1812int i ,j ; 1813stbi__uint16 * good ; 1814 1815if (req_comp == img_n )return data ; 1816STBI_ASSERT (req_comp >=1 && req_comp <=4 ); 1817 1818good = (stbi__uint16 * )stbi__malloc (req_comp * x * y * 2 ); 1819if (good == NULL ) { 1820STBI_FREE (data ); 1821return (stbi__uint16 * )stbi__errpuc ("outofmem" ,"Out of memory" ); 1822 } 1823 1824for (j = 0 ;j < (int )y ;++ j ) { 1825stbi__uint16 * src = data + j * x * img_n ; 1826stbi__uint16 * dest = good + j * x * req_comp ; 1827 1828#define STBI__COMBO (a ,b ) ((a)*8+(b)) 1829#define STBI__CASE (a ,b ) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) 1830// convert source image with img_n components to one with req_comp components; 1831// avoid switch per pixel, so use switch per scanline and massive macros 1832switch (STBI__COMBO (img_n ,req_comp )) { 1833STBI__CASE (1 ,2 ) {dest [0 ]= src [0 ];dest [1 ]= 0xffff ; }break ; 1834STBI__CASE (1 ,3 ) {dest [0 ]= dest [1 ]= dest [2 ]= src [0 ]; }break ; 1835STBI__CASE (1 ,4 ) {dest [0 ]= dest [1 ]= dest [2 ]= src [0 ];dest [3 ]= 0xffff ; }break ; 1836STBI__CASE (2 ,1 ) {dest [0 ]= src [0 ]; }break ; 1837STBI__CASE (2 ,3 ) {dest [0 ]= dest [1 ]= dest [2 ]= src [0 ]; }break ; 1838STBI__CASE (2 ,4 ) {dest [0 ]= dest [1 ]= dest [2 ]= src [0 ];dest [3 ]= src [1 ]; }break ; 1839STBI__CASE (3 ,4 ) {dest [0 ]= src [0 ];dest [1 ]= src [1 ];dest [2 ]= src [2 ];dest [3 ]= 0xffff ; }break ; 1840STBI__CASE (3 ,1 ) {dest [0 ]= stbi__compute_y_16 (src [0 ],src [1 ],src [2 ]); }break ; 1841STBI__CASE (3 ,2 ) {dest [0 ]= stbi__compute_y_16 (src [0 ],src [1 ],src [2 ]);dest [1 ]= 0xffff ; }break ; 1842STBI__CASE (4 ,1 ) {dest [0 ]= stbi__compute_y_16 (src [0 ],src [1 ],src [2 ]); }break ; 1843STBI__CASE (4 ,2 ) {dest [0 ]= stbi__compute_y_16 (src [0 ],src [1 ],src [2 ]);dest [1 ]= src [3 ]; }break ; 1844STBI__CASE (4 ,3 ) {dest [0 ]= src [0 ];dest [1 ]= src [1 ];dest [2 ]= src [2 ]; }break ; 1845default :STBI_ASSERT (0 );STBI_FREE (data );STBI_FREE (good );return (stbi__uint16 * )stbi__errpuc ("unsupported" ,"Unsupported format conversion" ); 1846 } 1847#undef STBI__CASE 1848 } 1849 1850STBI_FREE (data ); 1851return good ; 1852} 1853#endif 1854 1855#ifndef STBI_NO_LINEAR 1856static float * stbi__ldr_to_hdr (stbi_uc * data ,int x ,int y ,int comp ) 1857{ 1858int i ,k ,n ; 1859float * output ; 1860if (!data )return NULL ; 1861output = (float * )stbi__malloc_mad4 (x ,y ,comp ,sizeof (float ),0 ); 1862if (output == NULL ) {STBI_FREE (data );return stbi__errpf ("outofmem" ,"Out of memory" ); } 1863// compute number of non-alpha components 1864if (comp & 1 )n = comp ;else n = comp - 1 ; 1865for (i = 0 ;i < x * y ;++ i ) { 1866for (k = 0 ;k < n ;++ k ) { 1867output [i * comp + k ]= (float ) (pow (data [i * comp + k ]/255.0f ,stbi__l2h_gamma )* stbi__l2h_scale ); 1868 } 1869 } 1870if (n < comp ) { 1871for (i = 0 ;i < x * y ;++ i ) { 1872output [i * comp + n ]= data [i * comp + n ]/255.0f ; 1873 } 1874 } 1875STBI_FREE (data ); 1876return output ; 1877} 1878#endif 1879 1880#ifndef STBI_NO_HDR 1881#define stbi__float2int (x ) ((int) (x)) 1882static stbi_uc * stbi__hdr_to_ldr (float * data ,int x ,int y ,int comp ) 1883{ 1884int i ,k ,n ; 1885stbi_uc * output ; 1886if (!data )return NULL ; 1887output = (stbi_uc * )stbi__malloc_mad3 (x ,y ,comp ,0 ); 1888if (output == NULL ) {STBI_FREE (data );return stbi__errpuc ("outofmem" ,"Out of memory" ); } 1889// compute number of non-alpha components 1890if (comp & 1 )n = comp ;else n = comp - 1 ; 1891for (i = 0 ;i < x * y ;++ i ) { 1892for (k = 0 ;k < n ;++ k ) { 1893float z = (float )pow (data [i * comp + k ]* stbi__h2l_scale_i ,stbi__h2l_gamma_i )* 255 + 0.5f ; 1894if (z < 0 )z = 0 ; 1895if (z > 255 )z = 255 ; 1896output [i * comp + k ]= (stbi_uc )stbi__float2int (z ); 1897 } 1898if (k < comp ) { 1899float z = data [i * comp + k ]* 255 + 0.5f ; 1900if (z < 0 )z = 0 ; 1901if (z > 255 )z = 255 ; 1902output [i * comp + k ]= (stbi_uc )stbi__float2int (z ); 1903 } 1904 } 1905STBI_FREE (data ); 1906return output ; 1907} 1908#endif 1909 1910////////////////////////////////////////////////////////////////////////////// 1911// 1912// "baseline" JPEG/JFIF decoder 1913// 1914// simple implementation 1915// - doesn't support delayed output of y-dimension 1916// - simple interface (only one output format: 8-bit interleaved RGB) 1917// - doesn't try to recover corrupt jpegs 1918// - doesn't allow partial loading, loading multiple at once 1919// - still fast on x86 (copying globals into locals doesn't help x86) 1920// - allocates lots of intermediate memory (full size of all components) 1921// - non-interleaved case requires this anyway 1922// - allows good upsampling (see next) 1923// high-quality 1924// - upsampled channels are bilinearly interpolated, even across blocks 1925// - quality integer IDCT derived from IJG's 'slow' 1926// performance 1927// - fast huffman; reasonable integer IDCT 1928// - some SIMD kernels for common paths on targets with SSE2/NEON 1929// - uses a lot of intermediate memory, could cache poorly 1930 1931#ifndef STBI_NO_JPEG 1932 1933// huffman decoding acceleration 1934#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache 1935 1936typedef struct 1937{ 1938stbi_uc fast [1 <<FAST_BITS ]; 1939// weirdly, repacking this into AoS is a 10% speed loss, instead of a win 1940stbi__uint16 code [256 ]; 1941stbi_uc values [256 ]; 1942stbi_uc size [257 ]; 1943unsigned int maxcode [18 ]; 1944int delta [17 ];// old 'firstsymbol' - old 'firstcode' 1945}stbi__huffman ; 1946 1947typedef struct 1948{ 1949stbi__context * s ; 1950stbi__huffman huff_dc [4 ]; 1951stbi__huffman huff_ac [4 ]; 1952stbi__uint16 dequant [4 ][64 ]; 1953stbi__int16 fast_ac [4 ][1 <<FAST_BITS ]; 1954 1955// sizes for components, interleaved MCUs 1956int img_h_max ,img_v_max ; 1957int img_mcu_x ,img_mcu_y ; 1958int img_mcu_w ,img_mcu_h ; 1959 1960// definition of jpeg image component 1961struct 1962 { 1963int id ; 1964int h ,v ; 1965int tq ; 1966int hd ,ha ; 1967int dc_pred ; 1968 1969int x ,y ,w2 ,h2 ; 1970stbi_uc * data ; 1971void * raw_data ,* raw_coeff ; 1972stbi_uc * linebuf ; 1973short * coeff ;// progressive only 1974int coeff_w ,coeff_h ;// number of 8x8 coefficient blocks 1975 }img_comp [4 ]; 1976 1977stbi__uint32 code_buffer ;// jpeg entropy-coded buffer 1978int code_bits ;// number of valid bits 1979unsigned char marker ;// marker seen while filling entropy buffer 1980int nomore ;// flag if we saw a marker so must stop 1981 1982int progressive ; 1983int spec_start ; 1984int spec_end ; 1985int succ_high ; 1986int succ_low ; 1987int eob_run ; 1988int jfif ; 1989int app14_color_transform ;// Adobe APP14 tag 1990int rgb ; 1991 1992int scan_n ,order [4 ]; 1993int restart_interval ,todo ; 1994 1995// kernels 1996void (* idct_block_kernel )(stbi_uc * out ,int out_stride ,short data [64 ]); 1997void (* YCbCr_to_RGB_kernel )(stbi_uc * out ,const stbi_uc * y ,const stbi_uc * pcb ,const stbi_uc * pcr ,int count ,int step ); 1998stbi_uc * (* resample_row_hv_2_kernel )(stbi_uc * out ,stbi_uc * in_near ,stbi_uc * in_far ,int w ,int hs ); 1999}stbi__jpeg ; 2000 2001static int stbi__build_huffman (stbi__huffman * h ,int * count ) 2002{ 2003int i ,j ,k = 0 ; 2004unsigned int code ; 2005// build size list for each symbol (from JPEG spec) 2006for (i = 0 ;i < 16 ;++ i ) { 2007for (j = 0 ;j < count [i ];++ j ) { 2008h -> size [k ++ ]= (stbi_uc ) (i + 1 ); 2009if (k >=257 )return stbi__err ("bad size list" ,"Corrupt JPEG" ); 2010 } 2011 } 2012h -> size [k ]= 0 ; 2013 2014// compute actual symbols (from jpeg spec) 2015code = 0 ; 2016k = 0 ; 2017for (j = 1 ;j <=16 ;++ j ) { 2018// compute delta to add to code to compute symbol id 2019h -> delta [j ]= k - code ; 2020if (h -> size [k ]== j ) { 2021while (h -> size [k ]== j ) 2022h -> code [k ++ ]= (stbi__uint16 ) (code ++ ); 2023if (code - 1 >= (1u <<j ))return stbi__err ("bad code lengths" ,"Corrupt JPEG" ); 2024 } 2025// compute largest code + 1 for this size, preshifted as needed later 2026h -> maxcode [j ]= code << (16 - j ); 2027code <<=1 ; 2028 } 2029h -> maxcode [j ]= 0xffffffff ; 2030 2031// build non-spec acceleration table; 255 is flag for not-accelerated 2032memset (h -> fast ,255 ,1 <<FAST_BITS ); 2033for (i = 0 ;i < k ;++ i ) { 2034int s = h -> size [i ]; 2035if (s <=FAST_BITS ) { 2036int c = h -> code [i ] << (FAST_BITS - s ); 2037int m = 1 << (FAST_BITS - s ); 2038for (j = 0 ;j < m ;++ j ) { 2039h -> fast [c + j ]= (stbi_uc )i ; 2040 } 2041 } 2042 } 2043return 1 ; 2044} 2045 2046// build a table that decodes both magnitude and value of small ACs in 2047// one go. 2048static void stbi__build_fast_ac (stbi__int16 * fast_ac ,stbi__huffman * h ) 2049{ 2050int i ; 2051for (i = 0 ;i < (1 <<FAST_BITS );++ i ) { 2052stbi_uc fast = h -> fast [i ]; 2053fast_ac [i ]= 0 ; 2054if (fast < 255 ) { 2055int rs = h -> values [fast ]; 2056int run = (rs >>4 )& 15 ; 2057int magbits = rs & 15 ; 2058int len = h -> size [fast ]; 2059 2060if (magbits && len + magbits <=FAST_BITS ) { 2061// magnitude code followed by receive_extend code 2062int k = ((i <<len )& ((1 <<FAST_BITS )- 1 )) >> (FAST_BITS - magbits ); 2063int m = 1 << (magbits - 1 ); 2064if (k < m )k += (~0U <<magbits )+ 1 ; 2065// if the result is small enough, we can fit it in fast_ac table 2066if (k >=-128 && k <=127 ) 2067fast_ac [i ]= (stbi__int16 ) ((k * 256 )+ (run * 16 )+ (len + magbits )); 2068 } 2069 } 2070 } 2071} 2072 2073static void stbi__grow_buffer_unsafe (stbi__jpeg * j ) 2074{ 2075do { 2076unsigned int b = j -> nomore ?0 :stbi__get8 (j -> s ); 2077if (b == 0xff ) { 2078int c = stbi__get8 (j -> s ); 2079while (c == 0xff )c = stbi__get8 (j -> s );// consume fill bytes 2080if (c != 0 ) { 2081j -> marker = (unsigned char )c ; 2082j -> nomore = 1 ; 2083return ; 2084 } 2085 } 2086j -> code_buffer |=b << (24 - j -> code_bits ); 2087j -> code_bits += 8 ; 2088 }while (j -> code_bits <=24 ); 2089} 2090 2091// (1 << n) - 1 2092static const stbi__uint32 stbi__bmask [17 ]= {0 ,1 ,3 ,7 ,15 ,31 ,63 ,127 ,255 ,511 ,1023 ,2047 ,4095 ,8191 ,16383 ,32767 ,65535 }; 2093 2094// decode a jpeg huffman value from the bitstream 2095stbi_inline static int stbi__jpeg_huff_decode (stbi__jpeg * j ,stbi__huffman * h ) 2096{ 2097unsigned int temp ; 2098int c ,k ; 2099 2100if (j -> code_bits < 16 )stbi__grow_buffer_unsafe (j ); 2101 2102// look at the top FAST_BITS and determine what symbol ID it is, 2103// if the code is <= FAST_BITS 2104c = (j -> code_buffer >> (32 - FAST_BITS ))& ((1 <<FAST_BITS )- 1 ); 2105k = h -> fast [c ]; 2106if (k < 255 ) { 2107int s = h -> size [k ]; 2108if (s > j -> code_bits ) 2109return -1 ; 2110j -> code_buffer <<=s ; 2111j -> code_bits -= s ; 2112return h -> values [k ]; 2113 } 2114 2115// naive test is to shift the code_buffer down so k bits are 2116// valid, then test against maxcode. To speed this up, we've 2117// preshifted maxcode left so that it has (16-k) 0s at the 2118// end; in other words, regardless of the number of bits, it 2119// wants to be compared against something shifted to have 16; 2120// that way we don't need to shift inside the loop. 2121temp = j -> code_buffer >>16 ; 2122for (k = FAST_BITS + 1 ; ;++ k ) 2123if (temp < h -> maxcode [k ]) 2124break ; 2125if (k == 17 ) { 2126// error! code not found 2127j -> code_bits -= 16 ; 2128return -1 ; 2129 } 2130 2131if (k > j -> code_bits ) 2132return -1 ; 2133 2134// convert the huffman code to the symbol id 2135c = ((j -> code_buffer >> (32 - k ))& stbi__bmask [k ])+ h -> delta [k ]; 2136if (c < 0 || c >=256 )// symbol id out of bounds! 2137return -1 ; 2138STBI_ASSERT ((((j -> code_buffer ) >> (32 - h -> size [c ]))& stbi__bmask [h -> size [c ]])== h -> code [c ]); 2139 2140// convert the id to a symbol 2141j -> code_bits -= k ; 2142j -> code_buffer <<=k ; 2143return h -> values [c ]; 2144} 2145 2146// bias[n] = (-1<<n) + 1 2147static const int stbi__jbias [16 ]= {0 ,-1 ,-3 ,-7 ,-15 ,-31 ,-63 ,-127 ,-255 ,-511 ,-1023 ,-2047 ,-4095 ,-8191 ,-16383 ,-32767 }; 2148 2149// combined JPEG 'receive' and JPEG 'extend', since baseline 2150// always extends everything it receives. 2151stbi_inline static int stbi__extend_receive (stbi__jpeg * j ,int n ) 2152{ 2153unsigned int k ; 2154int sgn ; 2155if (j -> code_bits < n )stbi__grow_buffer_unsafe (j ); 2156if (j -> code_bits < n )return 0 ;// ran out of bits from stream, return 0s intead of continuing 2157 2158sgn = j -> code_buffer >>31 ;// sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) 2159k = stbi_lrot (j -> code_buffer ,n ); 2160j -> code_buffer = k & ~stbi__bmask [n ]; 2161k &=stbi__bmask [n ]; 2162j -> code_bits -= n ; 2163return k + (stbi__jbias [n ]& (sgn - 1 )); 2164} 2165 2166// get some unsigned bits 2167stbi_inline static int stbi__jpeg_get_bits (stbi__jpeg * j ,int n ) 2168{ 2169unsigned int k ; 2170if (j -> code_bits < n )stbi__grow_buffer_unsafe (j ); 2171if (j -> code_bits < n )return 0 ;// ran out of bits from stream, return 0s intead of continuing 2172k = stbi_lrot (j -> code_buffer ,n ); 2173j -> code_buffer = k & ~stbi__bmask [n ]; 2174k &=stbi__bmask [n ]; 2175j -> code_bits -= n ; 2176return k ; 2177} 2178 2179stbi_inline static int stbi__jpeg_get_bit (stbi__jpeg * j ) 2180{ 2181unsigned int k ; 2182if (j -> code_bits < 1 )stbi__grow_buffer_unsafe (j ); 2183if (j -> code_bits < 1 )return 0 ;// ran out of bits from stream, return 0s intead of continuing 2184k = j -> code_buffer ; 2185j -> code_buffer <<=1 ; 2186-- j -> code_bits ; 2187return k & 0x80000000 ; 2188} 2189 2190// given a value that's at position X in the zigzag stream, 2191// where does it appear in the 8x8 matrix coded as row-major? 2192static const stbi_uc stbi__jpeg_dezigzag [64 + 15 ]= 2193{ 21940 ,1 ,8 ,16 ,9 ,2 ,3 ,10 , 219517 ,24 ,32 ,25 ,18 ,11 ,4 ,5 , 219612 ,19 ,26 ,33 ,40 ,48 ,41 ,34 , 219727 ,20 ,13 ,6 ,7 ,14 ,21 ,28 , 219835 ,42 ,49 ,56 ,57 ,50 ,43 ,36 , 219929 ,22 ,15 ,23 ,30 ,37 ,44 ,51 , 220058 ,59 ,52 ,45 ,38 ,31 ,39 ,46 , 220153 ,60 ,61 ,54 ,47 ,55 ,62 ,63 , 2202// let corrupt input sample past end 220363 ,63 ,63 ,63 ,63 ,63 ,63 ,63 , 220463 ,63 ,63 ,63 ,63 ,63 ,63 2205}; 2206 2207// decode one 64-entry block-- 2208static int stbi__jpeg_decode_block (stbi__jpeg * j ,short data [64 ],stbi__huffman * hdc ,stbi__huffman * hac ,stbi__int16 * fac ,int b ,stbi__uint16 * dequant ) 2209{ 2210int diff ,dc ,k ; 2211int t ; 2212 2213if (j -> code_bits < 16 )stbi__grow_buffer_unsafe (j ); 2214t = stbi__jpeg_huff_decode (j ,hdc ); 2215if (t < 0 || t > 15 )return stbi__err ("bad huffman code" ,"Corrupt JPEG" ); 2216 2217// 0 all the ac values now so we can do it 32-bits at a time 2218memset (data ,0 ,64 * sizeof (data [0 ])); 2219 2220diff = t ?stbi__extend_receive (j ,t ) :0 ; 2221if (!stbi__addints_valid (j -> img_comp [b ].dc_pred ,diff ))return stbi__err ("bad delta" ,"Corrupt JPEG" ); 2222dc = j -> img_comp [b ].dc_pred + diff ; 2223j -> img_comp [b ].dc_pred = dc ; 2224if (!stbi__mul2shorts_valid (dc ,dequant [0 ]))return stbi__err ("can't merge dc and ac" ,"Corrupt JPEG" ); 2225data [0 ]= (short ) (dc * dequant [0 ]); 2226 2227// decode AC components, see JPEG spec 2228k = 1 ; 2229do { 2230unsigned int zig ; 2231int c ,r ,s ; 2232if (j -> code_bits < 16 )stbi__grow_buffer_unsafe (j ); 2233c = (j -> code_buffer >> (32 - FAST_BITS ))& ((1 <<FAST_BITS )- 1 ); 2234r = fac [c ]; 2235if (r ) {// fast-AC path 2236k += (r >>4 )& 15 ;// run 2237s = r & 15 ;// combined length 2238if (s > j -> code_bits )return stbi__err ("bad huffman code" ,"Combined length longer than code bits available" ); 2239j -> code_buffer <<=s ; 2240j -> code_bits -= s ; 2241// decode into unzigzag'd location 2242zig = stbi__jpeg_dezigzag [k ++ ]; 2243data [zig ]= (short ) ((r >>8 )* dequant [zig ]); 2244 }else { 2245int rs = stbi__jpeg_huff_decode (j ,hac ); 2246if (rs < 0 )return stbi__err ("bad huffman code" ,"Corrupt JPEG" ); 2247s = rs & 15 ; 2248r = rs >>4 ; 2249if (s == 0 ) { 2250if (rs != 0xf0 )break ;// end block 2251k += 16 ; 2252 }else { 2253k += r ; 2254// decode into unzigzag'd location 2255zig = stbi__jpeg_dezigzag [k ++ ]; 2256data [zig ]= (short ) (stbi__extend_receive (j ,s )* dequant [zig ]); 2257 } 2258 } 2259 }while (k < 64 ); 2260return 1 ; 2261} 2262 2263static int stbi__jpeg_decode_block_prog_dc (stbi__jpeg * j ,short data [64 ],stbi__huffman * hdc ,int b ) 2264{ 2265int diff ,dc ; 2266int t ; 2267if (j -> spec_end != 0 )return stbi__err ("can't merge dc and ac" ,"Corrupt JPEG" ); 2268 2269if (j -> code_bits < 16 )stbi__grow_buffer_unsafe (j ); 2270 2271if (j -> succ_high == 0 ) { 2272// first scan for DC coefficient, must be first 2273memset (data ,0 ,64 * sizeof (data [0 ]));// 0 all the ac values now 2274t = stbi__jpeg_huff_decode (j ,hdc ); 2275if (t < 0 || t > 15 )return stbi__err ("can't merge dc and ac" ,"Corrupt JPEG" ); 2276diff = t ?stbi__extend_receive (j ,t ) :0 ; 2277 2278if (!stbi__addints_valid (j -> img_comp [b ].dc_pred ,diff ))return stbi__err ("bad delta" ,"Corrupt JPEG" ); 2279dc = j -> img_comp [b ].dc_pred + diff ; 2280j -> img_comp [b ].dc_pred = dc ; 2281if (!stbi__mul2shorts_valid (dc ,1 <<j -> succ_low ))return stbi__err ("can't merge dc and ac" ,"Corrupt JPEG" ); 2282data [0 ]= (short ) (dc * (1 <<j -> succ_low )); 2283 }else { 2284// refinement scan for DC coefficient 2285if (stbi__jpeg_get_bit (j )) 2286data [0 ]+= (short ) (1 <<j -> succ_low ); 2287 } 2288return 1 ; 2289} 2290 2291// @OPTIMIZE: store non-zigzagged during the decode passes, 2292// and only de-zigzag when dequantizing 2293static int stbi__jpeg_decode_block_prog_ac (stbi__jpeg * j ,short data [64 ],stbi__huffman * hac ,stbi__int16 * fac ) 2294{ 2295int k ; 2296if (j -> spec_start == 0 )return stbi__err ("can't merge dc and ac" ,"Corrupt JPEG" ); 2297 2298if (j -> succ_high == 0 ) { 2299int shift = j -> succ_low ; 2300 2301if (j -> eob_run ) { 2302-- j -> eob_run ; 2303return 1 ; 2304 } 2305 2306k = j -> spec_start ; 2307do { 2308unsigned int zig ; 2309int c ,r ,s ; 2310if (j -> code_bits < 16 )stbi__grow_buffer_unsafe (j ); 2311c = (j -> code_buffer >> (32 - FAST_BITS ))& ((1 <<FAST_BITS )- 1 ); 2312r = fac [c ]; 2313if (r ) {// fast-AC path 2314k += (r >>4 )& 15 ;// run 2315s = r & 15 ;// combined length 2316if (s > j -> code_bits )return stbi__err ("bad huffman code" ,"Combined length longer than code bits available" ); 2317j -> code_buffer <<=s ; 2318j -> code_bits -= s ; 2319zig = stbi__jpeg_dezigzag [k ++ ]; 2320data [zig ]= (short ) ((r >>8 )* (1 <<shift )); 2321 }else { 2322int rs = stbi__jpeg_huff_decode (j ,hac ); 2323if (rs < 0 )return stbi__err ("bad huffman code" ,"Corrupt JPEG" ); 2324s = rs & 15 ; 2325r = rs >>4 ; 2326if (s == 0 ) { 2327if (r < 15 ) { 2328j -> eob_run = (1 <<r ); 2329if (r ) 2330j -> eob_run += stbi__jpeg_get_bits (j ,r ); 2331-- j -> eob_run ; 2332break ; 2333 } 2334k += 16 ; 2335 }else { 2336k += r ; 2337zig = stbi__jpeg_dezigzag [k ++ ]; 2338data [zig ]= (short ) (stbi__extend_receive (j ,s )* (1 <<shift )); 2339 } 2340 } 2341 }while (k <=j -> spec_end ); 2342 }else { 2343// refinement scan for these AC coefficients 2344 2345short bit = (short ) (1 <<j -> succ_low ); 2346 2347if (j -> eob_run ) { 2348-- j -> eob_run ; 2349for (k = j -> spec_start ;k <=j -> spec_end ;++ k ) { 2350short * p = & data [stbi__jpeg_dezigzag [k ]]; 2351if (* p != 0 ) 2352if (stbi__jpeg_get_bit (j )) 2353if ((* p & bit )== 0 ) { 2354if (* p > 0 ) 2355* p += bit ; 2356else 2357* p -= bit ; 2358 } 2359 } 2360 }else { 2361k = j -> spec_start ; 2362do { 2363int r ,s ; 2364int rs = stbi__jpeg_huff_decode (j ,hac );// @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh 2365if (rs < 0 )return stbi__err ("bad huffman code" ,"Corrupt JPEG" ); 2366s = rs & 15 ; 2367r = rs >>4 ; 2368if (s == 0 ) { 2369if (r < 15 ) { 2370j -> eob_run = (1 <<r )- 1 ; 2371if (r ) 2372j -> eob_run += stbi__jpeg_get_bits (j ,r ); 2373r = 64 ;// force end of block 2374 }else { 2375// r=15 s=0 should write 16 0s, so we just do 2376// a run of 15 0s and then write s (which is 0), 2377// so we don't have to do anything special here 2378 } 2379 }else { 2380if (s != 1 )return stbi__err ("bad huffman code" ,"Corrupt JPEG" ); 2381// sign bit 2382if (stbi__jpeg_get_bit (j )) 2383s = bit ; 2384else 2385s = - bit ; 2386 } 2387 2388// advance by r 2389while (k <=j -> spec_end ) { 2390short * p = & data [stbi__jpeg_dezigzag [k ++ ]]; 2391if (* p != 0 ) { 2392if (stbi__jpeg_get_bit (j )) 2393if ((* p & bit )== 0 ) { 2394if (* p > 0 ) 2395* p += bit ; 2396else 2397* p -= bit ; 2398 } 2399 }else { 2400if (r == 0 ) { 2401* p = (short )s ; 2402break ; 2403 } 2404-- r ; 2405 } 2406 } 2407 }while (k <=j -> spec_end ); 2408 } 2409 } 2410return 1 ; 2411} 2412 2413// take a -128..127 value and stbi__clamp it and convert to 0..255 2414stbi_inline static stbi_uc stbi__clamp (int x ) 2415{ 2416// trick to use a single test to catch both cases 2417if ((unsigned int )x > 255 ) { 2418if (x < 0 )return 0 ; 2419if (x > 255 )return 255 ; 2420 } 2421return (stbi_uc )x ; 2422} 2423 2424#define stbi__f2f (x ) ((int) (((x) * 4096 + 0.5))) 2425#define stbi__fsh (x ) ((x) * 4096) 2426 2427// derived from jidctint -- DCT_ISLOW 2428#define STBI__IDCT_1D (s0 ,s1 ,s2 ,s3 ,s4 ,s5 ,s6 ,s7 ) \ 2429 int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ 2430 p2 = s2; \ 2431 p3 = s6; \ 2432 p1 = (p2+p3) * stbi__f2f(0.5411961f); \ 2433 t2 = p1 + p3*stbi__f2f(-1.847759065f); \ 2434 t3 = p1 + p2*stbi__f2f( 0.765366865f); \ 2435 p2 = s0; \ 2436 p3 = s4; \ 2437 t0 = stbi__fsh(p2+p3); \ 2438 t1 = stbi__fsh(p2-p3); \ 2439 x0 = t0+t3; \ 2440 x3 = t0-t3; \ 2441 x1 = t1+t2; \ 2442 x2 = t1-t2; \ 2443 t0 = s7; \ 2444 t1 = s5; \ 2445 t2 = s3; \ 2446 t3 = s1; \ 2447 p3 = t0+t2; \ 2448 p4 = t1+t3; \ 2449 p1 = t0+t3; \ 2450 p2 = t1+t2; \ 2451 p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ 2452 t0 = t0*stbi__f2f( 0.298631336f); \ 2453 t1 = t1*stbi__f2f( 2.053119869f); \ 2454 t2 = t2*stbi__f2f( 3.072711026f); \ 2455 t3 = t3*stbi__f2f( 1.501321110f); \ 2456 p1 = p5 + p1*stbi__f2f(-0.899976223f); \ 2457 p2 = p5 + p2*stbi__f2f(-2.562915447f); \ 2458 p3 = p3*stbi__f2f(-1.961570560f); \ 2459 p4 = p4*stbi__f2f(-0.390180644f); \ 2460 t3 += p1+p4; \ 2461 t2 += p2+p3; \ 2462 t1 += p2+p4; \ 2463 t0 += p1+p3; 2464 2465static void stbi__idct_block (stbi_uc * out ,int out_stride ,short data [64 ]) 2466{ 2467int i ,val [64 ],* v = val ; 2468stbi_uc * o ; 2469short * d = data ; 2470 2471// columns 2472for (i = 0 ;i < 8 ;++ i ,++ d ,++ v ) { 2473// if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing 2474if (d [8 ]== 0 && d [16 ]== 0 && d [24 ]== 0 && d [32 ]== 0 2475&& d [40 ]== 0 && d [48 ]== 0 && d [56 ]== 0 ) { 2476// no shortcut 0 seconds 2477// (1|2|3|4|5|6|7)==0 0 seconds 2478// all separate -0.047 seconds 2479// 1 && 2|3 && 4|5 && 6|7: -0.047 seconds 2480int dcterm = d [0 ]* 4 ; 2481v [0 ]= v [8 ]= v [16 ]= v [24 ]= v [32 ]= v [40 ]= v [48 ]= v [56 ]= dcterm ; 2482 }else { 2483STBI__IDCT_1D (d [0 ],d [8 ],d [16 ],d [24 ],d [32 ],d [40 ],d [48 ],d [56 ]) 2484// constants scaled things up by 1<<12; let's bring them back 2485// down, but keep 2 extra bits of precision 2486x0 += 512 ;x1 += 512 ;x2 += 512 ;x3 += 512 ; 2487v [0 ]= (x0 + t3 ) >>10 ; 2488v [56 ]= (x0 - t3 ) >>10 ; 2489v [8 ]= (x1 + t2 ) >>10 ; 2490v [48 ]= (x1 - t2 ) >>10 ; 2491v [16 ]= (x2 + t1 ) >>10 ; 2492v [40 ]= (x2 - t1 ) >>10 ; 2493v [24 ]= (x3 + t0 ) >>10 ; 2494v [32 ]= (x3 - t0 ) >>10 ; 2495 } 2496 } 2497 2498for (i = 0 ,v = val ,o = out ;i < 8 ;++ i ,v += 8 ,o += out_stride ) { 2499// no fast case since the first 1D IDCT spread components out 2500STBI__IDCT_1D (v [0 ],v [1 ],v [2 ],v [3 ],v [4 ],v [5 ],v [6 ],v [7 ]) 2501// constants scaled things up by 1<<12, plus we had 1<<2 from first 2502// loop, plus horizontal and vertical each scale by sqrt(8) so together 2503// we've got an extra 1<<3, so 1<<17 total we need to remove. 2504// so we want to round that, which means adding 0.5 * 1<<17, 2505// aka 65536. Also, we'll end up with -128 to 127 that we want 2506// to encode as 0..255 by adding 128, so we'll add that before the shift 2507x0 += 65536 + (128 <<17 ); 2508x1 += 65536 + (128 <<17 ); 2509x2 += 65536 + (128 <<17 ); 2510x3 += 65536 + (128 <<17 ); 2511// tried computing the shifts into temps, or'ing the temps to see 2512// if any were out of range, but that was slower 2513o [0 ]= stbi__clamp ((x0 + t3 ) >>17 ); 2514o [7 ]= stbi__clamp ((x0 - t3 ) >>17 ); 2515o [1 ]= stbi__clamp ((x1 + t2 ) >>17 ); 2516o [6 ]= stbi__clamp ((x1 - t2 ) >>17 ); 2517o [2 ]= stbi__clamp ((x2 + t1 ) >>17 ); 2518o [5 ]= stbi__clamp ((x2 - t1 ) >>17 ); 2519o [3 ]= stbi__clamp ((x3 + t0 ) >>17 ); 2520o [4 ]= stbi__clamp ((x3 - t0 ) >>17 ); 2521 } 2522} 2523 2524#ifdef STBI_SSE2 2525// sse2 integer IDCT. not the fastest possible implementation but it 2526// produces bit-identical results to the generic C version so it's 2527// fully "transparent". 2528static void stbi__idct_simd (stbi_uc * out ,int out_stride ,short data [64 ]) 2529{ 2530// This is constructed to match our regular (generic) integer IDCT exactly. 2531__m128i row0 ,row1 ,row2 ,row3 ,row4 ,row5 ,row6 ,row7 ; 2532__m128i tmp ; 2533 2534// dot product constant: even elems=x, odd elems=y 2535#define dct_const (x ,y ) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) 2536 2537// out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) 2538// out(1) = c1[even]*x + c1[odd]*y 2539#define dct_rot (out0 ,out1 ,x ,y ,c0 ,c1 ) \ 2540 __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ 2541 __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ 2542 __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ 2543 __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ 2544 __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ 2545 __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) 2546 2547// out = in << 12 (in 16-bit, out 32-bit) 2548#define dct_widen (out ,in ) \ 2549 __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ 2550 __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) 2551 2552// wide add 2553#define dct_wadd (out ,a ,b ) \ 2554 __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ 2555 __m128i out##_h = _mm_add_epi32(a##_h, b##_h) 2556 2557// wide sub 2558#define dct_wsub (out ,a ,b ) \ 2559 __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ 2560 __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) 2561 2562// butterfly a/b, add bias, then shift by "s" and pack 2563#define dct_bfly32o (out0 ,out1 ,a ,b ,bias ,s ) \ 2564 { \ 2565 __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ 2566 __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ 2567 dct_wadd(sum, abiased, b); \ 2568 dct_wsub(dif, abiased, b); \ 2569 out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ 2570 out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ 2571 } 2572 2573// 8-bit interleave step (for transposes) 2574#define dct_interleave8 (a ,b ) \ 2575 tmp = a; \ 2576 a = _mm_unpacklo_epi8(a, b); \ 2577 b = _mm_unpackhi_epi8(tmp, b) 2578 2579// 16-bit interleave step (for transposes) 2580#define dct_interleave16 (a ,b ) \ 2581 tmp = a; \ 2582 a = _mm_unpacklo_epi16(a, b); \ 2583 b = _mm_unpackhi_epi16(tmp, b) 2584 2585#define dct_pass (bias ,shift ) \ 2586 { \ 2587/* even part */ \ 2588dct_rot (t2e ,t3e ,row2 ,row6 ,rot0_0 ,rot0_1 ); \ 2589__m128i sum04 = _mm_add_epi16 (row0 ,row4 ); \ 2590__m128i dif04 = _mm_sub_epi16 (row0 ,row4 ); \ 2591dct_widen (t0e ,sum04 ); \ 2592dct_widen (t1e ,dif04 ); \ 2593dct_wadd (x0 ,t0e ,t3e ); \ 2594dct_wsub (x3 ,t0e ,t3e ); \ 2595dct_wadd (x1 ,t1e ,t2e ); \ 2596dct_wsub (x2 ,t1e ,t2e ); \ 2597/* odd part */ \ 2598dct_rot (y0o ,y2o ,row7 ,row3 ,rot2_0 ,rot2_1 ); \ 2599dct_rot (y1o ,y3o ,row5 ,row1 ,rot3_0 ,rot3_1 ); \ 2600__m128i sum17 = _mm_add_epi16 (row1 ,row7 ); \ 2601__m128i sum35 = _mm_add_epi16 (row3 ,row5 ); \ 2602dct_rot (y4o ,y5o ,sum17 ,sum35 ,rot1_0 ,rot1_1 ); \ 2603dct_wadd (x4 ,y0o ,y4o ); \ 2604dct_wadd (x5 ,y1o ,y5o ); \ 2605dct_wadd (x6 ,y2o ,y5o ); \ 2606dct_wadd (x7 ,y3o ,y4o ); \ 2607dct_bfly32o (row0 ,row7 ,x0 ,x7 ,bias ,shift ); \ 2608dct_bfly32o (row1 ,row6 ,x1 ,x6 ,bias ,shift ); \ 2609dct_bfly32o (row2 ,row5 ,x2 ,x5 ,bias ,shift ); \ 2610dct_bfly32o (row3 ,row4 ,x3 ,x4 ,bias ,shift ); \ 2611 } 2612 2613__m128i rot0_0 = dct_const (stbi__f2f (0.5411961f ),stbi__f2f (0.5411961f )+ stbi__f2f (-1.847759065f )); 2614__m128i rot0_1 = dct_const (stbi__f2f (0.5411961f )+ stbi__f2f (0.765366865f ),stbi__f2f (0.5411961f )); 2615__m128i rot1_0 = dct_const (stbi__f2f (1.175875602f )+ stbi__f2f (-0.899976223f ),stbi__f2f (1.175875602f )); 2616__m128i rot1_1 = dct_const (stbi__f2f (1.175875602f ),stbi__f2f (1.175875602f )+ stbi__f2f (-2.562915447f )); 2617__m128i rot2_0 = dct_const (stbi__f2f (-1.961570560f )+ stbi__f2f (0.298631336f ),stbi__f2f (-1.961570560f )); 2618__m128i rot2_1 = dct_const (stbi__f2f (-1.961570560f ),stbi__f2f (-1.961570560f )+ stbi__f2f (3.072711026f )); 2619__m128i rot3_0 = dct_const (stbi__f2f (-0.390180644f )+ stbi__f2f (2.053119869f ),stbi__f2f (-0.390180644f )); 2620__m128i rot3_1 = dct_const (stbi__f2f (-0.390180644f ),stbi__f2f (-0.390180644f )+ stbi__f2f (1.501321110f )); 2621 2622// rounding biases in column/row passes, see stbi__idct_block for explanation. 2623__m128i bias_0 = _mm_set1_epi32 (512 ); 2624__m128i bias_1 = _mm_set1_epi32 (65536 + (128 <<17 )); 2625 2626// load 2627row0 = _mm_load_si128 ((const __m128i * ) (data + 0 * 8 )); 2628row1 = _mm_load_si128 ((const __m128i * ) (data + 1 * 8 )); 2629row2 = _mm_load_si128 ((const __m128i * ) (data + 2 * 8 )); 2630row3 = _mm_load_si128 ((const __m128i * ) (data + 3 * 8 )); 2631row4 = _mm_load_si128 ((const __m128i * ) (data + 4 * 8 )); 2632row5 = _mm_load_si128 ((const __m128i * ) (data + 5 * 8 )); 2633row6 = _mm_load_si128 ((const __m128i * ) (data + 6 * 8 )); 2634row7 = _mm_load_si128 ((const __m128i * ) (data + 7 * 8 )); 2635 2636// column pass 2637dct_pass (bias_0 ,10 ); 2638 2639 { 2640// 16bit 8x8 transpose pass 1 2641dct_interleave16 (row0 ,row4 ); 2642dct_interleave16 (row1 ,row5 ); 2643dct_interleave16 (row2 ,row6 ); 2644dct_interleave16 (row3 ,row7 ); 2645 2646// transpose pass 2 2647dct_interleave16 (row0 ,row2 ); 2648dct_interleave16 (row1 ,row3 ); 2649dct_interleave16 (row4 ,row6 ); 2650dct_interleave16 (row5 ,row7 ); 2651 2652// transpose pass 3 2653dct_interleave16 (row0 ,row1 ); 2654dct_interleave16 (row2 ,row3 ); 2655dct_interleave16 (row4 ,row5 ); 2656dct_interleave16 (row6 ,row7 ); 2657 } 2658 2659// row pass 2660dct_pass (bias_1 ,17 ); 2661 2662 { 2663// pack 2664__m128i p0 = _mm_packus_epi16 (row0 ,row1 );// a0a1a2a3...a7b0b1b2b3...b7 2665__m128i p1 = _mm_packus_epi16 (row2 ,row3 ); 2666__m128i p2 = _mm_packus_epi16 (row4 ,row5 ); 2667__m128i p3 = _mm_packus_epi16 (row6 ,row7 ); 2668 2669// 8bit 8x8 transpose pass 1 2670dct_interleave8 (p0 ,p2 );// a0e0a1e1... 2671dct_interleave8 (p1 ,p3 );// c0g0c1g1... 2672 2673// transpose pass 2 2674dct_interleave8 (p0 ,p1 );// a0c0e0g0... 2675dct_interleave8 (p2 ,p3 );// b0d0f0h0... 2676 2677// transpose pass 3 2678dct_interleave8 (p0 ,p2 );// a0b0c0d0... 2679dct_interleave8 (p1 ,p3 );// a4b4c4d4... 2680 2681// store 2682_mm_storel_epi64 ((__m128i * )out ,p0 );out += out_stride ; 2683_mm_storel_epi64 ((__m128i * )out ,_mm_shuffle_epi32 (p0 ,0x4e ));out += out_stride ; 2684_mm_storel_epi64 ((__m128i * )out ,p2 );out += out_stride ; 2685_mm_storel_epi64 ((__m128i * )out ,_mm_shuffle_epi32 (p2 ,0x4e ));out += out_stride ; 2686_mm_storel_epi64 ((__m128i * )out ,p1 );out += out_stride ; 2687_mm_storel_epi64 ((__m128i * )out ,_mm_shuffle_epi32 (p1 ,0x4e ));out += out_stride ; 2688_mm_storel_epi64 ((__m128i * )out ,p3 );out += out_stride ; 2689_mm_storel_epi64 ((__m128i * )out ,_mm_shuffle_epi32 (p3 ,0x4e )); 2690 } 2691 2692#undef dct_const 2693#undef dct_rot 2694#undef dct_widen 2695#undef dct_wadd 2696#undef dct_wsub 2697#undef dct_bfly32o 2698#undef dct_interleave8 2699#undef dct_interleave16 2700#undef dct_pass 2701} 2702 2703#endif // STBI_SSE2 2704 2705#ifdef STBI_NEON 2706 2707// NEON integer IDCT. should produce bit-identical 2708// results to the generic C version. 2709static void stbi__idct_simd (stbi_uc * out ,int out_stride ,short data [64 ]) 2710{ 2711int16x8_t row0 ,row1 ,row2 ,row3 ,row4 ,row5 ,row6 ,row7 ; 2712 2713int16x4_t rot0_0 = vdup_n_s16 (stbi__f2f (0.5411961f )); 2714int16x4_t rot0_1 = vdup_n_s16 (stbi__f2f (-1.847759065f )); 2715int16x4_t rot0_2 = vdup_n_s16 (stbi__f2f (0.765366865f )); 2716int16x4_t rot1_0 = vdup_n_s16 (stbi__f2f (1.175875602f )); 2717int16x4_t rot1_1 = vdup_n_s16 (stbi__f2f (-0.899976223f )); 2718int16x4_t rot1_2 = vdup_n_s16 (stbi__f2f (-2.562915447f )); 2719int16x4_t rot2_0 = vdup_n_s16 (stbi__f2f (-1.961570560f )); 2720int16x4_t rot2_1 = vdup_n_s16 (stbi__f2f (-0.390180644f )); 2721int16x4_t rot3_0 = vdup_n_s16 (stbi__f2f (0.298631336f )); 2722int16x4_t rot3_1 = vdup_n_s16 (stbi__f2f (2.053119869f )); 2723int16x4_t rot3_2 = vdup_n_s16 (stbi__f2f (3.072711026f )); 2724int16x4_t rot3_3 = vdup_n_s16 (stbi__f2f (1.501321110f )); 2725 2726#define dct_long_mul (out ,inq ,coeff ) \ 2727 int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ 2728 int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) 2729 2730#define dct_long_mac (out ,acc ,inq ,coeff ) \ 2731 int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ 2732 int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) 2733 2734#define dct_widen (out ,inq ) \ 2735 int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ 2736 int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) 2737 2738// wide add 2739#define dct_wadd (out ,a ,b ) \ 2740 int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ 2741 int32x4_t out##_h = vaddq_s32(a##_h, b##_h) 2742 2743// wide sub 2744#define dct_wsub (out ,a ,b ) \ 2745 int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ 2746 int32x4_t out##_h = vsubq_s32(a##_h, b##_h) 2747 2748// butterfly a/b, then shift using "shiftop" by "s" and pack 2749#define dct_bfly32o (out0 ,out1 ,a ,b ,shiftop ,s ) \ 2750 { \ 2751 dct_wadd(sum, a, b); \ 2752 dct_wsub(dif, a, b); \ 2753 out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ 2754 out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ 2755 } 2756 2757#define dct_pass (shiftop ,shift ) \ 2758 { \ 2759/* even part */ \ 2760int16x8_t sum26 = vaddq_s16(row2, row6); \ 2761 dct_long_mul(p1e, sum26, rot0_0); \ 2762 dct_long_mac(t2e, p1e, row6, rot0_1); \ 2763 dct_long_mac(t3e, p1e, row2, rot0_2); \ 2764 int16x8_t sum04 = vaddq_s16(row0, row4); \ 2765 int16x8_t dif04 = vsubq_s16(row0, row4); \ 2766 dct_widen(t0e, sum04); \ 2767 dct_widen(t1e, dif04); \ 2768 dct_wadd(x0, t0e, t3e); \ 2769 dct_wsub(x3, t0e, t3e); \ 2770 dct_wadd(x1, t1e, t2e); \ 2771 dct_wsub(x2, t1e, t2e); \ 2772/* odd part */ \ 2773int16x8_t sum15 = vaddq_s16 (row1 ,row5 ); \ 2774int16x8_t sum17 = vaddq_s16 (row1 ,row7 ); \ 2775int16x8_t sum35 = vaddq_s16 (row3 ,row5 ); \ 2776int16x8_t sum37 = vaddq_s16 (row3 ,row7 ); \ 2777int16x8_t sumodd = vaddq_s16 (sum17 ,sum35 ); \ 2778dct_long_mul (p5o ,sumodd ,rot1_0 ); \ 2779dct_long_mac (p1o ,p5o ,sum17 ,rot1_1 ); \ 2780dct_long_mac (p2o ,p5o ,sum35 ,rot1_2 ); \ 2781dct_long_mul (p3o ,sum37 ,rot2_0 ); \ 2782dct_long_mul (p4o ,sum15 ,rot2_1 ); \ 2783dct_wadd (sump13o ,p1o ,p3o ); \ 2784dct_wadd (sump24o ,p2o ,p4o ); \ 2785dct_wadd (sump23o ,p2o ,p3o ); \ 2786dct_wadd (sump14o ,p1o ,p4o ); \ 2787dct_long_mac (x4 ,sump13o ,row7 ,rot3_0 ); \ 2788dct_long_mac (x5 ,sump24o ,row5 ,rot3_1 ); \ 2789dct_long_mac (x6 ,sump23o ,row3 ,rot3_2 ); \ 2790dct_long_mac (x7 ,sump14o ,row1 ,rot3_3 ); \ 2791dct_bfly32o (row0 ,row7 ,x0 ,x7 ,shiftop ,shift ); \ 2792dct_bfly32o (row1 ,row6 ,x1 ,x6 ,shiftop ,shift ); \ 2793dct_bfly32o (row2 ,row5 ,x2 ,x5 ,shiftop ,shift ); \ 2794dct_bfly32o (row3 ,row4 ,x3 ,x4 ,shiftop ,shift ); \ 2795 } 2796 2797// load 2798row0 = vld1q_s16 (data + 0 * 8 ); 2799row1 = vld1q_s16 (data + 1 * 8 ); 2800row2 = vld1q_s16 (data + 2 * 8 ); 2801row3 = vld1q_s16 (data + 3 * 8 ); 2802row4 = vld1q_s16 (data + 4 * 8 ); 2803row5 = vld1q_s16 (data + 5 * 8 ); 2804row6 = vld1q_s16 (data + 6 * 8 ); 2805row7 = vld1q_s16 (data + 7 * 8 ); 2806 2807// add DC bias 2808row0 = vaddq_s16 (row0 ,vsetq_lane_s16 (1024 ,vdupq_n_s16 (0 ),0 )); 2809 2810// column pass 2811dct_pass (vrshrn_n_s32 ,10 ); 2812 2813// 16bit 8x8 transpose 2814 { 2815// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. 2816// whether compilers actually get this is another story, sadly. 2817#define dct_trn16 (x ,y ) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } 2818#define dct_trn32 (x ,y ) { int32x4x2_t t = vtrnq_s32(vreinterpretq_s32_s16(x), vreinterpretq_s32_s16(y)); x = vreinterpretq_s16_s32(t.val[0]); y = vreinterpretq_s16_s32(t.val[1]); } 2819#define dct_trn64 (x ,y ) { int16x8_t x0 = x; int16x8_t y0 = y; x = vcombine_s16(vget_low_s16(x0), vget_low_s16(y0)); y = vcombine_s16(vget_high_s16(x0), vget_high_s16(y0)); } 2820 2821// pass 1 2822dct_trn16 (row0 ,row1 );// a0b0a2b2a4b4a6b6 2823dct_trn16 (row2 ,row3 ); 2824dct_trn16 (row4 ,row5 ); 2825dct_trn16 (row6 ,row7 ); 2826 2827// pass 2 2828dct_trn32 (row0 ,row2 );// a0b0c0d0a4b4c4d4 2829dct_trn32 (row1 ,row3 ); 2830dct_trn32 (row4 ,row6 ); 2831dct_trn32 (row5 ,row7 ); 2832 2833// pass 3 2834dct_trn64 (row0 ,row4 );// a0b0c0d0e0f0g0h0 2835dct_trn64 (row1 ,row5 ); 2836dct_trn64 (row2 ,row6 ); 2837dct_trn64 (row3 ,row7 ); 2838 2839#undef dct_trn16 2840#undef dct_trn32 2841#undef dct_trn64 2842 } 2843 2844// row pass 2845// vrshrn_n_s32 only supports shifts up to 16, we need 2846// 17. so do a non-rounding shift of 16 first then follow 2847// up with a rounding shift by 1. 2848dct_pass (vshrn_n_s32 ,16 ); 2849 2850 { 2851// pack and round 2852uint8x8_t p0 = vqrshrun_n_s16 (row0 ,1 ); 2853uint8x8_t p1 = vqrshrun_n_s16 (row1 ,1 ); 2854uint8x8_t p2 = vqrshrun_n_s16 (row2 ,1 ); 2855uint8x8_t p3 = vqrshrun_n_s16 (row3 ,1 ); 2856uint8x8_t p4 = vqrshrun_n_s16 (row4 ,1 ); 2857uint8x8_t p5 = vqrshrun_n_s16 (row5 ,1 ); 2858uint8x8_t p6 = vqrshrun_n_s16 (row6 ,1 ); 2859uint8x8_t p7 = vqrshrun_n_s16 (row7 ,1 ); 2860 2861// again, these can translate into one instruction, but often don't. 2862#define dct_trn8_8 (x ,y ) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } 2863#define dct_trn8_16 (x ,y ) { uint16x4x2_t t = vtrn_u16(vreinterpret_u16_u8(x), vreinterpret_u16_u8(y)); x = vreinterpret_u8_u16(t.val[0]); y = vreinterpret_u8_u16(t.val[1]); } 2864#define dct_trn8_32 (x ,y ) { uint32x2x2_t t = vtrn_u32(vreinterpret_u32_u8(x), vreinterpret_u32_u8(y)); x = vreinterpret_u8_u32(t.val[0]); y = vreinterpret_u8_u32(t.val[1]); } 2865 2866// sadly can't use interleaved stores here since we only write 2867// 8 bytes to each scan line! 2868 2869// 8x8 8-bit transpose pass 1 2870dct_trn8_8 (p0 ,p1 ); 2871dct_trn8_8 (p2 ,p3 ); 2872dct_trn8_8 (p4 ,p5 ); 2873dct_trn8_8 (p6 ,p7 ); 2874 2875// pass 2 2876dct_trn8_16 (p0 ,p2 ); 2877dct_trn8_16 (p1 ,p3 ); 2878dct_trn8_16 (p4 ,p6 ); 2879dct_trn8_16 (p5 ,p7 ); 2880 2881// pass 3 2882dct_trn8_32 (p0 ,p4 ); 2883dct_trn8_32 (p1 ,p5 ); 2884dct_trn8_32 (p2 ,p6 ); 2885dct_trn8_32 (p3 ,p7 ); 2886 2887// store 2888vst1_u8 (out ,p0 );out += out_stride ; 2889vst1_u8 (out ,p1 );out += out_stride ; 2890vst1_u8 (out ,p2 );out += out_stride ; 2891vst1_u8 (out ,p3 );out += out_stride ; 2892vst1_u8 (out ,p4 );out += out_stride ; 2893vst1_u8 (out ,p5 );out += out_stride ; 2894vst1_u8 (out ,p6 );out += out_stride ; 2895vst1_u8 (out ,p7 ); 2896 2897#undef dct_trn8_8 2898#undef dct_trn8_16 2899#undef dct_trn8_32 2900 } 2901 2902#undef dct_long_mul 2903#undef dct_long_mac 2904#undef dct_widen 2905#undef dct_wadd 2906#undef dct_wsub 2907#undef dct_bfly32o 2908#undef dct_pass 2909} 2910 2911#endif // STBI_NEON 2912 2913#define STBI__MARKER_none 0xff 2914// if there's a pending marker from the entropy stream, return that 2915// otherwise, fetch from the stream and get a marker. if there's no 2916// marker, return 0xff, which is never a valid marker value 2917static stbi_uc stbi__get_marker (stbi__jpeg * j ) 2918{ 2919stbi_uc x ; 2920if (j -> marker != STBI__MARKER_none ) {x = j -> marker ;j -> marker = STBI__MARKER_none ;return x ; } 2921x = stbi__get8 (j -> s ); 2922if (x != 0xff )return STBI__MARKER_none ; 2923while (x == 0xff ) 2924x = stbi__get8 (j -> s );// consume repeated 0xff fill bytes 2925return x ; 2926} 2927 2928// in each scan, we'll have scan_n components, and the order 2929// of the components is specified by order[] 2930#define STBI__RESTART (x ) ((x) >= 0xd0 && (x) <= 0xd7) 2931 2932// after a restart interval, stbi__jpeg_reset the entropy decoder and 2933// the dc prediction 2934static void stbi__jpeg_reset (stbi__jpeg * j ) 2935{ 2936j -> code_bits = 0 ; 2937j -> code_buffer = 0 ; 2938j -> nomore = 0 ; 2939j -> img_comp [0 ].dc_pred = j -> img_comp [1 ].dc_pred = j -> img_comp [2 ].dc_pred = j -> img_comp [3 ].dc_pred = 0 ; 2940j -> marker = STBI__MARKER_none ; 2941j -> todo = j -> restart_interval ?j -> restart_interval :0x7fffffff ; 2942j -> eob_run = 0 ; 2943// no more than 1<<31 MCUs if no restart_interal? that's plenty safe, 2944// since we don't even allow 1<<30 pixels 2945} 2946 2947static int stbi__parse_entropy_coded_data (stbi__jpeg * z ) 2948{ 2949stbi__jpeg_reset (z ); 2950if (!z -> progressive ) { 2951if (z -> scan_n == 1 ) { 2952int i ,j ; 2953STBI_SIMD_ALIGN (short ,data [64 ]); 2954int n = z -> order [0 ]; 2955// non-interleaved data, we just need to process one block at a time, 2956// in trivial scanline order 2957// number of blocks to do just depends on how many actual "pixels" this 2958// component has, independent of interleaved MCU blocking and such 2959int w = (z -> img_comp [n ].x + 7 ) >>3 ; 2960int h = (z -> img_comp [n ].y + 7 ) >>3 ; 2961for (j = 0 ;j < h ;++ j ) { 2962for (i = 0 ;i < w ;++ i ) { 2963int ha = z -> img_comp [n ].ha ; 2964if (!stbi__jpeg_decode_block (z ,data ,z -> huff_dc + z -> img_comp [n ].hd ,z -> huff_ac + ha ,z -> fast_ac [ha ],n ,z -> dequant [z -> img_comp [n ].tq ]))return 0 ; 2965z -> idct_block_kernel (z -> img_comp [n ].data + z -> img_comp [n ].w2 * j * 8 + i * 8 ,z -> img_comp [n ].w2 ,data ); 2966// every data block is an MCU, so countdown the restart interval 2967if (-- z -> todo <=0 ) { 2968if (z -> code_bits < 24 )stbi__grow_buffer_unsafe (z ); 2969// if it's NOT a restart, then just bail, so we get corrupt data 2970// rather than no data 2971if (!STBI__RESTART (z -> marker ))return 1 ; 2972stbi__jpeg_reset (z ); 2973 } 2974 } 2975 } 2976return 1 ; 2977 }else {// interleaved 2978int i ,j ,k ,x ,y ; 2979STBI_SIMD_ALIGN (short ,data [64 ]); 2980for (j = 0 ;j < z -> img_mcu_y ;++ j ) { 2981for (i = 0 ;i < z -> img_mcu_x ;++ i ) { 2982// scan an interleaved mcu... process scan_n components in order 2983for (k = 0 ;k < z -> scan_n ;++ k ) { 2984int n = z -> order [k ]; 2985// scan out an mcu's worth of this component; that's just determined 2986// by the basic H and V specified for the component 2987for (y = 0 ;y < z -> img_comp [n ].v ;++ y ) { 2988for (x = 0 ;x < z -> img_comp [n ].h ;++ x ) { 2989int x2 = (i * z -> img_comp [n ].h + x )* 8 ; 2990int y2 = (j * z -> img_comp [n ].v + y )* 8 ; 2991int ha = z -> img_comp [n ].ha ; 2992if (!stbi__jpeg_decode_block (z ,data ,z -> huff_dc + z -> img_comp [n ].hd ,z -> huff_ac + ha ,z -> fast_ac [ha ],n ,z -> dequant [z -> img_comp [n ].tq ]))return 0 ; 2993z -> idct_block_kernel (z -> img_comp [n ].data + z -> img_comp [n ].w2 * y2 + x2 ,z -> img_comp [n ].w2 ,data ); 2994 } 2995 } 2996 } 2997// after all interleaved components, that's an interleaved MCU, 2998// so now count down the restart interval 2999if (-- z -> todo <=0 ) { 3000if (z -> code_bits < 24 )stbi__grow_buffer_unsafe (z ); 3001if (!STBI__RESTART (z -> marker ))return 1 ; 3002stbi__jpeg_reset (z ); 3003 } 3004 } 3005 } 3006return 1 ; 3007 } 3008 }else { 3009if (z -> scan_n == 1 ) { 3010int i ,j ; 3011int n = z -> order [0 ]; 3012// non-interleaved data, we just need to process one block at a time, 3013// in trivial scanline order 3014// number of blocks to do just depends on how many actual "pixels" this 3015// component has, independent of interleaved MCU blocking and such 3016int w = (z -> img_comp [n ].x + 7 ) >>3 ; 3017int h = (z -> img_comp [n ].y + 7 ) >>3 ; 3018for (j = 0 ;j < h ;++ j ) { 3019for (i = 0 ;i < w ;++ i ) { 3020short * data = z -> img_comp [n ].coeff + 64 * (i + j * z -> img_comp [n ].coeff_w ); 3021if (z -> spec_start == 0 ) { 3022if (!stbi__jpeg_decode_block_prog_dc (z ,data ,& z -> huff_dc [z -> img_comp [n ].hd ],n )) 3023return 0 ; 3024 }else { 3025int ha = z -> img_comp [n ].ha ; 3026if (!stbi__jpeg_decode_block_prog_ac (z ,data ,& z -> huff_ac [ha ],z -> fast_ac [ha ])) 3027return 0 ; 3028 } 3029// every data block is an MCU, so countdown the restart interval 3030if (-- z -> todo <=0 ) { 3031if (z -> code_bits < 24 )stbi__grow_buffer_unsafe (z ); 3032if (!STBI__RESTART (z -> marker ))return 1 ; 3033stbi__jpeg_reset (z ); 3034 } 3035 } 3036 } 3037return 1 ; 3038 }else {// interleaved 3039int i ,j ,k ,x ,y ; 3040for (j = 0 ;j < z -> img_mcu_y ;++ j ) { 3041for (i = 0 ;i < z -> img_mcu_x ;++ i ) { 3042// scan an interleaved mcu... process scan_n components in order 3043for (k = 0 ;k < z -> scan_n ;++ k ) { 3044int n = z -> order [k ]; 3045// scan out an mcu's worth of this component; that's just determined 3046// by the basic H and V specified for the component 3047for (y = 0 ;y < z -> img_comp [n ].v ;++ y ) { 3048for (x = 0 ;x < z -> img_comp [n ].h ;++ x ) { 3049int x2 = (i * z -> img_comp [n ].h + x ); 3050int y2 = (j * z -> img_comp [n ].v + y ); 3051short * data = z -> img_comp [n ].coeff + 64 * (x2 + y2 * z -> img_comp [n ].coeff_w ); 3052if (!stbi__jpeg_decode_block_prog_dc (z ,data ,& z -> huff_dc [z -> img_comp [n ].hd ],n )) 3053return 0 ; 3054 } 3055 } 3056 } 3057// after all interleaved components, that's an interleaved MCU, 3058// so now count down the restart interval 3059if (-- z -> todo <=0 ) { 3060if (z -> code_bits < 24 )stbi__grow_buffer_unsafe (z ); 3061if (!STBI__RESTART (z -> marker ))return 1 ; 3062stbi__jpeg_reset (z ); 3063 } 3064 } 3065 } 3066return 1 ; 3067 } 3068 } 3069} 3070 3071static void stbi__jpeg_dequantize (short * data ,stbi__uint16 * dequant ) 3072{ 3073int i ; 3074for (i = 0 ;i < 64 ;++ i ) 3075data [i ] *=dequant [i ]; 3076} 3077 3078static void stbi__jpeg_finish (stbi__jpeg * z ) 3079{ 3080if (z -> progressive ) { 3081// dequantize and idct the data 3082int i ,j ,n ; 3083for (n = 0 ;n < z -> s -> img_n ;++ n ) { 3084int w = (z -> img_comp [n ].x + 7 ) >>3 ; 3085int h = (z -> img_comp [n ].y + 7 ) >>3 ; 3086for (j = 0 ;j < h ;++ j ) { 3087for (i = 0 ;i < w ;++ i ) { 3088short * data = z -> img_comp [n ].coeff + 64 * (i + j * z -> img_comp [n ].coeff_w ); 3089stbi__jpeg_dequantize (data ,z -> dequant [z -> img_comp [n ].tq ]); 3090z -> idct_block_kernel (z -> img_comp [n ].data + z -> img_comp [n ].w2 * j * 8 + i * 8 ,z -> img_comp [n ].w2 ,data ); 3091 } 3092 } 3093 } 3094 } 3095} 3096 3097static int stbi__process_marker (stbi__jpeg * z ,int m ) 3098{ 3099int L ; 3100switch (m ) { 3101case STBI__MARKER_none :// no marker found 3102return stbi__err ("expected marker" ,"Corrupt JPEG" ); 3103 3104case 0xDD :// DRI - specify restart interval 3105if (stbi__get16be (z -> s )!= 4 )return stbi__err ("bad DRI len" ,"Corrupt JPEG" ); 3106z -> restart_interval = stbi__get16be (z -> s ); 3107return 1 ; 3108 3109case 0xDB :// DQT - define quantization table 3110L = stbi__get16be (z -> s )- 2 ; 3111while (L > 0 ) { 3112int q = stbi__get8 (z -> s ); 3113int p = q >>4 ,sixteen = (p != 0 ); 3114int t = q & 15 ,i ; 3115if (p != 0 && p != 1 )return stbi__err ("bad DQT type" ,"Corrupt JPEG" ); 3116if (t > 3 )return stbi__err ("bad DQT table" ,"Corrupt JPEG" ); 3117 3118for (i = 0 ;i < 64 ;++ i ) 3119z -> dequant [t ][stbi__jpeg_dezigzag [i ]]= (stbi__uint16 )(sixteen ?stbi__get16be (z -> s ) :stbi__get8 (z -> s )); 3120L -= (sixteen ?129 :65 ); 3121 } 3122return L == 0 ; 3123 3124case 0xC4 :// DHT - define huffman table 3125L = stbi__get16be (z -> s )- 2 ; 3126while (L > 0 ) { 3127stbi_uc * v ; 3128int sizes [16 ],i ,n = 0 ; 3129int q = stbi__get8 (z -> s ); 3130int tc = q >>4 ; 3131int th = q & 15 ; 3132if (tc > 1 || th > 3 )return stbi__err ("bad DHT header" ,"Corrupt JPEG" ); 3133for (i = 0 ;i < 16 ;++ i ) { 3134sizes [i ]= stbi__get8 (z -> s ); 3135n += sizes [i ]; 3136 } 3137if (n > 256 )return stbi__err ("bad DHT header" ,"Corrupt JPEG" );// Loop over i < n would write past end of values! 3138L -= 17 ; 3139if (tc == 0 ) { 3140if (!stbi__build_huffman (z -> huff_dc + th ,sizes ))return 0 ; 3141v = z -> huff_dc [th ].values ; 3142 }else { 3143if (!stbi__build_huffman (z -> huff_ac + th ,sizes ))return 0 ; 3144v = z -> huff_ac [th ].values ; 3145 } 3146for (i = 0 ;i < n ;++ i ) 3147v [i ]= stbi__get8 (z -> s ); 3148if (tc != 0 ) 3149stbi__build_fast_ac (z -> fast_ac [th ],z -> huff_ac + th ); 3150L -= n ; 3151 } 3152return L == 0 ; 3153 } 3154 3155// check for comment block or APP blocks 3156if ((m >=0xE0 && m <=0xEF )|| m == 0xFE ) { 3157L = stbi__get16be (z -> s ); 3158if (L < 2 ) { 3159if (m == 0xFE ) 3160return stbi__err ("bad COM len" ,"Corrupt JPEG" ); 3161else 3162return stbi__err ("bad APP len" ,"Corrupt JPEG" ); 3163 } 3164L -= 2 ; 3165 3166if (m == 0xE0 && L >=5 ) {// JFIF APP0 segment 3167static const unsigned char tag [5 ]= {'J' ,'F' ,'I' ,'F' ,'\0' }; 3168int ok = 1 ; 3169int i ; 3170for (i = 0 ;i < 5 ;++ i ) 3171if (stbi__get8 (z -> s )!= tag [i ]) 3172ok = 0 ; 3173L -= 5 ; 3174if (ok ) 3175z -> jfif = 1 ; 3176 }else if (m == 0xEE && L >=12 ) {// Adobe APP14 segment 3177static const unsigned char tag [6 ]= {'A' ,'d' ,'o' ,'b' ,'e' ,'\0' }; 3178int ok = 1 ; 3179int i ; 3180for (i = 0 ;i < 6 ;++ i ) 3181if (stbi__get8 (z -> s )!= tag [i ]) 3182ok = 0 ; 3183L -= 6 ; 3184if (ok ) { 3185stbi__get8 (z -> s );// version 3186stbi__get16be (z -> s );// flags0 3187stbi__get16be (z -> s );// flags1 3188z -> app14_color_transform = stbi__get8 (z -> s );// color transform 3189L -= 6 ; 3190 } 3191 } 3192 3193stbi__skip (z -> s ,L ); 3194return 1 ; 3195 } 3196 3197return stbi__err ("unknown marker" ,"Corrupt JPEG" ); 3198} 3199 3200// after we see SOS 3201static int stbi__process_scan_header (stbi__jpeg * z ) 3202{ 3203int i ; 3204int Ls = stbi__get16be (z -> s ); 3205z -> scan_n = stbi__get8 (z -> s ); 3206if (z -> scan_n < 1 || z -> scan_n > 4 || z -> scan_n > (int )z -> s -> img_n )return stbi__err ("bad SOS component count" ,"Corrupt JPEG" ); 3207if (Ls != 6 + 2 * z -> scan_n )return stbi__err ("bad SOS len" ,"Corrupt JPEG" ); 3208for (i = 0 ;i < z -> scan_n ;++ i ) { 3209int id = stbi__get8 (z -> s ),which ; 3210int q = stbi__get8 (z -> s ); 3211for (which = 0 ;which < z -> s -> img_n ;++ which ) 3212if (z -> img_comp [which ].id == id ) 3213break ; 3214if (which == z -> s -> img_n )return 0 ;// no match 3215z -> img_comp [which ].hd = q >>4 ;if (z -> img_comp [which ].hd > 3 )return stbi__err ("bad DC huff" ,"Corrupt JPEG" ); 3216z -> img_comp [which ].ha = q & 15 ;if (z -> img_comp [which ].ha > 3 )return stbi__err ("bad AC huff" ,"Corrupt JPEG" ); 3217z -> order [i ]= which ; 3218 } 3219 3220 { 3221int aa ; 3222z -> spec_start = stbi__get8 (z -> s ); 3223z -> spec_end = stbi__get8 (z -> s );// should be 63, but might be 0 3224aa = stbi__get8 (z -> s ); 3225z -> succ_high = (aa >>4 ); 3226z -> succ_low = (aa & 15 ); 3227if (z -> progressive ) { 3228if (z -> spec_start > 63 || z -> spec_end > 63 || z -> spec_start > z -> spec_end || z -> succ_high > 13 || z -> succ_low > 13 ) 3229return stbi__err ("bad SOS" ,"Corrupt JPEG" ); 3230 }else { 3231if (z -> spec_start != 0 )return stbi__err ("bad SOS" ,"Corrupt JPEG" ); 3232if (z -> succ_high != 0 || z -> succ_low != 0 )return stbi__err ("bad SOS" ,"Corrupt JPEG" ); 3233z -> spec_end = 63 ; 3234 } 3235 } 3236 3237return 1 ; 3238} 3239 3240static int stbi__free_jpeg_components (stbi__jpeg * z ,int ncomp ,int why ) 3241{ 3242int i ; 3243for (i = 0 ;i < ncomp ;++ i ) { 3244if (z -> img_comp [i ].raw_data ) { 3245STBI_FREE (z -> img_comp [i ].raw_data ); 3246z -> img_comp [i ].raw_data = NULL ; 3247z -> img_comp [i ].data = NULL ; 3248 } 3249if (z -> img_comp [i ].raw_coeff ) { 3250STBI_FREE (z -> img_comp [i ].raw_coeff ); 3251z -> img_comp [i ].raw_coeff = 0 ; 3252z -> img_comp [i ].coeff = 0 ; 3253 } 3254if (z -> img_comp [i ].linebuf ) { 3255STBI_FREE (z -> img_comp [i ].linebuf ); 3256z -> img_comp [i ].linebuf = NULL ; 3257 } 3258 } 3259return why ; 3260} 3261 3262static int stbi__process_frame_header (stbi__jpeg * z ,int scan ) 3263{ 3264stbi__context * s = z -> s ; 3265int Lf ,p ,i ,q ,h_max = 1 ,v_max = 1 ,c ; 3266Lf = stbi__get16be (s );if (Lf < 11 )return stbi__err ("bad SOF len" ,"Corrupt JPEG" );// JPEG 3267p = stbi__get8 (s );if (p != 8 )return stbi__err ("only 8-bit" ,"JPEG format not supported: 8-bit only" );// JPEG baseline 3268s -> img_y = stbi__get16be (s );if (s -> img_y == 0 )return stbi__err ("no header height" ,"JPEG format not supported: delayed height" );// Legal, but we don't handle it--but neither does IJG 3269s -> img_x = stbi__get16be (s );if (s -> img_x == 0 )return stbi__err ("0 width" ,"Corrupt JPEG" );// JPEG requires 3270if (s -> img_y > STBI_MAX_DIMENSIONS )return stbi__err ("too large" ,"Very large image (corrupt?)" ); 3271if (s -> img_x > STBI_MAX_DIMENSIONS )return stbi__err ("too large" ,"Very large image (corrupt?)" ); 3272c = stbi__get8 (s ); 3273if (c != 3 && c != 1 && c != 4 )return stbi__err ("bad component count" ,"Corrupt JPEG" ); 3274s -> img_n = c ; 3275for (i = 0 ;i < c ;++ i ) { 3276z -> img_comp [i ].data = NULL ; 3277z -> img_comp [i ].linebuf = NULL ; 3278 } 3279 3280if (Lf != 8 + 3 * s -> img_n )return stbi__err ("bad SOF len" ,"Corrupt JPEG" ); 3281 3282z -> rgb = 0 ; 3283for (i = 0 ;i < s -> img_n ;++ i ) { 3284static const unsigned char rgb [3 ]= {'R' ,'G' ,'B' }; 3285z -> img_comp [i ].id = stbi__get8 (s ); 3286if (s -> img_n == 3 && z -> img_comp [i ].id == rgb [i ]) 3287++ z -> rgb ; 3288q = stbi__get8 (s ); 3289z -> img_comp [i ].h = (q >>4 );if (!z -> img_comp [i ].h || z -> img_comp [i ].h > 4 )return stbi__err ("bad H" ,"Corrupt JPEG" ); 3290z -> img_comp [i ].v = q & 15 ;if (!z -> img_comp [i ].v || z -> img_comp [i ].v > 4 )return stbi__err ("bad V" ,"Corrupt JPEG" ); 3291z -> img_comp [i ].tq = stbi__get8 (s );if (z -> img_comp [i ].tq > 3 )return stbi__err ("bad TQ" ,"Corrupt JPEG" ); 3292 } 3293 3294if (scan != STBI__SCAN_load )return 1 ; 3295 3296if (!stbi__mad3sizes_valid (s -> img_x ,s -> img_y ,s -> img_n ,0 ))return stbi__err ("too large" ,"Image too large to decode" ); 3297 3298for (i = 0 ;i < s -> img_n ;++ i ) { 3299if (z -> img_comp [i ].h > h_max )h_max = z -> img_comp [i ].h ; 3300if (z -> img_comp [i ].v > v_max )v_max = z -> img_comp [i ].v ; 3301 } 3302 3303// check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios 3304// and I've never seen a non-corrupted JPEG file actually use them 3305for (i = 0 ;i < s -> img_n ;++ i ) { 3306if (h_max %z -> img_comp [i ].h != 0 )return stbi__err ("bad H" ,"Corrupt JPEG" ); 3307if (v_max %z -> img_comp [i ].v != 0 )return stbi__err ("bad V" ,"Corrupt JPEG" ); 3308 } 3309 3310// compute interleaved mcu info 3311z -> img_h_max = h_max ; 3312z -> img_v_max = v_max ; 3313z -> img_mcu_w = h_max * 8 ; 3314z -> img_mcu_h = v_max * 8 ; 3315// these sizes can't be more than 17 bits 3316z -> img_mcu_x = (s -> img_x + z -> img_mcu_w - 1 ) /z -> img_mcu_w ; 3317z -> img_mcu_y = (s -> img_y + z -> img_mcu_h - 1 ) /z -> img_mcu_h ; 3318 3319for (i = 0 ;i < s -> img_n ;++ i ) { 3320// number of effective pixels (e.g. for non-interleaved MCU) 3321z -> img_comp [i ].x = (s -> img_x * z -> img_comp [i ].h + h_max - 1 ) /h_max ; 3322z -> img_comp [i ].y = (s -> img_y * z -> img_comp [i ].v + v_max - 1 ) /v_max ; 3323// to simplify generation, we'll allocate enough memory to decode 3324// the bogus oversized data from using interleaved MCUs and their 3325// big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't 3326// discard the extra data until colorspace conversion 3327// 3328// img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) 3329// so these muls can't overflow with 32-bit ints (which we require) 3330z -> img_comp [i ].w2 = z -> img_mcu_x * z -> img_comp [i ].h * 8 ; 3331z -> img_comp [i ].h2 = z -> img_mcu_y * z -> img_comp [i ].v * 8 ; 3332z -> img_comp [i ].coeff = 0 ; 3333z -> img_comp [i ].raw_coeff = 0 ; 3334z -> img_comp [i ].linebuf = NULL ; 3335z -> img_comp [i ].raw_data = stbi__malloc_mad2 (z -> img_comp [i ].w2 ,z -> img_comp [i ].h2 ,15 ); 3336if (z -> img_comp [i ].raw_data == NULL ) 3337return stbi__free_jpeg_components (z ,i + 1 ,stbi__err ("outofmem" ,"Out of memory" )); 3338// align blocks for idct using mmx/sse 3339z -> img_comp [i ].data = (stbi_uc * ) (((size_t )z -> img_comp [i ].raw_data + 15 )& ~15 ); 3340if (z -> progressive ) { 3341// w2, h2 are multiples of 8 (see above) 3342z -> img_comp [i ].coeff_w = z -> img_comp [i ].w2 /8 ; 3343z -> img_comp [i ].coeff_h = z -> img_comp [i ].h2 /8 ; 3344z -> img_comp [i ].raw_coeff = stbi__malloc_mad3 (z -> img_comp [i ].w2 ,z -> img_comp [i ].h2 ,sizeof (short ),15 ); 3345if (z -> img_comp [i ].raw_coeff == NULL ) 3346return stbi__free_jpeg_components (z ,i + 1 ,stbi__err ("outofmem" ,"Out of memory" )); 3347z -> img_comp [i ].coeff = (short * ) (((size_t )z -> img_comp [i ].raw_coeff + 15 )& ~15 ); 3348 } 3349 } 3350 3351return 1 ; 3352} 3353 3354// use comparisons since in some cases we handle more than one case (e.g. SOF) 3355#define stbi__DNL (x ) ((x) == 0xdc) 3356#define stbi__SOI (x ) ((x) == 0xd8) 3357#define stbi__EOI (x ) ((x) == 0xd9) 3358#define stbi__SOF (x ) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) 3359#define stbi__SOS (x ) ((x) == 0xda) 3360 3361#define stbi__SOF_progressive (x ) ((x) == 0xc2) 3362 3363static int stbi__decode_jpeg_header (stbi__jpeg * z ,int scan ) 3364{ 3365int m ; 3366z -> jfif = 0 ; 3367z -> app14_color_transform = -1 ;// valid values are 0,1,2 3368z -> marker = STBI__MARKER_none ;// initialize cached marker to empty 3369m = stbi__get_marker (z ); 3370if (!stbi__SOI (m ))return stbi__err ("no SOI" ,"Corrupt JPEG" ); 3371if (scan == STBI__SCAN_type )return 1 ; 3372m = stbi__get_marker (z ); 3373while (!stbi__SOF (m )) { 3374if (!stbi__process_marker (z ,m ))return 0 ; 3375m = stbi__get_marker (z ); 3376while (m == STBI__MARKER_none ) { 3377// some files have extra padding after their blocks, so ok, we'll scan 3378if (stbi__at_eof (z -> s ))return stbi__err ("no SOF" ,"Corrupt JPEG" ); 3379m = stbi__get_marker (z ); 3380 } 3381 } 3382z -> progressive = stbi__SOF_progressive (m ); 3383if (!stbi__process_frame_header (z ,scan ))return 0 ; 3384return 1 ; 3385} 3386 3387static int stbi__skip_jpeg_junk_at_end (stbi__jpeg * j ) 3388{ 3389// some JPEGs have junk at end, skip over it but if we find what looks 3390// like a valid marker, resume there 3391while (!stbi__at_eof (j -> s )) { 3392int x = stbi__get8 (j -> s ); 3393while (x == 255 ) {// might be a marker 3394if (stbi__at_eof (j -> s ))return STBI__MARKER_none ; 3395x = stbi__get8 (j -> s ); 3396if (x != 0x00 && x != 0xff ) { 3397// not a stuffed zero or lead-in to another marker, looks 3398// like an actual marker, return it 3399return x ; 3400 } 3401// stuffed zero has x=0 now which ends the loop, meaning we go 3402// back to regular scan loop. 3403// repeated 0xff keeps trying to read the next byte of the marker. 3404 } 3405 } 3406return STBI__MARKER_none ; 3407} 3408 3409// decode image to YCbCr format 3410static int stbi__decode_jpeg_image (stbi__jpeg * j ) 3411{ 3412int m ; 3413for (m = 0 ;m < 4 ;m ++ ) { 3414j -> img_comp [m ].raw_data = NULL ; 3415j -> img_comp [m ].raw_coeff = NULL ; 3416 } 3417j -> restart_interval = 0 ; 3418if (!stbi__decode_jpeg_header (j ,STBI__SCAN_load ))return 0 ; 3419m = stbi__get_marker (j ); 3420while (!stbi__EOI (m )) { 3421if (stbi__SOS (m )) { 3422if (!stbi__process_scan_header (j ))return 0 ; 3423if (!stbi__parse_entropy_coded_data (j ))return 0 ; 3424if (j -> marker == STBI__MARKER_none ) { 3425j -> marker = stbi__skip_jpeg_junk_at_end (j ); 3426// if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 3427 } 3428m = stbi__get_marker (j ); 3429if (STBI__RESTART (m )) 3430m = stbi__get_marker (j ); 3431 }else if (stbi__DNL (m )) { 3432int Ld = stbi__get16be (j -> s ); 3433stbi__uint32 NL = stbi__get16be (j -> s ); 3434if (Ld != 4 )return stbi__err ("bad DNL len" ,"Corrupt JPEG" ); 3435if (NL != j -> s -> img_y )return stbi__err ("bad DNL height" ,"Corrupt JPEG" ); 3436m = stbi__get_marker (j ); 3437 }else { 3438if (!stbi__process_marker (j ,m ))return 1 ; 3439m = stbi__get_marker (j ); 3440 } 3441 } 3442if (j -> progressive ) 3443stbi__jpeg_finish (j ); 3444return 1 ; 3445} 3446 3447// static jfif-centered resampling (across block boundaries) 3448 3449typedef stbi_uc * (* resample_row_func )(stbi_uc * out ,stbi_uc * in0 ,stbi_uc * in1 , 3450int w ,int hs ); 3451 3452#define stbi__div4 (x ) ((stbi_uc) ((x) >> 2)) 3453 3454static stbi_uc * resample_row_1 (stbi_uc * out ,stbi_uc * in_near ,stbi_uc * in_far ,int w ,int hs ) 3455{ 3456STBI_NOTUSED (out ); 3457STBI_NOTUSED (in_far ); 3458STBI_NOTUSED (w ); 3459STBI_NOTUSED (hs ); 3460return in_near ; 3461} 3462 3463static stbi_uc * stbi__resample_row_v_2 (stbi_uc * out ,stbi_uc * in_near ,stbi_uc * in_far ,int w ,int hs ) 3464{ 3465// need to generate two samples vertically for every one in input 3466int i ; 3467STBI_NOTUSED (hs ); 3468for (i = 0 ;i < w ;++ i ) 3469out [i ]= stbi__div4 (3 * in_near [i ]+ in_far [i ]+ 2 ); 3470return out ; 3471} 3472 3473static stbi_uc * stbi__resample_row_h_2 (stbi_uc * out ,stbi_uc * in_near ,stbi_uc * in_far ,int w ,int hs ) 3474{ 3475// need to generate two samples horizontally for every one in input 3476int i ; 3477stbi_uc * input = in_near ; 3478 3479if (w == 1 ) { 3480// if only one sample, can't do any interpolation 3481out [0 ]= out [1 ]= input [0 ]; 3482return out ; 3483 } 3484 3485out [0 ]= input [0 ]; 3486out [1 ]= stbi__div4 (input [0 ]* 3 + input [1 ]+ 2 ); 3487for (i = 1 ;i < w - 1 ;++ i ) { 3488int n = 3 * input [i ]+ 2 ; 3489out [i * 2 + 0 ]= stbi__div4 (n + input [i - 1 ]); 3490out [i * 2 + 1 ]= stbi__div4 (n + input [i + 1 ]); 3491 } 3492out [i * 2 + 0 ]= stbi__div4 (input [w - 2 ]* 3 + input [w - 1 ]+ 2 ); 3493out [i * 2 + 1 ]= input [w - 1 ]; 3494 3495STBI_NOTUSED (in_far ); 3496STBI_NOTUSED (hs ); 3497 3498return out ; 3499} 3500 3501#define stbi__div16 (x ) ((stbi_uc) ((x) >> 4)) 3502 3503static stbi_uc * stbi__resample_row_hv_2 (stbi_uc * out ,stbi_uc * in_near ,stbi_uc * in_far ,int w ,int hs ) 3504{ 3505// need to generate 2x2 samples for every one in input 3506int i ,t0 ,t1 ; 3507if (w == 1 ) { 3508out [0 ]= out [1 ]= stbi__div4 (3 * in_near [0 ]+ in_far [0 ]+ 2 ); 3509return out ; 3510 } 3511 3512t1 = 3 * in_near [0 ]+ in_far [0 ]; 3513out [0 ]= stbi__div4 (t1 + 2 ); 3514for (i = 1 ;i < w ;++ i ) { 3515t0 = t1 ; 3516t1 = 3 * in_near [i ]+ in_far [i ]; 3517out [i * 2 - 1 ]= stbi__div16 (3 * t0 + t1 + 8 ); 3518out [i * 2 ]= stbi__div16 (3 * t1 + t0 + 8 ); 3519 } 3520out [w * 2 - 1 ]= stbi__div4 (t1 + 2 ); 3521 3522STBI_NOTUSED (hs ); 3523 3524return out ; 3525} 3526 3527#if defined(STBI_SSE2 )|| defined(STBI_NEON ) 3528static stbi_uc * stbi__resample_row_hv_2_simd (stbi_uc * out ,stbi_uc * in_near ,stbi_uc * in_far ,int w ,int hs ) 3529{ 3530// need to generate 2x2 samples for every one in input 3531int i = 0 ,t0 ,t1 ; 3532 3533if (w == 1 ) { 3534out [0 ]= out [1 ]= stbi__div4 (3 * in_near [0 ]+ in_far [0 ]+ 2 ); 3535return out ; 3536 } 3537 3538t1 = 3 * in_near [0 ]+ in_far [0 ]; 3539// process groups of 8 pixels for as long as we can. 3540// note we can't handle the last pixel in a row in this loop 3541// because we need to handle the filter boundary conditions. 3542for (;i < ((w - 1 )& ~7 );i += 8 ) { 3543#if defined(STBI_SSE2 ) 3544// load and perform the vertical filtering pass 3545// this uses 3*x + y = 4*x + (y - x) 3546__m128i zero = _mm_setzero_si128 (); 3547__m128i farb = _mm_loadl_epi64 ((__m128i * ) (in_far + i )); 3548__m128i nearb = _mm_loadl_epi64 ((__m128i * ) (in_near + i )); 3549__m128i farw = _mm_unpacklo_epi8 (farb ,zero ); 3550__m128i nearw = _mm_unpacklo_epi8 (nearb ,zero ); 3551__m128i diff = _mm_sub_epi16 (farw ,nearw ); 3552__m128i nears = _mm_slli_epi16 (nearw ,2 ); 3553__m128i curr = _mm_add_epi16 (nears ,diff );// current row 3554 3555// horizontal filter works the same based on shifted vers of current 3556// row. "prev" is current row shifted right by 1 pixel; we need to 3557// insert the previous pixel value (from t1). 3558// "next" is current row shifted left by 1 pixel, with first pixel 3559// of next block of 8 pixels added in. 3560__m128i prv0 = _mm_slli_si128 (curr ,2 ); 3561__m128i nxt0 = _mm_srli_si128 (curr ,2 ); 3562__m128i prev = _mm_insert_epi16 (prv0 ,t1 ,0 ); 3563__m128i next = _mm_insert_epi16 (nxt0 ,3 * in_near [i + 8 ]+ in_far [i + 8 ],7 ); 3564 3565// horizontal filter, polyphase implementation since it's convenient: 3566// even pixels = 3*cur + prev = cur*4 + (prev - cur) 3567// odd pixels = 3*cur + next = cur*4 + (next - cur) 3568// note the shared term. 3569__m128i bias = _mm_set1_epi16 (8 ); 3570__m128i curs = _mm_slli_epi16 (curr ,2 ); 3571__m128i prvd = _mm_sub_epi16 (prev ,curr ); 3572__m128i nxtd = _mm_sub_epi16 (next ,curr ); 3573__m128i curb = _mm_add_epi16 (curs ,bias ); 3574__m128i even = _mm_add_epi16 (prvd ,curb ); 3575__m128i odd = _mm_add_epi16 (nxtd ,curb ); 3576 3577// interleave even and odd pixels, then undo scaling. 3578__m128i int0 = _mm_unpacklo_epi16 (even ,odd ); 3579__m128i int1 = _mm_unpackhi_epi16 (even ,odd ); 3580__m128i de0 = _mm_srli_epi16 (int0 ,4 ); 3581__m128i de1 = _mm_srli_epi16 (int1 ,4 ); 3582 3583// pack and write output 3584__m128i outv = _mm_packus_epi16 (de0 ,de1 ); 3585_mm_storeu_si128 ((__m128i * ) (out + i * 2 ),outv ); 3586#elif defined(STBI_NEON ) 3587// load and perform the vertical filtering pass 3588// this uses 3*x + y = 4*x + (y - x) 3589uint8x8_t farb = vld1_u8 (in_far + i ); 3590uint8x8_t nearb = vld1_u8 (in_near + i ); 3591int16x8_t diff = vreinterpretq_s16_u16 (vsubl_u8 (farb ,nearb )); 3592int16x8_t nears = vreinterpretq_s16_u16 (vshll_n_u8 (nearb ,2 )); 3593int16x8_t curr = vaddq_s16 (nears ,diff );// current row 3594 3595// horizontal filter works the same based on shifted vers of current 3596// row. "prev" is current row shifted right by 1 pixel; we need to 3597// insert the previous pixel value (from t1). 3598// "next" is current row shifted left by 1 pixel, with first pixel 3599// of next block of 8 pixels added in. 3600int16x8_t prv0 = vextq_s16 (curr ,curr ,7 ); 3601int16x8_t nxt0 = vextq_s16 (curr ,curr ,1 ); 3602int16x8_t prev = vsetq_lane_s16 (t1 ,prv0 ,0 ); 3603int16x8_t next = vsetq_lane_s16 (3 * in_near [i + 8 ]+ in_far [i + 8 ],nxt0 ,7 ); 3604 3605// horizontal filter, polyphase implementation since it's convenient: 3606// even pixels = 3*cur + prev = cur*4 + (prev - cur) 3607// odd pixels = 3*cur + next = cur*4 + (next - cur) 3608// note the shared term. 3609int16x8_t curs = vshlq_n_s16 (curr ,2 ); 3610int16x8_t prvd = vsubq_s16 (prev ,curr ); 3611int16x8_t nxtd = vsubq_s16 (next ,curr ); 3612int16x8_t even = vaddq_s16 (curs ,prvd ); 3613int16x8_t odd = vaddq_s16 (curs ,nxtd ); 3614 3615// undo scaling and round, then store with even/odd phases interleaved 3616uint8x8x2_t o ; 3617o .val [0 ]= vqrshrun_n_s16 (even ,4 ); 3618o .val [1 ]= vqrshrun_n_s16 (odd ,4 ); 3619vst2_u8 (out + i * 2 ,o ); 3620#endif 3621 3622// "previous" value for next iter 3623t1 = 3 * in_near [i + 7 ]+ in_far [i + 7 ]; 3624 } 3625 3626t0 = t1 ; 3627t1 = 3 * in_near [i ]+ in_far [i ]; 3628out [i * 2 ]= stbi__div16 (3 * t1 + t0 + 8 ); 3629 3630for (++ i ;i < w ;++ i ) { 3631t0 = t1 ; 3632t1 = 3 * in_near [i ]+ in_far [i ]; 3633out [i * 2 - 1 ]= stbi__div16 (3 * t0 + t1 + 8 ); 3634out [i * 2 ]= stbi__div16 (3 * t1 + t0 + 8 ); 3635 } 3636out [w * 2 - 1 ]= stbi__div4 (t1 + 2 ); 3637 3638STBI_NOTUSED (hs ); 3639 3640return out ; 3641} 3642#endif 3643 3644static stbi_uc * stbi__resample_row_generic (stbi_uc * out ,stbi_uc * in_near ,stbi_uc * in_far ,int w ,int hs ) 3645{ 3646// resample with nearest-neighbor 3647int i ,j ; 3648STBI_NOTUSED (in_far ); 3649for (i = 0 ;i < w ;++ i ) 3650for (j = 0 ;j < hs ;++ j ) 3651out [i * hs + j ]= in_near [i ]; 3652return out ; 3653} 3654 3655// this is a reduced-precision calculation of YCbCr-to-RGB introduced 3656// to make sure the code produces the same results in both SIMD and scalar 3657#define stbi__float2fixed (x ) (((int) ((x) * 4096.0f + 0.5f)) << 8) 3658static void stbi__YCbCr_to_RGB_row (stbi_uc * out ,const stbi_uc * y ,const stbi_uc * pcb ,const stbi_uc * pcr ,int count ,int step ) 3659{ 3660int i ; 3661for (i = 0 ;i < count ;++ i ) { 3662int y_fixed = (y [i ] <<20 )+ (1 <<19 );// rounding 3663int r ,g ,b ; 3664int cr = pcr [i ]- 128 ; 3665int cb = pcb [i ]- 128 ; 3666r = y_fixed + cr * stbi__float2fixed (1.40200f ); 3667g = y_fixed + (cr *- stbi__float2fixed (0.71414f ))+ ((cb *- stbi__float2fixed (0.34414f ))& 0xffff0000 ); 3668b = y_fixed + cb * stbi__float2fixed (1.77200f ); 3669r >>=20 ; 3670g >>=20 ; 3671b >>=20 ; 3672if ((unsigned )r > 255 ) {if (r < 0 )r = 0 ;else r = 255 ; } 3673if ((unsigned )g > 255 ) {if (g < 0 )g = 0 ;else g = 255 ; } 3674if ((unsigned )b > 255 ) {if (b < 0 )b = 0 ;else b = 255 ; } 3675out [0 ]= (stbi_uc )r ; 3676out [1 ]= (stbi_uc )g ; 3677out [2 ]= (stbi_uc )b ; 3678out [3 ]= 255 ; 3679out += step ; 3680 } 3681} 3682 3683#if defined(STBI_SSE2 )|| defined(STBI_NEON ) 3684static void stbi__YCbCr_to_RGB_simd (stbi_uc * out ,stbi_uc const * y ,stbi_uc const * pcb ,stbi_uc const * pcr ,int count ,int step ) 3685{ 3686int i = 0 ; 3687 3688#ifdef STBI_SSE2 3689// step == 3 is pretty ugly on the final interleave, and i'm not convinced 3690// it's useful in practice (you wouldn't use it for textures, for example). 3691// so just accelerate step == 4 case. 3692if (step == 4 ) { 3693// this is a fairly straightforward implementation and not super-optimized. 3694__m128i signflip = _mm_set1_epi8 (-0x80 ); 3695__m128i cr_const0 = _mm_set1_epi16 ( (short ) (1.40200f * 4096.0f + 0.5f )); 3696__m128i cr_const1 = _mm_set1_epi16 (- (short ) (0.71414f * 4096.0f + 0.5f )); 3697__m128i cb_const0 = _mm_set1_epi16 (- (short ) (0.34414f * 4096.0f + 0.5f )); 3698__m128i cb_const1 = _mm_set1_epi16 ( (short ) (1.77200f * 4096.0f + 0.5f )); 3699__m128i y_bias = _mm_set1_epi8 ((char ) (unsigned char )128 ); 3700__m128i xw = _mm_set1_epi16 (255 );// alpha channel 3701 3702for (;i + 7 < count ;i += 8 ) { 3703// load 3704__m128i y_bytes = _mm_loadl_epi64 ((__m128i * ) (y + i )); 3705__m128i cr_bytes = _mm_loadl_epi64 ((__m128i * ) (pcr + i )); 3706__m128i cb_bytes = _mm_loadl_epi64 ((__m128i * ) (pcb + i )); 3707__m128i cr_biased = _mm_xor_si128 (cr_bytes ,signflip );// -128 3708__m128i cb_biased = _mm_xor_si128 (cb_bytes ,signflip );// -128 3709 3710// unpack to short (and left-shift cr, cb by 8) 3711__m128i yw = _mm_unpacklo_epi8 (y_bias ,y_bytes ); 3712__m128i crw = _mm_unpacklo_epi8 (_mm_setzero_si128 (),cr_biased ); 3713__m128i cbw = _mm_unpacklo_epi8 (_mm_setzero_si128 (),cb_biased ); 3714 3715// color transform 3716__m128i yws = _mm_srli_epi16 (yw ,4 ); 3717__m128i cr0 = _mm_mulhi_epi16 (cr_const0 ,crw ); 3718__m128i cb0 = _mm_mulhi_epi16 (cb_const0 ,cbw ); 3719__m128i cb1 = _mm_mulhi_epi16 (cbw ,cb_const1 ); 3720__m128i cr1 = _mm_mulhi_epi16 (crw ,cr_const1 ); 3721__m128i rws = _mm_add_epi16 (cr0 ,yws ); 3722__m128i gwt = _mm_add_epi16 (cb0 ,yws ); 3723__m128i bws = _mm_add_epi16 (yws ,cb1 ); 3724__m128i gws = _mm_add_epi16 (gwt ,cr1 ); 3725 3726// descale 3727__m128i rw = _mm_srai_epi16 (rws ,4 ); 3728__m128i bw = _mm_srai_epi16 (bws ,4 ); 3729__m128i gw = _mm_srai_epi16 (gws ,4 ); 3730 3731// back to byte, set up for transpose 3732__m128i brb = _mm_packus_epi16 (rw ,bw ); 3733__m128i gxb = _mm_packus_epi16 (gw ,xw ); 3734 3735// transpose to interleave channels 3736__m128i t0 = _mm_unpacklo_epi8 (brb ,gxb ); 3737__m128i t1 = _mm_unpackhi_epi8 (brb ,gxb ); 3738__m128i o0 = _mm_unpacklo_epi16 (t0 ,t1 ); 3739__m128i o1 = _mm_unpackhi_epi16 (t0 ,t1 ); 3740 3741// store 3742_mm_storeu_si128 ((__m128i * ) (out + 0 ),o0 ); 3743_mm_storeu_si128 ((__m128i * ) (out + 16 ),o1 ); 3744out += 32 ; 3745 } 3746 } 3747#endif 3748 3749#ifdef STBI_NEON 3750// in this version, step=3 support would be easy to add. but is there demand? 3751if (step == 4 ) { 3752// this is a fairly straightforward implementation and not super-optimized. 3753uint8x8_t signflip = vdup_n_u8 (0x80 ); 3754int16x8_t cr_const0 = vdupq_n_s16 ( (short ) (1.40200f * 4096.0f + 0.5f )); 3755int16x8_t cr_const1 = vdupq_n_s16 (- (short ) (0.71414f * 4096.0f + 0.5f )); 3756int16x8_t cb_const0 = vdupq_n_s16 (- (short ) (0.34414f * 4096.0f + 0.5f )); 3757int16x8_t cb_const1 = vdupq_n_s16 ( (short ) (1.77200f * 4096.0f + 0.5f )); 3758 3759for (;i + 7 < count ;i += 8 ) { 3760// load 3761uint8x8_t y_bytes = vld1_u8 (y + i ); 3762uint8x8_t cr_bytes = vld1_u8 (pcr + i ); 3763uint8x8_t cb_bytes = vld1_u8 (pcb + i ); 3764int8x8_t cr_biased = vreinterpret_s8_u8 (vsub_u8 (cr_bytes ,signflip )); 3765int8x8_t cb_biased = vreinterpret_s8_u8 (vsub_u8 (cb_bytes ,signflip )); 3766 3767// expand to s16 3768int16x8_t yws = vreinterpretq_s16_u16 (vshll_n_u8 (y_bytes ,4 )); 3769int16x8_t crw = vshll_n_s8 (cr_biased ,7 ); 3770int16x8_t cbw = vshll_n_s8 (cb_biased ,7 ); 3771 3772// color transform 3773int16x8_t cr0 = vqdmulhq_s16 (crw ,cr_const0 ); 3774int16x8_t cb0 = vqdmulhq_s16 (cbw ,cb_const0 ); 3775int16x8_t cr1 = vqdmulhq_s16 (crw ,cr_const1 ); 3776int16x8_t cb1 = vqdmulhq_s16 (cbw ,cb_const1 ); 3777int16x8_t rws = vaddq_s16 (yws ,cr0 ); 3778int16x8_t gws = vaddq_s16 (vaddq_s16 (yws ,cb0 ),cr1 ); 3779int16x8_t bws = vaddq_s16 (yws ,cb1 ); 3780 3781// undo scaling, round, convert to byte 3782uint8x8x4_t o ; 3783o .val [0 ]= vqrshrun_n_s16 (rws ,4 ); 3784o .val [1 ]= vqrshrun_n_s16 (gws ,4 ); 3785o .val [2 ]= vqrshrun_n_s16 (bws ,4 ); 3786o .val [3 ]= vdup_n_u8 (255 ); 3787 3788// store, interleaving r/g/b/a 3789vst4_u8 (out ,o ); 3790out += 8 * 4 ; 3791 } 3792 } 3793#endif 3794 3795for (;i < count ;++ i ) { 3796int y_fixed = (y [i ] <<20 )+ (1 <<19 );// rounding 3797int r ,g ,b ; 3798int cr = pcr [i ]- 128 ; 3799int cb = pcb [i ]- 128 ; 3800r = y_fixed + cr * stbi__float2fixed (1.40200f ); 3801g = y_fixed + cr *- stbi__float2fixed (0.71414f )+ ((cb *- stbi__float2fixed (0.34414f ))& 0xffff0000 ); 3802b = y_fixed + cb * stbi__float2fixed (1.77200f ); 3803r >>=20 ; 3804g >>=20 ; 3805b >>=20 ; 3806if ((unsigned )r > 255 ) {if (r < 0 )r = 0 ;else r = 255 ; } 3807if ((unsigned )g > 255 ) {if (g < 0 )g = 0 ;else g = 255 ; } 3808if ((unsigned )b > 255 ) {if (b < 0 )b = 0 ;else b = 255 ; } 3809out [0 ]= (stbi_uc )r ; 3810out [1 ]= (stbi_uc )g ; 3811out [2 ]= (stbi_uc )b ; 3812out [3 ]= 255 ; 3813out += step ; 3814 } 3815} 3816#endif 3817 3818// set up the kernels 3819static void stbi__setup_jpeg (stbi__jpeg * j ) 3820{ 3821j -> idct_block_kernel = stbi__idct_block ; 3822j -> YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row ; 3823j -> resample_row_hv_2_kernel = stbi__resample_row_hv_2 ; 3824 3825#ifdef STBI_SSE2 3826if (stbi__sse2_available ()) { 3827j -> idct_block_kernel = stbi__idct_simd ; 3828j -> YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd ; 3829j -> resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd ; 3830 } 3831#endif 3832 3833#ifdef STBI_NEON 3834j -> idct_block_kernel = stbi__idct_simd ; 3835j -> YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd ; 3836j -> resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd ; 3837#endif 3838} 3839 3840// clean up the temporary component buffers 3841static void stbi__cleanup_jpeg (stbi__jpeg * j ) 3842{ 3843stbi__free_jpeg_components (j ,j -> s -> img_n ,0 ); 3844} 3845 3846typedef struct 3847{ 3848resample_row_func resample ; 3849stbi_uc * line0 ,* line1 ; 3850int hs ,vs ;// expansion factor in each axis 3851int w_lores ;// horizontal pixels pre-expansion 3852int ystep ;// how far through vertical expansion we are 3853int ypos ;// which pre-expansion row we're on 3854}stbi__resample ; 3855 3856// fast 0..255 * 0..255 => 0..255 rounded multiplication 3857static stbi_uc stbi__blinn_8x8 (stbi_uc x ,stbi_uc y ) 3858{ 3859unsigned int t = x * y + 128 ; 3860return (stbi_uc ) ((t + (t >>8 )) >>8 ); 3861} 3862 3863static stbi_uc * load_jpeg_image (stbi__jpeg * z ,int * out_x ,int * out_y ,int * comp ,int req_comp ) 3864{ 3865int n ,decode_n ,is_rgb ; 3866z -> s -> img_n = 0 ;// make stbi__cleanup_jpeg safe 3867 3868// validate req_comp 3869if (req_comp < 0 || req_comp > 4 )return stbi__errpuc ("bad req_comp" ,"Internal error" ); 3870 3871// load a jpeg image from whichever source, but leave in YCbCr format 3872if (!stbi__decode_jpeg_image (z )) {stbi__cleanup_jpeg (z );return NULL ; } 3873 3874// determine actual number of components to generate 3875n = req_comp ?req_comp :z -> s -> img_n >=3 ?3 :1 ; 3876 3877is_rgb = z -> s -> img_n == 3 && (z -> rgb == 3 || (z -> app14_color_transform == 0 && !z -> jfif )); 3878 3879if (z -> s -> img_n == 3 && n < 3 && !is_rgb ) 3880decode_n = 1 ; 3881else 3882decode_n = z -> s -> img_n ; 3883 3884// nothing to do if no components requested; check this now to avoid 3885// accessing uninitialized coutput[0] later 3886if (decode_n <=0 ) {stbi__cleanup_jpeg (z );return NULL ; } 3887 3888// resample and color-convert 3889 { 3890int k ; 3891unsigned int i ,j ; 3892stbi_uc * output ; 3893stbi_uc * coutput [4 ]= {NULL ,NULL ,NULL ,NULL }; 3894 3895stbi__resample res_comp [4 ]; 3896 3897for (k = 0 ;k < decode_n ;++ k ) { 3898stbi__resample * r = & res_comp [k ]; 3899 3900// allocate line buffer big enough for upsampling off the edges 3901// with upsample factor of 4 3902z -> img_comp [k ].linebuf = (stbi_uc * )stbi__malloc (z -> s -> img_x + 3 ); 3903if (!z -> img_comp [k ].linebuf ) {stbi__cleanup_jpeg (z );return stbi__errpuc ("outofmem" ,"Out of memory" ); } 3904 3905r -> hs = z -> img_h_max /z -> img_comp [k ].h ; 3906r -> vs = z -> img_v_max /z -> img_comp [k ].v ; 3907r -> ystep = r -> vs >>1 ; 3908r -> w_lores = (z -> s -> img_x + r -> hs - 1 ) /r -> hs ; 3909r -> ypos = 0 ; 3910r -> line0 = r -> line1 = z -> img_comp [k ].data ; 3911 3912if (r -> hs == 1 && r -> vs == 1 )r -> resample = resample_row_1 ; 3913else if (r -> hs == 1 && r -> vs == 2 )r -> resample = stbi__resample_row_v_2 ; 3914else if (r -> hs == 2 && r -> vs == 1 )r -> resample = stbi__resample_row_h_2 ; 3915else if (r -> hs == 2 && r -> vs == 2 )r -> resample = z -> resample_row_hv_2_kernel ; 3916else r -> resample = stbi__resample_row_generic ; 3917 } 3918 3919// can't error after this so, this is safe 3920output = (stbi_uc * )stbi__malloc_mad3 (n ,z -> s -> img_x ,z -> s -> img_y ,1 ); 3921if (!output ) {stbi__cleanup_jpeg (z );return stbi__errpuc ("outofmem" ,"Out of memory" ); } 3922 3923// now go ahead and resample 3924for (j = 0 ;j < z -> s -> img_y ;++ j ) { 3925stbi_uc * out = output + n * z -> s -> img_x * j ; 3926for (k = 0 ;k < decode_n ;++ k ) { 3927stbi__resample * r = & res_comp [k ]; 3928int y_bot = r -> ystep >= (r -> vs >>1 ); 3929coutput [k ]= r -> resample (z -> img_comp [k ].linebuf , 3930y_bot ?r -> line1 :r -> line0 , 3931y_bot ?r -> line0 :r -> line1 , 3932r -> w_lores ,r -> hs ); 3933if (++ r -> ystep >=r -> vs ) { 3934r -> ystep = 0 ; 3935r -> line0 = r -> line1 ; 3936if (++ r -> ypos < z -> img_comp [k ].y ) 3937r -> line1 += z -> img_comp [k ].w2 ; 3938 } 3939 } 3940if (n >=3 ) { 3941stbi_uc * y = coutput [0 ]; 3942if (z -> s -> img_n == 3 ) { 3943if (is_rgb ) { 3944for (i = 0 ;i < z -> s -> img_x ;++ i ) { 3945out [0 ]= y [i ]; 3946out [1 ]= coutput [1 ][i ]; 3947out [2 ]= coutput [2 ][i ]; 3948out [3 ]= 255 ; 3949out += n ; 3950 } 3951 }else { 3952z -> YCbCr_to_RGB_kernel (out ,y ,coutput [1 ],coutput [2 ],z -> s -> img_x ,n ); 3953 } 3954 }else if (z -> s -> img_n == 4 ) { 3955if (z -> app14_color_transform == 0 ) {// CMYK 3956for (i = 0 ;i < z -> s -> img_x ;++ i ) { 3957stbi_uc m = coutput [3 ][i ]; 3958out [0 ]= stbi__blinn_8x8 (coutput [0 ][i ],m ); 3959out [1 ]= stbi__blinn_8x8 (coutput [1 ][i ],m ); 3960out [2 ]= stbi__blinn_8x8 (coutput [2 ][i ],m ); 3961out [3 ]= 255 ; 3962out += n ; 3963 } 3964 }else if (z -> app14_color_transform == 2 ) {// YCCK 3965z -> YCbCr_to_RGB_kernel (out ,y ,coutput [1 ],coutput [2 ],z -> s -> img_x ,n ); 3966for (i = 0 ;i < z -> s -> img_x ;++ i ) { 3967stbi_uc m = coutput [3 ][i ]; 3968out [0 ]= stbi__blinn_8x8 (255 - out [0 ],m ); 3969out [1 ]= stbi__blinn_8x8 (255 - out [1 ],m ); 3970out [2 ]= stbi__blinn_8x8 (255 - out [2 ],m ); 3971out += n ; 3972 } 3973 }else {// YCbCr + alpha? Ignore the fourth channel for now 3974z -> YCbCr_to_RGB_kernel (out ,y ,coutput [1 ],coutput [2 ],z -> s -> img_x ,n ); 3975 } 3976 }else 3977for (i = 0 ;i < z -> s -> img_x ;++ i ) { 3978out [0 ]= out [1 ]= out [2 ]= y [i ]; 3979out [3 ]= 255 ;// not used if n==3 3980out += n ; 3981 } 3982 }else { 3983if (is_rgb ) { 3984if (n == 1 ) 3985for (i = 0 ;i < z -> s -> img_x ;++ i ) 3986* out ++ = stbi__compute_y (coutput [0 ][i ],coutput [1 ][i ],coutput [2 ][i ]); 3987else { 3988for (i = 0 ;i < z -> s -> img_x ;++ i ,out += 2 ) { 3989out [0 ]= stbi__compute_y (coutput [0 ][i ],coutput [1 ][i ],coutput [2 ][i ]); 3990out [1 ]= 255 ; 3991 } 3992 } 3993 }else if (z -> s -> img_n == 4 && z -> app14_color_transform == 0 ) { 3994for (i = 0 ;i < z -> s -> img_x ;++ i ) { 3995stbi_uc m = coutput [3 ][i ]; 3996stbi_uc r = stbi__blinn_8x8 (coutput [0 ][i ],m ); 3997stbi_uc g = stbi__blinn_8x8 (coutput [1 ][i ],m ); 3998stbi_uc b = stbi__blinn_8x8 (coutput [2 ][i ],m ); 3999out [0 ]= stbi__compute_y (r ,g ,b ); 4000out [1 ]= 255 ; 4001out += n ; 4002 } 4003 }else if (z -> s -> img_n == 4 && z -> app14_color_transform == 2 ) { 4004for (i = 0 ;i < z -> s -> img_x ;++ i ) { 4005out [0 ]= stbi__blinn_8x8 (255 - coutput [0 ][i ],coutput [3 ][i ]); 4006out [1 ]= 255 ; 4007out += n ; 4008 } 4009 }else { 4010stbi_uc * y = coutput [0 ]; 4011if (n == 1 ) 4012for (i = 0 ;i < z -> s -> img_x ;++ i )out [i ]= y [i ]; 4013else 4014for (i = 0 ;i < z -> s -> img_x ;++ i ) {* out ++ = y [i ];* out ++ = 255 ; } 4015 } 4016 } 4017 } 4018stbi__cleanup_jpeg (z ); 4019* out_x = z -> s -> img_x ; 4020* out_y = z -> s -> img_y ; 4021if (comp )* comp = z -> s -> img_n >=3 ?3 :1 ;// report original components, not output 4022return output ; 4023 } 4024} 4025 4026static void * stbi__jpeg_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ) 4027{ 4028unsigned char * result ; 4029stbi__jpeg * j = (stbi__jpeg * )stbi__malloc (sizeof (stbi__jpeg )); 4030if (!j )return stbi__errpuc ("outofmem" ,"Out of memory" ); 4031memset (j ,0 ,sizeof (stbi__jpeg )); 4032STBI_NOTUSED (ri ); 4033j -> s = s ; 4034stbi__setup_jpeg (j ); 4035result = load_jpeg_image (j ,x ,y ,comp ,req_comp ); 4036STBI_FREE (j ); 4037return result ; 4038} 4039 4040static int stbi__jpeg_test (stbi__context * s ) 4041{ 4042int r ; 4043stbi__jpeg * j = (stbi__jpeg * )stbi__malloc (sizeof (stbi__jpeg )); 4044if (!j )return stbi__err ("outofmem" ,"Out of memory" ); 4045memset (j ,0 ,sizeof (stbi__jpeg )); 4046j -> s = s ; 4047stbi__setup_jpeg (j ); 4048r = stbi__decode_jpeg_header (j ,STBI__SCAN_type ); 4049stbi__rewind (s ); 4050STBI_FREE (j ); 4051return r ; 4052} 4053 4054static int stbi__jpeg_info_raw (stbi__jpeg * j ,int * x ,int * y ,int * comp ) 4055{ 4056if (!stbi__decode_jpeg_header (j ,STBI__SCAN_header )) { 4057stbi__rewind (j -> s ); 4058return 0 ; 4059 } 4060if (x )* x = j -> s -> img_x ; 4061if (y )* y = j -> s -> img_y ; 4062if (comp )* comp = j -> s -> img_n >=3 ?3 :1 ; 4063return 1 ; 4064} 4065 4066static int stbi__jpeg_info (stbi__context * s ,int * x ,int * y ,int * comp ) 4067{ 4068int result ; 4069stbi__jpeg * j = (stbi__jpeg * ) (stbi__malloc (sizeof (stbi__jpeg ))); 4070if (!j )return stbi__err ("outofmem" ,"Out of memory" ); 4071memset (j ,0 ,sizeof (stbi__jpeg )); 4072j -> s = s ; 4073result = stbi__jpeg_info_raw (j ,x ,y ,comp ); 4074STBI_FREE (j ); 4075return result ; 4076} 4077#endif 4078 4079// public domain zlib decode v0.2 Sean Barrett 2006-11-18 4080// simple implementation 4081// - all input must be provided in an upfront buffer 4082// - all output is written to a single output buffer (can malloc/realloc) 4083// performance 4084// - fast huffman 4085 4086#ifndef STBI_NO_ZLIB 4087 4088// fast-way is faster to check than jpeg huffman, but slow way is slower 4089#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables 4090#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1) 4091#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet 4092 4093// zlib-style huffman encoding 4094// (jpegs packs from left, zlib from right, so can't share code) 4095typedef struct 4096{ 4097stbi__uint16 fast [1 <<STBI__ZFAST_BITS ]; 4098stbi__uint16 firstcode [16 ]; 4099int maxcode [17 ]; 4100stbi__uint16 firstsymbol [16 ]; 4101stbi_uc size [STBI__ZNSYMS ]; 4102stbi__uint16 value [STBI__ZNSYMS ]; 4103}stbi__zhuffman ; 4104 4105stbi_inline static int stbi__bitreverse16 (int n ) 4106{ 4107n = ((n & 0xAAAA ) >>1 ) | ((n & 0x5555 ) <<1 ); 4108n = ((n & 0xCCCC ) >>2 ) | ((n & 0x3333 ) <<2 ); 4109n = ((n & 0xF0F0 ) >>4 ) | ((n & 0x0F0F ) <<4 ); 4110n = ((n & 0xFF00 ) >>8 ) | ((n & 0x00FF ) <<8 ); 4111return n ; 4112} 4113 4114stbi_inline static int stbi__bit_reverse (int v ,int bits ) 4115{ 4116STBI_ASSERT (bits <=16 ); 4117// to bit reverse n bits, reverse 16 and shift 4118// e.g. 11 bits, bit reverse and shift away 5 4119return stbi__bitreverse16 (v ) >> (16 - bits ); 4120} 4121 4122static int stbi__zbuild_huffman (stbi__zhuffman * z ,const stbi_uc * sizelist ,int num ) 4123{ 4124int i ,k = 0 ; 4125int code ,next_code [16 ],sizes [17 ]; 4126 4127// DEFLATE spec for generating codes 4128memset (sizes ,0 ,sizeof (sizes )); 4129memset (z -> fast ,0 ,sizeof (z -> fast )); 4130for (i = 0 ;i < num ;++ i ) 4131++ sizes [sizelist [i ]]; 4132sizes [0 ]= 0 ; 4133for (i = 1 ;i < 16 ;++ i ) 4134if (sizes [i ]> (1 <<i )) 4135return stbi__err ("bad sizes" ,"Corrupt PNG" ); 4136code = 0 ; 4137for (i = 1 ;i < 16 ;++ i ) { 4138next_code [i ]= code ; 4139z -> firstcode [i ]= (stbi__uint16 )code ; 4140z -> firstsymbol [i ]= (stbi__uint16 )k ; 4141code = (code + sizes [i ]); 4142if (sizes [i ]) 4143if (code - 1 >= (1 <<i ))return stbi__err ("bad codelengths" ,"Corrupt PNG" ); 4144z -> maxcode [i ]= code << (16 - i );// preshift for inner loop 4145code <<=1 ; 4146k += sizes [i ]; 4147 } 4148z -> maxcode [16 ]= 0x10000 ;// sentinel 4149for (i = 0 ;i < num ;++ i ) { 4150int s = sizelist [i ]; 4151if (s ) { 4152int c = next_code [s ]- z -> firstcode [s ]+ z -> firstsymbol [s ]; 4153stbi__uint16 fastv = (stbi__uint16 ) ((s <<9 ) |i ); 4154z -> size [c ]= (stbi_uc )s ; 4155z -> value [c ]= (stbi__uint16 )i ; 4156if (s <=STBI__ZFAST_BITS ) { 4157int j = stbi__bit_reverse (next_code [s ],s ); 4158while (j < (1 <<STBI__ZFAST_BITS )) { 4159z -> fast [j ]= fastv ; 4160j += (1 <<s ); 4161 } 4162 } 4163++ next_code [s ]; 4164 } 4165 } 4166return 1 ; 4167} 4168 4169// zlib-from-memory implementation for PNG reading 4170// because PNG allows splitting the zlib stream arbitrarily, 4171// and it's annoying structurally to have PNG call ZLIB call PNG, 4172// we require PNG read all the IDATs and combine them into a single 4173// memory buffer 4174 4175typedef struct 4176{ 4177stbi_uc * zbuffer ,* zbuffer_end ; 4178int num_bits ; 4179stbi__uint32 code_buffer ; 4180 4181char * zout ; 4182char * zout_start ; 4183char * zout_end ; 4184int z_expandable ; 4185 4186stbi__zhuffman z_length ,z_distance ; 4187}stbi__zbuf ; 4188 4189stbi_inline static int stbi__zeof (stbi__zbuf * z ) 4190{ 4191return (z -> zbuffer >=z -> zbuffer_end ); 4192} 4193 4194stbi_inline static stbi_uc stbi__zget8 (stbi__zbuf * z ) 4195{ 4196return stbi__zeof (z ) ?0 :* z -> zbuffer ++ ; 4197} 4198 4199static void stbi__fill_bits (stbi__zbuf * z ) 4200{ 4201do { 4202if (z -> code_buffer >= (1U <<z -> num_bits )) { 4203z -> zbuffer = z -> zbuffer_end ;/* treat this as EOF so we fail. */ 4204return ; 4205 } 4206z -> code_buffer |= (unsigned int )stbi__zget8 (z ) <<z -> num_bits ; 4207z -> num_bits += 8 ; 4208 }while (z -> num_bits <=24 ); 4209} 4210 4211stbi_inline static unsigned int stbi__zreceive (stbi__zbuf * z ,int n ) 4212{ 4213unsigned int k ; 4214if (z -> num_bits < n )stbi__fill_bits (z ); 4215k = z -> code_buffer & ((1 <<n )- 1 ); 4216z -> code_buffer >>=n ; 4217z -> num_bits -= n ; 4218return k ; 4219} 4220 4221static int stbi__zhuffman_decode_slowpath (stbi__zbuf * a ,stbi__zhuffman * z ) 4222{ 4223int b ,s ,k ; 4224// not resolved by fast table, so compute it the slow way 4225// use jpeg approach, which requires MSbits at top 4226k = stbi__bit_reverse (a -> code_buffer ,16 ); 4227for (s = STBI__ZFAST_BITS + 1 ; ;++ s ) 4228if (k < z -> maxcode [s ]) 4229break ; 4230if (s >=16 )return -1 ;// invalid code! 4231// code size is s, so: 4232b = (k >> (16 - s ))- z -> firstcode [s ]+ z -> firstsymbol [s ]; 4233if (b >=STBI__ZNSYMS )return -1 ;// some data was corrupt somewhere! 4234if (z -> size [b ]!= s )return -1 ;// was originally an assert, but report failure instead. 4235a -> code_buffer >>=s ; 4236a -> num_bits -= s ; 4237return z -> value [b ]; 4238} 4239 4240stbi_inline static int stbi__zhuffman_decode (stbi__zbuf * a ,stbi__zhuffman * z ) 4241{ 4242int b ,s ; 4243if (a -> num_bits < 16 ) { 4244if (stbi__zeof (a )) { 4245return -1 ;/* report error for unexpected end of data. */ 4246 } 4247stbi__fill_bits (a ); 4248 } 4249b = z -> fast [a -> code_buffer & STBI__ZFAST_MASK ]; 4250if (b ) { 4251s = b >>9 ; 4252a -> code_buffer >>=s ; 4253a -> num_bits -= s ; 4254return b & 511 ; 4255 } 4256return stbi__zhuffman_decode_slowpath (a ,z ); 4257} 4258 4259static int stbi__zexpand (stbi__zbuf * z ,char * zout ,int n )// need to make room for n bytes 4260{ 4261char * q ; 4262unsigned int cur ,limit ,old_limit ; 4263z -> zout = zout ; 4264if (!z -> z_expandable )return stbi__err ("output buffer limit" ,"Corrupt PNG" ); 4265cur = (unsigned int ) (z -> zout - z -> zout_start ); 4266limit = old_limit = (unsigned ) (z -> zout_end - z -> zout_start ); 4267if (UINT_MAX - cur < (unsigned )n )return stbi__err ("outofmem" ,"Out of memory" ); 4268while (cur + n > limit ) { 4269if (limit > UINT_MAX /2 )return stbi__err ("outofmem" ,"Out of memory" ); 4270limit *=2 ; 4271 } 4272q = (char * )STBI_REALLOC_SIZED (z -> zout_start ,old_limit ,limit ); 4273STBI_NOTUSED (old_limit ); 4274if (q == NULL )return stbi__err ("outofmem" ,"Out of memory" ); 4275z -> zout_start = q ; 4276z -> zout = q + cur ; 4277z -> zout_end = q + limit ; 4278return 1 ; 4279} 4280 4281static const int stbi__zlength_base [31 ]= { 42823 ,4 ,5 ,6 ,7 ,8 ,9 ,10 ,11 ,13 , 428315 ,17 ,19 ,23 ,27 ,31 ,35 ,43 ,51 ,59 , 428467 ,83 ,99 ,115 ,131 ,163 ,195 ,227 ,258 ,0 ,0 }; 4285 4286static const int stbi__zlength_extra [31 ]= 4287{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 }; 4288 4289static const int stbi__zdist_base [32 ]= {1 ,2 ,3 ,4 ,5 ,7 ,9 ,13 ,17 ,25 ,33 ,49 ,65 ,97 ,129 ,193 , 4290257 ,385 ,513 ,769 ,1025 ,1537 ,2049 ,3073 ,4097 ,6145 ,8193 ,12289 ,16385 ,24577 ,0 ,0 }; 4291 4292static const int stbi__zdist_extra [32 ]= 4293{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 }; 4294 4295static int stbi__parse_huffman_block (stbi__zbuf * a ) 4296{ 4297char * zout = a -> zout ; 4298for (;;) { 4299int z = stbi__zhuffman_decode (a ,& a -> z_length ); 4300if (z < 256 ) { 4301if (z < 0 )return stbi__err ("bad huffman code" ,"Corrupt PNG" );// error in huffman codes 4302if (zout >=a -> zout_end ) { 4303if (!stbi__zexpand (a ,zout ,1 ))return 0 ; 4304zout = a -> zout ; 4305 } 4306* zout ++ = (char )z ; 4307 }else { 4308stbi_uc * p ; 4309int len ,dist ; 4310if (z == 256 ) { 4311a -> zout = zout ; 4312return 1 ; 4313 } 4314if (z >=286 )return stbi__err ("bad huffman code" ,"Corrupt PNG" );// per DEFLATE, length codes 286 and 287 must not appear in compressed data 4315z -= 257 ; 4316len = stbi__zlength_base [z ]; 4317if (stbi__zlength_extra [z ])len += stbi__zreceive (a ,stbi__zlength_extra [z ]); 4318z = stbi__zhuffman_decode (a ,& a -> z_distance ); 4319if (z < 0 || z >=30 )return stbi__err ("bad huffman code" ,"Corrupt PNG" );// per DEFLATE, distance codes 30 and 31 must not appear in compressed data 4320dist = stbi__zdist_base [z ]; 4321if (stbi__zdist_extra [z ])dist += stbi__zreceive (a ,stbi__zdist_extra [z ]); 4322if (zout - a -> zout_start < dist )return stbi__err ("bad dist" ,"Corrupt PNG" ); 4323if (zout + len > a -> zout_end ) { 4324if (!stbi__zexpand (a ,zout ,len ))return 0 ; 4325zout = a -> zout ; 4326 } 4327p = (stbi_uc * ) (zout - dist ); 4328if (dist == 1 ) {// run of one byte; common in images. 4329stbi_uc v = * p ; 4330if (len ) {do * zout ++ = v ;while (-- len ); } 4331 }else { 4332if (len ) {do * zout ++ = * p ++ ;while (-- len ); } 4333 } 4334 } 4335 } 4336} 4337 4338static int stbi__compute_huffman_codes (stbi__zbuf * a ) 4339{ 4340static const stbi_uc length_dezigzag [19 ]= {16 ,17 ,18 ,0 ,8 ,7 ,9 ,6 ,10 ,5 ,11 ,4 ,12 ,3 ,13 ,2 ,14 ,1 ,15 }; 4341stbi__zhuffman z_codelength ; 4342stbi_uc lencodes [286 + 32 + 137 ];//padding for maximum single op 4343stbi_uc codelength_sizes [19 ]; 4344int i ,n ; 4345 4346int hlit = stbi__zreceive (a ,5 )+ 257 ; 4347int hdist = stbi__zreceive (a ,5 )+ 1 ; 4348int hclen = stbi__zreceive (a ,4 )+ 4 ; 4349int ntot = hlit + hdist ; 4350 4351memset (codelength_sizes ,0 ,sizeof (codelength_sizes )); 4352for (i = 0 ;i < hclen ;++ i ) { 4353int s = stbi__zreceive (a ,3 ); 4354codelength_sizes [length_dezigzag [i ]]= (stbi_uc )s ; 4355 } 4356if (!stbi__zbuild_huffman (& z_codelength ,codelength_sizes ,19 ))return 0 ; 4357 4358n = 0 ; 4359while (n < ntot ) { 4360int c = stbi__zhuffman_decode (a ,& z_codelength ); 4361if (c < 0 || c >=19 )return stbi__err ("bad codelengths" ,"Corrupt PNG" ); 4362if (c < 16 ) 4363lencodes [n ++ ]= (stbi_uc )c ; 4364else { 4365stbi_uc fill = 0 ; 4366if (c == 16 ) { 4367c = stbi__zreceive (a ,2 )+ 3 ; 4368if (n == 0 )return stbi__err ("bad codelengths" ,"Corrupt PNG" ); 4369fill = lencodes [n - 1 ]; 4370 }else if (c == 17 ) { 4371c = stbi__zreceive (a ,3 )+ 3 ; 4372 }else if (c == 18 ) { 4373c = stbi__zreceive (a ,7 )+ 11 ; 4374 }else { 4375return stbi__err ("bad codelengths" ,"Corrupt PNG" ); 4376 } 4377if (ntot - n < c )return stbi__err ("bad codelengths" ,"Corrupt PNG" ); 4378memset (lencodes + n ,fill ,c ); 4379n += c ; 4380 } 4381 } 4382if (n != ntot )return stbi__err ("bad codelengths" ,"Corrupt PNG" ); 4383if (!stbi__zbuild_huffman (& a -> z_length ,lencodes ,hlit ))return 0 ; 4384if (!stbi__zbuild_huffman (& a -> z_distance ,lencodes + hlit ,hdist ))return 0 ; 4385return 1 ; 4386} 4387 4388static int stbi__parse_uncompressed_block (stbi__zbuf * a ) 4389{ 4390stbi_uc header [4 ]; 4391int len ,nlen ,k ; 4392if (a -> num_bits & 7 ) 4393stbi__zreceive (a ,a -> num_bits & 7 );// discard 4394// drain the bit-packed data into header 4395k = 0 ; 4396while (a -> num_bits > 0 ) { 4397header [k ++ ]= (stbi_uc ) (a -> code_buffer & 255 );// suppress MSVC run-time check 4398a -> code_buffer >>=8 ; 4399a -> num_bits -= 8 ; 4400 } 4401if (a -> num_bits < 0 )return stbi__err ("zlib corrupt" ,"Corrupt PNG" ); 4402// now fill header the normal way 4403while (k < 4 ) 4404header [k ++ ]= stbi__zget8 (a ); 4405len = header [1 ]* 256 + header [0 ]; 4406nlen = header [3 ]* 256 + header [2 ]; 4407if (nlen != (len ^0xffff ))return stbi__err ("zlib corrupt" ,"Corrupt PNG" ); 4408if (a -> zbuffer + len > a -> zbuffer_end )return stbi__err ("read past buffer" ,"Corrupt PNG" ); 4409if (a -> zout + len > a -> zout_end ) 4410if (!stbi__zexpand (a ,a -> zout ,len ))return 0 ; 4411memcpy (a -> zout ,a -> zbuffer ,len ); 4412a -> zbuffer += len ; 4413a -> zout += len ; 4414return 1 ; 4415} 4416 4417static int stbi__parse_zlib_header (stbi__zbuf * a ) 4418{ 4419int cmf = stbi__zget8 (a ); 4420int cm = cmf & 15 ; 4421/* int cinfo = cmf >> 4; */ 4422int flg = stbi__zget8 (a ); 4423if (stbi__zeof (a ))return stbi__err ("bad zlib header" ,"Corrupt PNG" );// zlib spec 4424if ((cmf * 256 + flg ) %31 != 0 )return stbi__err ("bad zlib header" ,"Corrupt PNG" );// zlib spec 4425if (flg & 32 )return stbi__err ("no preset dict" ,"Corrupt PNG" );// preset dictionary not allowed in png 4426if (cm != 8 )return stbi__err ("bad compression" ,"Corrupt PNG" );// DEFLATE required for png 4427// window = 1 << (8 + cinfo)... but who cares, we fully buffer output 4428return 1 ; 4429} 4430 4431static const stbi_uc stbi__zdefault_length [STBI__ZNSYMS ]= 4432{ 44338 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 , 44348 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 , 44358 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 , 44368 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 , 44378 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 , 44389 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 , 44399 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 , 44409 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 ,9 , 44417 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,7 ,8 ,8 ,8 ,8 ,8 ,8 ,8 ,8 4442}; 4443static const stbi_uc stbi__zdefault_distance [32 ]= 4444{ 44455 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 ,5 4446}; 4447/* 4448Init algorithm: 4449{ 4450int i; // use <= to match clearly with spec 4451for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; 4452for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; 4453for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; 4454for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; 4455 4456for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; 4457} 4458*/ 4459 4460static int stbi__parse_zlib (stbi__zbuf * a ,int parse_header ) 4461{ 4462int final ,type ; 4463if (parse_header ) 4464if (!stbi__parse_zlib_header (a ))return 0 ; 4465a -> num_bits = 0 ; 4466a -> code_buffer = 0 ; 4467do { 4468final = stbi__zreceive (a ,1 ); 4469type = stbi__zreceive (a ,2 ); 4470if (type == 0 ) { 4471if (!stbi__parse_uncompressed_block (a ))return 0 ; 4472 }else if (type == 3 ) { 4473return 0 ; 4474 }else { 4475if (type == 1 ) { 4476// use fixed code lengths 4477if (!stbi__zbuild_huffman (& a -> z_length ,stbi__zdefault_length ,STBI__ZNSYMS ))return 0 ; 4478if (!stbi__zbuild_huffman (& a -> z_distance ,stbi__zdefault_distance ,32 ))return 0 ; 4479 }else { 4480if (!stbi__compute_huffman_codes (a ))return 0 ; 4481 } 4482if (!stbi__parse_huffman_block (a ))return 0 ; 4483 } 4484 }while (!final ); 4485return 1 ; 4486} 4487 4488static int stbi__do_zlib (stbi__zbuf * a ,char * obuf ,int olen ,int exp ,int parse_header ) 4489{ 4490a -> zout_start = obuf ; 4491a -> zout = obuf ; 4492a -> zout_end = obuf + olen ; 4493a -> z_expandable = exp ; 4494 4495return stbi__parse_zlib (a ,parse_header ); 4496} 4497 4498STBIDEF char * stbi_zlib_decode_malloc_guesssize (const char * buffer ,int len ,int initial_size ,int * outlen ) 4499{ 4500stbi__zbuf a ; 4501char * p = (char * )stbi__malloc (initial_size ); 4502if (p == NULL )return NULL ; 4503a .zbuffer = (stbi_uc * )buffer ; 4504a .zbuffer_end = (stbi_uc * )buffer + len ; 4505if (stbi__do_zlib (& a ,p ,initial_size ,1 ,1 )) { 4506if (outlen )* outlen = (int ) (a .zout - a .zout_start ); 4507return a .zout_start ; 4508 }else { 4509STBI_FREE (a .zout_start ); 4510return NULL ; 4511 } 4512} 4513 4514STBIDEF char * stbi_zlib_decode_malloc (char const * buffer ,int len ,int * outlen ) 4515{ 4516return stbi_zlib_decode_malloc_guesssize (buffer ,len ,16384 ,outlen ); 4517} 4518 4519STBIDEF char * stbi_zlib_decode_malloc_guesssize_headerflag (const char * buffer ,int len ,int initial_size ,int * outlen ,int parse_header ) 4520{ 4521stbi__zbuf a ; 4522char * p = (char * )stbi__malloc (initial_size ); 4523if (p == NULL )return NULL ; 4524a .zbuffer = (stbi_uc * )buffer ; 4525a .zbuffer_end = (stbi_uc * )buffer + len ; 4526if (stbi__do_zlib (& a ,p ,initial_size ,1 ,parse_header )) { 4527if (outlen )* outlen = (int ) (a .zout - a .zout_start ); 4528return a .zout_start ; 4529 }else { 4530STBI_FREE (a .zout_start ); 4531return NULL ; 4532 } 4533} 4534 4535STBIDEF int stbi_zlib_decode_buffer (char * obuffer ,int olen ,char const * ibuffer ,int ilen ) 4536{ 4537stbi__zbuf a ; 4538a .zbuffer = (stbi_uc * )ibuffer ; 4539a .zbuffer_end = (stbi_uc * )ibuffer + ilen ; 4540if (stbi__do_zlib (& a ,obuffer ,olen ,0 ,1 )) 4541return (int ) (a .zout - a .zout_start ); 4542else 4543return -1 ; 4544} 4545 4546STBIDEF char * stbi_zlib_decode_noheader_malloc (char const * buffer ,int len ,int * outlen ) 4547{ 4548stbi__zbuf a ; 4549char * p = (char * )stbi__malloc (16384 ); 4550if (p == NULL )return NULL ; 4551a .zbuffer = (stbi_uc * )buffer ; 4552a .zbuffer_end = (stbi_uc * )buffer + len ; 4553if (stbi__do_zlib (& a ,p ,16384 ,1 ,0 )) { 4554if (outlen )* outlen = (int ) (a .zout - a .zout_start ); 4555return a .zout_start ; 4556 }else { 4557STBI_FREE (a .zout_start ); 4558return NULL ; 4559 } 4560} 4561 4562STBIDEF int stbi_zlib_decode_noheader_buffer (char * obuffer ,int olen ,const char * ibuffer ,int ilen ) 4563{ 4564stbi__zbuf a ; 4565a .zbuffer = (stbi_uc * )ibuffer ; 4566a .zbuffer_end = (stbi_uc * )ibuffer + ilen ; 4567if (stbi__do_zlib (& a ,obuffer ,olen ,0 ,0 )) 4568return (int ) (a .zout - a .zout_start ); 4569else 4570return -1 ; 4571} 4572#endif 4573 4574// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 4575// simple implementation 4576// - only 8-bit samples 4577// - no CRC checking 4578// - allocates lots of intermediate memory 4579// - avoids problem of streaming data between subsystems 4580// - avoids explicit window management 4581// performance 4582// - uses stb_zlib, a PD zlib implementation with fast huffman decoding 4583 4584#ifndef STBI_NO_PNG 4585typedef struct 4586{ 4587stbi__uint32 length ; 4588stbi__uint32 type ; 4589}stbi__pngchunk ; 4590 4591static stbi__pngchunk stbi__get_chunk_header (stbi__context * s ) 4592{ 4593stbi__pngchunk c ; 4594c .length = stbi__get32be (s ); 4595c .type = stbi__get32be (s ); 4596return c ; 4597} 4598 4599static int stbi__check_png_header (stbi__context * s ) 4600{ 4601static const stbi_uc png_sig [8 ]= {137 ,80 ,78 ,71 ,13 ,10 ,26 ,10 }; 4602int i ; 4603for (i = 0 ;i < 8 ;++ i ) 4604if (stbi__get8 (s )!= png_sig [i ])return stbi__err ("bad png sig" ,"Not a PNG" ); 4605return 1 ; 4606} 4607 4608typedef struct 4609{ 4610stbi__context * s ; 4611stbi_uc * idata ,* expanded ,* out ; 4612int depth ; 4613}stbi__png ; 4614 4615 4616enum { 4617STBI__F_none = 0 , 4618STBI__F_sub = 1 , 4619STBI__F_up = 2 , 4620STBI__F_avg = 3 , 4621STBI__F_paeth = 4 , 4622// synthetic filters used for first scanline to avoid needing a dummy row of 0s 4623STBI__F_avg_first , 4624STBI__F_paeth_first 4625}; 4626 4627static stbi_uc first_row_filter [5 ]= 4628{ 4629STBI__F_none , 4630STBI__F_sub , 4631STBI__F_none , 4632STBI__F_avg_first , 4633STBI__F_paeth_first 4634}; 4635 4636static int stbi__paeth (int a ,int b ,int c ) 4637{ 4638int p = a + b - c ; 4639int pa = abs (p - a ); 4640int pb = abs (p - b ); 4641int pc = abs (p - c ); 4642if (pa <=pb && pa <=pc )return a ; 4643if (pb <=pc )return b ; 4644return c ; 4645} 4646 4647static const stbi_uc stbi__depth_scale_table [9 ]= {0 ,0xff ,0x55 ,0 ,0x11 ,0 ,0 ,0 ,0x01 }; 4648 4649// create the png data from post-deflated data 4650static int stbi__create_png_image_raw (stbi__png * a ,stbi_uc * raw ,stbi__uint32 raw_len ,int out_n ,stbi__uint32 x ,stbi__uint32 y ,int depth ,int color ) 4651{ 4652int bytes = (depth == 16 ?2 :1 ); 4653stbi__context * s = a -> s ; 4654stbi__uint32 i ,j ,stride = x * out_n * bytes ; 4655stbi__uint32 img_len ,img_width_bytes ; 4656int k ; 4657int img_n = s -> img_n ;// copy it into a local for later 4658 4659int output_bytes = out_n * bytes ; 4660int filter_bytes = img_n * bytes ; 4661int width = x ; 4662 4663STBI_ASSERT (out_n == s -> img_n || out_n == s -> img_n + 1 ); 4664a -> out = (stbi_uc * )stbi__malloc_mad3 (x ,y ,output_bytes ,0 );// extra bytes to write off the end into 4665if (!a -> out )return stbi__err ("outofmem" ,"Out of memory" ); 4666 4667if (!stbi__mad3sizes_valid (img_n ,x ,depth ,7 ))return stbi__err ("too large" ,"Corrupt PNG" ); 4668img_width_bytes = (((img_n * x * depth )+ 7 ) >>3 ); 4669img_len = (img_width_bytes + 1 )* y ; 4670 4671// we used to check for exact match between raw_len and img_len on non-interlaced PNGs, 4672// but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), 4673// so just check for raw_len < img_len always. 4674if (raw_len < img_len )return stbi__err ("not enough pixels" ,"Corrupt PNG" ); 4675 4676for (j = 0 ;j < y ;++ j ) { 4677stbi_uc * cur = a -> out + stride * j ; 4678stbi_uc * prior ; 4679int filter = * raw ++ ; 4680 4681if (filter > 4 ) 4682return stbi__err ("invalid filter" ,"Corrupt PNG" ); 4683 4684if (depth < 8 ) { 4685if (img_width_bytes > x )return stbi__err ("invalid width" ,"Corrupt PNG" ); 4686cur += x * out_n - img_width_bytes ;// store output to the rightmost img_len bytes, so we can decode in place 4687filter_bytes = 1 ; 4688width = img_width_bytes ; 4689 } 4690prior = cur - stride ;// bugfix: need to compute this after 'cur +=' computation above 4691 4692// if first row, use special filter that doesn't sample previous row 4693if (j == 0 )filter = first_row_filter [filter ]; 4694 4695// handle first byte explicitly 4696for (k = 0 ;k < filter_bytes ;++ k ) { 4697switch (filter ) { 4698case STBI__F_none :cur [k ]= raw [k ];break ; 4699case STBI__F_sub :cur [k ]= raw [k ];break ; 4700case STBI__F_up :cur [k ]= STBI__BYTECAST (raw [k ]+ prior [k ]);break ; 4701case STBI__F_avg :cur [k ]= STBI__BYTECAST (raw [k ]+ (prior [k ]>>1 ));break ; 4702case STBI__F_paeth :cur [k ]= STBI__BYTECAST (raw [k ]+ stbi__paeth (0 ,prior [k ],0 ));break ; 4703case STBI__F_avg_first :cur [k ]= raw [k ];break ; 4704case STBI__F_paeth_first :cur [k ]= raw [k ];break ; 4705 } 4706 } 4707 4708if (depth == 8 ) { 4709if (img_n != out_n ) 4710cur [img_n ]= 255 ;// first pixel 4711raw += img_n ; 4712cur += out_n ; 4713prior += out_n ; 4714 }else if (depth == 16 ) { 4715if (img_n != out_n ) { 4716cur [filter_bytes ]= 255 ;// first pixel top byte 4717cur [filter_bytes + 1 ]= 255 ;// first pixel bottom byte 4718 } 4719raw += filter_bytes ; 4720cur += output_bytes ; 4721prior += output_bytes ; 4722 }else { 4723raw += 1 ; 4724cur += 1 ; 4725prior += 1 ; 4726 } 4727 4728// this is a little gross, so that we don't switch per-pixel or per-component 4729if (depth < 8 || img_n == out_n ) { 4730int nk = (width - 1 )* filter_bytes ; 4731#define STBI__CASE (f ) \ 4732 case f: \ 4733 for (k=0; k < nk; ++k) 4734switch (filter ) { 4735// "none" filter turns into a memcpy here; make that explicit. 4736case STBI__F_none :memcpy (cur ,raw ,nk );break ; 4737STBI__CASE (STBI__F_sub ) {cur [k ]= STBI__BYTECAST (raw [k ]+ cur [k - filter_bytes ]); }break ; 4738STBI__CASE (STBI__F_up ) {cur [k ]= STBI__BYTECAST (raw [k ]+ prior [k ]); }break ; 4739STBI__CASE (STBI__F_avg ) {cur [k ]= STBI__BYTECAST (raw [k ]+ ((prior [k ]+ cur [k - filter_bytes ])>>1 )); }break ; 4740STBI__CASE (STBI__F_paeth ) {cur [k ]= STBI__BYTECAST (raw [k ]+ stbi__paeth (cur [k - filter_bytes ],prior [k ],prior [k - filter_bytes ])); }break ; 4741STBI__CASE (STBI__F_avg_first ) {cur [k ]= STBI__BYTECAST (raw [k ]+ (cur [k - filter_bytes ] >>1 )); }break ; 4742STBI__CASE (STBI__F_paeth_first ) {cur [k ]= STBI__BYTECAST (raw [k ]+ stbi__paeth (cur [k - filter_bytes ],0 ,0 )); }break ; 4743 } 4744#undef STBI__CASE 4745raw += nk ; 4746 }else { 4747STBI_ASSERT (img_n + 1 == out_n ); 4748#define STBI__CASE (f ) \ 4749 case f: \ 4750 for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ 4751 for (k=0; k < filter_bytes; ++k) 4752switch (filter ) { 4753STBI__CASE (STBI__F_none ) {cur [k ]= raw [k ]; }break ; 4754STBI__CASE (STBI__F_sub ) {cur [k ]= STBI__BYTECAST (raw [k ]+ cur [k - output_bytes ]); }break ; 4755STBI__CASE (STBI__F_up ) {cur [k ]= STBI__BYTECAST (raw [k ]+ prior [k ]); }break ; 4756STBI__CASE (STBI__F_avg ) {cur [k ]= STBI__BYTECAST (raw [k ]+ ((prior [k ]+ cur [k - output_bytes ])>>1 )); }break ; 4757STBI__CASE (STBI__F_paeth ) {cur [k ]= STBI__BYTECAST (raw [k ]+ stbi__paeth (cur [k - output_bytes ],prior [k ],prior [k - output_bytes ])); }break ; 4758STBI__CASE (STBI__F_avg_first ) {cur [k ]= STBI__BYTECAST (raw [k ]+ (cur [k - output_bytes ] >>1 )); }break ; 4759STBI__CASE (STBI__F_paeth_first ) {cur [k ]= STBI__BYTECAST (raw [k ]+ stbi__paeth (cur [k - output_bytes ],0 ,0 )); }break ; 4760 } 4761#undef STBI__CASE 4762 4763// the loop above sets the high byte of the pixels' alpha, but for 4764// 16 bit png files we also need the low byte set. we'll do that here. 4765if (depth == 16 ) { 4766cur = a -> out + stride * j ;// start at the beginning of the row again 4767for (i = 0 ;i < x ;++ i ,cur += output_bytes ) { 4768cur [filter_bytes + 1 ]= 255 ; 4769 } 4770 } 4771 } 4772 } 4773 4774// we make a separate pass to expand bits to pixels; for performance, 4775// this could run two scanlines behind the above code, so it won't 4776// intefere with filtering but will still be in the cache. 4777if (depth < 8 ) { 4778for (j = 0 ;j < y ;++ j ) { 4779stbi_uc * cur = a -> out + stride * j ; 4780stbi_uc * in = a -> out + stride * j + x * out_n - img_width_bytes ; 4781// unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit 4782// png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop 4783stbi_uc scale = (color == 0 ) ?stbi__depth_scale_table [depth ] :1 ;// scale grayscale values to 0..255 range 4784 4785// note that the final byte might overshoot and write more data than desired. 4786// we can allocate enough data that this never writes out of memory, but it 4787// could also overwrite the next scanline. can it overwrite non-empty data 4788// on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. 4789// so we need to explicitly clamp the final ones 4790 4791if (depth == 4 ) { 4792for (k = x * img_n ;k >=2 ;k -= 2 ,++ in ) { 4793* cur ++ = scale * ((* in >>4 ) ); 4794* cur ++ = scale * ((* in )& 0x0f ); 4795 } 4796if (k > 0 )* cur ++ = scale * ((* in >>4 ) ); 4797 }else if (depth == 2 ) { 4798for (k = x * img_n ;k >=4 ;k -= 4 ,++ in ) { 4799* cur ++ = scale * ((* in >>6 ) ); 4800* cur ++ = scale * ((* in >>4 )& 0x03 ); 4801* cur ++ = scale * ((* in >>2 )& 0x03 ); 4802* cur ++ = scale * ((* in )& 0x03 ); 4803 } 4804if (k > 0 )* cur ++ = scale * ((* in >>6 ) ); 4805if (k > 1 )* cur ++ = scale * ((* in >>4 )& 0x03 ); 4806if (k > 2 )* cur ++ = scale * ((* in >>2 )& 0x03 ); 4807 }else if (depth == 1 ) { 4808for (k = x * img_n ;k >=8 ;k -= 8 ,++ in ) { 4809* cur ++ = scale * ((* in >>7 ) ); 4810* cur ++ = scale * ((* in >>6 )& 0x01 ); 4811* cur ++ = scale * ((* in >>5 )& 0x01 ); 4812* cur ++ = scale * ((* in >>4 )& 0x01 ); 4813* cur ++ = scale * ((* in >>3 )& 0x01 ); 4814* cur ++ = scale * ((* in >>2 )& 0x01 ); 4815* cur ++ = scale * ((* in >>1 )& 0x01 ); 4816* cur ++ = scale * ((* in )& 0x01 ); 4817 } 4818if (k > 0 )* cur ++ = scale * ((* in >>7 ) ); 4819if (k > 1 )* cur ++ = scale * ((* in >>6 )& 0x01 ); 4820if (k > 2 )* cur ++ = scale * ((* in >>5 )& 0x01 ); 4821if (k > 3 )* cur ++ = scale * ((* in >>4 )& 0x01 ); 4822if (k > 4 )* cur ++ = scale * ((* in >>3 )& 0x01 ); 4823if (k > 5 )* cur ++ = scale * ((* in >>2 )& 0x01 ); 4824if (k > 6 )* cur ++ = scale * ((* in >>1 )& 0x01 ); 4825 } 4826if (img_n != out_n ) { 4827int q ; 4828// insert alpha = 255 4829cur = a -> out + stride * j ; 4830if (img_n == 1 ) { 4831for (q = x - 1 ;q >=0 ;-- q ) { 4832cur [q * 2 + 1 ]= 255 ; 4833cur [q * 2 + 0 ]= cur [q ]; 4834 } 4835 }else { 4836STBI_ASSERT (img_n == 3 ); 4837for (q = x - 1 ;q >=0 ;-- q ) { 4838cur [q * 4 + 3 ]= 255 ; 4839cur [q * 4 + 2 ]= cur [q * 3 + 2 ]; 4840cur [q * 4 + 1 ]= cur [q * 3 + 1 ]; 4841cur [q * 4 + 0 ]= cur [q * 3 + 0 ]; 4842 } 4843 } 4844 } 4845 } 4846 }else if (depth == 16 ) { 4847// force the image data from big-endian to platform-native. 4848// this is done in a separate pass due to the decoding relying 4849// on the data being untouched, but could probably be done 4850// per-line during decode if care is taken. 4851stbi_uc * cur = a -> out ; 4852stbi__uint16 * cur16 = (stbi__uint16 * )cur ; 4853 4854for (i = 0 ;i < x * y * out_n ;++ i ,cur16 ++ ,cur += 2 ) { 4855* cur16 = (cur [0 ] <<8 ) |cur [1 ]; 4856 } 4857 } 4858 4859return 1 ; 4860} 4861 4862static int stbi__create_png_image (stbi__png * a ,stbi_uc * image_data ,stbi__uint32 image_data_len ,int out_n ,int depth ,int color ,int interlaced ) 4863{ 4864int bytes = (depth == 16 ?2 :1 ); 4865int out_bytes = out_n * bytes ; 4866stbi_uc * final ; 4867int p ; 4868if (!interlaced ) 4869return stbi__create_png_image_raw (a ,image_data ,image_data_len ,out_n ,a -> s -> img_x ,a -> s -> img_y ,depth ,color ); 4870 4871// de-interlacing 4872final = (stbi_uc * )stbi__malloc_mad3 (a -> s -> img_x ,a -> s -> img_y ,out_bytes ,0 ); 4873if (!final )return stbi__err ("outofmem" ,"Out of memory" ); 4874for (p = 0 ;p < 7 ;++ p ) { 4875int xorig []= {0 ,4 ,0 ,2 ,0 ,1 ,0 }; 4876int yorig []= {0 ,0 ,4 ,0 ,2 ,0 ,1 }; 4877int xspc []= {8 ,8 ,4 ,4 ,2 ,2 ,1 }; 4878int yspc []= {8 ,8 ,8 ,4 ,4 ,2 ,2 }; 4879int i ,j ,x ,y ; 4880// pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 4881x = (a -> s -> img_x - xorig [p ]+ xspc [p ]- 1 ) /xspc [p ]; 4882y = (a -> s -> img_y - yorig [p ]+ yspc [p ]- 1 ) /yspc [p ]; 4883if (x && y ) { 4884stbi__uint32 img_len = ((((a -> s -> img_n * x * depth )+ 7 ) >>3 )+ 1 )* y ; 4885if (!stbi__create_png_image_raw (a ,image_data ,image_data_len ,out_n ,x ,y ,depth ,color )) { 4886STBI_FREE (final ); 4887return 0 ; 4888 } 4889for (j = 0 ;j < y ;++ j ) { 4890for (i = 0 ;i < x ;++ i ) { 4891int out_y = j * yspc [p ]+ yorig [p ]; 4892int out_x = i * xspc [p ]+ xorig [p ]; 4893memcpy (final + out_y * a -> s -> img_x * out_bytes + out_x * out_bytes , 4894a -> out + (j * x + i )* out_bytes ,out_bytes ); 4895 } 4896 } 4897STBI_FREE (a -> out ); 4898image_data += img_len ; 4899image_data_len -= img_len ; 4900 } 4901 } 4902a -> out = final ; 4903 4904return 1 ; 4905} 4906 4907static int stbi__compute_transparency (stbi__png * z ,stbi_uc tc [3 ],int out_n ) 4908{ 4909stbi__context * s = z -> s ; 4910stbi__uint32 i ,pixel_count = s -> img_x * s -> img_y ; 4911stbi_uc * p = z -> out ; 4912 4913// compute color-based transparency, assuming we've 4914// already got 255 as the alpha value in the output 4915STBI_ASSERT (out_n == 2 || out_n == 4 ); 4916 4917if (out_n == 2 ) { 4918for (i = 0 ;i < pixel_count ;++ i ) { 4919p [1 ]= (p [0 ]== tc [0 ] ?0 :255 ); 4920p += 2 ; 4921 } 4922 }else { 4923for (i = 0 ;i < pixel_count ;++ i ) { 4924if (p [0 ]== tc [0 ]&& p [1 ]== tc [1 ]&& p [2 ]== tc [2 ]) 4925p [3 ]= 0 ; 4926p += 4 ; 4927 } 4928 } 4929return 1 ; 4930} 4931 4932static int stbi__compute_transparency16 (stbi__png * z ,stbi__uint16 tc [3 ],int out_n ) 4933{ 4934stbi__context * s = z -> s ; 4935stbi__uint32 i ,pixel_count = s -> img_x * s -> img_y ; 4936stbi__uint16 * p = (stbi__uint16 * )z -> out ; 4937 4938// compute color-based transparency, assuming we've 4939// already got 65535 as the alpha value in the output 4940STBI_ASSERT (out_n == 2 || out_n == 4 ); 4941 4942if (out_n == 2 ) { 4943for (i = 0 ;i < pixel_count ;++ i ) { 4944p [1 ]= (p [0 ]== tc [0 ] ?0 :65535 ); 4945p += 2 ; 4946 } 4947 }else { 4948for (i = 0 ;i < pixel_count ;++ i ) { 4949if (p [0 ]== tc [0 ]&& p [1 ]== tc [1 ]&& p [2 ]== tc [2 ]) 4950p [3 ]= 0 ; 4951p += 4 ; 4952 } 4953 } 4954return 1 ; 4955} 4956 4957static int stbi__expand_png_palette (stbi__png * a ,stbi_uc * palette ,int len ,int pal_img_n ) 4958{ 4959stbi__uint32 i ,pixel_count = a -> s -> img_x * a -> s -> img_y ; 4960stbi_uc * p ,* temp_out ,* orig = a -> out ; 4961 4962p = (stbi_uc * )stbi__malloc_mad2 (pixel_count ,pal_img_n ,0 ); 4963if (p == NULL )return stbi__err ("outofmem" ,"Out of memory" ); 4964 4965// between here and free(out) below, exitting would leak 4966temp_out = p ; 4967 4968if (pal_img_n == 3 ) { 4969for (i = 0 ;i < pixel_count ;++ i ) { 4970int n = orig [i ]* 4 ; 4971p [0 ]= palette [n ]; 4972p [1 ]= palette [n + 1 ]; 4973p [2 ]= palette [n + 2 ]; 4974p += 3 ; 4975 } 4976 }else { 4977for (i = 0 ;i < pixel_count ;++ i ) { 4978int n = orig [i ]* 4 ; 4979p [0 ]= palette [n ]; 4980p [1 ]= palette [n + 1 ]; 4981p [2 ]= palette [n + 2 ]; 4982p [3 ]= palette [n + 3 ]; 4983p += 4 ; 4984 } 4985 } 4986STBI_FREE (a -> out ); 4987a -> out = temp_out ; 4988 4989STBI_NOTUSED (len ); 4990 4991return 1 ; 4992} 4993 4994static int stbi__unpremultiply_on_load_global = 0 ; 4995static int stbi__de_iphone_flag_global = 0 ; 4996 4997STBIDEF void stbi_set_unpremultiply_on_load (int flag_true_if_should_unpremultiply ) 4998{ 4999stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply ; 5000} 5001 5002STBIDEF void stbi_convert_iphone_png_to_rgb (int flag_true_if_should_convert ) 5003{ 5004stbi__de_iphone_flag_global = flag_true_if_should_convert ; 5005} 5006 5007#ifndef STBI_THREAD_LOCAL 5008#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global 5009#define stbi__de_iphone_flag stbi__de_iphone_flag_global 5010#else 5011static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local ,stbi__unpremultiply_on_load_set ; 5012static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local ,stbi__de_iphone_flag_set ; 5013 5014STBIDEF void stbi_set_unpremultiply_on_load_thread (int flag_true_if_should_unpremultiply ) 5015{ 5016stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply ; 5017stbi__unpremultiply_on_load_set = 1 ; 5018} 5019 5020STBIDEF void stbi_convert_iphone_png_to_rgb_thread (int flag_true_if_should_convert ) 5021{ 5022stbi__de_iphone_flag_local = flag_true_if_should_convert ; 5023stbi__de_iphone_flag_set = 1 ; 5024} 5025 5026#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ 5027 ? stbi__unpremultiply_on_load_local \ 5028 : stbi__unpremultiply_on_load_global) 5029#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ 5030 ? stbi__de_iphone_flag_local \ 5031 : stbi__de_iphone_flag_global) 5032#endif // STBI_THREAD_LOCAL 5033 5034static void stbi__de_iphone (stbi__png * z ) 5035{ 5036stbi__context * s = z -> s ; 5037stbi__uint32 i ,pixel_count = s -> img_x * s -> img_y ; 5038stbi_uc * p = z -> out ; 5039 5040if (s -> img_out_n == 3 ) {// convert bgr to rgb 5041for (i = 0 ;i < pixel_count ;++ i ) { 5042stbi_uc t = p [0 ]; 5043p [0 ]= p [2 ]; 5044p [2 ]= t ; 5045p += 3 ; 5046 } 5047 }else { 5048STBI_ASSERT (s -> img_out_n == 4 ); 5049if (stbi__unpremultiply_on_load ) { 5050// convert bgr to rgb and unpremultiply 5051for (i = 0 ;i < pixel_count ;++ i ) { 5052stbi_uc a = p [3 ]; 5053stbi_uc t = p [0 ]; 5054if (a ) { 5055stbi_uc half = a /2 ; 5056p [0 ]= (p [2 ]* 255 + half ) /a ; 5057p [1 ]= (p [1 ]* 255 + half ) /a ; 5058p [2 ]= (t * 255 + half ) /a ; 5059 }else { 5060p [0 ]= p [2 ]; 5061p [2 ]= t ; 5062 } 5063p += 4 ; 5064 } 5065 }else { 5066// convert bgr to rgb 5067for (i = 0 ;i < pixel_count ;++ i ) { 5068stbi_uc t = p [0 ]; 5069p [0 ]= p [2 ]; 5070p [2 ]= t ; 5071p += 4 ; 5072 } 5073 } 5074 } 5075} 5076 5077#define STBI__PNG_TYPE (a ,b ,c ,d ) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d)) 5078 5079static int stbi__parse_png_file (stbi__png * z ,int scan ,int req_comp ) 5080{ 5081stbi_uc palette [1024 ],pal_img_n = 0 ; 5082stbi_uc has_trans = 0 ,tc [3 ]= {0 }; 5083stbi__uint16 tc16 [3 ]; 5084stbi__uint32 ioff = 0 ,idata_limit = 0 ,i ,pal_len = 0 ; 5085int first = 1 ,k ,interlace = 0 ,color = 0 ,is_iphone = 0 ; 5086stbi__context * s = z -> s ; 5087 5088z -> expanded = NULL ; 5089z -> idata = NULL ; 5090z -> out = NULL ; 5091 5092if (!stbi__check_png_header (s ))return 0 ; 5093 5094if (scan == STBI__SCAN_type )return 1 ; 5095 5096for (;;) { 5097stbi__pngchunk c = stbi__get_chunk_header (s ); 5098switch (c .type ) { 5099case STBI__PNG_TYPE ('C' ,'g' ,'B' ,'I' ): 5100is_iphone = 1 ; 5101stbi__skip (s ,c .length ); 5102break ; 5103case STBI__PNG_TYPE ('I' ,'H' ,'D' ,'R' ): { 5104int comp ,filter ; 5105if (!first )return stbi__err ("multiple IHDR" ,"Corrupt PNG" ); 5106first = 0 ; 5107if (c .length != 13 )return stbi__err ("bad IHDR len" ,"Corrupt PNG" ); 5108s -> img_x = stbi__get32be (s ); 5109s -> img_y = stbi__get32be (s ); 5110if (s -> img_y > STBI_MAX_DIMENSIONS )return stbi__err ("too large" ,"Very large image (corrupt?)" ); 5111if (s -> img_x > STBI_MAX_DIMENSIONS )return stbi__err ("too large" ,"Very large image (corrupt?)" ); 5112z -> depth = stbi__get8 (s );if (z -> depth != 1 && z -> depth != 2 && z -> depth != 4 && z -> depth != 8 && z -> depth != 16 )return stbi__err ("1/2/4/8/16-bit only" ,"PNG not supported: 1/2/4/8/16-bit only" ); 5113color = stbi__get8 (s );if (color > 6 )return stbi__err ("bad ctype" ,"Corrupt PNG" ); 5114if (color == 3 && z -> depth == 16 )return stbi__err ("bad ctype" ,"Corrupt PNG" ); 5115if (color == 3 )pal_img_n = 3 ;else if (color & 1 )return stbi__err ("bad ctype" ,"Corrupt PNG" ); 5116comp = stbi__get8 (s );if (comp )return stbi__err ("bad comp method" ,"Corrupt PNG" ); 5117filter = stbi__get8 (s );if (filter )return stbi__err ("bad filter method" ,"Corrupt PNG" ); 5118interlace = stbi__get8 (s );if (interlace > 1 )return stbi__err ("bad interlace method" ,"Corrupt PNG" ); 5119if (!s -> img_x || !s -> img_y )return stbi__err ("0-pixel image" ,"Corrupt PNG" ); 5120if (!pal_img_n ) { 5121s -> img_n = (color & 2 ?3 :1 )+ (color & 4 ?1 :0 ); 5122if ((1 <<30 ) /s -> img_x /s -> img_n < s -> img_y )return stbi__err ("too large" ,"Image too large to decode" ); 5123 }else { 5124// if paletted, then pal_n is our final components, and 5125// img_n is # components to decompress/filter. 5126s -> img_n = 1 ; 5127if ((1 <<30 ) /s -> img_x /4 < s -> img_y )return stbi__err ("too large" ,"Corrupt PNG" ); 5128 } 5129// even with SCAN_header, have to scan to see if we have a tRNS 5130break ; 5131 } 5132 5133case STBI__PNG_TYPE ('P' ,'L' ,'T' ,'E' ): { 5134if (first )return stbi__err ("first not IHDR" ,"Corrupt PNG" ); 5135if (c .length > 256 * 3 )return stbi__err ("invalid PLTE" ,"Corrupt PNG" ); 5136pal_len = c .length /3 ; 5137if (pal_len * 3 != c .length )return stbi__err ("invalid PLTE" ,"Corrupt PNG" ); 5138for (i = 0 ;i < pal_len ;++ i ) { 5139palette [i * 4 + 0 ]= stbi__get8 (s ); 5140palette [i * 4 + 1 ]= stbi__get8 (s ); 5141palette [i * 4 + 2 ]= stbi__get8 (s ); 5142palette [i * 4 + 3 ]= 255 ; 5143 } 5144break ; 5145 } 5146 5147case STBI__PNG_TYPE ('t' ,'R' ,'N' ,'S' ): { 5148if (first )return stbi__err ("first not IHDR" ,"Corrupt PNG" ); 5149if (z -> idata )return stbi__err ("tRNS after IDAT" ,"Corrupt PNG" ); 5150if (pal_img_n ) { 5151if (scan == STBI__SCAN_header ) {s -> img_n = 4 ;return 1 ; } 5152if (pal_len == 0 )return stbi__err ("tRNS before PLTE" ,"Corrupt PNG" ); 5153if (c .length > pal_len )return stbi__err ("bad tRNS len" ,"Corrupt PNG" ); 5154pal_img_n = 4 ; 5155for (i = 0 ;i < c .length ;++ i ) 5156palette [i * 4 + 3 ]= stbi__get8 (s ); 5157 }else { 5158if (!(s -> img_n & 1 ))return stbi__err ("tRNS with alpha" ,"Corrupt PNG" ); 5159if (c .length != (stbi__uint32 )s -> img_n * 2 )return stbi__err ("bad tRNS len" ,"Corrupt PNG" ); 5160has_trans = 1 ; 5161// non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. 5162if (scan == STBI__SCAN_header ) {++ s -> img_n ;return 1 ; } 5163if (z -> depth == 16 ) { 5164for (k = 0 ;k < s -> img_n ;++ k )tc16 [k ]= (stbi__uint16 )stbi__get16be (s );// copy the values as-is 5165 }else { 5166for (k = 0 ;k < s -> img_n ;++ k )tc [k ]= (stbi_uc )(stbi__get16be (s )& 255 )* stbi__depth_scale_table [z -> depth ];// non 8-bit images will be larger 5167 } 5168 } 5169break ; 5170 } 5171 5172case STBI__PNG_TYPE ('I' ,'D' ,'A' ,'T' ): { 5173if (first )return stbi__err ("first not IHDR" ,"Corrupt PNG" ); 5174if (pal_img_n && !pal_len )return stbi__err ("no PLTE" ,"Corrupt PNG" ); 5175if (scan == STBI__SCAN_header ) { 5176// header scan definitely stops at first IDAT 5177if (pal_img_n ) 5178s -> img_n = pal_img_n ; 5179return 1 ; 5180 } 5181if (c .length > (1u <<30 ))return stbi__err ("IDAT size limit" ,"IDAT section larger than 2^30 bytes" ); 5182if ((int )(ioff + c .length )< (int )ioff )return 0 ; 5183if (ioff + c .length > idata_limit ) { 5184stbi__uint32 idata_limit_old = idata_limit ; 5185stbi_uc * p ; 5186if (idata_limit == 0 )idata_limit = c .length > 4096 ?c .length :4096 ; 5187while (ioff + c .length > idata_limit ) 5188idata_limit *=2 ; 5189STBI_NOTUSED (idata_limit_old ); 5190p = (stbi_uc * )STBI_REALLOC_SIZED (z -> idata ,idata_limit_old ,idata_limit );if (p == NULL )return stbi__err ("outofmem" ,"Out of memory" ); 5191z -> idata = p ; 5192 } 5193if (!stbi__getn (s ,z -> idata + ioff ,c .length ))return stbi__err ("outofdata" ,"Corrupt PNG" ); 5194ioff += c .length ; 5195break ; 5196 } 5197 5198case STBI__PNG_TYPE ('I' ,'E' ,'N' ,'D' ): { 5199stbi__uint32 raw_len ,bpl ; 5200if (first )return stbi__err ("first not IHDR" ,"Corrupt PNG" ); 5201if (scan != STBI__SCAN_load )return 1 ; 5202if (z -> idata == NULL )return stbi__err ("no IDAT" ,"Corrupt PNG" ); 5203// initial guess for decoded data size to avoid unnecessary reallocs 5204bpl = (s -> img_x * z -> depth + 7 ) /8 ;// bytes per line, per component 5205raw_len = bpl * s -> img_y * s -> img_n /* pixels */ + s -> img_y /* filter mode per row */ ; 5206z -> expanded = (stbi_uc * )stbi_zlib_decode_malloc_guesssize_headerflag ((char * )z -> idata ,ioff ,raw_len , (int * )& raw_len , !is_iphone ); 5207if (z -> expanded == NULL )return 0 ;// zlib should set error 5208STBI_FREE (z -> idata );z -> idata = NULL ; 5209if ((req_comp == s -> img_n + 1 && req_comp != 3 && !pal_img_n )|| has_trans ) 5210s -> img_out_n = s -> img_n + 1 ; 5211else 5212s -> img_out_n = s -> img_n ; 5213if (!stbi__create_png_image (z ,z -> expanded ,raw_len ,s -> img_out_n ,z -> depth ,color ,interlace ))return 0 ; 5214if (has_trans ) { 5215if (z -> depth == 16 ) { 5216if (!stbi__compute_transparency16 (z ,tc16 ,s -> img_out_n ))return 0 ; 5217 }else { 5218if (!stbi__compute_transparency (z ,tc ,s -> img_out_n ))return 0 ; 5219 } 5220 } 5221if (is_iphone && stbi__de_iphone_flag && s -> img_out_n > 2 ) 5222stbi__de_iphone (z ); 5223if (pal_img_n ) { 5224// pal_img_n == 3 or 4 5225s -> img_n = pal_img_n ;// record the actual colors we had 5226s -> img_out_n = pal_img_n ; 5227if (req_comp >=3 )s -> img_out_n = req_comp ; 5228if (!stbi__expand_png_palette (z ,palette ,pal_len ,s -> img_out_n )) 5229return 0 ; 5230 }else if (has_trans ) { 5231// non-paletted image with tRNS -> source image has (constant) alpha 5232++ s -> img_n ; 5233 } 5234STBI_FREE (z -> expanded );z -> expanded = NULL ; 5235// end of PNG chunk, read and skip CRC 5236stbi__get32be (s ); 5237return 1 ; 5238 } 5239 5240default : 5241// if critical, fail 5242if (first )return stbi__err ("first not IHDR" ,"Corrupt PNG" ); 5243if ((c .type & (1 <<29 ))== 0 ) { 5244#ifndef STBI_NO_FAILURE_STRINGS 5245// not threadsafe 5246static char invalid_chunk []= "XXXX PNG chunk not known" ; 5247invalid_chunk [0 ]= STBI__BYTECAST (c .type >>24 ); 5248invalid_chunk [1 ]= STBI__BYTECAST (c .type >>16 ); 5249invalid_chunk [2 ]= STBI__BYTECAST (c .type >>8 ); 5250invalid_chunk [3 ]= STBI__BYTECAST (c .type >>0 ); 5251#endif 5252return stbi__err (invalid_chunk ,"PNG not supported: unknown PNG chunk type" ); 5253 } 5254stbi__skip (s ,c .length ); 5255break ; 5256 } 5257// end of PNG chunk, read and skip CRC 5258stbi__get32be (s ); 5259 } 5260} 5261 5262static void * stbi__do_png (stbi__png * p ,int * x ,int * y ,int * n ,int req_comp ,stbi__result_info * ri ) 5263{ 5264void * result = NULL ; 5265if (req_comp < 0 || req_comp > 4 )return stbi__errpuc ("bad req_comp" ,"Internal error" ); 5266if (stbi__parse_png_file (p ,STBI__SCAN_load ,req_comp )) { 5267if (p -> depth <=8 ) 5268ri -> bits_per_channel = 8 ; 5269else if (p -> depth == 16 ) 5270ri -> bits_per_channel = 16 ; 5271else 5272return stbi__errpuc ("bad bits_per_channel" ,"PNG not supported: unsupported color depth" ); 5273result = p -> out ; 5274p -> out = NULL ; 5275if (req_comp && req_comp != p -> s -> img_out_n ) { 5276if (ri -> bits_per_channel == 8 ) 5277result = stbi__convert_format ((unsigned char * )result ,p -> s -> img_out_n ,req_comp ,p -> s -> img_x ,p -> s -> img_y ); 5278else 5279result = stbi__convert_format16 ((stbi__uint16 * )result ,p -> s -> img_out_n ,req_comp ,p -> s -> img_x ,p -> s -> img_y ); 5280p -> s -> img_out_n = req_comp ; 5281if (result == NULL )return result ; 5282 } 5283* x = p -> s -> img_x ; 5284* y = p -> s -> img_y ; 5285if (n )* n = p -> s -> img_n ; 5286 } 5287STBI_FREE (p -> out );p -> out = NULL ; 5288STBI_FREE (p -> expanded );p -> expanded = NULL ; 5289STBI_FREE (p -> idata );p -> idata = NULL ; 5290 5291return result ; 5292} 5293 5294static void * stbi__png_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ) 5295{ 5296stbi__png p ; 5297p .s = s ; 5298return stbi__do_png (& p ,x ,y ,comp ,req_comp ,ri ); 5299} 5300 5301static int stbi__png_test (stbi__context * s ) 5302{ 5303int r ; 5304r = stbi__check_png_header (s ); 5305stbi__rewind (s ); 5306return r ; 5307} 5308 5309static int stbi__png_info_raw (stbi__png * p ,int * x ,int * y ,int * comp ) 5310{ 5311if (!stbi__parse_png_file (p ,STBI__SCAN_header ,0 )) { 5312stbi__rewind (p -> s ); 5313return 0 ; 5314 } 5315if (x )* x = p -> s -> img_x ; 5316if (y )* y = p -> s -> img_y ; 5317if (comp )* comp = p -> s -> img_n ; 5318return 1 ; 5319} 5320 5321static int stbi__png_info (stbi__context * s ,int * x ,int * y ,int * comp ) 5322{ 5323stbi__png p ; 5324p .s = s ; 5325return stbi__png_info_raw (& p ,x ,y ,comp ); 5326} 5327 5328static int stbi__png_is16 (stbi__context * s ) 5329{ 5330stbi__png p ; 5331p .s = s ; 5332if (!stbi__png_info_raw (& p ,NULL ,NULL ,NULL )) 5333return 0 ; 5334if (p .depth != 16 ) { 5335stbi__rewind (p .s ); 5336return 0 ; 5337 } 5338return 1 ; 5339} 5340#endif 5341 5342// Microsoft/Windows BMP image 5343 5344#ifndef STBI_NO_BMP 5345static int stbi__bmp_test_raw (stbi__context * s ) 5346{ 5347int r ; 5348int sz ; 5349if (stbi__get8 (s )!= 'B' )return 0 ; 5350if (stbi__get8 (s )!= 'M' )return 0 ; 5351stbi__get32le (s );// discard filesize 5352stbi__get16le (s );// discard reserved 5353stbi__get16le (s );// discard reserved 5354stbi__get32le (s );// discard data offset 5355sz = stbi__get32le (s ); 5356r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124 ); 5357return r ; 5358} 5359 5360static int stbi__bmp_test (stbi__context * s ) 5361{ 5362int r = stbi__bmp_test_raw (s ); 5363stbi__rewind (s ); 5364return r ; 5365} 5366 5367 5368// returns 0..31 for the highest set bit 5369static int stbi__high_bit (unsigned int z ) 5370{ 5371int n = 0 ; 5372if (z == 0 )return -1 ; 5373if (z >=0x10000 ) {n += 16 ;z >>=16 ; } 5374if (z >=0x00100 ) {n += 8 ;z >>=8 ; } 5375if (z >=0x00010 ) {n += 4 ;z >>=4 ; } 5376if (z >=0x00004 ) {n += 2 ;z >>=2 ; } 5377if (z >=0x00002 ) {n += 1 ;/* >>= 1;*/ } 5378return n ; 5379} 5380 5381static int stbi__bitcount (unsigned int a ) 5382{ 5383a = (a & 0x55555555 )+ ((a >>1 )& 0x55555555 );// max 2 5384a = (a & 0x33333333 )+ ((a >>2 )& 0x33333333 );// max 4 5385a = (a + (a >>4 ))& 0x0f0f0f0f ;// max 8 per 4, now 8 bits 5386a = (a + (a >>8 ));// max 16 per 8 bits 5387a = (a + (a >>16 ));// max 32 per 8 bits 5388return a & 0xff ; 5389} 5390 5391// extract an arbitrarily-aligned N-bit value (N=bits) 5392// from v, and then make it 8-bits long and fractionally 5393// extend it to full full range. 5394static int stbi__shiftsigned (unsigned int v ,int shift ,int bits ) 5395{ 5396static unsigned int mul_table [9 ]= { 53970 , 53980xff /*0b11111111*/ ,0x55 /*0b01010101*/ ,0x49 /*0b01001001*/ ,0x11 /*0b00010001*/ , 53990x21 /*0b00100001*/ ,0x41 /*0b01000001*/ ,0x81 /*0b10000001*/ ,0x01 /*0b00000001*/ , 5400 }; 5401static unsigned int shift_table [9 ]= { 54020 ,0 ,0 ,1 ,0 ,2 ,4 ,6 ,0 , 5403 }; 5404if (shift < 0 ) 5405v <<=- shift ; 5406else 5407v >>=shift ; 5408STBI_ASSERT (v < 256 ); 5409v >>= (8 - bits ); 5410STBI_ASSERT (bits >=0 && bits <=8 ); 5411return (int ) ((unsigned )v * mul_table [bits ]) >>shift_table [bits ]; 5412} 5413 5414typedef struct 5415{ 5416int bpp ,offset ,hsz ; 5417unsigned int mr ,mg ,mb ,ma ,all_a ; 5418int extra_read ; 5419}stbi__bmp_data ; 5420 5421static int stbi__bmp_set_mask_defaults (stbi__bmp_data * info ,int compress ) 5422{ 5423// BI_BITFIELDS specifies masks explicitly, don't override 5424if (compress == 3 ) 5425return 1 ; 5426 5427if (compress == 0 ) { 5428if (info -> bpp == 16 ) { 5429info -> mr = 31u <<10 ; 5430info -> mg = 31u <<5 ; 5431info -> mb = 31u <<0 ; 5432 }else if (info -> bpp == 32 ) { 5433info -> mr = 0xffu <<16 ; 5434info -> mg = 0xffu <<8 ; 5435info -> mb = 0xffu <<0 ; 5436info -> ma = 0xffu <<24 ; 5437info -> all_a = 0 ;// if all_a is 0 at end, then we loaded alpha channel but it was all 0 5438 }else { 5439// otherwise, use defaults, which is all-0 5440info -> mr = info -> mg = info -> mb = info -> ma = 0 ; 5441 } 5442return 1 ; 5443 } 5444return 0 ;// error 5445} 5446 5447static void * stbi__bmp_parse_header (stbi__context * s ,stbi__bmp_data * info ) 5448{ 5449int hsz ; 5450if (stbi__get8 (s )!= 'B' || stbi__get8 (s )!= 'M' )return stbi__errpuc ("not BMP" ,"Corrupt BMP" ); 5451stbi__get32le (s );// discard filesize 5452stbi__get16le (s );// discard reserved 5453stbi__get16le (s );// discard reserved 5454info -> offset = stbi__get32le (s ); 5455info -> hsz = hsz = stbi__get32le (s ); 5456info -> mr = info -> mg = info -> mb = info -> ma = 0 ; 5457info -> extra_read = 14 ; 5458 5459if (info -> offset < 0 )return stbi__errpuc ("bad BMP" ,"bad BMP" ); 5460 5461if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124 )return stbi__errpuc ("unknown BMP" ,"BMP type not supported: unknown" ); 5462if (hsz == 12 ) { 5463s -> img_x = stbi__get16le (s ); 5464s -> img_y = stbi__get16le (s ); 5465 }else { 5466s -> img_x = stbi__get32le (s ); 5467s -> img_y = stbi__get32le (s ); 5468 } 5469if (stbi__get16le (s )!= 1 )return stbi__errpuc ("bad BMP" ,"bad BMP" ); 5470info -> bpp = stbi__get16le (s ); 5471if (hsz != 12 ) { 5472int compress = stbi__get32le (s ); 5473if (compress == 1 || compress == 2 )return stbi__errpuc ("BMP RLE" ,"BMP type not supported: RLE" ); 5474if (compress >=4 )return stbi__errpuc ("BMP JPEG/PNG" ,"BMP type not supported: unsupported compression" );// this includes PNG/JPEG modes 5475if (compress == 3 && info -> bpp != 16 && info -> bpp != 32 )return stbi__errpuc ("bad BMP" ,"bad BMP" );// bitfields requires 16 or 32 bits/pixel 5476stbi__get32le (s );// discard sizeof 5477stbi__get32le (s );// discard hres 5478stbi__get32le (s );// discard vres 5479stbi__get32le (s );// discard colorsused 5480stbi__get32le (s );// discard max important 5481if (hsz == 40 || hsz == 56 ) { 5482if (hsz == 56 ) { 5483stbi__get32le (s ); 5484stbi__get32le (s ); 5485stbi__get32le (s ); 5486stbi__get32le (s ); 5487 } 5488if (info -> bpp == 16 || info -> bpp == 32 ) { 5489if (compress == 0 ) { 5490stbi__bmp_set_mask_defaults (info ,compress ); 5491 }else if (compress == 3 ) { 5492info -> mr = stbi__get32le (s ); 5493info -> mg = stbi__get32le (s ); 5494info -> mb = stbi__get32le (s ); 5495info -> extra_read += 12 ; 5496// not documented, but generated by photoshop and handled by mspaint 5497if (info -> mr == info -> mg && info -> mg == info -> mb ) { 5498// ?!?!? 5499return stbi__errpuc ("bad BMP" ,"bad BMP" ); 5500 } 5501 }else 5502return stbi__errpuc ("bad BMP" ,"bad BMP" ); 5503 } 5504 }else { 5505// V4/V5 header 5506int i ; 5507if (hsz != 108 && hsz != 124 ) 5508return stbi__errpuc ("bad BMP" ,"bad BMP" ); 5509info -> mr = stbi__get32le (s ); 5510info -> mg = stbi__get32le (s ); 5511info -> mb = stbi__get32le (s ); 5512info -> ma = stbi__get32le (s ); 5513if (compress != 3 )// override mr/mg/mb unless in BI_BITFIELDS mode, as per docs 5514stbi__bmp_set_mask_defaults (info ,compress ); 5515stbi__get32le (s );// discard color space 5516for (i = 0 ;i < 12 ;++ i ) 5517stbi__get32le (s );// discard color space parameters 5518if (hsz == 124 ) { 5519stbi__get32le (s );// discard rendering intent 5520stbi__get32le (s );// discard offset of profile data 5521stbi__get32le (s );// discard size of profile data 5522stbi__get32le (s );// discard reserved 5523 } 5524 } 5525 } 5526return (void * )1 ; 5527} 5528 5529 5530static void * stbi__bmp_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ) 5531{ 5532stbi_uc * out ; 5533unsigned int mr = 0 ,mg = 0 ,mb = 0 ,ma = 0 ,all_a ; 5534stbi_uc pal [256 ][4 ]; 5535int psize = 0 ,i ,j ,width ; 5536int flip_vertically ,pad ,target ; 5537stbi__bmp_data info ; 5538STBI_NOTUSED (ri ); 5539 5540info .all_a = 255 ; 5541if (stbi__bmp_parse_header (s ,& info )== NULL ) 5542return NULL ;// error code already set 5543 5544flip_vertically = ((int )s -> img_y )> 0 ; 5545s -> img_y = abs ((int )s -> img_y ); 5546 5547if (s -> img_y > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 5548if (s -> img_x > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 5549 5550mr = info .mr ; 5551mg = info .mg ; 5552mb = info .mb ; 5553ma = info .ma ; 5554all_a = info .all_a ; 5555 5556if (info .hsz == 12 ) { 5557if (info .bpp < 24 ) 5558psize = (info .offset - info .extra_read - 24 ) /3 ; 5559 }else { 5560if (info .bpp < 16 ) 5561psize = (info .offset - info .extra_read - info .hsz ) >>2 ; 5562 } 5563if (psize == 0 ) { 5564// accept some number of extra bytes after the header, but if the offset points either to before 5565// the header ends or implies a large amount of extra data, reject the file as malformed 5566int bytes_read_so_far = s -> callback_already_read + (int )(s -> img_buffer - s -> img_buffer_original ); 5567int header_limit = 1024 ;// max we actually read is below 256 bytes currently. 5568int extra_data_limit = 256 * 4 ;// what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. 5569if (bytes_read_so_far <=0 || bytes_read_so_far > header_limit ) { 5570return stbi__errpuc ("bad header" ,"Corrupt BMP" ); 5571 } 5572// we established that bytes_read_so_far is positive and sensible. 5573// the first half of this test rejects offsets that are either too small positives, or 5574// negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn 5575// ensures the number computed in the second half of the test can't overflow. 5576if (info .offset < bytes_read_so_far || info .offset - bytes_read_so_far > extra_data_limit ) { 5577return stbi__errpuc ("bad offset" ,"Corrupt BMP" ); 5578 }else { 5579stbi__skip (s ,info .offset - bytes_read_so_far ); 5580 } 5581 } 5582 5583if (info .bpp == 24 && ma == 0xff000000 ) 5584s -> img_n = 3 ; 5585else 5586s -> img_n = ma ?4 :3 ; 5587if (req_comp && req_comp >=3 )// we can directly decode 3 or 4 5588target = req_comp ; 5589else 5590target = s -> img_n ;// if they want monochrome, we'll post-convert 5591 5592// sanity-check size 5593if (!stbi__mad3sizes_valid (target ,s -> img_x ,s -> img_y ,0 )) 5594return stbi__errpuc ("too large" ,"Corrupt BMP" ); 5595 5596out = (stbi_uc * )stbi__malloc_mad3 (target ,s -> img_x ,s -> img_y ,0 ); 5597if (!out )return stbi__errpuc ("outofmem" ,"Out of memory" ); 5598if (info .bpp < 16 ) { 5599int z = 0 ; 5600if (psize == 0 || psize > 256 ) {STBI_FREE (out );return stbi__errpuc ("invalid" ,"Corrupt BMP" ); } 5601for (i = 0 ;i < psize ;++ i ) { 5602pal [i ][2 ]= stbi__get8 (s ); 5603pal [i ][1 ]= stbi__get8 (s ); 5604pal [i ][0 ]= stbi__get8 (s ); 5605if (info .hsz != 12 )stbi__get8 (s ); 5606pal [i ][3 ]= 255 ; 5607 } 5608stbi__skip (s ,info .offset - info .extra_read - info .hsz - psize * (info .hsz == 12 ?3 :4 )); 5609if (info .bpp == 1 )width = (s -> img_x + 7 ) >>3 ; 5610else if (info .bpp == 4 )width = (s -> img_x + 1 ) >>1 ; 5611else if (info .bpp == 8 )width = s -> img_x ; 5612else {STBI_FREE (out );return stbi__errpuc ("bad bpp" ,"Corrupt BMP" ); } 5613pad = (- width )& 3 ; 5614if (info .bpp == 1 ) { 5615for (j = 0 ;j < (int )s -> img_y ;++ j ) { 5616int bit_offset = 7 ,v = stbi__get8 (s ); 5617for (i = 0 ;i < (int )s -> img_x ;++ i ) { 5618int color = (v >>bit_offset )& 0x1 ; 5619out [z ++ ]= pal [color ][0 ]; 5620out [z ++ ]= pal [color ][1 ]; 5621out [z ++ ]= pal [color ][2 ]; 5622if (target == 4 )out [z ++ ]= 255 ; 5623if (i + 1 == (int )s -> img_x )break ; 5624if ((-- bit_offset )< 0 ) { 5625bit_offset = 7 ; 5626v = stbi__get8 (s ); 5627 } 5628 } 5629stbi__skip (s ,pad ); 5630 } 5631 }else { 5632for (j = 0 ;j < (int )s -> img_y ;++ j ) { 5633for (i = 0 ;i < (int )s -> img_x ;i += 2 ) { 5634int v = stbi__get8 (s ),v2 = 0 ; 5635if (info .bpp == 4 ) { 5636v2 = v & 15 ; 5637v >>=4 ; 5638 } 5639out [z ++ ]= pal [v ][0 ]; 5640out [z ++ ]= pal [v ][1 ]; 5641out [z ++ ]= pal [v ][2 ]; 5642if (target == 4 )out [z ++ ]= 255 ; 5643if (i + 1 == (int )s -> img_x )break ; 5644v = (info .bpp == 8 ) ?stbi__get8 (s ) :v2 ; 5645out [z ++ ]= pal [v ][0 ]; 5646out [z ++ ]= pal [v ][1 ]; 5647out [z ++ ]= pal [v ][2 ]; 5648if (target == 4 )out [z ++ ]= 255 ; 5649 } 5650stbi__skip (s ,pad ); 5651 } 5652 } 5653 }else { 5654int rshift = 0 ,gshift = 0 ,bshift = 0 ,ashift = 0 ,rcount = 0 ,gcount = 0 ,bcount = 0 ,acount = 0 ; 5655int z = 0 ; 5656int easy = 0 ; 5657stbi__skip (s ,info .offset - info .extra_read - info .hsz ); 5658if (info .bpp == 24 )width = 3 * s -> img_x ; 5659else if (info .bpp == 16 )width = 2 * s -> img_x ; 5660else /* bpp = 32 and pad = 0 */ width = 0 ; 5661pad = (- width )& 3 ; 5662if (info .bpp == 24 ) { 5663easy = 1 ; 5664 }else if (info .bpp == 32 ) { 5665if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000 ) 5666easy = 2 ; 5667 } 5668if (!easy ) { 5669if (!mr || !mg || !mb ) {STBI_FREE (out );return stbi__errpuc ("bad masks" ,"Corrupt BMP" ); } 5670// right shift amt to put high bit in position #7 5671rshift = stbi__high_bit (mr )- 7 ;rcount = stbi__bitcount (mr ); 5672gshift = stbi__high_bit (mg )- 7 ;gcount = stbi__bitcount (mg ); 5673bshift = stbi__high_bit (mb )- 7 ;bcount = stbi__bitcount (mb ); 5674ashift = stbi__high_bit (ma )- 7 ;acount = stbi__bitcount (ma ); 5675if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8 ) {STBI_FREE (out );return stbi__errpuc ("bad masks" ,"Corrupt BMP" ); } 5676 } 5677for (j = 0 ;j < (int )s -> img_y ;++ j ) { 5678if (easy ) { 5679for (i = 0 ;i < (int )s -> img_x ;++ i ) { 5680unsigned char a ; 5681out [z + 2 ]= stbi__get8 (s ); 5682out [z + 1 ]= stbi__get8 (s ); 5683out [z + 0 ]= stbi__get8 (s ); 5684z += 3 ; 5685a = (easy == 2 ?stbi__get8 (s ) :255 ); 5686all_a |=a ; 5687if (target == 4 )out [z ++ ]= a ; 5688 } 5689 }else { 5690int bpp = info .bpp ; 5691for (i = 0 ;i < (int )s -> img_x ;++ i ) { 5692stbi__uint32 v = (bpp == 16 ? (stbi__uint32 )stbi__get16le (s ) :stbi__get32le (s )); 5693unsigned int a ; 5694out [z ++ ]= STBI__BYTECAST (stbi__shiftsigned (v & mr ,rshift ,rcount )); 5695out [z ++ ]= STBI__BYTECAST (stbi__shiftsigned (v & mg ,gshift ,gcount )); 5696out [z ++ ]= STBI__BYTECAST (stbi__shiftsigned (v & mb ,bshift ,bcount )); 5697a = (ma ?stbi__shiftsigned (v & ma ,ashift ,acount ) :255 ); 5698all_a |=a ; 5699if (target == 4 )out [z ++ ]= STBI__BYTECAST (a ); 5700 } 5701 } 5702stbi__skip (s ,pad ); 5703 } 5704 } 5705 5706// if alpha channel is all 0s, replace with all 255s 5707if (target == 4 && all_a == 0 ) 5708for (i = 4 * s -> img_x * s -> img_y - 1 ;i >=0 ;i -= 4 ) 5709out [i ]= 255 ; 5710 5711if (flip_vertically ) { 5712stbi_uc t ; 5713for (j = 0 ;j < (int )s -> img_y >>1 ;++ j ) { 5714stbi_uc * p1 = out + j * s -> img_x * target ; 5715stbi_uc * p2 = out + (s -> img_y - 1 - j )* s -> img_x * target ; 5716for (i = 0 ;i < (int )s -> img_x * target ;++ i ) { 5717t = p1 [i ];p1 [i ]= p2 [i ];p2 [i ]= t ; 5718 } 5719 } 5720 } 5721 5722if (req_comp && req_comp != target ) { 5723out = stbi__convert_format (out ,target ,req_comp ,s -> img_x ,s -> img_y ); 5724if (out == NULL )return out ;// stbi__convert_format frees input on failure 5725 } 5726 5727* x = s -> img_x ; 5728* y = s -> img_y ; 5729if (comp )* comp = s -> img_n ; 5730return out ; 5731} 5732#endif 5733 5734// Targa Truevision - TGA 5735// by Jonathan Dummer 5736#ifndef STBI_NO_TGA 5737// returns STBI_rgb or whatever, 0 on error 5738static int stbi__tga_get_comp (int bits_per_pixel ,int is_grey ,int * is_rgb16 ) 5739{ 5740// only RGB or RGBA (incl. 16bit) or grey allowed 5741if (is_rgb16 )* is_rgb16 = 0 ; 5742switch (bits_per_pixel ) { 5743case 8 :return STBI_grey ; 5744case 16 :if (is_grey )return STBI_grey_alpha ; 5745// fallthrough 5746case 15 :if (is_rgb16 )* is_rgb16 = 1 ; 5747return STBI_rgb ; 5748case 24 :// fallthrough 5749case 32 :return bits_per_pixel /8 ; 5750default :return 0 ; 5751 } 5752} 5753 5754static int stbi__tga_info (stbi__context * s ,int * x ,int * y ,int * comp ) 5755{ 5756int tga_w ,tga_h ,tga_comp ,tga_image_type ,tga_bits_per_pixel ,tga_colormap_bpp ; 5757int sz ,tga_colormap_type ; 5758stbi__get8 (s );// discard Offset 5759tga_colormap_type = stbi__get8 (s );// colormap type 5760if (tga_colormap_type > 1 ) { 5761stbi__rewind (s ); 5762return 0 ;// only RGB or indexed allowed 5763 } 5764tga_image_type = stbi__get8 (s );// image type 5765if (tga_colormap_type == 1 ) {// colormapped (paletted) image 5766if (tga_image_type != 1 && tga_image_type != 9 ) { 5767stbi__rewind (s ); 5768return 0 ; 5769 } 5770stbi__skip (s ,4 );// skip index of first colormap entry and number of entries 5771sz = stbi__get8 (s );// check bits per palette color entry 5772if ( (sz != 8 )&& (sz != 15 )&& (sz != 16 )&& (sz != 24 )&& (sz != 32 ) ) { 5773stbi__rewind (s ); 5774return 0 ; 5775 } 5776stbi__skip (s ,4 );// skip image x and y origin 5777tga_colormap_bpp = sz ; 5778 }else {// "normal" image w/o colormap - only RGB or grey allowed, +/- RLE 5779if ( (tga_image_type != 2 )&& (tga_image_type != 3 )&& (tga_image_type != 10 )&& (tga_image_type != 11 ) ) { 5780stbi__rewind (s ); 5781return 0 ;// only RGB or grey allowed, +/- RLE 5782 } 5783stbi__skip (s ,9 );// skip colormap specification and image x/y origin 5784tga_colormap_bpp = 0 ; 5785 } 5786tga_w = stbi__get16le (s ); 5787if (tga_w < 1 ) { 5788stbi__rewind (s ); 5789return 0 ;// test width 5790 } 5791tga_h = stbi__get16le (s ); 5792if (tga_h < 1 ) { 5793stbi__rewind (s ); 5794return 0 ;// test height 5795 } 5796tga_bits_per_pixel = stbi__get8 (s );// bits per pixel 5797stbi__get8 (s );// ignore alpha bits 5798if (tga_colormap_bpp != 0 ) { 5799if ((tga_bits_per_pixel != 8 )&& (tga_bits_per_pixel != 16 )) { 5800// when using a colormap, tga_bits_per_pixel is the size of the indexes 5801// I don't think anything but 8 or 16bit indexes makes sense 5802stbi__rewind (s ); 5803return 0 ; 5804 } 5805tga_comp = stbi__tga_get_comp (tga_colormap_bpp ,0 ,NULL ); 5806 }else { 5807tga_comp = stbi__tga_get_comp (tga_bits_per_pixel , (tga_image_type == 3 )|| (tga_image_type == 11 ),NULL ); 5808 } 5809if (!tga_comp ) { 5810stbi__rewind (s ); 5811return 0 ; 5812 } 5813if (x )* x = tga_w ; 5814if (y )* y = tga_h ; 5815if (comp )* comp = tga_comp ; 5816return 1 ;// seems to have passed everything 5817} 5818 5819static int stbi__tga_test (stbi__context * s ) 5820{ 5821int res = 0 ; 5822int sz ,tga_color_type ; 5823stbi__get8 (s );// discard Offset 5824tga_color_type = stbi__get8 (s );// color type 5825if (tga_color_type > 1 ) gotoerrorEnd ;// only RGB or indexed allowed 5826sz = stbi__get8 (s );// image type 5827if (tga_color_type == 1 ) {// colormapped (paletted) image 5828if (sz != 1 && sz != 9 ) gotoerrorEnd ;// colortype 1 demands image type 1 or 9 5829stbi__skip (s ,4 );// skip index of first colormap entry and number of entries 5830sz = stbi__get8 (s );// check bits per palette color entry 5831if ( (sz != 8 )&& (sz != 15 )&& (sz != 16 )&& (sz != 24 )&& (sz != 32 ) ) gotoerrorEnd ; 5832stbi__skip (s ,4 );// skip image x and y origin 5833 }else {// "normal" image w/o colormap 5834if ( (sz != 2 )&& (sz != 3 )&& (sz != 10 )&& (sz != 11 ) ) gotoerrorEnd ;// only RGB or grey allowed, +/- RLE 5835stbi__skip (s ,9 );// skip colormap specification and image x/y origin 5836 } 5837if (stbi__get16le (s )< 1 ) gotoerrorEnd ;// test width 5838if (stbi__get16le (s )< 1 ) gotoerrorEnd ;// test height 5839sz = stbi__get8 (s );// bits per pixel 5840if ( (tga_color_type == 1 )&& (sz != 8 )&& (sz != 16 ) ) gotoerrorEnd ;// for colormapped images, bpp is size of an index 5841if ( (sz != 8 )&& (sz != 15 )&& (sz != 16 )&& (sz != 24 )&& (sz != 32 ) ) gotoerrorEnd ; 5842 5843res = 1 ;// if we got this far, everything's good and we can return 1 instead of 0 5844 5845errorEnd : 5846stbi__rewind (s ); 5847return res ; 5848} 5849 5850// read 16bit value and convert to 24bit RGB 5851static void stbi__tga_read_rgb16 (stbi__context * s ,stbi_uc * out ) 5852{ 5853stbi__uint16 px = (stbi__uint16 )stbi__get16le (s ); 5854stbi__uint16 fiveBitMask = 31 ; 5855// we have 3 channels with 5bits each 5856int r = (px >>10 )& fiveBitMask ; 5857int g = (px >>5 )& fiveBitMask ; 5858int b = px & fiveBitMask ; 5859// Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later 5860out [0 ]= (stbi_uc )((r * 255 )/31 ); 5861out [1 ]= (stbi_uc )((g * 255 )/31 ); 5862out [2 ]= (stbi_uc )((b * 255 )/31 ); 5863 5864// some people claim that the most significant bit might be used for alpha 5865// (possibly if an alpha-bit is set in the "image descriptor byte") 5866// but that only made 16bit test images completely translucent.. 5867// so let's treat all 15 and 16bit TGAs as RGB with no alpha. 5868} 5869 5870static void * stbi__tga_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ) 5871{ 5872// read in the TGA header stuff 5873int tga_offset = stbi__get8 (s ); 5874int tga_indexed = stbi__get8 (s ); 5875int tga_image_type = stbi__get8 (s ); 5876int tga_is_RLE = 0 ; 5877int tga_palette_start = stbi__get16le (s ); 5878int tga_palette_len = stbi__get16le (s ); 5879int tga_palette_bits = stbi__get8 (s ); 5880int tga_x_origin = stbi__get16le (s ); 5881int tga_y_origin = stbi__get16le (s ); 5882int tga_width = stbi__get16le (s ); 5883int tga_height = stbi__get16le (s ); 5884int tga_bits_per_pixel = stbi__get8 (s ); 5885int tga_comp ,tga_rgb16 = 0 ; 5886int tga_inverted = stbi__get8 (s ); 5887// int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) 5888// image data 5889unsigned char * tga_data ; 5890unsigned char * tga_palette = NULL ; 5891int i ,j ; 5892unsigned char raw_data [4 ]= {0 }; 5893int RLE_count = 0 ; 5894int RLE_repeating = 0 ; 5895int read_next_pixel = 1 ; 5896STBI_NOTUSED (ri ); 5897STBI_NOTUSED (tga_x_origin );// @TODO 5898STBI_NOTUSED (tga_y_origin );// @TODO 5899 5900if (tga_height > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 5901if (tga_width > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 5902 5903// do a tiny bit of precessing 5904if (tga_image_type >=8 ) 5905 { 5906tga_image_type -= 8 ; 5907tga_is_RLE = 1 ; 5908 } 5909tga_inverted = 1 - ((tga_inverted >>5 )& 1 ); 5910 5911// If I'm paletted, then I'll use the number of bits from the palette 5912if (tga_indexed )tga_comp = stbi__tga_get_comp (tga_palette_bits ,0 ,& tga_rgb16 ); 5913else tga_comp = stbi__tga_get_comp (tga_bits_per_pixel , (tga_image_type == 3 ),& tga_rgb16 ); 5914 5915if (!tga_comp )// shouldn't really happen, stbi__tga_test() should have ensured basic consistency 5916return stbi__errpuc ("bad format" ,"Can't find out TGA pixelformat" ); 5917 5918// tga info 5919* x = tga_width ; 5920* y = tga_height ; 5921if (comp )* comp = tga_comp ; 5922 5923if (!stbi__mad3sizes_valid (tga_width ,tga_height ,tga_comp ,0 )) 5924return stbi__errpuc ("too large" ,"Corrupt TGA" ); 5925 5926tga_data = (unsigned char * )stbi__malloc_mad3 (tga_width ,tga_height ,tga_comp ,0 ); 5927if (!tga_data )return stbi__errpuc ("outofmem" ,"Out of memory" ); 5928 5929// skip to the data's starting position (offset usually = 0) 5930stbi__skip (s ,tga_offset ); 5931 5932if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { 5933for (i = 0 ;i < tga_height ;++ i ) { 5934int row = tga_inverted ?tga_height - i - 1 :i ; 5935stbi_uc * tga_row = tga_data + row * tga_width * tga_comp ; 5936stbi__getn (s ,tga_row ,tga_width * tga_comp ); 5937 } 5938 }else { 5939// do I need to load a palette? 5940if (tga_indexed ) 5941 { 5942if (tga_palette_len == 0 ) {/* you have to have at least one entry! */ 5943STBI_FREE (tga_data ); 5944return stbi__errpuc ("bad palette" ,"Corrupt TGA" ); 5945 } 5946 5947// any data to skip? (offset usually = 0) 5948stbi__skip (s ,tga_palette_start ); 5949// load the palette 5950tga_palette = (unsigned char * )stbi__malloc_mad2 (tga_palette_len ,tga_comp ,0 ); 5951if (!tga_palette ) { 5952STBI_FREE (tga_data ); 5953return stbi__errpuc ("outofmem" ,"Out of memory" ); 5954 } 5955if (tga_rgb16 ) { 5956stbi_uc * pal_entry = tga_palette ; 5957STBI_ASSERT (tga_comp == STBI_rgb ); 5958for (i = 0 ;i < tga_palette_len ;++ i ) { 5959stbi__tga_read_rgb16 (s ,pal_entry ); 5960pal_entry += tga_comp ; 5961 } 5962 }else if (!stbi__getn (s ,tga_palette ,tga_palette_len * tga_comp )) { 5963STBI_FREE (tga_data ); 5964STBI_FREE (tga_palette ); 5965return stbi__errpuc ("bad palette" ,"Corrupt TGA" ); 5966 } 5967 } 5968// load the data 5969for (i = 0 ;i < tga_width * tga_height ;++ i ) 5970 { 5971// if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? 5972if (tga_is_RLE ) 5973 { 5974if (RLE_count == 0 ) 5975 { 5976// yep, get the next byte as a RLE command 5977int RLE_cmd = stbi__get8 (s ); 5978RLE_count = 1 + (RLE_cmd & 127 ); 5979RLE_repeating = RLE_cmd >>7 ; 5980read_next_pixel = 1 ; 5981 }else if ( !RLE_repeating ) 5982 { 5983read_next_pixel = 1 ; 5984 } 5985 }else 5986 { 5987read_next_pixel = 1 ; 5988 } 5989// OK, if I need to read a pixel, do it now 5990if (read_next_pixel ) 5991 { 5992// load however much data we did have 5993if (tga_indexed ) 5994 { 5995// read in index, then perform the lookup 5996int pal_idx = (tga_bits_per_pixel == 8 ) ?stbi__get8 (s ) :stbi__get16le (s ); 5997if (pal_idx >=tga_palette_len ) { 5998// invalid index 5999pal_idx = 0 ; 6000 } 6001pal_idx *=tga_comp ; 6002for (j = 0 ;j < tga_comp ;++ j ) { 6003raw_data [j ]= tga_palette [pal_idx + j ]; 6004 } 6005 }else if (tga_rgb16 ) { 6006STBI_ASSERT (tga_comp == STBI_rgb ); 6007stbi__tga_read_rgb16 (s ,raw_data ); 6008 }else { 6009// read in the data raw 6010for (j = 0 ;j < tga_comp ;++ j ) { 6011raw_data [j ]= stbi__get8 (s ); 6012 } 6013 } 6014// clear the reading flag for the next pixel 6015read_next_pixel = 0 ; 6016 }// end of reading a pixel 6017 6018// copy data 6019for (j = 0 ;j < tga_comp ;++ j ) 6020tga_data [i * tga_comp + j ]= raw_data [j ]; 6021 6022// in case we're in RLE mode, keep counting down 6023-- RLE_count ; 6024 } 6025// do I need to invert the image? 6026if (tga_inverted ) 6027 { 6028for (j = 0 ;j * 2 < tga_height ;++ j ) 6029 { 6030int index1 = j * tga_width * tga_comp ; 6031int index2 = (tga_height - 1 - j )* tga_width * tga_comp ; 6032for (i = tga_width * tga_comp ;i > 0 ;-- i ) 6033 { 6034unsigned char temp = tga_data [index1 ]; 6035tga_data [index1 ]= tga_data [index2 ]; 6036tga_data [index2 ]= temp ; 6037++ index1 ; 6038++ index2 ; 6039 } 6040 } 6041 } 6042// clear my palette, if I had one 6043if (tga_palette != NULL ) 6044 { 6045STBI_FREE (tga_palette ); 6046 } 6047 } 6048 6049// swap RGB - if the source data was RGB16, it already is in the right order 6050if (tga_comp >=3 && !tga_rgb16 ) 6051 { 6052unsigned char * tga_pixel = tga_data ; 6053for (i = 0 ;i < tga_width * tga_height ;++ i ) 6054 { 6055unsigned char temp = tga_pixel [0 ]; 6056tga_pixel [0 ]= tga_pixel [2 ]; 6057tga_pixel [2 ]= temp ; 6058tga_pixel += tga_comp ; 6059 } 6060 } 6061 6062// convert to target component count 6063if (req_comp && req_comp != tga_comp ) 6064tga_data = stbi__convert_format (tga_data ,tga_comp ,req_comp ,tga_width ,tga_height ); 6065 6066// the things I do to get rid of an error message, and yet keep 6067// Microsoft's C compilers happy... [8^( 6068tga_palette_start = tga_palette_len = tga_palette_bits = 6069tga_x_origin = tga_y_origin = 0 ; 6070STBI_NOTUSED (tga_palette_start ); 6071// OK, done 6072return tga_data ; 6073} 6074#endif 6075 6076// ************************************************************************************************* 6077// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB 6078 6079#ifndef STBI_NO_PSD 6080static int stbi__psd_test (stbi__context * s ) 6081{ 6082int r = (stbi__get32be (s )== 0x38425053 ); 6083stbi__rewind (s ); 6084return r ; 6085} 6086 6087static int stbi__psd_decode_rle (stbi__context * s ,stbi_uc * p ,int pixelCount ) 6088{ 6089int count ,nleft ,len ; 6090 6091count = 0 ; 6092while ((nleft = pixelCount - count )> 0 ) { 6093len = stbi__get8 (s ); 6094if (len == 128 ) { 6095// No-op. 6096 }else if (len < 128 ) { 6097// Copy next len+1 bytes literally. 6098len ++ ; 6099if (len > nleft )return 0 ;// corrupt data 6100count += len ; 6101while (len ) { 6102* p = stbi__get8 (s ); 6103p += 4 ; 6104len -- ; 6105 } 6106 }else if (len > 128 ) { 6107stbi_uc val ; 6108// Next -len+1 bytes in the dest are replicated from next source byte. 6109// (Interpret len as a negative 8-bit int.) 6110len = 257 - len ; 6111if (len > nleft )return 0 ;// corrupt data 6112val = stbi__get8 (s ); 6113count += len ; 6114while (len ) { 6115* p = val ; 6116p += 4 ; 6117len -- ; 6118 } 6119 } 6120 } 6121 6122return 1 ; 6123} 6124 6125static void * stbi__psd_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ,int bpc ) 6126{ 6127int pixelCount ; 6128int channelCount ,compression ; 6129int channel ,i ; 6130int bitdepth ; 6131int w ,h ; 6132stbi_uc * out ; 6133STBI_NOTUSED (ri ); 6134 6135// Check identifier 6136if (stbi__get32be (s )!= 0x38425053 )// "8BPS" 6137return stbi__errpuc ("not PSD" ,"Corrupt PSD image" ); 6138 6139// Check file type version. 6140if (stbi__get16be (s )!= 1 ) 6141return stbi__errpuc ("wrong version" ,"Unsupported version of PSD image" ); 6142 6143// Skip 6 reserved bytes. 6144stbi__skip (s ,6 ); 6145 6146// Read the number of channels (R, G, B, A, etc). 6147channelCount = stbi__get16be (s ); 6148if (channelCount < 0 || channelCount > 16 ) 6149return stbi__errpuc ("wrong channel count" ,"Unsupported number of channels in PSD image" ); 6150 6151// Read the rows and columns of the image. 6152h = stbi__get32be (s ); 6153w = stbi__get32be (s ); 6154 6155if (h > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 6156if (w > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 6157 6158// Make sure the depth is 8 bits. 6159bitdepth = stbi__get16be (s ); 6160if (bitdepth != 8 && bitdepth != 16 ) 6161return stbi__errpuc ("unsupported bit depth" ,"PSD bit depth is not 8 or 16 bit" ); 6162 6163// Make sure the color mode is RGB. 6164// Valid options are: 6165// 0: Bitmap 6166// 1: Grayscale 6167// 2: Indexed color 6168// 3: RGB color 6169// 4: CMYK color 6170// 7: Multichannel 6171// 8: Duotone 6172// 9: Lab color 6173if (stbi__get16be (s )!= 3 ) 6174return stbi__errpuc ("wrong color format" ,"PSD is not in RGB color format" ); 6175 6176// Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) 6177stbi__skip (s ,stbi__get32be (s ) ); 6178 6179// Skip the image resources. (resolution, pen tool paths, etc) 6180stbi__skip (s ,stbi__get32be (s ) ); 6181 6182// Skip the reserved data. 6183stbi__skip (s ,stbi__get32be (s ) ); 6184 6185// Find out if the data is compressed. 6186// Known values: 6187// 0: no compression 6188// 1: RLE compressed 6189compression = stbi__get16be (s ); 6190if (compression > 1 ) 6191return stbi__errpuc ("bad compression" ,"PSD has an unknown compression format" ); 6192 6193// Check size 6194if (!stbi__mad3sizes_valid (4 ,w ,h ,0 )) 6195return stbi__errpuc ("too large" ,"Corrupt PSD" ); 6196 6197// Create the destination image. 6198 6199if (!compression && bitdepth == 16 && bpc == 16 ) { 6200out = (stbi_uc * )stbi__malloc_mad3 (8 ,w ,h ,0 ); 6201ri -> bits_per_channel = 16 ; 6202 }else 6203out = (stbi_uc * )stbi__malloc (4 * w * h ); 6204 6205if (!out )return stbi__errpuc ("outofmem" ,"Out of memory" ); 6206pixelCount = w * h ; 6207 6208// Initialize the data to zero. 6209//memset( out, 0, pixelCount * 4 ); 6210 6211// Finally, the image data. 6212if (compression ) { 6213// RLE as used by .PSD and .TIFF 6214// Loop until you get the number of unpacked bytes you are expecting: 6215// Read the next source byte into n. 6216// If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. 6217// Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. 6218// Else if n is 128, noop. 6219// Endloop 6220 6221// The RLE-compressed data is preceded by a 2-byte data count for each row in the data, 6222// which we're going to just skip. 6223stbi__skip (s ,h * channelCount * 2 ); 6224 6225// Read the RLE data by channel. 6226for (channel = 0 ;channel < 4 ;channel ++ ) { 6227stbi_uc * p ; 6228 6229p = out + channel ; 6230if (channel >=channelCount ) { 6231// Fill this channel with default data. 6232for (i = 0 ;i < pixelCount ;i ++ ,p += 4 ) 6233* p = (channel == 3 ?255 :0 ); 6234 }else { 6235// Read the RLE data. 6236if (!stbi__psd_decode_rle (s ,p ,pixelCount )) { 6237STBI_FREE (out ); 6238return stbi__errpuc ("corrupt" ,"bad RLE data" ); 6239 } 6240 } 6241 } 6242 6243 }else { 6244// We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) 6245// where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image. 6246 6247// Read the data by channel. 6248for (channel = 0 ;channel < 4 ;channel ++ ) { 6249if (channel >=channelCount ) { 6250// Fill this channel with default data. 6251if (bitdepth == 16 && bpc == 16 ) { 6252stbi__uint16 * q = ((stbi__uint16 * )out )+ channel ; 6253stbi__uint16 val = channel == 3 ?65535 :0 ; 6254for (i = 0 ;i < pixelCount ;i ++ ,q += 4 ) 6255* q = val ; 6256 }else { 6257stbi_uc * p = out + channel ; 6258stbi_uc val = channel == 3 ?255 :0 ; 6259for (i = 0 ;i < pixelCount ;i ++ ,p += 4 ) 6260* p = val ; 6261 } 6262 }else { 6263if (ri -> bits_per_channel == 16 ) {// output bpc 6264stbi__uint16 * q = ((stbi__uint16 * )out )+ channel ; 6265for (i = 0 ;i < pixelCount ;i ++ ,q += 4 ) 6266* q = (stbi__uint16 )stbi__get16be (s ); 6267 }else { 6268stbi_uc * p = out + channel ; 6269if (bitdepth == 16 ) {// input bpc 6270for (i = 0 ;i < pixelCount ;i ++ ,p += 4 ) 6271* p = (stbi_uc ) (stbi__get16be (s ) >>8 ); 6272 }else { 6273for (i = 0 ;i < pixelCount ;i ++ ,p += 4 ) 6274* p = stbi__get8 (s ); 6275 } 6276 } 6277 } 6278 } 6279 } 6280 6281// remove weird white matte from PSD 6282if (channelCount >=4 ) { 6283if (ri -> bits_per_channel == 16 ) { 6284for (i = 0 ;i < w * h ;++ i ) { 6285stbi__uint16 * pixel = (stbi__uint16 * )out + 4 * i ; 6286if (pixel [3 ]!= 0 && pixel [3 ]!= 65535 ) { 6287float a = pixel [3 ] /65535.0f ; 6288float ra = 1.0f /a ; 6289float inv_a = 65535.0f * (1 - ra ); 6290pixel [0 ]= (stbi__uint16 ) (pixel [0 ]* ra + inv_a ); 6291pixel [1 ]= (stbi__uint16 ) (pixel [1 ]* ra + inv_a ); 6292pixel [2 ]= (stbi__uint16 ) (pixel [2 ]* ra + inv_a ); 6293 } 6294 } 6295 }else { 6296for (i = 0 ;i < w * h ;++ i ) { 6297unsigned char * pixel = out + 4 * i ; 6298if (pixel [3 ]!= 0 && pixel [3 ]!= 255 ) { 6299float a = pixel [3 ] /255.0f ; 6300float ra = 1.0f /a ; 6301float inv_a = 255.0f * (1 - ra ); 6302pixel [0 ]= (unsigned char ) (pixel [0 ]* ra + inv_a ); 6303pixel [1 ]= (unsigned char ) (pixel [1 ]* ra + inv_a ); 6304pixel [2 ]= (unsigned char ) (pixel [2 ]* ra + inv_a ); 6305 } 6306 } 6307 } 6308 } 6309 6310// convert to desired output format 6311if (req_comp && req_comp != 4 ) { 6312if (ri -> bits_per_channel == 16 ) 6313out = (stbi_uc * )stbi__convert_format16 ((stbi__uint16 * )out ,4 ,req_comp ,w ,h ); 6314else 6315out = stbi__convert_format (out ,4 ,req_comp ,w ,h ); 6316if (out == NULL )return out ;// stbi__convert_format frees input on failure 6317 } 6318 6319if (comp )* comp = 4 ; 6320* y = h ; 6321* x = w ; 6322 6323return out ; 6324} 6325#endif 6326 6327// ************************************************************************************************* 6328// Softimage PIC loader 6329// by Tom Seddon 6330// 6331// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format 6332// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/ 6333 6334#ifndef STBI_NO_PIC 6335static int stbi__pic_is4 (stbi__context * s ,const char * str ) 6336{ 6337int i ; 6338for (i = 0 ;i < 4 ;++ i ) 6339if (stbi__get8 (s )!= (stbi_uc )str [i ]) 6340return 0 ; 6341 6342return 1 ; 6343} 6344 6345static int stbi__pic_test_core (stbi__context * s ) 6346{ 6347int i ; 6348 6349if (!stbi__pic_is4 (s ,"\x53\x80\xF6\x34" )) 6350return 0 ; 6351 6352for (i = 0 ;i < 84 ;++ i ) 6353stbi__get8 (s ); 6354 6355if (!stbi__pic_is4 (s ,"PICT" )) 6356return 0 ; 6357 6358return 1 ; 6359} 6360 6361typedef struct 6362{ 6363stbi_uc size ,type ,channel ; 6364}stbi__pic_packet ; 6365 6366static stbi_uc * stbi__readval (stbi__context * s ,int channel ,stbi_uc * dest ) 6367{ 6368int mask = 0x80 ,i ; 6369 6370for (i = 0 ;i < 4 ;++ i ,mask >>=1 ) { 6371if (channel & mask ) { 6372if (stbi__at_eof (s ))return stbi__errpuc ("bad file" ,"PIC file too short" ); 6373dest [i ]= stbi__get8 (s ); 6374 } 6375 } 6376 6377return dest ; 6378} 6379 6380static void stbi__copyval (int channel ,stbi_uc * dest ,const stbi_uc * src ) 6381{ 6382int mask = 0x80 ,i ; 6383 6384for (i = 0 ;i < 4 ;++ i ,mask >>=1 ) 6385if (channel & mask ) 6386dest [i ]= src [i ]; 6387} 6388 6389static stbi_uc * stbi__pic_load_core (stbi__context * s ,int width ,int height ,int * comp ,stbi_uc * result ) 6390{ 6391int act_comp = 0 ,num_packets = 0 ,y ,chained ; 6392stbi__pic_packet packets [10 ]; 6393 6394// this will (should...) cater for even some bizarre stuff like having data 6395// for the same channel in multiple packets. 6396do { 6397stbi__pic_packet * packet ; 6398 6399if (num_packets == sizeof (packets )/sizeof (packets [0 ])) 6400return stbi__errpuc ("bad format" ,"too many packets" ); 6401 6402packet = & packets [num_packets ++ ]; 6403 6404chained = stbi__get8 (s ); 6405packet -> size = stbi__get8 (s ); 6406packet -> type = stbi__get8 (s ); 6407packet -> channel = stbi__get8 (s ); 6408 6409act_comp |=packet -> channel ; 6410 6411if (stbi__at_eof (s ))return stbi__errpuc ("bad file" ,"file too short (reading packets)" ); 6412if (packet -> size != 8 )return stbi__errpuc ("bad format" ,"packet isn't 8bpp" ); 6413 }while (chained ); 6414 6415* comp = (act_comp & 0x10 ?4 :3 );// has alpha channel? 6416 6417for (y = 0 ;y < height ;++ y ) { 6418int packet_idx ; 6419 6420for (packet_idx = 0 ;packet_idx < num_packets ;++ packet_idx ) { 6421stbi__pic_packet * packet = & packets [packet_idx ]; 6422stbi_uc * dest = result + y * width * 4 ; 6423 6424switch (packet -> type ) { 6425default : 6426return stbi__errpuc ("bad format" ,"packet has bad compression type" ); 6427 6428case 0 : {//uncompressed 6429int x ; 6430 6431for (x = 0 ;x < width ;++ x ,dest += 4 ) 6432if (!stbi__readval (s ,packet -> channel ,dest )) 6433return 0 ; 6434break ; 6435 } 6436 6437case 1 ://Pure RLE 6438 { 6439int left = width ,i ; 6440 6441while (left > 0 ) { 6442stbi_uc count ,value [4 ]; 6443 6444count = stbi__get8 (s ); 6445if (stbi__at_eof (s ))return stbi__errpuc ("bad file" ,"file too short (pure read count)" ); 6446 6447if (count > left ) 6448count = (stbi_uc )left ; 6449 6450if (!stbi__readval (s ,packet -> channel ,value ))return 0 ; 6451 6452for (i = 0 ;i < count ;++ i ,dest += 4 ) 6453stbi__copyval (packet -> channel ,dest ,value ); 6454left -= count ; 6455 } 6456 } 6457break ; 6458 6459case 2 : {//Mixed RLE 6460int left = width ; 6461while (left > 0 ) { 6462int count = stbi__get8 (s ),i ; 6463if (stbi__at_eof (s ))return stbi__errpuc ("bad file" ,"file too short (mixed read count)" ); 6464 6465if (count >=128 ) {// Repeated 6466stbi_uc value [4 ]; 6467 6468if (count == 128 ) 6469count = stbi__get16be (s ); 6470else 6471count -= 127 ; 6472if (count > left ) 6473return stbi__errpuc ("bad file" ,"scanline overrun" ); 6474 6475if (!stbi__readval (s ,packet -> channel ,value )) 6476return 0 ; 6477 6478for (i = 0 ;i < count ;++ i ,dest += 4 ) 6479stbi__copyval (packet -> channel ,dest ,value ); 6480 }else {// Raw 6481++ count ; 6482if (count > left )return stbi__errpuc ("bad file" ,"scanline overrun" ); 6483 6484for (i = 0 ;i < count ;++ i ,dest += 4 ) 6485if (!stbi__readval (s ,packet -> channel ,dest )) 6486return 0 ; 6487 } 6488left -= count ; 6489 } 6490break ; 6491 } 6492 } 6493 } 6494 } 6495 6496return result ; 6497} 6498 6499static void * stbi__pic_load (stbi__context * s ,int * px ,int * py ,int * comp ,int req_comp ,stbi__result_info * ri ) 6500{ 6501stbi_uc * result ; 6502int i ,x ,y ,internal_comp ; 6503STBI_NOTUSED (ri ); 6504 6505if (!comp )comp = & internal_comp ; 6506 6507for (i = 0 ;i < 92 ;++ i ) 6508stbi__get8 (s ); 6509 6510x = stbi__get16be (s ); 6511y = stbi__get16be (s ); 6512 6513if (y > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 6514if (x > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 6515 6516if (stbi__at_eof (s ))return stbi__errpuc ("bad file" ,"file too short (pic header)" ); 6517if (!stbi__mad3sizes_valid (x ,y ,4 ,0 ))return stbi__errpuc ("too large" ,"PIC image too large to decode" ); 6518 6519stbi__get32be (s );//skip `ratio' 6520stbi__get16be (s );//skip `fields' 6521stbi__get16be (s );//skip `pad' 6522 6523// intermediate buffer is RGBA 6524result = (stbi_uc * )stbi__malloc_mad3 (x ,y ,4 ,0 ); 6525if (!result )return stbi__errpuc ("outofmem" ,"Out of memory" ); 6526memset (result ,0xff ,x * y * 4 ); 6527 6528if (!stbi__pic_load_core (s ,x ,y ,comp ,result )) { 6529STBI_FREE (result ); 6530result = 0 ; 6531 } 6532* px = x ; 6533* py = y ; 6534if (req_comp == 0 )req_comp = * comp ; 6535result = stbi__convert_format (result ,4 ,req_comp ,x ,y ); 6536 6537return result ; 6538} 6539 6540static int stbi__pic_test (stbi__context * s ) 6541{ 6542int r = stbi__pic_test_core (s ); 6543stbi__rewind (s ); 6544return r ; 6545} 6546#endif 6547 6548// ************************************************************************************************* 6549// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb 6550 6551#ifndef STBI_NO_GIF 6552typedef struct 6553{ 6554stbi__int16 prefix ; 6555stbi_uc first ; 6556stbi_uc suffix ; 6557}stbi__gif_lzw ; 6558 6559typedef struct 6560{ 6561int w ,h ; 6562stbi_uc * out ;// output buffer (always 4 components) 6563stbi_uc * background ;// The current "background" as far as a gif is concerned 6564stbi_uc * history ; 6565int flags ,bgindex ,ratio ,transparent ,eflags ; 6566stbi_uc pal [256 ][4 ]; 6567stbi_uc lpal [256 ][4 ]; 6568stbi__gif_lzw codes [8192 ]; 6569stbi_uc * color_table ; 6570int parse ,step ; 6571int lflags ; 6572int start_x ,start_y ; 6573int max_x ,max_y ; 6574int cur_x ,cur_y ; 6575int line_size ; 6576int delay ; 6577}stbi__gif ; 6578 6579static int stbi__gif_test_raw (stbi__context * s ) 6580{ 6581int sz ; 6582if (stbi__get8 (s )!= 'G' || stbi__get8 (s )!= 'I' || stbi__get8 (s )!= 'F' || stbi__get8 (s )!= '8' )return 0 ; 6583sz = stbi__get8 (s ); 6584if (sz != '9' && sz != '7' )return 0 ; 6585if (stbi__get8 (s )!= 'a' )return 0 ; 6586return 1 ; 6587} 6588 6589static int stbi__gif_test (stbi__context * s ) 6590{ 6591int r = stbi__gif_test_raw (s ); 6592stbi__rewind (s ); 6593return r ; 6594} 6595 6596static void stbi__gif_parse_colortable (stbi__context * s ,stbi_uc pal [256 ][4 ],int num_entries ,int transp ) 6597{ 6598int i ; 6599for (i = 0 ;i < num_entries ;++ i ) { 6600pal [i ][2 ]= stbi__get8 (s ); 6601pal [i ][1 ]= stbi__get8 (s ); 6602pal [i ][0 ]= stbi__get8 (s ); 6603pal [i ][3 ]= transp == i ?0 :255 ; 6604 } 6605} 6606 6607static int stbi__gif_header (stbi__context * s ,stbi__gif * g ,int * comp ,int is_info ) 6608{ 6609stbi_uc version ; 6610if (stbi__get8 (s )!= 'G' || stbi__get8 (s )!= 'I' || stbi__get8 (s )!= 'F' || stbi__get8 (s )!= '8' ) 6611return stbi__err ("not GIF" ,"Corrupt GIF" ); 6612 6613version = stbi__get8 (s ); 6614if (version != '7' && version != '9' )return stbi__err ("not GIF" ,"Corrupt GIF" ); 6615if (stbi__get8 (s )!= 'a' )return stbi__err ("not GIF" ,"Corrupt GIF" ); 6616 6617stbi__g_failure_reason = "" ; 6618g -> w = stbi__get16le (s ); 6619g -> h = stbi__get16le (s ); 6620g -> flags = stbi__get8 (s ); 6621g -> bgindex = stbi__get8 (s ); 6622g -> ratio = stbi__get8 (s ); 6623g -> transparent = -1 ; 6624 6625if (g -> w > STBI_MAX_DIMENSIONS )return stbi__err ("too large" ,"Very large image (corrupt?)" ); 6626if (g -> h > STBI_MAX_DIMENSIONS )return stbi__err ("too large" ,"Very large image (corrupt?)" ); 6627 6628if (comp != 0 )* comp = 4 ;// can't actually tell whether it's 3 or 4 until we parse the comments 6629 6630if (is_info )return 1 ; 6631 6632if (g -> flags & 0x80 ) 6633stbi__gif_parse_colortable (s ,g -> pal ,2 << (g -> flags & 7 ),-1 ); 6634 6635return 1 ; 6636} 6637 6638static int stbi__gif_info_raw (stbi__context * s ,int * x ,int * y ,int * comp ) 6639{ 6640stbi__gif * g = (stbi__gif * )stbi__malloc (sizeof (stbi__gif )); 6641if (!g )return stbi__err ("outofmem" ,"Out of memory" ); 6642if (!stbi__gif_header (s ,g ,comp ,1 )) { 6643STBI_FREE (g ); 6644stbi__rewind (s ); 6645return 0 ; 6646 } 6647if (x )* x = g -> w ; 6648if (y )* y = g -> h ; 6649STBI_FREE (g ); 6650return 1 ; 6651} 6652 6653static void stbi__out_gif_code (stbi__gif * g ,stbi__uint16 code ) 6654{ 6655stbi_uc * p ,* c ; 6656int idx ; 6657 6658// recurse to decode the prefixes, since the linked-list is backwards, 6659// and working backwards through an interleaved image would be nasty 6660if (g -> codes [code ].prefix >=0 ) 6661stbi__out_gif_code (g ,g -> codes [code ].prefix ); 6662 6663if (g -> cur_y >=g -> max_y )return ; 6664 6665idx = g -> cur_x + g -> cur_y ; 6666p = & g -> out [idx ]; 6667g -> history [idx /4 ]= 1 ; 6668 6669c = & g -> color_table [g -> codes [code ].suffix * 4 ]; 6670if (c [3 ]> 128 ) {// don't render transparent pixels; 6671p [0 ]= c [2 ]; 6672p [1 ]= c [1 ]; 6673p [2 ]= c [0 ]; 6674p [3 ]= c [3 ]; 6675 } 6676g -> cur_x += 4 ; 6677 6678if (g -> cur_x >=g -> max_x ) { 6679g -> cur_x = g -> start_x ; 6680g -> cur_y += g -> step ; 6681 6682while (g -> cur_y >=g -> max_y && g -> parse > 0 ) { 6683g -> step = (1 <<g -> parse )* g -> line_size ; 6684g -> cur_y = g -> start_y + (g -> step >>1 ); 6685-- g -> parse ; 6686 } 6687 } 6688} 6689 6690static stbi_uc * stbi__process_gif_raster (stbi__context * s ,stbi__gif * g ) 6691{ 6692stbi_uc lzw_cs ; 6693stbi__int32 len ,init_code ; 6694stbi__uint32 first ; 6695stbi__int32 codesize ,codemask ,avail ,oldcode ,bits ,valid_bits ,clear ; 6696stbi__gif_lzw * p ; 6697 6698lzw_cs = stbi__get8 (s ); 6699if (lzw_cs > 12 )return NULL ; 6700clear = 1 <<lzw_cs ; 6701first = 1 ; 6702codesize = lzw_cs + 1 ; 6703codemask = (1 <<codesize )- 1 ; 6704bits = 0 ; 6705valid_bits = 0 ; 6706for (init_code = 0 ;init_code < clear ;init_code ++ ) { 6707g -> codes [init_code ].prefix = -1 ; 6708g -> codes [init_code ].first = (stbi_uc )init_code ; 6709g -> codes [init_code ].suffix = (stbi_uc )init_code ; 6710 } 6711 6712// support no starting clear code 6713avail = clear + 2 ; 6714oldcode = -1 ; 6715 6716len = 0 ; 6717for (;;) { 6718if (valid_bits < codesize ) { 6719if (len == 0 ) { 6720len = stbi__get8 (s );// start new block 6721if (len == 0 ) 6722return g -> out ; 6723 } 6724-- len ; 6725bits |= (stbi__int32 )stbi__get8 (s ) <<valid_bits ; 6726valid_bits += 8 ; 6727 }else { 6728stbi__int32 code = bits & codemask ; 6729bits >>=codesize ; 6730valid_bits -= codesize ; 6731// @OPTIMIZE: is there some way we can accelerate the non-clear path? 6732if (code == clear ) {// clear code 6733codesize = lzw_cs + 1 ; 6734codemask = (1 <<codesize )- 1 ; 6735avail = clear + 2 ; 6736oldcode = -1 ; 6737first = 0 ; 6738 }else if (code == clear + 1 ) {// end of stream code 6739stbi__skip (s ,len ); 6740while ((len = stbi__get8 (s ))> 0 ) 6741stbi__skip (s ,len ); 6742return g -> out ; 6743 }else if (code <=avail ) { 6744if (first ) { 6745return stbi__errpuc ("no clear code" ,"Corrupt GIF" ); 6746 } 6747 6748if (oldcode >=0 ) { 6749p = & g -> codes [avail ++ ]; 6750if (avail > 8192 ) { 6751return stbi__errpuc ("too many codes" ,"Corrupt GIF" ); 6752 } 6753 6754p -> prefix = (stbi__int16 )oldcode ; 6755p -> first = g -> codes [oldcode ].first ; 6756p -> suffix = (code == avail ) ?p -> first :g -> codes [code ].first ; 6757 }else if (code == avail ) 6758return stbi__errpuc ("illegal code in raster" ,"Corrupt GIF" ); 6759 6760stbi__out_gif_code (g , (stbi__uint16 )code ); 6761 6762if ((avail & codemask )== 0 && avail <=0x0FFF ) { 6763codesize ++ ; 6764codemask = (1 <<codesize )- 1 ; 6765 } 6766 6767oldcode = code ; 6768 }else { 6769return stbi__errpuc ("illegal code in raster" ,"Corrupt GIF" ); 6770 } 6771 } 6772 } 6773} 6774 6775// this function is designed to support animated gifs, although stb_image doesn't support it 6776// two back is the image from two frames ago, used for a very specific disposal format 6777static stbi_uc * stbi__gif_load_next (stbi__context * s ,stbi__gif * g ,int * comp ,int req_comp ,stbi_uc * two_back ) 6778{ 6779int dispose ; 6780int first_frame ; 6781int pi ; 6782int pcount ; 6783STBI_NOTUSED (req_comp ); 6784 6785// on first frame, any non-written pixels get the background colour (non-transparent) 6786first_frame = 0 ; 6787if (g -> out == 0 ) { 6788if (!stbi__gif_header (s ,g ,comp ,0 ))return 0 ;// stbi__g_failure_reason set by stbi__gif_header 6789if (!stbi__mad3sizes_valid (4 ,g -> w ,g -> h ,0 )) 6790return stbi__errpuc ("too large" ,"GIF image is too large" ); 6791pcount = g -> w * g -> h ; 6792g -> out = (stbi_uc * )stbi__malloc (4 * pcount ); 6793g -> background = (stbi_uc * )stbi__malloc (4 * pcount ); 6794g -> history = (stbi_uc * )stbi__malloc (pcount ); 6795if (!g -> out || !g -> background || !g -> history ) 6796return stbi__errpuc ("outofmem" ,"Out of memory" ); 6797 6798// image is treated as "transparent" at the start - ie, nothing overwrites the current background; 6799// background colour is only used for pixels that are not rendered first frame, after that "background" 6800// color refers to the color that was there the previous frame. 6801memset (g -> out ,0x00 ,4 * pcount ); 6802memset (g -> background ,0x00 ,4 * pcount );// state of the background (starts transparent) 6803memset (g -> history ,0x00 ,pcount );// pixels that were affected previous frame 6804first_frame = 1 ; 6805 }else { 6806// second frame - how do we dispose of the previous one? 6807dispose = (g -> eflags & 0x1C ) >>2 ; 6808pcount = g -> w * g -> h ; 6809 6810if ((dispose == 3 )&& (two_back == 0 )) { 6811dispose = 2 ;// if I don't have an image to revert back to, default to the old background 6812 } 6813 6814if (dispose == 3 ) {// use previous graphic 6815for (pi = 0 ;pi < pcount ;++ pi ) { 6816if (g -> history [pi ]) { 6817memcpy (& g -> out [pi * 4 ],& two_back [pi * 4 ],4 ); 6818 } 6819 } 6820 }else if (dispose == 2 ) { 6821// restore what was changed last frame to background before that frame; 6822for (pi = 0 ;pi < pcount ;++ pi ) { 6823if (g -> history [pi ]) { 6824memcpy (& g -> out [pi * 4 ],& g -> background [pi * 4 ],4 ); 6825 } 6826 } 6827 }else { 6828// This is a non-disposal case eithe way, so just 6829// leave the pixels as is, and they will become the new background 6830// 1: do not dispose 6831// 0: not specified. 6832 } 6833 6834// background is what out is after the undoing of the previou frame; 6835memcpy (g -> background ,g -> out ,4 * g -> w * g -> h ); 6836 } 6837 6838// clear my history; 6839memset (g -> history ,0x00 ,g -> w * g -> h );// pixels that were affected previous frame 6840 6841for (;;) { 6842int tag = stbi__get8 (s ); 6843switch (tag ) { 6844case 0x2C :/* Image Descriptor */ 6845 { 6846stbi__int32 x ,y ,w ,h ; 6847stbi_uc * o ; 6848 6849x = stbi__get16le (s ); 6850y = stbi__get16le (s ); 6851w = stbi__get16le (s ); 6852h = stbi__get16le (s ); 6853if (((x + w )> (g -> w ))|| ((y + h )> (g -> h ))) 6854return stbi__errpuc ("bad Image Descriptor" ,"Corrupt GIF" ); 6855 6856g -> line_size = g -> w * 4 ; 6857g -> start_x = x * 4 ; 6858g -> start_y = y * g -> line_size ; 6859g -> max_x = g -> start_x + w * 4 ; 6860g -> max_y = g -> start_y + h * g -> line_size ; 6861g -> cur_x = g -> start_x ; 6862g -> cur_y = g -> start_y ; 6863 6864// if the width of the specified rectangle is 0, that means 6865// we may not see *any* pixels or the image is malformed; 6866// to make sure this is caught, move the current y down to 6867// max_y (which is what out_gif_code checks). 6868if (w == 0 ) 6869g -> cur_y = g -> max_y ; 6870 6871g -> lflags = stbi__get8 (s ); 6872 6873if (g -> lflags & 0x40 ) { 6874g -> step = 8 * g -> line_size ;// first interlaced spacing 6875g -> parse = 3 ; 6876 }else { 6877g -> step = g -> line_size ; 6878g -> parse = 0 ; 6879 } 6880 6881if (g -> lflags & 0x80 ) { 6882stbi__gif_parse_colortable (s ,g -> lpal ,2 << (g -> lflags & 7 ),g -> eflags & 0x01 ?g -> transparent :-1 ); 6883g -> color_table = (stbi_uc * )g -> lpal ; 6884 }else if (g -> flags & 0x80 ) { 6885g -> color_table = (stbi_uc * )g -> pal ; 6886 }else 6887return stbi__errpuc ("missing color table" ,"Corrupt GIF" ); 6888 6889o = stbi__process_gif_raster (s ,g ); 6890if (!o )return NULL ; 6891 6892// if this was the first frame, 6893pcount = g -> w * g -> h ; 6894if (first_frame && (g -> bgindex > 0 )) { 6895// if first frame, any pixel not drawn to gets the background color 6896for (pi = 0 ;pi < pcount ;++ pi ) { 6897if (g -> history [pi ]== 0 ) { 6898g -> pal [g -> bgindex ][3 ]= 255 ;// just in case it was made transparent, undo that; It will be reset next frame if need be; 6899memcpy (& g -> out [pi * 4 ],& g -> pal [g -> bgindex ],4 ); 6900 } 6901 } 6902 } 6903 6904return o ; 6905 } 6906 6907case 0x21 :// Comment Extension. 6908 { 6909int len ; 6910int ext = stbi__get8 (s ); 6911if (ext == 0xF9 ) {// Graphic Control Extension. 6912len = stbi__get8 (s ); 6913if (len == 4 ) { 6914g -> eflags = stbi__get8 (s ); 6915g -> delay = 10 * stbi__get16le (s );// delay - 1/100th of a second, saving as 1/1000ths. 6916 6917// unset old transparent 6918if (g -> transparent >=0 ) { 6919g -> pal [g -> transparent ][3 ]= 255 ; 6920 } 6921if (g -> eflags & 0x01 ) { 6922g -> transparent = stbi__get8 (s ); 6923if (g -> transparent >=0 ) { 6924g -> pal [g -> transparent ][3 ]= 0 ; 6925 } 6926 }else { 6927// don't need transparent 6928stbi__skip (s ,1 ); 6929g -> transparent = -1 ; 6930 } 6931 }else { 6932stbi__skip (s ,len ); 6933break ; 6934 } 6935 } 6936while ((len = stbi__get8 (s ))!= 0 ) { 6937stbi__skip (s ,len ); 6938 } 6939break ; 6940 } 6941 6942case 0x3B :// gif stream termination code 6943return (stbi_uc * )s ;// using '1' causes warning on some compilers 6944 6945default : 6946return stbi__errpuc ("unknown code" ,"Corrupt GIF" ); 6947 } 6948 } 6949} 6950 6951static void * stbi__load_gif_main_outofmem (stbi__gif * g ,stbi_uc * out ,int ** delays ) 6952{ 6953STBI_FREE (g -> out ); 6954STBI_FREE (g -> history ); 6955STBI_FREE (g -> background ); 6956 6957if (out )STBI_FREE (out ); 6958if (delays && * delays )STBI_FREE (* delays ); 6959return stbi__errpuc ("outofmem" ,"Out of memory" ); 6960} 6961 6962static void * stbi__load_gif_main (stbi__context * s ,int ** delays ,int * x ,int * y ,int * z ,int * comp ,int req_comp ) 6963{ 6964if (stbi__gif_test (s )) { 6965int layers = 0 ; 6966stbi_uc * u = 0 ; 6967stbi_uc * out = 0 ; 6968stbi_uc * two_back = 0 ; 6969stbi__gif g ; 6970int stride ; 6971int out_size = 0 ; 6972int delays_size = 0 ; 6973 6974STBI_NOTUSED (out_size ); 6975STBI_NOTUSED (delays_size ); 6976 6977memset (& g ,0 ,sizeof (g )); 6978if (delays ) { 6979* delays = 0 ; 6980 } 6981 6982do { 6983u = stbi__gif_load_next (s ,& g ,comp ,req_comp ,two_back ); 6984if (u == (stbi_uc * )s )u = 0 ;// end of animated gif marker 6985 6986if (u ) { 6987* x = g .w ; 6988* y = g .h ; 6989++ layers ; 6990stride = g .w * g .h * 4 ; 6991 6992if (out ) { 6993void * tmp = (stbi_uc * )STBI_REALLOC_SIZED (out ,out_size ,layers * stride ); 6994if (!tmp ) 6995return stbi__load_gif_main_outofmem (& g ,out ,delays ); 6996else { 6997out = (stbi_uc * )tmp ; 6998out_size = layers * stride ; 6999 } 7000 7001if (delays ) { 7002int * new_delays = (int * )STBI_REALLOC_SIZED (* delays ,delays_size ,sizeof (int )* layers ); 7003if (!new_delays ) 7004return stbi__load_gif_main_outofmem (& g ,out ,delays ); 7005* delays = new_delays ; 7006delays_size = layers * sizeof (int ); 7007 } 7008 }else { 7009out = (stbi_uc * )stbi__malloc (layers * stride ); 7010if (!out ) 7011return stbi__load_gif_main_outofmem (& g ,out ,delays ); 7012out_size = layers * stride ; 7013if (delays ) { 7014* delays = (int * )stbi__malloc (layers * sizeof (int ) ); 7015if (!* delays ) 7016return stbi__load_gif_main_outofmem (& g ,out ,delays ); 7017delays_size = layers * sizeof (int ); 7018 } 7019 } 7020memcpy (out + ((layers - 1 )* stride ),u ,stride ); 7021if (layers >=2 ) { 7022two_back = out - 2 * stride ; 7023 } 7024 7025if (delays ) { 7026 (* delays )[layers - 1U ]= g .delay ; 7027 } 7028 } 7029 }while (u != 0 ); 7030 7031// free temp buffer; 7032STBI_FREE (g .out ); 7033STBI_FREE (g .history ); 7034STBI_FREE (g .background ); 7035 7036// do the final conversion after loading everything; 7037if (req_comp && req_comp != 4 ) 7038out = stbi__convert_format (out ,4 ,req_comp ,layers * g .w ,g .h ); 7039 7040* z = layers ; 7041return out ; 7042 }else { 7043return stbi__errpuc ("not GIF" ,"Image was not as a gif type." ); 7044 } 7045} 7046 7047static void * stbi__gif_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ) 7048{ 7049stbi_uc * u = 0 ; 7050stbi__gif g ; 7051memset (& g ,0 ,sizeof (g )); 7052STBI_NOTUSED (ri ); 7053 7054u = stbi__gif_load_next (s ,& g ,comp ,req_comp ,0 ); 7055if (u == (stbi_uc * )s )u = 0 ;// end of animated gif marker 7056if (u ) { 7057* x = g .w ; 7058* y = g .h ; 7059 7060// moved conversion to after successful load so that the same 7061// can be done for multiple frames. 7062if (req_comp && req_comp != 4 ) 7063u = stbi__convert_format (u ,4 ,req_comp ,g .w ,g .h ); 7064 }else if (g .out ) { 7065// if there was an error and we allocated an image buffer, free it! 7066STBI_FREE (g .out ); 7067 } 7068 7069// free buffers needed for multiple frame loading; 7070STBI_FREE (g .history ); 7071STBI_FREE (g .background ); 7072 7073return u ; 7074} 7075 7076static int stbi__gif_info (stbi__context * s ,int * x ,int * y ,int * comp ) 7077{ 7078return stbi__gif_info_raw (s ,x ,y ,comp ); 7079} 7080#endif 7081 7082// ************************************************************************************************* 7083// Radiance RGBE HDR loader 7084// originally by Nicolas Schulz 7085#ifndef STBI_NO_HDR 7086static int stbi__hdr_test_core (stbi__context * s ,const char * signature ) 7087{ 7088int i ; 7089for (i = 0 ;signature [i ];++ i ) 7090if (stbi__get8 (s )!= signature [i ]) 7091return 0 ; 7092stbi__rewind (s ); 7093return 1 ; 7094} 7095 7096static int stbi__hdr_test (stbi__context * s ) 7097{ 7098int r = stbi__hdr_test_core (s ,"#?RADIANCE\n" ); 7099stbi__rewind (s ); 7100if (!r ) { 7101r = stbi__hdr_test_core (s ,"#?RGBE\n" ); 7102stbi__rewind (s ); 7103 } 7104return r ; 7105} 7106 7107#define STBI__HDR_BUFLEN 1024 7108static char * stbi__hdr_gettoken (stbi__context * z ,char * buffer ) 7109{ 7110int len = 0 ; 7111char c = '\0' ; 7112 7113c = (char )stbi__get8 (z ); 7114 7115while (!stbi__at_eof (z )&& c != '\n' ) { 7116buffer [len ++ ]= c ; 7117if (len == STBI__HDR_BUFLEN - 1 ) { 7118// flush to end of line 7119while (!stbi__at_eof (z )&& stbi__get8 (z )!= '\n' ) 7120 ; 7121break ; 7122 } 7123c = (char )stbi__get8 (z ); 7124 } 7125 7126buffer [len ]= 0 ; 7127return buffer ; 7128} 7129 7130static void stbi__hdr_convert (float * output ,stbi_uc * input ,int req_comp ) 7131{ 7132if (input [3 ]!= 0 ) { 7133float f1 ; 7134// Exponent 7135f1 = (float )ldexp (1.0f ,input [3 ]- (int )(128 + 8 )); 7136if (req_comp <=2 ) 7137output [0 ]= (input [0 ]+ input [1 ]+ input [2 ])* f1 /3 ; 7138else { 7139output [0 ]= input [0 ]* f1 ; 7140output [1 ]= input [1 ]* f1 ; 7141output [2 ]= input [2 ]* f1 ; 7142 } 7143if (req_comp == 2 )output [1 ]= 1 ; 7144if (req_comp == 4 )output [3 ]= 1 ; 7145 }else { 7146switch (req_comp ) { 7147case 4 :output [3 ]= 1 ;/* fallthrough */ 7148case 3 :output [0 ]= output [1 ]= output [2 ]= 0 ; 7149break ; 7150case 2 :output [1 ]= 1 ;/* fallthrough */ 7151case 1 :output [0 ]= 0 ; 7152break ; 7153 } 7154 } 7155} 7156 7157static float * stbi__hdr_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ) 7158{ 7159char buffer [STBI__HDR_BUFLEN ]; 7160char * token ; 7161int valid = 0 ; 7162int width ,height ; 7163stbi_uc * scanline ; 7164float * hdr_data ; 7165int len ; 7166unsigned char count ,value ; 7167int i ,j ,k ,c1 ,c2 ,z ; 7168const char * headerToken ; 7169STBI_NOTUSED (ri ); 7170 7171// Check identifier 7172headerToken = stbi__hdr_gettoken (s ,buffer ); 7173if (strcmp (headerToken ,"#?RADIANCE" )!= 0 && strcmp (headerToken ,"#?RGBE" )!= 0 ) 7174return stbi__errpf ("not HDR" ,"Corrupt HDR image" ); 7175 7176// Parse header 7177for (;;) { 7178token = stbi__hdr_gettoken (s ,buffer ); 7179if (token [0 ]== 0 )break ; 7180if (strcmp (token ,"FORMAT=32-bit_rle_rgbe" )== 0 )valid = 1 ; 7181 } 7182 7183if (!valid )return stbi__errpf ("unsupported format" ,"Unsupported HDR format" ); 7184 7185// Parse width and height 7186// can't use sscanf() if we're not using stdio! 7187token = stbi__hdr_gettoken (s ,buffer ); 7188if (strncmp (token ,"-Y " ,3 ))return stbi__errpf ("unsupported data layout" ,"Unsupported HDR format" ); 7189token += 3 ; 7190height = (int )strtol (token ,& token ,10 ); 7191while (* token == ' ' )++ token ; 7192if (strncmp (token ,"+X " ,3 ))return stbi__errpf ("unsupported data layout" ,"Unsupported HDR format" ); 7193token += 3 ; 7194width = (int )strtol (token ,NULL ,10 ); 7195 7196if (height > STBI_MAX_DIMENSIONS )return stbi__errpf ("too large" ,"Very large image (corrupt?)" ); 7197if (width > STBI_MAX_DIMENSIONS )return stbi__errpf ("too large" ,"Very large image (corrupt?)" ); 7198 7199* x = width ; 7200* y = height ; 7201 7202if (comp )* comp = 3 ; 7203if (req_comp == 0 )req_comp = 3 ; 7204 7205if (!stbi__mad4sizes_valid (width ,height ,req_comp ,sizeof (float ),0 )) 7206return stbi__errpf ("too large" ,"HDR image is too large" ); 7207 7208// Read data 7209hdr_data = (float * )stbi__malloc_mad4 (width ,height ,req_comp ,sizeof (float ),0 ); 7210if (!hdr_data ) 7211return stbi__errpf ("outofmem" ,"Out of memory" ); 7212 7213// Load image data 7214// image data is stored as some number of sca 7215if (width < 8 || width >=32768 ) { 7216// Read flat data 7217for (j = 0 ;j < height ;++ j ) { 7218for (i = 0 ;i < width ;++ i ) { 7219stbi_uc rgbe [4 ]; 7220main_decode_loop : 7221stbi__getn (s ,rgbe ,4 ); 7222stbi__hdr_convert (hdr_data + j * width * req_comp + i * req_comp ,rgbe ,req_comp ); 7223 } 7224 } 7225 }else { 7226// Read RLE-encoded data 7227scanline = NULL ; 7228 7229for (j = 0 ;j < height ;++ j ) { 7230c1 = stbi__get8 (s ); 7231c2 = stbi__get8 (s ); 7232len = stbi__get8 (s ); 7233if (c1 != 2 || c2 != 2 || (len & 0x80 )) { 7234// not run-length encoded, so we have to actually use THIS data as a decoded 7235// pixel (note this can't be a valid pixel--one of RGB must be >= 128) 7236stbi_uc rgbe [4 ]; 7237rgbe [0 ]= (stbi_uc )c1 ; 7238rgbe [1 ]= (stbi_uc )c2 ; 7239rgbe [2 ]= (stbi_uc )len ; 7240rgbe [3 ]= (stbi_uc )stbi__get8 (s ); 7241stbi__hdr_convert (hdr_data ,rgbe ,req_comp ); 7242i = 1 ; 7243j = 0 ; 7244STBI_FREE (scanline ); 7245 gotomain_decode_loop ;// yes, this makes no sense 7246 } 7247len <<=8 ; 7248len |=stbi__get8 (s ); 7249if (len != width ) {STBI_FREE (hdr_data );STBI_FREE (scanline );return stbi__errpf ("invalid decoded scanline length" ,"corrupt HDR" ); } 7250if (scanline == NULL ) { 7251scanline = (stbi_uc * )stbi__malloc_mad2 (width ,4 ,0 ); 7252if (!scanline ) { 7253STBI_FREE (hdr_data ); 7254return stbi__errpf ("outofmem" ,"Out of memory" ); 7255 } 7256 } 7257 7258for (k = 0 ;k < 4 ;++ k ) { 7259int nleft ; 7260i = 0 ; 7261while ((nleft = width - i )> 0 ) { 7262count = stbi__get8 (s ); 7263if (count > 128 ) { 7264// Run 7265value = stbi__get8 (s ); 7266count -= 128 ; 7267if ((count == 0 )|| (count > nleft )) {STBI_FREE (hdr_data );STBI_FREE (scanline );return stbi__errpf ("corrupt" ,"bad RLE data in HDR" ); } 7268for (z = 0 ;z < count ;++ z ) 7269scanline [i ++ * 4 + k ]= value ; 7270 }else { 7271// Dump 7272if ((count == 0 )|| (count > nleft )) {STBI_FREE (hdr_data );STBI_FREE (scanline );return stbi__errpf ("corrupt" ,"bad RLE data in HDR" ); } 7273for (z = 0 ;z < count ;++ z ) 7274scanline [i ++ * 4 + k ]= stbi__get8 (s ); 7275 } 7276 } 7277 } 7278for (i = 0 ;i < width ;++ i ) 7279stbi__hdr_convert (hdr_data + (j * width + i )* req_comp ,scanline + i * 4 ,req_comp ); 7280 } 7281if (scanline ) 7282STBI_FREE (scanline ); 7283 } 7284 7285return hdr_data ; 7286} 7287 7288static int stbi__hdr_info (stbi__context * s ,int * x ,int * y ,int * comp ) 7289{ 7290char buffer [STBI__HDR_BUFLEN ]; 7291char * token ; 7292int valid = 0 ; 7293int dummy ; 7294 7295if (!x )x = & dummy ; 7296if (!y )y = & dummy ; 7297if (!comp )comp = & dummy ; 7298 7299if (stbi__hdr_test (s )== 0 ) { 7300stbi__rewind (s ); 7301return 0 ; 7302 } 7303 7304for (;;) { 7305token = stbi__hdr_gettoken (s ,buffer ); 7306if (token [0 ]== 0 )break ; 7307if (strcmp (token ,"FORMAT=32-bit_rle_rgbe" )== 0 )valid = 1 ; 7308 } 7309 7310if (!valid ) { 7311stbi__rewind (s ); 7312return 0 ; 7313 } 7314token = stbi__hdr_gettoken (s ,buffer ); 7315if (strncmp (token ,"-Y " ,3 )) { 7316stbi__rewind (s ); 7317return 0 ; 7318 } 7319token += 3 ; 7320* y = (int )strtol (token ,& token ,10 ); 7321while (* token == ' ' )++ token ; 7322if (strncmp (token ,"+X " ,3 )) { 7323stbi__rewind (s ); 7324return 0 ; 7325 } 7326token += 3 ; 7327* x = (int )strtol (token ,NULL ,10 ); 7328* comp = 3 ; 7329return 1 ; 7330} 7331#endif // STBI_NO_HDR 7332 7333#ifndef STBI_NO_BMP 7334static int stbi__bmp_info (stbi__context * s ,int * x ,int * y ,int * comp ) 7335{ 7336void * p ; 7337stbi__bmp_data info ; 7338 7339info .all_a = 255 ; 7340p = stbi__bmp_parse_header (s ,& info ); 7341if (p == NULL ) { 7342stbi__rewind (s ); 7343return 0 ; 7344 } 7345if (x )* x = s -> img_x ; 7346if (y )* y = s -> img_y ; 7347if (comp ) { 7348if (info .bpp == 24 && info .ma == 0xff000000 ) 7349* comp = 3 ; 7350else 7351* comp = info .ma ?4 :3 ; 7352 } 7353return 1 ; 7354} 7355#endif 7356 7357#ifndef STBI_NO_PSD 7358static int stbi__psd_info (stbi__context * s ,int * x ,int * y ,int * comp ) 7359{ 7360int channelCount ,dummy ,depth ; 7361if (!x )x = & dummy ; 7362if (!y )y = & dummy ; 7363if (!comp )comp = & dummy ; 7364if (stbi__get32be (s )!= 0x38425053 ) { 7365stbi__rewind (s ); 7366return 0 ; 7367 } 7368if (stbi__get16be (s )!= 1 ) { 7369stbi__rewind (s ); 7370return 0 ; 7371 } 7372stbi__skip (s ,6 ); 7373channelCount = stbi__get16be (s ); 7374if (channelCount < 0 || channelCount > 16 ) { 7375stbi__rewind (s ); 7376return 0 ; 7377 } 7378* y = stbi__get32be (s ); 7379* x = stbi__get32be (s ); 7380depth = stbi__get16be (s ); 7381if (depth != 8 && depth != 16 ) { 7382stbi__rewind (s ); 7383return 0 ; 7384 } 7385if (stbi__get16be (s )!= 3 ) { 7386stbi__rewind (s ); 7387return 0 ; 7388 } 7389* comp = 4 ; 7390return 1 ; 7391} 7392 7393static int stbi__psd_is16 (stbi__context * s ) 7394{ 7395int channelCount ,depth ; 7396if (stbi__get32be (s )!= 0x38425053 ) { 7397stbi__rewind (s ); 7398return 0 ; 7399 } 7400if (stbi__get16be (s )!= 1 ) { 7401stbi__rewind (s ); 7402return 0 ; 7403 } 7404stbi__skip (s ,6 ); 7405channelCount = stbi__get16be (s ); 7406if (channelCount < 0 || channelCount > 16 ) { 7407stbi__rewind (s ); 7408return 0 ; 7409 } 7410STBI_NOTUSED (stbi__get32be (s )); 7411STBI_NOTUSED (stbi__get32be (s )); 7412depth = stbi__get16be (s ); 7413if (depth != 16 ) { 7414stbi__rewind (s ); 7415return 0 ; 7416 } 7417return 1 ; 7418} 7419#endif 7420 7421#ifndef STBI_NO_PIC 7422static int stbi__pic_info (stbi__context * s ,int * x ,int * y ,int * comp ) 7423{ 7424int act_comp = 0 ,num_packets = 0 ,chained ,dummy ; 7425stbi__pic_packet packets [10 ]; 7426 7427if (!x )x = & dummy ; 7428if (!y )y = & dummy ; 7429if (!comp )comp = & dummy ; 7430 7431if (!stbi__pic_is4 (s ,"\x53\x80\xF6\x34" )) { 7432stbi__rewind (s ); 7433return 0 ; 7434 } 7435 7436stbi__skip (s ,88 ); 7437 7438* x = stbi__get16be (s ); 7439* y = stbi__get16be (s ); 7440if (stbi__at_eof (s )) { 7441stbi__rewind (s ); 7442return 0 ; 7443 } 7444if ( (* x )!= 0 && (1 <<28 ) / (* x )< (* y )) { 7445stbi__rewind (s ); 7446return 0 ; 7447 } 7448 7449stbi__skip (s ,8 ); 7450 7451do { 7452stbi__pic_packet * packet ; 7453 7454if (num_packets == sizeof (packets )/sizeof (packets [0 ])) 7455return 0 ; 7456 7457packet = & packets [num_packets ++ ]; 7458chained = stbi__get8 (s ); 7459packet -> size = stbi__get8 (s ); 7460packet -> type = stbi__get8 (s ); 7461packet -> channel = stbi__get8 (s ); 7462act_comp |=packet -> channel ; 7463 7464if (stbi__at_eof (s )) { 7465stbi__rewind (s ); 7466return 0 ; 7467 } 7468if (packet -> size != 8 ) { 7469stbi__rewind (s ); 7470return 0 ; 7471 } 7472 }while (chained ); 7473 7474* comp = (act_comp & 0x10 ?4 :3 ); 7475 7476return 1 ; 7477} 7478#endif 7479 7480// ************************************************************************************************* 7481// Portable Gray Map and Portable Pixel Map loader 7482// by Ken Miller 7483// 7484// PGM: http://netpbm.sourceforge.net/doc/pgm.html 7485// PPM: http://netpbm.sourceforge.net/doc/ppm.html 7486// 7487// Known limitations: 7488// Does not support comments in the header section 7489// Does not support ASCII image data (formats P2 and P3) 7490 7491#ifndef STBI_NO_PNM 7492 7493static int stbi__pnm_test (stbi__context * s ) 7494{ 7495char p ,t ; 7496p = (char )stbi__get8 (s ); 7497t = (char )stbi__get8 (s ); 7498if (p != 'P' || (t != '5' && t != '6' )) { 7499stbi__rewind (s ); 7500return 0 ; 7501 } 7502return 1 ; 7503} 7504 7505static void * stbi__pnm_load (stbi__context * s ,int * x ,int * y ,int * comp ,int req_comp ,stbi__result_info * ri ) 7506{ 7507stbi_uc * out ; 7508STBI_NOTUSED (ri ); 7509 7510ri -> bits_per_channel = stbi__pnm_info (s , (int * )& s -> img_x , (int * )& s -> img_y , (int * )& s -> img_n ); 7511if (ri -> bits_per_channel == 0 ) 7512return 0 ; 7513 7514if (s -> img_y > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 7515if (s -> img_x > STBI_MAX_DIMENSIONS )return stbi__errpuc ("too large" ,"Very large image (corrupt?)" ); 7516 7517* x = s -> img_x ; 7518* y = s -> img_y ; 7519if (comp )* comp = s -> img_n ; 7520 7521if (!stbi__mad4sizes_valid (s -> img_n ,s -> img_x ,s -> img_y ,ri -> bits_per_channel /8 ,0 )) 7522return stbi__errpuc ("too large" ,"PNM too large" ); 7523 7524out = (stbi_uc * )stbi__malloc_mad4 (s -> img_n ,s -> img_x ,s -> img_y ,ri -> bits_per_channel /8 ,0 ); 7525if (!out )return stbi__errpuc ("outofmem" ,"Out of memory" ); 7526if (!stbi__getn (s ,out ,s -> img_n * s -> img_x * s -> img_y * (ri -> bits_per_channel /8 ))) { 7527STBI_FREE (out ); 7528return stbi__errpuc ("bad PNM" ,"PNM file truncated" ); 7529 } 7530 7531if (req_comp && req_comp != s -> img_n ) { 7532if (ri -> bits_per_channel == 16 ) { 7533out = (stbi_uc * )stbi__convert_format16 ((stbi__uint16 * )out ,s -> img_n ,req_comp ,s -> img_x ,s -> img_y ); 7534 }else { 7535out = stbi__convert_format (out ,s -> img_n ,req_comp ,s -> img_x ,s -> img_y ); 7536 } 7537if (out == NULL )return out ;// stbi__convert_format frees input on failure 7538 } 7539return out ; 7540} 7541 7542static int stbi__pnm_isspace (char c ) 7543{ 7544return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r' ; 7545} 7546 7547static void stbi__pnm_skip_whitespace (stbi__context * s ,char * c ) 7548{ 7549for (;;) { 7550while (!stbi__at_eof (s )&& stbi__pnm_isspace (* c )) 7551* c = (char )stbi__get8 (s ); 7552 7553if (stbi__at_eof (s )|| * c != '#' ) 7554break ; 7555 7556while (!stbi__at_eof (s )&& * c != '\n' && * c != '\r' ) 7557* c = (char )stbi__get8 (s ); 7558 } 7559} 7560 7561static int stbi__pnm_isdigit (char c ) 7562{ 7563return c >='0' && c <='9' ; 7564} 7565 7566static int stbi__pnm_getinteger (stbi__context * s ,char * c ) 7567{ 7568int value = 0 ; 7569 7570while (!stbi__at_eof (s )&& stbi__pnm_isdigit (* c )) { 7571value = value * 10 + (* c - '0' ); 7572* c = (char )stbi__get8 (s ); 7573if ((value > 214748364 )|| (value == 214748364 && * c > '7' )) 7574return stbi__err ("integer parse overflow" ,"Parsing an integer in the PPM header overflowed a 32-bit int" ); 7575 } 7576 7577return value ; 7578} 7579 7580static int stbi__pnm_info (stbi__context * s ,int * x ,int * y ,int * comp ) 7581{ 7582int maxv ,dummy ; 7583char c ,p ,t ; 7584 7585if (!x )x = & dummy ; 7586if (!y )y = & dummy ; 7587if (!comp )comp = & dummy ; 7588 7589stbi__rewind (s ); 7590 7591// Get identifier 7592p = (char )stbi__get8 (s ); 7593t = (char )stbi__get8 (s ); 7594if (p != 'P' || (t != '5' && t != '6' )) { 7595stbi__rewind (s ); 7596return 0 ; 7597 } 7598 7599* comp = (t == '6' ) ?3 :1 ;// '5' is 1-component .pgm; '6' is 3-component .ppm 7600 7601c = (char )stbi__get8 (s ); 7602stbi__pnm_skip_whitespace (s ,& c ); 7603 7604* x = stbi__pnm_getinteger (s ,& c );// read width 7605if (* x == 0 ) 7606return stbi__err ("invalid width" ,"PPM image header had zero or overflowing width" ); 7607stbi__pnm_skip_whitespace (s ,& c ); 7608 7609* y = stbi__pnm_getinteger (s ,& c );// read height 7610if (* y == 0 ) 7611return stbi__err ("invalid width" ,"PPM image header had zero or overflowing width" ); 7612stbi__pnm_skip_whitespace (s ,& c ); 7613 7614maxv = stbi__pnm_getinteger (s ,& c );// read max value 7615if (maxv > 65535 ) 7616return stbi__err ("max value > 65535" ,"PPM image supports only 8-bit and 16-bit images" ); 7617else if (maxv > 255 ) 7618return 16 ; 7619else 7620return 8 ; 7621} 7622 7623static int stbi__pnm_is16 (stbi__context * s ) 7624{ 7625if (stbi__pnm_info (s ,NULL ,NULL ,NULL )== 16 ) 7626return 1 ; 7627return 0 ; 7628} 7629#endif 7630 7631static int stbi__info_main (stbi__context * s ,int * x ,int * y ,int * comp ) 7632{ 7633#ifndef STBI_NO_JPEG 7634if (stbi__jpeg_info (s ,x ,y ,comp ))return 1 ; 7635#endif 7636 7637#ifndef STBI_NO_PNG 7638if (stbi__png_info (s ,x ,y ,comp ))return 1 ; 7639#endif 7640 7641#ifndef STBI_NO_GIF 7642if (stbi__gif_info (s ,x ,y ,comp ))return 1 ; 7643#endif 7644 7645#ifndef STBI_NO_BMP 7646if (stbi__bmp_info (s ,x ,y ,comp ))return 1 ; 7647#endif 7648 7649#ifndef STBI_NO_PSD 7650if (stbi__psd_info (s ,x ,y ,comp ))return 1 ; 7651#endif 7652 7653#ifndef STBI_NO_PIC 7654if (stbi__pic_info (s ,x ,y ,comp ))return 1 ; 7655#endif 7656 7657#ifndef STBI_NO_PNM 7658if (stbi__pnm_info (s ,x ,y ,comp ))return 1 ; 7659#endif 7660 7661#ifndef STBI_NO_HDR 7662if (stbi__hdr_info (s ,x ,y ,comp ))return 1 ; 7663#endif 7664 7665// test tga last because it's a crappy test! 7666#ifndef STBI_NO_TGA 7667if (stbi__tga_info (s ,x ,y ,comp )) 7668return 1 ; 7669#endif 7670return stbi__err ("unknown image type" ,"Image not of any known type, or corrupt" ); 7671} 7672 7673static int stbi__is_16_main (stbi__context * s ) 7674{ 7675#ifndef STBI_NO_PNG 7676if (stbi__png_is16 (s ))return 1 ; 7677#endif 7678 7679#ifndef STBI_NO_PSD 7680if (stbi__psd_is16 (s ))return 1 ; 7681#endif 7682 7683#ifndef STBI_NO_PNM 7684if (stbi__pnm_is16 (s ))return 1 ; 7685#endif 7686return 0 ; 7687} 7688 7689#ifndef STBI_NO_STDIO 7690STBIDEF int stbi_info (char const * filename ,int * x ,int * y ,int * comp ) 7691{ 7692FILE * f = stbi__fopen (filename ,"rb" ); 7693int result ; 7694if (!f )return stbi__err ("can't fopen" ,"Unable to open file" ); 7695result = stbi_info_from_file (f ,x ,y ,comp ); 7696fclose (f ); 7697return result ; 7698} 7699 7700STBIDEF int stbi_info_from_file (FILE * f ,int * x ,int * y ,int * comp ) 7701{ 7702int r ; 7703stbi__context s ; 7704long pos = ftell (f ); 7705stbi__start_file (& s ,f ); 7706r = stbi__info_main (& s ,x ,y ,comp ); 7707fseek (f ,pos ,SEEK_SET ); 7708return r ; 7709} 7710 7711STBIDEF int stbi_is_16_bit (char const * filename ) 7712{ 7713FILE * f = stbi__fopen (filename ,"rb" ); 7714int result ; 7715if (!f )return stbi__err ("can't fopen" ,"Unable to open file" ); 7716result = stbi_is_16_bit_from_file (f ); 7717fclose (f ); 7718return result ; 7719} 7720 7721STBIDEF int stbi_is_16_bit_from_file (FILE * f ) 7722{ 7723int r ; 7724stbi__context s ; 7725long pos = ftell (f ); 7726stbi__start_file (& s ,f ); 7727r = stbi__is_16_main (& s ); 7728fseek (f ,pos ,SEEK_SET ); 7729return r ; 7730} 7731#endif // !STBI_NO_STDIO 7732 7733STBIDEF int stbi_info_from_memory (stbi_uc const * buffer ,int len ,int * x ,int * y ,int * comp ) 7734{ 7735stbi__context s ; 7736stbi__start_mem (& s ,buffer ,len ); 7737return stbi__info_main (& s ,x ,y ,comp ); 7738} 7739 7740STBIDEF int stbi_info_from_callbacks (stbi_io_callbacks const * c ,void * user ,int * x ,int * y ,int * comp ) 7741{ 7742stbi__context s ; 7743stbi__start_callbacks (& s , (stbi_io_callbacks * )c ,user ); 7744return stbi__info_main (& s ,x ,y ,comp ); 7745} 7746 7747STBIDEF int stbi_is_16_bit_from_memory (stbi_uc const * buffer ,int len ) 7748{ 7749stbi__context s ; 7750stbi__start_mem (& s ,buffer ,len ); 7751return stbi__is_16_main (& s ); 7752} 7753 7754STBIDEF int stbi_is_16_bit_from_callbacks (stbi_io_callbacks const * c ,void * user ) 7755{ 7756stbi__context s ; 7757stbi__start_callbacks (& s , (stbi_io_callbacks * )c ,user ); 7758return stbi__is_16_main (& s ); 7759} 7760 7761#endif // STB_IMAGE_IMPLEMENTATION 7762 7763/* 7764revision history: 77652.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs 77662.19 (2018-02-11) fix warning 77672.18 (2018-01-30) fix warnings 77682.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug 77691-bit BMP 7770*_is_16_bit api 7771avoid warnings 77722.16 (2017-07-23) all functions have 16-bit variants; 7773STBI_NO_STDIO works again; 7774compilation fixes; 7775fix rounding in unpremultiply; 7776optimize vertical flip; 7777disable raw_len validation; 7778documentation fixes 77792.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; 7780warning fixes; disable run-time SSE detection on gcc; 7781uniform handling of optional "return" values; 7782thread-safe initialization of zlib tables 77832.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs 77842.13 (2016-11-29) add 16-bit API, only supported for PNG right now 77852.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes 77862.11 (2016-04-02) allocate large structures on the stack 7787remove white matting for transparent PSD 7788fix reported channel count for PNG & BMP 7789re-enable SSE2 in non-gcc 64-bit 7790support RGB-formatted JPEG 7791read 16-bit PNGs (only as 8-bit) 77922.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED 77932.09 (2016-01-16) allow comments in PNM files 779416-bit-per-pixel TGA (not bit-per-component) 7795info() for TGA could break due to .hdr handling 7796info() for BMP to shares code instead of sloppy parse 7797can use STBI_REALLOC_SIZED if allocator doesn't support realloc 7798code cleanup 77992.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA 78002.07 (2015-09-13) fix compiler warnings 7801partial animated GIF support 7802limited 16-bpc PSD support 7803#ifdef unused functions 7804bug with < 92 byte PIC,PNM,HDR,TGA 78052.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value 78062.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning 78072.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit 78082.03 (2015-04-12) extra corruption checking (mmozeiko) 7809stbi_set_flip_vertically_on_load (nguillemot) 7810fix NEON support; fix mingw support 78112.02 (2015-01-19) fix incorrect assert, fix warning 78122.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 78132.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG 78142.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) 7815progressive JPEG (stb) 7816PGM/PPM support (Ken Miller) 7817STBI_MALLOC,STBI_REALLOC,STBI_FREE 7818GIF bugfix -- seemingly never worked 7819STBI_NO_*, STBI_ONLY_* 78201.48 (2014-12-14) fix incorrectly-named assert() 78211.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb) 7822optimize PNG (ryg) 7823fix bug in interlaced PNG with user-specified channel count (stb) 78241.46 (2014-08-26) 7825fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG 78261.45 (2014-08-16) 7827fix MSVC-ARM internal compiler error by wrapping malloc 78281.44 (2014-08-07) 7829various warning fixes from Ronny Chevalier 78301.43 (2014-07-15) 7831fix MSVC-only compiler problem in code changed in 1.42 78321.42 (2014-07-09) 7833don't define _CRT_SECURE_NO_WARNINGS (affects user code) 7834fixes to stbi__cleanup_jpeg path 7835added STBI_ASSERT to avoid requiring assert.h 78361.41 (2014-06-25) 7837fix search&replace from 1.36 that messed up comments/error messages 78381.40 (2014-06-22) 7839fix gcc struct-initialization warning 78401.39 (2014-06-15) 7841fix to TGA optimization when req_comp != number of components in TGA; 7842fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) 7843add support for BMP version 5 (more ignored fields) 78441.38 (2014-06-06) 7845suppress MSVC warnings on integer casts truncating values 7846fix accidental rename of 'skip' field of I/O 78471.37 (2014-06-04) 7848remove duplicate typedef 78491.36 (2014-06-03) 7850convert to header file single-file library 7851if de-iphone isn't set, load iphone images color-swapped instead of returning NULL 78521.35 (2014-05-27) 7853various warnings 7854fix broken STBI_SIMD path 7855fix bug where stbi_load_from_file no longer left file pointer in correct place 7856fix broken non-easy path for 32-bit BMP (possibly never used) 7857TGA optimization by Arseny Kapoulkine 78581.34 (unknown) 7859use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case 78601.33 (2011-07-14) 7861make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements 78621.32 (2011-07-13) 7863support for "info" function for all supported filetypes (SpartanJ) 78641.31 (2011-06-20) 7865a few more leak fixes, bug in PNG handling (SpartanJ) 78661.30 (2011-06-11) 7867added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) 7868removed deprecated format-specific test/load functions 7869removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway 7870error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) 7871fix inefficiency in decoding 32-bit BMP (David Woo) 78721.29 (2010-08-16) 7873various warning fixes from Aurelien Pocheville 78741.28 (2010-08-01) 7875fix bug in GIF palette transparency (SpartanJ) 78761.27 (2010-08-01) 7877cast-to-stbi_uc to fix warnings 78781.26 (2010-07-24) 7879fix bug in file buffering for PNG reported by SpartanJ 78801.25 (2010-07-17) 7881refix trans_data warning (Won Chun) 78821.24 (2010-07-12) 7883perf improvements reading from files on platforms with lock-heavy fgetc() 7884minor perf improvements for jpeg 7885deprecated type-specific functions so we'll get feedback if they're needed 7886attempt to fix trans_data warning (Won Chun) 78871.23 fixed bug in iPhone support 78881.22 (2010-07-10) 7889removed image *writing* support 7890stbi_info support from Jetro Lauha 7891GIF support from Jean-Marc Lienher 7892iPhone PNG-extensions from James Brown 7893warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva) 78941.21 fix use of 'stbi_uc' in header (reported by jon blow) 78951.20 added support for Softimage PIC, by Tom Seddon 78961.19 bug in interlaced PNG corruption check (found by ryg) 78971.18 (2008-08-02) 7898fix a threading bug (local mutable static) 78991.17 support interlaced PNG 79001.16 major bugfix - stbi__convert_format converted one too many pixels 79011.15 initialize some fields for thread safety 79021.14 fix threadsafe conversion bug 7903header-file-only version (#define STBI_HEADER_FILE_ONLY before including) 79041.13 threadsafe 79051.12 const qualifiers in the API 79061.11 Support installable IDCT, colorspace conversion routines 79071.10 Fixes for 64-bit (don't use "unsigned long") 7908optimized upsampling by Fabian "ryg" Giesen 79091.09 Fix format-conversion for PSD code (bad global variables!) 79101.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz 79111.07 attempt to fix C++ warning/errors again 79121.06 attempt to fix C++ warning/errors again 79131.05 fix TGA loading to return correct *comp and use good luminance calc 79141.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free 79151.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR 79161.02 support for (subset of) HDR files, float interface for preferred access to them 79171.01 fix bug: possible bug in handling right-side up bmps... not sure 7918fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all 79191.00 interface to zlib that skips zlib header 79200.99 correct handling of alpha in palette 79210.98 TGA loader by lonesock; dynamically add loaders (untested) 79220.97 jpeg errors on too large a file; also catch another malloc failure 79230.96 fix detection of invalid v value - particleman@mollyrocket forum 79240.95 during header scan, seek to markers in case of padding 79250.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same 79260.93 handle jpegtran output; verbose errors 79270.92 read 4,8,16,24,32-bit BMP files of several formats 79280.91 output 24-bit Windows 3.0 BMP files 79290.90 fix a few more warnings; bump version number to approach 1.0 79300.61 bugfixes due to Marc LeBlanc, Christopher Lloyd 79310.60 fix compiling as c++ 79320.59 fix warnings: merge Dave Moore's -Wall fixes 79330.58 fix bug: zlib uncompressed mode len/nlen was wrong endian 79340.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available 79350.56 fix bug: zlib uncompressed mode len vs. nlen 79360.55 fix bug: restart_interval not initialized to 0 79370.54 allow NULL for 'int *comp' 79380.53 fix bug in png 3->4; speedup png decoding 79390.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments 79400.51 obey req_comp requests, 1-component jpegs return as 1-component, 7941on 'test' only check type, not whether we support this variant 79420.50 (2006-11-19) 7943first released version 7944*/ 7945 7946 7947/* 7948------------------------------------------------------------------------------ 7949This software is available under 2 licenses -- choose whichever you prefer. 7950------------------------------------------------------------------------------ 7951ALTERNATIVE A - MIT License 7952Copyright (c) 2017 Sean Barrett 7953Permission is hereby granted, free of charge, to any person obtaining a copy of 7954this software and associated documentation files (the "Software"), to deal in 7955the Software without restriction, including without limitation the rights to 7956use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies 7957of the Software, and to permit persons to whom the Software is furnished to do 7958so, subject to the following conditions: 7959The above copyright notice and this permission notice shall be included in all 7960copies or substantial portions of the Software. 7961THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 7962IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 7963FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 7964AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 7965LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 7966OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 7967SOFTWARE. 7968------------------------------------------------------------------------------ 7969ALTERNATIVE B - Public Domain (www.unlicense.org) 7970This is free and unencumbered software released into the public domain. 7971Anyone is free to copy, modify, publish, use, compile, sell, or distribute this 7972software, either in source code form or as a compiled binary, for any purpose, 7973commercial or non-commercial, and by any means. 7974In jurisdictions that recognize copyright laws, the author or authors of this 7975software dedicate any and all copyright interest in the software to the public 7976domain. We make this dedication for the benefit of the public at large and to 7977the detriment of our heirs and successors. We intend this dedication to be an 7978overt act of relinquishment in perpetuity of all present and future rights to 7979this software under copyright law. 7980THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 7981IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 7982FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 7983AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN 7984ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 7985WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 7986------------------------------------------------------------------------------ 7987*/