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