Path: blob/a-new-beginning/SharedDependencies/Sources/stb/include/stb_image.h
2 views
/* stb_image - v2.23 - public domain image loader - http://nothings.org/stb1no warranty implied; use at your own risk23Do this:4#define STB_IMAGE_IMPLEMENTATION5before you include this file in *one* C or C++ file to create the implementation.67// i.e. it should look like this:8#include ...9#include ...10#include ...11#define STB_IMAGE_IMPLEMENTATION12#include "stb_image.h"1314You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.15And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free161718QUICK NOTES:19Primarily of interest to game developers and other people who can20avoid problematic images and only need the trivial interface2122JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)23PNG 1/2/4/8/16-bit-per-channel2425TGA (not sure what subset, if a subset)26BMP non-1bpp, non-RLE27PSD (composited view only, no extra channels, 8/16 bit-per-channel)2829GIF (*comp always reports as 4-channel)30HDR (radiance rgbE format)31PIC (Softimage PIC)32PNM (PPM and PGM binary only)3334Animated GIF still needs a proper API, but here's one way to do it:35http://gist.github.com/urraka/685d9a6340b26b830d493637- decode from memory or through FILE (define STBI_NO_STDIO to remove code)38- decode from arbitrary I/O callbacks39- SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)4041Full documentation under "DOCUMENTATION" below.424344LICENSE4546See end of file for license information.4748RECENT REVISION HISTORY:49502.23 (2019-08-11) fix clang static analysis warning512.22 (2019-03-04) gif fixes, fix warnings522.21 (2019-02-25) fix typo in comment532.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs542.19 (2018-02-11) fix warning552.18 (2018-01-30) fix warnings562.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings572.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes582.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC592.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs602.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes612.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes622.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x6463RGB-format JPEG; remove white matting in PSD;64allocate large structures on the stack;65correct channel count for PNG & BMP662.10 (2016-01-22) avoid warning introduced in 2.09672.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED6869See end of file for full revision history.707172============================ Contributors =========================7374Image formats Extensions, features75Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info)76Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info)77Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG)78Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks)79Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG)80Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip)81Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD)82github:urraka (animated gif) Junggon Kim (PNM comments)83Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA)84socks-the-fox (16-bit PNG)85Jeremy Sawicki (handle all ImageNet JPGs)86Optimizations & bugfixes Mikhail Morozov (1-bit BMP)87Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query)88Arseny Kapoulkine89John-Mark Allen90Carmelo J Fdez-Aguera9192Bug & warning fixes93Marc LeBlanc David Woo Guillaume George Martins Mozeiko94Christpher Lloyd Jerry Jansson Joseph Thomson Phil Jordan95Dave Moore Roy Eltham Hayaki Saito Nathan Reed96Won Chun Luke Graham Johan Duparc Nick Verigakis97the Horde3D community Thomas Ruf Ronny Chevalier github:rlyeh98Janez Zemva John Bartholomew Michal Cichon github:romigrou99Jonathan Blow Ken Hamada Tero Hanninen github:svdijk100Laurent Gomila Cort Stratton Sergio Gonzalez github:snagar101Aruelien Pocheville Thibault Reuille Cass Everitt github:Zelex102Ryamond Barbiero Paul Du Bois Engin Manap github:grim210103Aldo Culquicondor Philipp Wiesemann Dale Weiler github:sammyhw104Oriol Ferrer Mesia Josh Tobin Matthew Gregan github:phprus105Julian Raschke Gregory Mullen Baldur Karlsson github:poppolopoppo106Christian Floisand Kevin Schmidt JR Smith github:darealshinji107Blazej Dariusz Roszkowski github:Michaelangel007108*/109110#ifndef STBI_INCLUDE_STB_IMAGE_H111#define STBI_INCLUDE_STB_IMAGE_H112113// DOCUMENTATION114//115// Limitations:116// - no 12-bit-per-channel JPEG117// - no JPEGs with arithmetic coding118// - GIF always returns *comp=4119//120// Basic usage (see HDR discussion below for HDR usage):121// int x,y,n;122// unsigned char *data = stbi_load(filename, &x, &y, &n, 0);123// // ... process data if not NULL ...124// // ... x = width, y = height, n = # 8-bit components per pixel ...125// // ... replace '0' with '1'..'4' to force that many components per pixel126// // ... but 'n' will always be the number that it would have been if you said 0127// stbi_image_free(data)128//129// Standard parameters:130// int *x -- outputs image width in pixels131// int *y -- outputs image height in pixels132// int *channels_in_file -- outputs # of image components in image file133// int desired_channels -- if non-zero, # of image components requested in result134//135// The return value from an image loader is an 'unsigned char *' which points136// to the pixel data, or NULL on an allocation failure or if the image is137// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,138// with each pixel consisting of N interleaved 8-bit components; the first139// pixel pointed to is top-left-most in the image. There is no padding between140// image scanlines or between pixels, regardless of format. The number of141// components N is 'desired_channels' if desired_channels is non-zero, or142// *channels_in_file otherwise. If desired_channels is non-zero,143// *channels_in_file has the number of components that _would_ have been144// output otherwise. E.g. if you set desired_channels to 4, you will always145// get RGBA output, but you can check *channels_in_file to see if it's trivially146// opaque because e.g. there were only 3 channels in the source image.147//148// An output image with N components has the following components interleaved149// in this order in each pixel:150//151// N=#comp components152// 1 grey153// 2 grey, alpha154// 3 red, green, blue155// 4 red, green, blue, alpha156//157// If image loading fails for any reason, the return value will be NULL,158// and *x, *y, *channels_in_file will be unchanged. The function159// stbi_failure_reason() can be queried for an extremely brief, end-user160// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS161// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly162// more user-friendly ones.163//164// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.165//166// ===========================================================================167//168// UNICODE:169//170// If compiling for Windows and you wish to use Unicode filenames, compile171// with172// #define STBI_WINDOWS_UTF8173// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert174// Windows wchar_t filenames to utf8.175//176// ===========================================================================177//178// Philosophy179//180// stb libraries are designed with the following priorities:181//182// 1. easy to use183// 2. easy to maintain184// 3. good performance185//186// Sometimes I let "good performance" creep up in priority over "easy to maintain",187// and for best performance I may provide less-easy-to-use APIs that give higher188// performance, in addition to the easy-to-use ones. Nevertheless, it's important189// to keep in mind that from the standpoint of you, a client of this library,190// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.191//192// Some secondary priorities arise directly from the first two, some of which193// provide more explicit reasons why performance can't be emphasized.194//195// - Portable ("ease of use")196// - Small source code footprint ("easy to maintain")197// - No dependencies ("ease of use")198//199// ===========================================================================200//201// I/O callbacks202//203// I/O callbacks allow you to read from arbitrary sources, like packaged204// files or some other source. Data read from callbacks are processed205// through a small internal buffer (currently 128 bytes) to try to reduce206// overhead.207//208// The three functions you must define are "read" (reads some bytes of data),209// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).210//211// ===========================================================================212//213// SIMD support214//215// The JPEG decoder will try to automatically use SIMD kernels on x86 when216// supported by the compiler. For ARM Neon support, you must explicitly217// request it.218//219// (The old do-it-yourself SIMD API is no longer supported in the current220// code.)221//222// On x86, SSE2 will automatically be used when available based on a run-time223// test; if not, the generic C versions are used as a fall-back. On ARM targets,224// the typical path is to have separate builds for NEON and non-NEON devices225// (at least this is true for iOS and Android). Therefore, the NEON support is226// toggled by a build flag: define STBI_NEON to get NEON loops.227//228// If for some reason you do not want to use any of SIMD code, or if229// you have issues compiling it, you can disable it entirely by230// defining STBI_NO_SIMD.231//232// ===========================================================================233//234// HDR image support (disable by defining STBI_NO_HDR)235//236// stb_image supports loading HDR images in general, and currently the Radiance237// .HDR file format specifically. You can still load any file through the existing238// interface; if you attempt to load an HDR file, it will be automatically remapped239// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;240// both of these constants can be reconfigured through this interface:241//242// stbi_hdr_to_ldr_gamma(2.2f);243// stbi_hdr_to_ldr_scale(1.0f);244//245// (note, do not use _inverse_ constants; stbi_image will invert them246// appropriately).247//248// Additionally, there is a new, parallel interface for loading files as249// (linear) floats to preserve the full dynamic range:250//251// float *data = stbi_loadf(filename, &x, &y, &n, 0);252//253// If you load LDR images through this interface, those images will254// be promoted to floating point values, run through the inverse of255// constants corresponding to the above:256//257// stbi_ldr_to_hdr_scale(1.0f);258// stbi_ldr_to_hdr_gamma(2.2f);259//260// Finally, given a filename (or an open file or memory block--see header261// file for details) containing image data, you can query for the "most262// appropriate" interface to use (that is, whether the image is HDR or263// not), using:264//265// stbi_is_hdr(char *filename);266//267// ===========================================================================268//269// iPhone PNG support:270//271// By default we convert iphone-formatted PNGs back to RGB, even though272// they are internally encoded differently. You can disable this conversion273// by calling stbi_convert_iphone_png_to_rgb(0), in which case274// you will always just get the native iphone "format" through (which275// is BGR stored in RGB).276//277// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per278// pixel to remove any premultiplied alpha *only* if the image file explicitly279// says there's premultiplied data (currently only happens in iPhone images,280// and only if iPhone convert-to-rgb processing is on).281//282// ===========================================================================283//284// ADDITIONAL CONFIGURATION285//286// - You can suppress implementation of any of the decoders to reduce287// your code footprint by #defining one or more of the following288// symbols before creating the implementation.289//290// STBI_NO_JPEG291// STBI_NO_PNG292// STBI_NO_BMP293// STBI_NO_PSD294// STBI_NO_TGA295// STBI_NO_GIF296// STBI_NO_HDR297// STBI_NO_PIC298// STBI_NO_PNM (.ppm and .pgm)299//300// - You can request *only* certain decoders and suppress all other ones301// (this will be more forward-compatible, as addition of new decoders302// doesn't require you to disable them explicitly):303//304// STBI_ONLY_JPEG305// STBI_ONLY_PNG306// STBI_ONLY_BMP307// STBI_ONLY_PSD308// STBI_ONLY_TGA309// STBI_ONLY_GIF310// STBI_ONLY_HDR311// STBI_ONLY_PIC312// STBI_ONLY_PNM (.ppm and .pgm)313//314// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still315// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB316//317318319#ifndef STBI_NO_STDIO320#include <stdio.h>321#endif // STBI_NO_STDIO322323#define STBI_VERSION 1324325enum326{327STBI_default = 0, // only used for desired_channels328329STBI_grey = 1,330STBI_grey_alpha = 2,331STBI_rgb = 3,332STBI_rgb_alpha = 4333};334335#include <stdlib.h>336typedef unsigned char stbi_uc;337typedef unsigned short stbi_us;338339#ifdef __cplusplus340extern "C" {341#endif342343#ifndef STBIDEF344#ifdef STB_IMAGE_STATIC345#define STBIDEF static346#else347#define STBIDEF extern348#endif349#endif350351//////////////////////////////////////////////////////////////////////////////352//353// PRIMARY API - works on images of any type354//355356//357// load image by filename, open file, or memory buffer358//359360typedef struct361{362int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read363void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative364int (*eof) (void *user); // returns nonzero if we are at end of file/data365} stbi_io_callbacks;366367////////////////////////////////////368//369// 8-bits-per-channel interface370//371372STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);373STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels);374375#ifndef STBI_NO_STDIO376STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);377STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);378// for stbi_load_from_file, file pointer is left pointing immediately after image379#endif380381#ifndef STBI_NO_GIF382STBIDEF 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);383#endif384385#ifdef STBI_WINDOWS_UTF8386STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input);387#endif388389////////////////////////////////////390//391// 16-bits-per-channel interface392//393394STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);395STBIDEF 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);396397#ifndef STBI_NO_STDIO398STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);399STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);400#endif401402////////////////////////////////////403//404// float-per-channel interface405//406#ifndef STBI_NO_LINEAR407STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);408STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);409410#ifndef STBI_NO_STDIO411STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);412STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);413#endif414#endif415416#ifndef STBI_NO_HDR417STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);418STBIDEF void stbi_hdr_to_ldr_scale(float scale);419#endif // STBI_NO_HDR420421#ifndef STBI_NO_LINEAR422STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);423STBIDEF void stbi_ldr_to_hdr_scale(float scale);424#endif // STBI_NO_LINEAR425426// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR427STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);428STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);429#ifndef STBI_NO_STDIO430STBIDEF int stbi_is_hdr (char const *filename);431STBIDEF int stbi_is_hdr_from_file(FILE *f);432#endif // STBI_NO_STDIO433434435// get a VERY brief reason for failure436// NOT THREADSAFE437STBIDEF const char *stbi_failure_reason (void);438439// free the loaded image -- this is just free()440STBIDEF void stbi_image_free (void *retval_from_stbi_load);441442// get image dimensions & components without fully decoding443STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);444STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp);445STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len);446STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user);447448#ifndef STBI_NO_STDIO449STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp);450STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);451STBIDEF int stbi_is_16_bit (char const *filename);452STBIDEF int stbi_is_16_bit_from_file(FILE *f);453#endif454455456457// for image formats that explicitly notate that they have premultiplied alpha,458// we just return the colors as stored in the file. set this flag to force459// unpremultiplication. results are undefined if the unpremultiply overflow.460STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);461462// indicate whether we should process iphone images back to canonical format,463// or just pass them through "as-is"464STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);465466// flip the image vertically, so the first pixel in the output array is the bottom left467STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip);468469// ZLIB client - used by PNG, available for other purposes470471STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);472STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header);473STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);474STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);475476STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);477STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);478479480#ifdef __cplusplus481}482#endif483484//485//486//// end header file /////////////////////////////////////////////////////487#endif // STBI_INCLUDE_STB_IMAGE_H488489#ifdef STB_IMAGE_IMPLEMENTATION490491#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \492|| defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \493|| defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \494|| defined(STBI_ONLY_ZLIB)495#ifndef STBI_ONLY_JPEG496#define STBI_NO_JPEG497#endif498#ifndef STBI_ONLY_PNG499#define STBI_NO_PNG500#endif501#ifndef STBI_ONLY_BMP502#define STBI_NO_BMP503#endif504#ifndef STBI_ONLY_PSD505#define STBI_NO_PSD506#endif507#ifndef STBI_ONLY_TGA508#define STBI_NO_TGA509#endif510#ifndef STBI_ONLY_GIF511#define STBI_NO_GIF512#endif513#ifndef STBI_ONLY_HDR514#define STBI_NO_HDR515#endif516#ifndef STBI_ONLY_PIC517#define STBI_NO_PIC518#endif519#ifndef STBI_ONLY_PNM520#define STBI_NO_PNM521#endif522#endif523524#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)525#define STBI_NO_ZLIB526#endif527528529#include <stdarg.h>530#include <stddef.h> // ptrdiff_t on osx531#include <stdlib.h>532#include <string.h>533#include <limits.h>534535#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)536#include <math.h> // ldexp, pow537#endif538539#ifndef STBI_NO_STDIO540#include <stdio.h>541#endif542543#ifndef STBI_ASSERT544#include <assert.h>545#define STBI_ASSERT(x) assert(x)546#endif547548#ifdef __cplusplus549#define STBI_EXTERN extern "C"550#else551#define STBI_EXTERN extern552#endif553554555#ifndef _MSC_VER556#ifdef __cplusplus557#define stbi_inline inline558#else559#define stbi_inline560#endif561#else562#define stbi_inline __forceinline563#endif564565566#ifdef _MSC_VER567typedef unsigned short stbi__uint16;568typedef signed short stbi__int16;569typedef unsigned int stbi__uint32;570typedef signed int stbi__int32;571#else572#include <stdint.h>573typedef uint16_t stbi__uint16;574typedef int16_t stbi__int16;575typedef uint32_t stbi__uint32;576typedef int32_t stbi__int32;577#endif578579// should produce compiler error if size is wrong580typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1];581582#ifdef _MSC_VER583#define STBI_NOTUSED(v) (void)(v)584#else585#define STBI_NOTUSED(v) (void)sizeof(v)586#endif587588#ifdef _MSC_VER589#define STBI_HAS_LROTL590#endif591592#ifdef STBI_HAS_LROTL593#define stbi_lrot(x,y) _lrotl(x,y)594#else595#define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y))))596#endif597598#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED))599// ok600#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED)601// ok602#else603#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)."604#endif605606#ifndef STBI_MALLOC607#define STBI_MALLOC(sz) malloc(sz)608#define STBI_REALLOC(p,newsz) realloc(p,newsz)609#define STBI_FREE(p) free(p)610#endif611612#ifndef STBI_REALLOC_SIZED613#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz)614#endif615616// x86/x64 detection617#if defined(__x86_64__) || defined(_M_X64)618#define STBI__X64_TARGET619#elif defined(__i386) || defined(_M_IX86)620#define STBI__X86_TARGET621#endif622623#if defined(__GNUC__) && defined(STBI__X86_TARGET) && !defined(__SSE2__) && !defined(STBI_NO_SIMD)624// gcc doesn't support sse2 intrinsics unless you compile with -msse2,625// which in turn means it gets to use SSE2 everywhere. This is unfortunate,626// but previous attempts to provide the SSE2 functions with runtime627// detection caused numerous issues. The way architecture extensions are628// exposed in GCC/Clang is, sadly, not really suited for one-file libs.629// New behavior: if compiled with -msse2, we use SSE2 without any630// detection; if not, we don't use it at all.631#define STBI_NO_SIMD632#endif633634#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD)635// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET636//637// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the638// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant.639// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not640// simultaneously enabling "-mstackrealign".641//642// See https://github.com/nothings/stb/issues/81 for more information.643//644// So default to no SSE2 on 32-bit MinGW. If you've read this far and added645// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2.646#define STBI_NO_SIMD647#endif648649#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET))650#define STBI_SSE2651#include <emmintrin.h>652653#ifdef _MSC_VER654655#if _MSC_VER >= 1400 // not VC6656#include <intrin.h> // __cpuid657static int stbi__cpuid3(void)658{659int info[4];660__cpuid(info,1);661return info[3];662}663#else664static int stbi__cpuid3(void)665{666int res;667__asm {668mov eax,1669cpuid670mov res,edx671}672return res;673}674#endif675676#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name677678#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)679static int stbi__sse2_available(void)680{681int info3 = stbi__cpuid3();682return ((info3 >> 26) & 1) != 0;683}684#endif685686#else // assume GCC-style if not VC++687#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))688689#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2)690static int stbi__sse2_available(void)691{692// If we're even attempting to compile this on GCC/Clang, that means693// -msse2 is on, which means the compiler is allowed to use SSE2694// instructions at will, and so are we.695return 1;696}697#endif698699#endif700#endif701702// ARM NEON703#if defined(STBI_NO_SIMD) && defined(STBI_NEON)704#undef STBI_NEON705#endif706707#ifdef STBI_NEON708#include <arm_neon.h>709// assume GCC or Clang on ARM targets710#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16)))711#endif712713#ifndef STBI_SIMD_ALIGN714#define STBI_SIMD_ALIGN(type, name) type name715#endif716717///////////////////////////////////////////////718//719// stbi__context struct and start_xxx functions720721// stbi__context structure is our basic context used by all images, so it722// contains all the IO context, plus some basic image information723typedef struct724{725stbi__uint32 img_x, img_y;726int img_n, img_out_n;727728stbi_io_callbacks io;729void *io_user_data;730731int read_from_callbacks;732int buflen;733stbi_uc buffer_start[128];734735stbi_uc *img_buffer, *img_buffer_end;736stbi_uc *img_buffer_original, *img_buffer_original_end;737} stbi__context;738739740static void stbi__refill_buffer(stbi__context *s);741742// initialize a memory-decode context743static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len)744{745s->io.read = NULL;746s->read_from_callbacks = 0;747s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer;748s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len;749}750751// initialize a callback-based context752static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user)753{754s->io = *c;755s->io_user_data = user;756s->buflen = sizeof(s->buffer_start);757s->read_from_callbacks = 1;758s->img_buffer_original = s->buffer_start;759stbi__refill_buffer(s);760s->img_buffer_original_end = s->img_buffer_end;761}762763#ifndef STBI_NO_STDIO764765static int stbi__stdio_read(void *user, char *data, int size)766{767return (int) fread(data,1,size,(FILE*) user);768}769770static void stbi__stdio_skip(void *user, int n)771{772fseek((FILE*) user, n, SEEK_CUR);773}774775static int stbi__stdio_eof(void *user)776{777return feof((FILE*) user);778}779780static stbi_io_callbacks stbi__stdio_callbacks =781{782stbi__stdio_read,783stbi__stdio_skip,784stbi__stdio_eof,785};786787static void stbi__start_file(stbi__context *s, FILE *f)788{789stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f);790}791792//static void stop_file(stbi__context *s) { }793794#endif // !STBI_NO_STDIO795796static void stbi__rewind(stbi__context *s)797{798// conceptually rewind SHOULD rewind to the beginning of the stream,799// but we just rewind to the beginning of the initial buffer, because800// we only use it after doing 'test', which only ever looks at at most 92 bytes801s->img_buffer = s->img_buffer_original;802s->img_buffer_end = s->img_buffer_original_end;803}804805enum806{807STBI_ORDER_RGB,808STBI_ORDER_BGR809};810811typedef struct812{813int bits_per_channel;814int num_channels;815int channel_order;816} stbi__result_info;817818#ifndef STBI_NO_JPEG819static int stbi__jpeg_test(stbi__context *s);820static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);821static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);822#endif823824#ifndef STBI_NO_PNG825static int stbi__png_test(stbi__context *s);826static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);827static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);828static int stbi__png_is16(stbi__context *s);829#endif830831#ifndef STBI_NO_BMP832static int stbi__bmp_test(stbi__context *s);833static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);834static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);835#endif836837#ifndef STBI_NO_TGA838static int stbi__tga_test(stbi__context *s);839static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);840static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);841#endif842843#ifndef STBI_NO_PSD844static int stbi__psd_test(stbi__context *s);845static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc);846static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);847static int stbi__psd_is16(stbi__context *s);848#endif849850#ifndef STBI_NO_HDR851static int stbi__hdr_test(stbi__context *s);852static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);853static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);854#endif855856#ifndef STBI_NO_PIC857static int stbi__pic_test(stbi__context *s);858static void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);859static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);860#endif861862#ifndef STBI_NO_GIF863static int stbi__gif_test(stbi__context *s);864static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);865static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp);866static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);867#endif868869#ifndef STBI_NO_PNM870static int stbi__pnm_test(stbi__context *s);871static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri);872static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);873#endif874875// this is not threadsafe876static const char *stbi__g_failure_reason;877878STBIDEF const char *stbi_failure_reason(void)879{880return stbi__g_failure_reason;881}882883static int stbi__err(const char *str)884{885stbi__g_failure_reason = str;886return 0;887}888889static void *stbi__malloc(size_t size)890{891return STBI_MALLOC(size);892}893894// stb_image uses ints pervasively, including for offset calculations.895// therefore the largest decoded image size we can support with the896// current code, even on 64-bit targets, is INT_MAX. this is not a897// significant limitation for the intended use case.898//899// we do, however, need to make sure our size calculations don't900// overflow. hence a few helper functions for size calculations that901// multiply integers together, making sure that they're non-negative902// and no overflow occurs.903904// return 1 if the sum is valid, 0 on overflow.905// negative terms are considered invalid.906static int stbi__addsizes_valid(int a, int b)907{908if (b < 0) return 0;909// now 0 <= b <= INT_MAX, hence also910// 0 <= INT_MAX - b <= INTMAX.911// And "a + b <= INT_MAX" (which might overflow) is the912// same as a <= INT_MAX - b (no overflow)913return a <= INT_MAX - b;914}915916// returns 1 if the product is valid, 0 on overflow.917// negative factors are considered invalid.918static int stbi__mul2sizes_valid(int a, int b)919{920if (a < 0 || b < 0) return 0;921if (b == 0) return 1; // mul-by-0 is always safe922// portable way to check for no overflows in a*b923return a <= INT_MAX/b;924}925926// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow927static int stbi__mad2sizes_valid(int a, int b, int add)928{929return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add);930}931932// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow933static int stbi__mad3sizes_valid(int a, int b, int c, int add)934{935return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&936stbi__addsizes_valid(a*b*c, add);937}938939// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow940#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)941static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add)942{943return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) &&944stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add);945}946#endif947948// mallocs with size overflow checking949static void *stbi__malloc_mad2(int a, int b, int add)950{951if (!stbi__mad2sizes_valid(a, b, add)) return NULL;952return stbi__malloc(a*b + add);953}954955static void *stbi__malloc_mad3(int a, int b, int c, int add)956{957if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL;958return stbi__malloc(a*b*c + add);959}960961#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)962static void *stbi__malloc_mad4(int a, int b, int c, int d, int add)963{964if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL;965return stbi__malloc(a*b*c*d + add);966}967#endif968969// stbi__err - error970// stbi__errpf - error returning pointer to float971// stbi__errpuc - error returning pointer to unsigned char972973#ifdef STBI_NO_FAILURE_STRINGS974#define stbi__err(x,y) 0975#elif defined(STBI_FAILURE_USERMSG)976#define stbi__err(x,y) stbi__err(y)977#else978#define stbi__err(x,y) stbi__err(x)979#endif980981#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL))982#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL))983984STBIDEF void stbi_image_free(void *retval_from_stbi_load)985{986STBI_FREE(retval_from_stbi_load);987}988989#ifndef STBI_NO_LINEAR990static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);991#endif992993#ifndef STBI_NO_HDR994static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp);995#endif996997static int stbi__vertically_flip_on_load = 0;998999STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip)1000{1001stbi__vertically_flip_on_load = flag_true_if_should_flip;1002}10031004static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)1005{1006memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields1007ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed1008ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order1009ri->num_channels = 0;10101011#ifndef STBI_NO_JPEG1012if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri);1013#endif1014#ifndef STBI_NO_PNG1015if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri);1016#endif1017#ifndef STBI_NO_BMP1018if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri);1019#endif1020#ifndef STBI_NO_GIF1021if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri);1022#endif1023#ifndef STBI_NO_PSD1024if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc);1025#endif1026#ifndef STBI_NO_PIC1027if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri);1028#endif1029#ifndef STBI_NO_PNM1030if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri);1031#endif10321033#ifndef STBI_NO_HDR1034if (stbi__hdr_test(s)) {1035float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri);1036return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp);1037}1038#endif10391040#ifndef STBI_NO_TGA1041// test tga last because it's a crappy test!1042if (stbi__tga_test(s))1043return stbi__tga_load(s,x,y,comp,req_comp, ri);1044#endif10451046return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");1047}10481049static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels)1050{1051int i;1052int img_len = w * h * channels;1053stbi_uc *reduced;10541055reduced = (stbi_uc *) stbi__malloc(img_len);1056if (reduced == NULL) return stbi__errpuc("outofmem", "Out of memory");10571058for (i = 0; i < img_len; ++i)1059reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is sufficient approx of 16->8 bit scaling10601061STBI_FREE(orig);1062return reduced;1063}10641065static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels)1066{1067int i;1068int img_len = w * h * channels;1069stbi__uint16 *enlarged;10701071enlarged = (stbi__uint16 *) stbi__malloc(img_len*2);1072if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");10731074for (i = 0; i < img_len; ++i)1075enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff10761077STBI_FREE(orig);1078return enlarged;1079}10801081static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel)1082{1083int row;1084size_t bytes_per_row = (size_t)w * bytes_per_pixel;1085stbi_uc temp[2048];1086stbi_uc *bytes = (stbi_uc *)image;10871088for (row = 0; row < (h>>1); row++) {1089stbi_uc *row0 = bytes + row*bytes_per_row;1090stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row;1091// swap row0 with row11092size_t bytes_left = bytes_per_row;1093while (bytes_left) {1094size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp);1095memcpy(temp, row0, bytes_copy);1096memcpy(row0, row1, bytes_copy);1097memcpy(row1, temp, bytes_copy);1098row0 += bytes_copy;1099row1 += bytes_copy;1100bytes_left -= bytes_copy;1101}1102}1103}11041105#ifndef STBI_NO_GIF1106static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel)1107{1108int slice;1109int slice_size = w * h * bytes_per_pixel;11101111stbi_uc *bytes = (stbi_uc *)image;1112for (slice = 0; slice < z; ++slice) {1113stbi__vertical_flip(bytes, w, h, bytes_per_pixel);1114bytes += slice_size;1115}1116}1117#endif11181119static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)1120{1121stbi__result_info ri;1122void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8);11231124if (result == NULL)1125return NULL;11261127if (ri.bits_per_channel != 8) {1128STBI_ASSERT(ri.bits_per_channel == 16);1129result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp);1130ri.bits_per_channel = 8;1131}11321133// @TODO: move stbi__convert_format to here11341135if (stbi__vertically_flip_on_load) {1136int channels = req_comp ? req_comp : *comp;1137stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc));1138}11391140return (unsigned char *) result;1141}11421143static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp)1144{1145stbi__result_info ri;1146void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16);11471148if (result == NULL)1149return NULL;11501151if (ri.bits_per_channel != 16) {1152STBI_ASSERT(ri.bits_per_channel == 8);1153result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp);1154ri.bits_per_channel = 16;1155}11561157// @TODO: move stbi__convert_format16 to here1158// @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision11591160if (stbi__vertically_flip_on_load) {1161int channels = req_comp ? req_comp : *comp;1162stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16));1163}11641165return (stbi__uint16 *) result;1166}11671168#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR)1169static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp)1170{1171if (stbi__vertically_flip_on_load && result != NULL) {1172int channels = req_comp ? req_comp : *comp;1173stbi__vertical_flip(result, *x, *y, channels * sizeof(float));1174}1175}1176#endif11771178#ifndef STBI_NO_STDIO11791180#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)1181STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide);1182STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default);1183#endif11841185#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)1186STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input)1187{1188return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL);1189}1190#endif11911192static FILE *stbi__fopen(char const *filename, char const *mode)1193{1194FILE *f;1195#if defined(_MSC_VER) && defined(STBI_WINDOWS_UTF8)1196wchar_t wMode[64];1197wchar_t wFilename[1024];1198if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)))1199return 0;12001201if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)))1202return 0;12031204#if _MSC_VER >= 14001205if (0 != _wfopen_s(&f, wFilename, wMode))1206f = 0;1207#else1208f = _wfopen(wFilename, wMode);1209#endif12101211#elif defined(_MSC_VER) && _MSC_VER >= 14001212if (0 != fopen_s(&f, filename, mode))1213f=0;1214#else1215f = fopen(filename, mode);1216#endif1217return f;1218}121912201221STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp)1222{1223FILE *f = stbi__fopen(filename, "rb");1224unsigned char *result;1225if (!f) return stbi__errpuc("can't fopen", "Unable to open file");1226result = stbi_load_from_file(f,x,y,comp,req_comp);1227fclose(f);1228return result;1229}12301231STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)1232{1233unsigned char *result;1234stbi__context s;1235stbi__start_file(&s,f);1236result = stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);1237if (result) {1238// need to 'unget' all the characters in the IO buffer1239fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);1240}1241return result;1242}12431244STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp)1245{1246stbi__uint16 *result;1247stbi__context s;1248stbi__start_file(&s,f);1249result = stbi__load_and_postprocess_16bit(&s,x,y,comp,req_comp);1250if (result) {1251// need to 'unget' all the characters in the IO buffer1252fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR);1253}1254return result;1255}12561257STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp)1258{1259FILE *f = stbi__fopen(filename, "rb");1260stbi__uint16 *result;1261if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file");1262result = stbi_load_from_file_16(f,x,y,comp,req_comp);1263fclose(f);1264return result;1265}126612671268#endif //!STBI_NO_STDIO12691270STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels)1271{1272stbi__context s;1273stbi__start_mem(&s,buffer,len);1274return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);1275}12761277STBIDEF 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)1278{1279stbi__context s;1280stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user);1281return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels);1282}12831284STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)1285{1286stbi__context s;1287stbi__start_mem(&s,buffer,len);1288return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);1289}12901291STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)1292{1293stbi__context s;1294stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);1295return stbi__load_and_postprocess_8bit(&s,x,y,comp,req_comp);1296}12971298#ifndef STBI_NO_GIF1299STBIDEF 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)1300{1301unsigned char *result;1302stbi__context s;1303stbi__start_mem(&s,buffer,len);13041305result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp);1306if (stbi__vertically_flip_on_load) {1307stbi__vertical_flip_slices( result, *x, *y, *z, *comp );1308}13091310return result;1311}1312#endif13131314#ifndef STBI_NO_LINEAR1315static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)1316{1317unsigned char *data;1318#ifndef STBI_NO_HDR1319if (stbi__hdr_test(s)) {1320stbi__result_info ri;1321float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri);1322if (hdr_data)1323stbi__float_postprocess(hdr_data,x,y,comp,req_comp);1324return hdr_data;1325}1326#endif1327data = stbi__load_and_postprocess_8bit(s, x, y, comp, req_comp);1328if (data)1329return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp);1330return stbi__errpf("unknown image type", "Image not of any known type, or corrupt");1331}13321333STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp)1334{1335stbi__context s;1336stbi__start_mem(&s,buffer,len);1337return stbi__loadf_main(&s,x,y,comp,req_comp);1338}13391340STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp)1341{1342stbi__context s;1343stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);1344return stbi__loadf_main(&s,x,y,comp,req_comp);1345}13461347#ifndef STBI_NO_STDIO1348STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp)1349{1350float *result;1351FILE *f = stbi__fopen(filename, "rb");1352if (!f) return stbi__errpf("can't fopen", "Unable to open file");1353result = stbi_loadf_from_file(f,x,y,comp,req_comp);1354fclose(f);1355return result;1356}13571358STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp)1359{1360stbi__context s;1361stbi__start_file(&s,f);1362return stbi__loadf_main(&s,x,y,comp,req_comp);1363}1364#endif // !STBI_NO_STDIO13651366#endif // !STBI_NO_LINEAR13671368// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is1369// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always1370// reports false!13711372STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)1373{1374#ifndef STBI_NO_HDR1375stbi__context s;1376stbi__start_mem(&s,buffer,len);1377return stbi__hdr_test(&s);1378#else1379STBI_NOTUSED(buffer);1380STBI_NOTUSED(len);1381return 0;1382#endif1383}13841385#ifndef STBI_NO_STDIO1386STBIDEF int stbi_is_hdr (char const *filename)1387{1388FILE *f = stbi__fopen(filename, "rb");1389int result=0;1390if (f) {1391result = stbi_is_hdr_from_file(f);1392fclose(f);1393}1394return result;1395}13961397STBIDEF int stbi_is_hdr_from_file(FILE *f)1398{1399#ifndef STBI_NO_HDR1400long pos = ftell(f);1401int res;1402stbi__context s;1403stbi__start_file(&s,f);1404res = stbi__hdr_test(&s);1405fseek(f, pos, SEEK_SET);1406return res;1407#else1408STBI_NOTUSED(f);1409return 0;1410#endif1411}1412#endif // !STBI_NO_STDIO14131414STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user)1415{1416#ifndef STBI_NO_HDR1417stbi__context s;1418stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user);1419return stbi__hdr_test(&s);1420#else1421STBI_NOTUSED(clbk);1422STBI_NOTUSED(user);1423return 0;1424#endif1425}14261427#ifndef STBI_NO_LINEAR1428static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;14291430STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }1431STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }1432#endif14331434static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;14351436STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }1437STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }143814391440//////////////////////////////////////////////////////////////////////////////1441//1442// Common code used by all image loaders1443//14441445enum1446{1447STBI__SCAN_load=0,1448STBI__SCAN_type,1449STBI__SCAN_header1450};14511452static void stbi__refill_buffer(stbi__context *s)1453{1454int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen);1455if (n == 0) {1456// at end of file, treat same as if from memory, but need to handle case1457// where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file1458s->read_from_callbacks = 0;1459s->img_buffer = s->buffer_start;1460s->img_buffer_end = s->buffer_start+1;1461*s->img_buffer = 0;1462} else {1463s->img_buffer = s->buffer_start;1464s->img_buffer_end = s->buffer_start + n;1465}1466}14671468stbi_inline static stbi_uc stbi__get8(stbi__context *s)1469{1470if (s->img_buffer < s->img_buffer_end)1471return *s->img_buffer++;1472if (s->read_from_callbacks) {1473stbi__refill_buffer(s);1474return *s->img_buffer++;1475}1476return 0;1477}14781479stbi_inline static int stbi__at_eof(stbi__context *s)1480{1481if (s->io.read) {1482if (!(s->io.eof)(s->io_user_data)) return 0;1483// if feof() is true, check if buffer = end1484// special case: we've only got the special 0 character at the end1485if (s->read_from_callbacks == 0) return 1;1486}14871488return s->img_buffer >= s->img_buffer_end;1489}14901491static void stbi__skip(stbi__context *s, int n)1492{1493if (n < 0) {1494s->img_buffer = s->img_buffer_end;1495return;1496}1497if (s->io.read) {1498int blen = (int) (s->img_buffer_end - s->img_buffer);1499if (blen < n) {1500s->img_buffer = s->img_buffer_end;1501(s->io.skip)(s->io_user_data, n - blen);1502return;1503}1504}1505s->img_buffer += n;1506}15071508static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n)1509{1510if (s->io.read) {1511int blen = (int) (s->img_buffer_end - s->img_buffer);1512if (blen < n) {1513int res, count;15141515memcpy(buffer, s->img_buffer, blen);15161517count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen);1518res = (count == (n-blen));1519s->img_buffer = s->img_buffer_end;1520return res;1521}1522}15231524if (s->img_buffer+n <= s->img_buffer_end) {1525memcpy(buffer, s->img_buffer, n);1526s->img_buffer += n;1527return 1;1528} else1529return 0;1530}15311532static int stbi__get16be(stbi__context *s)1533{1534int z = stbi__get8(s);1535return (z << 8) + stbi__get8(s);1536}15371538static stbi__uint32 stbi__get32be(stbi__context *s)1539{1540stbi__uint32 z = stbi__get16be(s);1541return (z << 16) + stbi__get16be(s);1542}15431544#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF)1545// nothing1546#else1547static int stbi__get16le(stbi__context *s)1548{1549int z = stbi__get8(s);1550return z + (stbi__get8(s) << 8);1551}1552#endif15531554#ifndef STBI_NO_BMP1555static stbi__uint32 stbi__get32le(stbi__context *s)1556{1557stbi__uint32 z = stbi__get16le(s);1558return z + (stbi__get16le(s) << 16);1559}1560#endif15611562#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings156315641565//////////////////////////////////////////////////////////////////////////////1566//1567// generic converter from built-in img_n to req_comp1568// individual types do this automatically as much as possible (e.g. jpeg1569// does all cases internally since it needs to colorspace convert anyway,1570// and it never has alpha, so very few cases ). png can automatically1571// interleave an alpha=255 channel, but falls back to this for other cases1572//1573// assume data buffer is malloced, so malloc a new one and free that one1574// only failure mode is malloc failing15751576static stbi_uc stbi__compute_y(int r, int g, int b)1577{1578return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8);1579}15801581static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y)1582{1583int i,j;1584unsigned char *good;15851586if (req_comp == img_n) return data;1587STBI_ASSERT(req_comp >= 1 && req_comp <= 4);15881589good = (unsigned char *) stbi__malloc_mad3(req_comp, x, y, 0);1590if (good == NULL) {1591STBI_FREE(data);1592return stbi__errpuc("outofmem", "Out of memory");1593}15941595for (j=0; j < (int) y; ++j) {1596unsigned char *src = data + j * x * img_n ;1597unsigned char *dest = good + j * x * req_comp;15981599#define STBI__COMBO(a,b) ((a)*8+(b))1600#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)1601// convert source image with img_n components to one with req_comp components;1602// avoid switch per pixel, so use switch per scanline and massive macros1603switch (STBI__COMBO(img_n, req_comp)) {1604STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break;1605STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;1606STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break;1607STBI__CASE(2,1) { dest[0]=src[0]; } break;1608STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;1609STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;1610STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break;1611STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;1612STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break;1613STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break;1614STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break;1615STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;1616default: STBI_ASSERT(0);1617}1618#undef STBI__CASE1619}16201621STBI_FREE(data);1622return good;1623}16241625static stbi__uint16 stbi__compute_y_16(int r, int g, int b)1626{1627return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8);1628}16291630static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y)1631{1632int i,j;1633stbi__uint16 *good;16341635if (req_comp == img_n) return data;1636STBI_ASSERT(req_comp >= 1 && req_comp <= 4);16371638good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2);1639if (good == NULL) {1640STBI_FREE(data);1641return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory");1642}16431644for (j=0; j < (int) y; ++j) {1645stbi__uint16 *src = data + j * x * img_n ;1646stbi__uint16 *dest = good + j * x * req_comp;16471648#define STBI__COMBO(a,b) ((a)*8+(b))1649#define STBI__CASE(a,b) case STBI__COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b)1650// convert source image with img_n components to one with req_comp components;1651// avoid switch per pixel, so use switch per scanline and massive macros1652switch (STBI__COMBO(img_n, req_comp)) {1653STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break;1654STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;1655STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break;1656STBI__CASE(2,1) { dest[0]=src[0]; } break;1657STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break;1658STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break;1659STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break;1660STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;1661STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break;1662STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break;1663STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break;1664STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break;1665default: STBI_ASSERT(0);1666}1667#undef STBI__CASE1668}16691670STBI_FREE(data);1671return good;1672}16731674#ifndef STBI_NO_LINEAR1675static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)1676{1677int i,k,n;1678float *output;1679if (!data) return NULL;1680output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0);1681if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); }1682// compute number of non-alpha components1683if (comp & 1) n = comp; else n = comp-1;1684for (i=0; i < x*y; ++i) {1685for (k=0; k < n; ++k) {1686output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale);1687}1688}1689if (n < comp) {1690for (i=0; i < x*y; ++i) {1691output[i*comp + n] = data[i*comp + n]/255.0f;1692}1693}1694STBI_FREE(data);1695return output;1696}1697#endif16981699#ifndef STBI_NO_HDR1700#define stbi__float2int(x) ((int) (x))1701static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)1702{1703int i,k,n;1704stbi_uc *output;1705if (!data) return NULL;1706output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0);1707if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); }1708// compute number of non-alpha components1709if (comp & 1) n = comp; else n = comp-1;1710for (i=0; i < x*y; ++i) {1711for (k=0; k < n; ++k) {1712float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f;1713if (z < 0) z = 0;1714if (z > 255) z = 255;1715output[i*comp + k] = (stbi_uc) stbi__float2int(z);1716}1717if (k < comp) {1718float z = data[i*comp+k] * 255 + 0.5f;1719if (z < 0) z = 0;1720if (z > 255) z = 255;1721output[i*comp + k] = (stbi_uc) stbi__float2int(z);1722}1723}1724STBI_FREE(data);1725return output;1726}1727#endif17281729//////////////////////////////////////////////////////////////////////////////1730//1731// "baseline" JPEG/JFIF decoder1732//1733// simple implementation1734// - doesn't support delayed output of y-dimension1735// - simple interface (only one output format: 8-bit interleaved RGB)1736// - doesn't try to recover corrupt jpegs1737// - doesn't allow partial loading, loading multiple at once1738// - still fast on x86 (copying globals into locals doesn't help x86)1739// - allocates lots of intermediate memory (full size of all components)1740// - non-interleaved case requires this anyway1741// - allows good upsampling (see next)1742// high-quality1743// - upsampled channels are bilinearly interpolated, even across blocks1744// - quality integer IDCT derived from IJG's 'slow'1745// performance1746// - fast huffman; reasonable integer IDCT1747// - some SIMD kernels for common paths on targets with SSE2/NEON1748// - uses a lot of intermediate memory, could cache poorly17491750#ifndef STBI_NO_JPEG17511752// huffman decoding acceleration1753#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache17541755typedef struct1756{1757stbi_uc fast[1 << FAST_BITS];1758// weirdly, repacking this into AoS is a 10% speed loss, instead of a win1759stbi__uint16 code[256];1760stbi_uc values[256];1761stbi_uc size[257];1762unsigned int maxcode[18];1763int delta[17]; // old 'firstsymbol' - old 'firstcode'1764} stbi__huffman;17651766typedef struct1767{1768stbi__context *s;1769stbi__huffman huff_dc[4];1770stbi__huffman huff_ac[4];1771stbi__uint16 dequant[4][64];1772stbi__int16 fast_ac[4][1 << FAST_BITS];17731774// sizes for components, interleaved MCUs1775int img_h_max, img_v_max;1776int img_mcu_x, img_mcu_y;1777int img_mcu_w, img_mcu_h;17781779// definition of jpeg image component1780struct1781{1782int id;1783int h,v;1784int tq;1785int hd,ha;1786int dc_pred;17871788int x,y,w2,h2;1789stbi_uc *data;1790void *raw_data, *raw_coeff;1791stbi_uc *linebuf;1792short *coeff; // progressive only1793int coeff_w, coeff_h; // number of 8x8 coefficient blocks1794} img_comp[4];17951796stbi__uint32 code_buffer; // jpeg entropy-coded buffer1797int code_bits; // number of valid bits1798unsigned char marker; // marker seen while filling entropy buffer1799int nomore; // flag if we saw a marker so must stop18001801int progressive;1802int spec_start;1803int spec_end;1804int succ_high;1805int succ_low;1806int eob_run;1807int jfif;1808int app14_color_transform; // Adobe APP14 tag1809int rgb;18101811int scan_n, order[4];1812int restart_interval, todo;18131814// kernels1815void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]);1816void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step);1817stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs);1818} stbi__jpeg;18191820static int stbi__build_huffman(stbi__huffman *h, int *count)1821{1822int i,j,k=0;1823unsigned int code;1824// build size list for each symbol (from JPEG spec)1825for (i=0; i < 16; ++i)1826for (j=0; j < count[i]; ++j)1827h->size[k++] = (stbi_uc) (i+1);1828h->size[k] = 0;18291830// compute actual symbols (from jpeg spec)1831code = 0;1832k = 0;1833for(j=1; j <= 16; ++j) {1834// compute delta to add to code to compute symbol id1835h->delta[j] = k - code;1836if (h->size[k] == j) {1837while (h->size[k] == j)1838h->code[k++] = (stbi__uint16) (code++);1839if (code-1 >= (1u << j)) return stbi__err("bad code lengths","Corrupt JPEG");1840}1841// compute largest code + 1 for this size, preshifted as needed later1842h->maxcode[j] = code << (16-j);1843code <<= 1;1844}1845h->maxcode[j] = 0xffffffff;18461847// build non-spec acceleration table; 255 is flag for not-accelerated1848memset(h->fast, 255, 1 << FAST_BITS);1849for (i=0; i < k; ++i) {1850int s = h->size[i];1851if (s <= FAST_BITS) {1852int c = h->code[i] << (FAST_BITS-s);1853int m = 1 << (FAST_BITS-s);1854for (j=0; j < m; ++j) {1855h->fast[c+j] = (stbi_uc) i;1856}1857}1858}1859return 1;1860}18611862// build a table that decodes both magnitude and value of small ACs in1863// one go.1864static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h)1865{1866int i;1867for (i=0; i < (1 << FAST_BITS); ++i) {1868stbi_uc fast = h->fast[i];1869fast_ac[i] = 0;1870if (fast < 255) {1871int rs = h->values[fast];1872int run = (rs >> 4) & 15;1873int magbits = rs & 15;1874int len = h->size[fast];18751876if (magbits && len + magbits <= FAST_BITS) {1877// magnitude code followed by receive_extend code1878int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits);1879int m = 1 << (magbits - 1);1880if (k < m) k += (~0U << magbits) + 1;1881// if the result is small enough, we can fit it in fast_ac table1882if (k >= -128 && k <= 127)1883fast_ac[i] = (stbi__int16) ((k * 256) + (run * 16) + (len + magbits));1884}1885}1886}1887}18881889static void stbi__grow_buffer_unsafe(stbi__jpeg *j)1890{1891do {1892unsigned int b = j->nomore ? 0 : stbi__get8(j->s);1893if (b == 0xff) {1894int c = stbi__get8(j->s);1895while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes1896if (c != 0) {1897j->marker = (unsigned char) c;1898j->nomore = 1;1899return;1900}1901}1902j->code_buffer |= b << (24 - j->code_bits);1903j->code_bits += 8;1904} while (j->code_bits <= 24);1905}19061907// (1 << n) - 11908static const stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535};19091910// decode a jpeg huffman value from the bitstream1911stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h)1912{1913unsigned int temp;1914int c,k;19151916if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);19171918// look at the top FAST_BITS and determine what symbol ID it is,1919// if the code is <= FAST_BITS1920c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);1921k = h->fast[c];1922if (k < 255) {1923int s = h->size[k];1924if (s > j->code_bits)1925return -1;1926j->code_buffer <<= s;1927j->code_bits -= s;1928return h->values[k];1929}19301931// naive test is to shift the code_buffer down so k bits are1932// valid, then test against maxcode. To speed this up, we've1933// preshifted maxcode left so that it has (16-k) 0s at the1934// end; in other words, regardless of the number of bits, it1935// wants to be compared against something shifted to have 16;1936// that way we don't need to shift inside the loop.1937temp = j->code_buffer >> 16;1938for (k=FAST_BITS+1 ; ; ++k)1939if (temp < h->maxcode[k])1940break;1941if (k == 17) {1942// error! code not found1943j->code_bits -= 16;1944return -1;1945}19461947if (k > j->code_bits)1948return -1;19491950// convert the huffman code to the symbol id1951c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k];1952STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]);19531954// convert the id to a symbol1955j->code_bits -= k;1956j->code_buffer <<= k;1957return h->values[c];1958}19591960// bias[n] = (-1<<n) + 11961static const int stbi__jbias[16] = {0,-1,-3,-7,-15,-31,-63,-127,-255,-511,-1023,-2047,-4095,-8191,-16383,-32767};19621963// combined JPEG 'receive' and JPEG 'extend', since baseline1964// always extends everything it receives.1965stbi_inline static int stbi__extend_receive(stbi__jpeg *j, int n)1966{1967unsigned int k;1968int sgn;1969if (j->code_bits < n) stbi__grow_buffer_unsafe(j);19701971sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB1972k = stbi_lrot(j->code_buffer, n);1973STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask)));1974j->code_buffer = k & ~stbi__bmask[n];1975k &= stbi__bmask[n];1976j->code_bits -= n;1977return k + (stbi__jbias[n] & ~sgn);1978}19791980// get some unsigned bits1981stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n)1982{1983unsigned int k;1984if (j->code_bits < n) stbi__grow_buffer_unsafe(j);1985k = stbi_lrot(j->code_buffer, n);1986j->code_buffer = k & ~stbi__bmask[n];1987k &= stbi__bmask[n];1988j->code_bits -= n;1989return k;1990}19911992stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j)1993{1994unsigned int k;1995if (j->code_bits < 1) stbi__grow_buffer_unsafe(j);1996k = j->code_buffer;1997j->code_buffer <<= 1;1998--j->code_bits;1999return k & 0x80000000;2000}20012002// given a value that's at position X in the zigzag stream,2003// where does it appear in the 8x8 matrix coded as row-major?2004static const stbi_uc stbi__jpeg_dezigzag[64+15] =2005{20060, 1, 8, 16, 9, 2, 3, 10,200717, 24, 32, 25, 18, 11, 4, 5,200812, 19, 26, 33, 40, 48, 41, 34,200927, 20, 13, 6, 7, 14, 21, 28,201035, 42, 49, 56, 57, 50, 43, 36,201129, 22, 15, 23, 30, 37, 44, 51,201258, 59, 52, 45, 38, 31, 39, 46,201353, 60, 61, 54, 47, 55, 62, 63,2014// let corrupt input sample past end201563, 63, 63, 63, 63, 63, 63, 63,201663, 63, 63, 63, 63, 63, 632017};20182019// decode one 64-entry block--2020static 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)2021{2022int diff,dc,k;2023int t;20242025if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);2026t = stbi__jpeg_huff_decode(j, hdc);2027if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG");20282029// 0 all the ac values now so we can do it 32-bits at a time2030memset(data,0,64*sizeof(data[0]));20312032diff = t ? stbi__extend_receive(j, t) : 0;2033dc = j->img_comp[b].dc_pred + diff;2034j->img_comp[b].dc_pred = dc;2035data[0] = (short) (dc * dequant[0]);20362037// decode AC components, see JPEG spec2038k = 1;2039do {2040unsigned int zig;2041int c,r,s;2042if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);2043c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);2044r = fac[c];2045if (r) { // fast-AC path2046k += (r >> 4) & 15; // run2047s = r & 15; // combined length2048j->code_buffer <<= s;2049j->code_bits -= s;2050// decode into unzigzag'd location2051zig = stbi__jpeg_dezigzag[k++];2052data[zig] = (short) ((r >> 8) * dequant[zig]);2053} else {2054int rs = stbi__jpeg_huff_decode(j, hac);2055if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");2056s = rs & 15;2057r = rs >> 4;2058if (s == 0) {2059if (rs != 0xf0) break; // end block2060k += 16;2061} else {2062k += r;2063// decode into unzigzag'd location2064zig = stbi__jpeg_dezigzag[k++];2065data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]);2066}2067}2068} while (k < 64);2069return 1;2070}20712072static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b)2073{2074int diff,dc;2075int t;2076if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");20772078if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);20792080if (j->succ_high == 0) {2081// first scan for DC coefficient, must be first2082memset(data,0,64*sizeof(data[0])); // 0 all the ac values now2083t = stbi__jpeg_huff_decode(j, hdc);2084diff = t ? stbi__extend_receive(j, t) : 0;20852086dc = j->img_comp[b].dc_pred + diff;2087j->img_comp[b].dc_pred = dc;2088data[0] = (short) (dc << j->succ_low);2089} else {2090// refinement scan for DC coefficient2091if (stbi__jpeg_get_bit(j))2092data[0] += (short) (1 << j->succ_low);2093}2094return 1;2095}20962097// @OPTIMIZE: store non-zigzagged during the decode passes,2098// and only de-zigzag when dequantizing2099static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac)2100{2101int k;2102if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG");21032104if (j->succ_high == 0) {2105int shift = j->succ_low;21062107if (j->eob_run) {2108--j->eob_run;2109return 1;2110}21112112k = j->spec_start;2113do {2114unsigned int zig;2115int c,r,s;2116if (j->code_bits < 16) stbi__grow_buffer_unsafe(j);2117c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1);2118r = fac[c];2119if (r) { // fast-AC path2120k += (r >> 4) & 15; // run2121s = r & 15; // combined length2122j->code_buffer <<= s;2123j->code_bits -= s;2124zig = stbi__jpeg_dezigzag[k++];2125data[zig] = (short) ((r >> 8) << shift);2126} else {2127int rs = stbi__jpeg_huff_decode(j, hac);2128if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");2129s = rs & 15;2130r = rs >> 4;2131if (s == 0) {2132if (r < 15) {2133j->eob_run = (1 << r);2134if (r)2135j->eob_run += stbi__jpeg_get_bits(j, r);2136--j->eob_run;2137break;2138}2139k += 16;2140} else {2141k += r;2142zig = stbi__jpeg_dezigzag[k++];2143data[zig] = (short) (stbi__extend_receive(j,s) << shift);2144}2145}2146} while (k <= j->spec_end);2147} else {2148// refinement scan for these AC coefficients21492150short bit = (short) (1 << j->succ_low);21512152if (j->eob_run) {2153--j->eob_run;2154for (k = j->spec_start; k <= j->spec_end; ++k) {2155short *p = &data[stbi__jpeg_dezigzag[k]];2156if (*p != 0)2157if (stbi__jpeg_get_bit(j))2158if ((*p & bit)==0) {2159if (*p > 0)2160*p += bit;2161else2162*p -= bit;2163}2164}2165} else {2166k = j->spec_start;2167do {2168int r,s;2169int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh2170if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG");2171s = rs & 15;2172r = rs >> 4;2173if (s == 0) {2174if (r < 15) {2175j->eob_run = (1 << r) - 1;2176if (r)2177j->eob_run += stbi__jpeg_get_bits(j, r);2178r = 64; // force end of block2179} else {2180// r=15 s=0 should write 16 0s, so we just do2181// a run of 15 0s and then write s (which is 0),2182// so we don't have to do anything special here2183}2184} else {2185if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG");2186// sign bit2187if (stbi__jpeg_get_bit(j))2188s = bit;2189else2190s = -bit;2191}21922193// advance by r2194while (k <= j->spec_end) {2195short *p = &data[stbi__jpeg_dezigzag[k++]];2196if (*p != 0) {2197if (stbi__jpeg_get_bit(j))2198if ((*p & bit)==0) {2199if (*p > 0)2200*p += bit;2201else2202*p -= bit;2203}2204} else {2205if (r == 0) {2206*p = (short) s;2207break;2208}2209--r;2210}2211}2212} while (k <= j->spec_end);2213}2214}2215return 1;2216}22172218// take a -128..127 value and stbi__clamp it and convert to 0..2552219stbi_inline static stbi_uc stbi__clamp(int x)2220{2221// trick to use a single test to catch both cases2222if ((unsigned int) x > 255) {2223if (x < 0) return 0;2224if (x > 255) return 255;2225}2226return (stbi_uc) x;2227}22282229#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5)))2230#define stbi__fsh(x) ((x) * 4096)22312232// derived from jidctint -- DCT_ISLOW2233#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \2234int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \2235p2 = s2; \2236p3 = s6; \2237p1 = (p2+p3) * stbi__f2f(0.5411961f); \2238t2 = p1 + p3*stbi__f2f(-1.847759065f); \2239t3 = p1 + p2*stbi__f2f( 0.765366865f); \2240p2 = s0; \2241p3 = s4; \2242t0 = stbi__fsh(p2+p3); \2243t1 = stbi__fsh(p2-p3); \2244x0 = t0+t3; \2245x3 = t0-t3; \2246x1 = t1+t2; \2247x2 = t1-t2; \2248t0 = s7; \2249t1 = s5; \2250t2 = s3; \2251t3 = s1; \2252p3 = t0+t2; \2253p4 = t1+t3; \2254p1 = t0+t3; \2255p2 = t1+t2; \2256p5 = (p3+p4)*stbi__f2f( 1.175875602f); \2257t0 = t0*stbi__f2f( 0.298631336f); \2258t1 = t1*stbi__f2f( 2.053119869f); \2259t2 = t2*stbi__f2f( 3.072711026f); \2260t3 = t3*stbi__f2f( 1.501321110f); \2261p1 = p5 + p1*stbi__f2f(-0.899976223f); \2262p2 = p5 + p2*stbi__f2f(-2.562915447f); \2263p3 = p3*stbi__f2f(-1.961570560f); \2264p4 = p4*stbi__f2f(-0.390180644f); \2265t3 += p1+p4; \2266t2 += p2+p3; \2267t1 += p2+p4; \2268t0 += p1+p3;22692270static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64])2271{2272int i,val[64],*v=val;2273stbi_uc *o;2274short *d = data;22752276// columns2277for (i=0; i < 8; ++i,++d, ++v) {2278// if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing2279if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==02280&& d[40]==0 && d[48]==0 && d[56]==0) {2281// no shortcut 0 seconds2282// (1|2|3|4|5|6|7)==0 0 seconds2283// all separate -0.047 seconds2284// 1 && 2|3 && 4|5 && 6|7: -0.047 seconds2285int dcterm = d[0]*4;2286v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm;2287} else {2288STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56])2289// constants scaled things up by 1<<12; let's bring them back2290// down, but keep 2 extra bits of precision2291x0 += 512; x1 += 512; x2 += 512; x3 += 512;2292v[ 0] = (x0+t3) >> 10;2293v[56] = (x0-t3) >> 10;2294v[ 8] = (x1+t2) >> 10;2295v[48] = (x1-t2) >> 10;2296v[16] = (x2+t1) >> 10;2297v[40] = (x2-t1) >> 10;2298v[24] = (x3+t0) >> 10;2299v[32] = (x3-t0) >> 10;2300}2301}23022303for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) {2304// no fast case since the first 1D IDCT spread components out2305STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7])2306// constants scaled things up by 1<<12, plus we had 1<<2 from first2307// loop, plus horizontal and vertical each scale by sqrt(8) so together2308// we've got an extra 1<<3, so 1<<17 total we need to remove.2309// so we want to round that, which means adding 0.5 * 1<<17,2310// aka 65536. Also, we'll end up with -128 to 127 that we want2311// to encode as 0..255 by adding 128, so we'll add that before the shift2312x0 += 65536 + (128<<17);2313x1 += 65536 + (128<<17);2314x2 += 65536 + (128<<17);2315x3 += 65536 + (128<<17);2316// tried computing the shifts into temps, or'ing the temps to see2317// if any were out of range, but that was slower2318o[0] = stbi__clamp((x0+t3) >> 17);2319o[7] = stbi__clamp((x0-t3) >> 17);2320o[1] = stbi__clamp((x1+t2) >> 17);2321o[6] = stbi__clamp((x1-t2) >> 17);2322o[2] = stbi__clamp((x2+t1) >> 17);2323o[5] = stbi__clamp((x2-t1) >> 17);2324o[3] = stbi__clamp((x3+t0) >> 17);2325o[4] = stbi__clamp((x3-t0) >> 17);2326}2327}23282329#ifdef STBI_SSE22330// sse2 integer IDCT. not the fastest possible implementation but it2331// produces bit-identical results to the generic C version so it's2332// fully "transparent".2333static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])2334{2335// This is constructed to match our regular (generic) integer IDCT exactly.2336__m128i row0, row1, row2, row3, row4, row5, row6, row7;2337__m128i tmp;23382339// dot product constant: even elems=x, odd elems=y2340#define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y))23412342// out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit)2343// out(1) = c1[even]*x + c1[odd]*y2344#define dct_rot(out0,out1, x,y,c0,c1) \2345__m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \2346__m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \2347__m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \2348__m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \2349__m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \2350__m128i out1##_h = _mm_madd_epi16(c0##hi, c1)23512352// out = in << 12 (in 16-bit, out 32-bit)2353#define dct_widen(out, in) \2354__m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \2355__m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4)23562357// wide add2358#define dct_wadd(out, a, b) \2359__m128i out##_l = _mm_add_epi32(a##_l, b##_l); \2360__m128i out##_h = _mm_add_epi32(a##_h, b##_h)23612362// wide sub2363#define dct_wsub(out, a, b) \2364__m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \2365__m128i out##_h = _mm_sub_epi32(a##_h, b##_h)23662367// butterfly a/b, add bias, then shift by "s" and pack2368#define dct_bfly32o(out0, out1, a,b,bias,s) \2369{ \2370__m128i abiased_l = _mm_add_epi32(a##_l, bias); \2371__m128i abiased_h = _mm_add_epi32(a##_h, bias); \2372dct_wadd(sum, abiased, b); \2373dct_wsub(dif, abiased, b); \2374out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \2375out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \2376}23772378// 8-bit interleave step (for transposes)2379#define dct_interleave8(a, b) \2380tmp = a; \2381a = _mm_unpacklo_epi8(a, b); \2382b = _mm_unpackhi_epi8(tmp, b)23832384// 16-bit interleave step (for transposes)2385#define dct_interleave16(a, b) \2386tmp = a; \2387a = _mm_unpacklo_epi16(a, b); \2388b = _mm_unpackhi_epi16(tmp, b)23892390#define dct_pass(bias,shift) \2391{ \2392/* even part */ \2393dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \2394__m128i sum04 = _mm_add_epi16(row0, row4); \2395__m128i dif04 = _mm_sub_epi16(row0, row4); \2396dct_widen(t0e, sum04); \2397dct_widen(t1e, dif04); \2398dct_wadd(x0, t0e, t3e); \2399dct_wsub(x3, t0e, t3e); \2400dct_wadd(x1, t1e, t2e); \2401dct_wsub(x2, t1e, t2e); \2402/* odd part */ \2403dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \2404dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \2405__m128i sum17 = _mm_add_epi16(row1, row7); \2406__m128i sum35 = _mm_add_epi16(row3, row5); \2407dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \2408dct_wadd(x4, y0o, y4o); \2409dct_wadd(x5, y1o, y5o); \2410dct_wadd(x6, y2o, y5o); \2411dct_wadd(x7, y3o, y4o); \2412dct_bfly32o(row0,row7, x0,x7,bias,shift); \2413dct_bfly32o(row1,row6, x1,x6,bias,shift); \2414dct_bfly32o(row2,row5, x2,x5,bias,shift); \2415dct_bfly32o(row3,row4, x3,x4,bias,shift); \2416}24172418__m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f));2419__m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f));2420__m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f));2421__m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f));2422__m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f));2423__m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f));2424__m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f));2425__m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f));24262427// rounding biases in column/row passes, see stbi__idct_block for explanation.2428__m128i bias_0 = _mm_set1_epi32(512);2429__m128i bias_1 = _mm_set1_epi32(65536 + (128<<17));24302431// load2432row0 = _mm_load_si128((const __m128i *) (data + 0*8));2433row1 = _mm_load_si128((const __m128i *) (data + 1*8));2434row2 = _mm_load_si128((const __m128i *) (data + 2*8));2435row3 = _mm_load_si128((const __m128i *) (data + 3*8));2436row4 = _mm_load_si128((const __m128i *) (data + 4*8));2437row5 = _mm_load_si128((const __m128i *) (data + 5*8));2438row6 = _mm_load_si128((const __m128i *) (data + 6*8));2439row7 = _mm_load_si128((const __m128i *) (data + 7*8));24402441// column pass2442dct_pass(bias_0, 10);24432444{2445// 16bit 8x8 transpose pass 12446dct_interleave16(row0, row4);2447dct_interleave16(row1, row5);2448dct_interleave16(row2, row6);2449dct_interleave16(row3, row7);24502451// transpose pass 22452dct_interleave16(row0, row2);2453dct_interleave16(row1, row3);2454dct_interleave16(row4, row6);2455dct_interleave16(row5, row7);24562457// transpose pass 32458dct_interleave16(row0, row1);2459dct_interleave16(row2, row3);2460dct_interleave16(row4, row5);2461dct_interleave16(row6, row7);2462}24632464// row pass2465dct_pass(bias_1, 17);24662467{2468// pack2469__m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b72470__m128i p1 = _mm_packus_epi16(row2, row3);2471__m128i p2 = _mm_packus_epi16(row4, row5);2472__m128i p3 = _mm_packus_epi16(row6, row7);24732474// 8bit 8x8 transpose pass 12475dct_interleave8(p0, p2); // a0e0a1e1...2476dct_interleave8(p1, p3); // c0g0c1g1...24772478// transpose pass 22479dct_interleave8(p0, p1); // a0c0e0g0...2480dct_interleave8(p2, p3); // b0d0f0h0...24812482// transpose pass 32483dct_interleave8(p0, p2); // a0b0c0d0...2484dct_interleave8(p1, p3); // a4b4c4d4...24852486// store2487_mm_storel_epi64((__m128i *) out, p0); out += out_stride;2488_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride;2489_mm_storel_epi64((__m128i *) out, p2); out += out_stride;2490_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride;2491_mm_storel_epi64((__m128i *) out, p1); out += out_stride;2492_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride;2493_mm_storel_epi64((__m128i *) out, p3); out += out_stride;2494_mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e));2495}24962497#undef dct_const2498#undef dct_rot2499#undef dct_widen2500#undef dct_wadd2501#undef dct_wsub2502#undef dct_bfly32o2503#undef dct_interleave82504#undef dct_interleave162505#undef dct_pass2506}25072508#endif // STBI_SSE225092510#ifdef STBI_NEON25112512// NEON integer IDCT. should produce bit-identical2513// results to the generic C version.2514static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64])2515{2516int16x8_t row0, row1, row2, row3, row4, row5, row6, row7;25172518int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f));2519int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f));2520int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f));2521int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f));2522int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f));2523int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f));2524int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f));2525int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f));2526int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f));2527int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f));2528int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f));2529int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f));25302531#define dct_long_mul(out, inq, coeff) \2532int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \2533int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff)25342535#define dct_long_mac(out, acc, inq, coeff) \2536int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \2537int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff)25382539#define dct_widen(out, inq) \2540int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \2541int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12)25422543// wide add2544#define dct_wadd(out, a, b) \2545int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \2546int32x4_t out##_h = vaddq_s32(a##_h, b##_h)25472548// wide sub2549#define dct_wsub(out, a, b) \2550int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \2551int32x4_t out##_h = vsubq_s32(a##_h, b##_h)25522553// butterfly a/b, then shift using "shiftop" by "s" and pack2554#define dct_bfly32o(out0,out1, a,b,shiftop,s) \2555{ \2556dct_wadd(sum, a, b); \2557dct_wsub(dif, a, b); \2558out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \2559out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \2560}25612562#define dct_pass(shiftop, shift) \2563{ \2564/* even part */ \2565int16x8_t sum26 = vaddq_s16(row2, row6); \2566dct_long_mul(p1e, sum26, rot0_0); \2567dct_long_mac(t2e, p1e, row6, rot0_1); \2568dct_long_mac(t3e, p1e, row2, rot0_2); \2569int16x8_t sum04 = vaddq_s16(row0, row4); \2570int16x8_t dif04 = vsubq_s16(row0, row4); \2571dct_widen(t0e, sum04); \2572dct_widen(t1e, dif04); \2573dct_wadd(x0, t0e, t3e); \2574dct_wsub(x3, t0e, t3e); \2575dct_wadd(x1, t1e, t2e); \2576dct_wsub(x2, t1e, t2e); \2577/* odd part */ \2578int16x8_t sum15 = vaddq_s16(row1, row5); \2579int16x8_t sum17 = vaddq_s16(row1, row7); \2580int16x8_t sum35 = vaddq_s16(row3, row5); \2581int16x8_t sum37 = vaddq_s16(row3, row7); \2582int16x8_t sumodd = vaddq_s16(sum17, sum35); \2583dct_long_mul(p5o, sumodd, rot1_0); \2584dct_long_mac(p1o, p5o, sum17, rot1_1); \2585dct_long_mac(p2o, p5o, sum35, rot1_2); \2586dct_long_mul(p3o, sum37, rot2_0); \2587dct_long_mul(p4o, sum15, rot2_1); \2588dct_wadd(sump13o, p1o, p3o); \2589dct_wadd(sump24o, p2o, p4o); \2590dct_wadd(sump23o, p2o, p3o); \2591dct_wadd(sump14o, p1o, p4o); \2592dct_long_mac(x4, sump13o, row7, rot3_0); \2593dct_long_mac(x5, sump24o, row5, rot3_1); \2594dct_long_mac(x6, sump23o, row3, rot3_2); \2595dct_long_mac(x7, sump14o, row1, rot3_3); \2596dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \2597dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \2598dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \2599dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \2600}26012602// load2603row0 = vld1q_s16(data + 0*8);2604row1 = vld1q_s16(data + 1*8);2605row2 = vld1q_s16(data + 2*8);2606row3 = vld1q_s16(data + 3*8);2607row4 = vld1q_s16(data + 4*8);2608row5 = vld1q_s16(data + 5*8);2609row6 = vld1q_s16(data + 6*8);2610row7 = vld1q_s16(data + 7*8);26112612// add DC bias2613row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0));26142615// column pass2616dct_pass(vrshrn_n_s32, 10);26172618// 16bit 8x8 transpose2619{2620// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively.2621// whether compilers actually get this is another story, sadly.2622#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; }2623#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]); }2624#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)); }26252626// pass 12627dct_trn16(row0, row1); // a0b0a2b2a4b4a6b62628dct_trn16(row2, row3);2629dct_trn16(row4, row5);2630dct_trn16(row6, row7);26312632// pass 22633dct_trn32(row0, row2); // a0b0c0d0a4b4c4d42634dct_trn32(row1, row3);2635dct_trn32(row4, row6);2636dct_trn32(row5, row7);26372638// pass 32639dct_trn64(row0, row4); // a0b0c0d0e0f0g0h02640dct_trn64(row1, row5);2641dct_trn64(row2, row6);2642dct_trn64(row3, row7);26432644#undef dct_trn162645#undef dct_trn322646#undef dct_trn642647}26482649// row pass2650// vrshrn_n_s32 only supports shifts up to 16, we need2651// 17. so do a non-rounding shift of 16 first then follow2652// up with a rounding shift by 1.2653dct_pass(vshrn_n_s32, 16);26542655{2656// pack and round2657uint8x8_t p0 = vqrshrun_n_s16(row0, 1);2658uint8x8_t p1 = vqrshrun_n_s16(row1, 1);2659uint8x8_t p2 = vqrshrun_n_s16(row2, 1);2660uint8x8_t p3 = vqrshrun_n_s16(row3, 1);2661uint8x8_t p4 = vqrshrun_n_s16(row4, 1);2662uint8x8_t p5 = vqrshrun_n_s16(row5, 1);2663uint8x8_t p6 = vqrshrun_n_s16(row6, 1);2664uint8x8_t p7 = vqrshrun_n_s16(row7, 1);26652666// again, these can translate into one instruction, but often don't.2667#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; }2668#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]); }2669#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]); }26702671// sadly can't use interleaved stores here since we only write2672// 8 bytes to each scan line!26732674// 8x8 8-bit transpose pass 12675dct_trn8_8(p0, p1);2676dct_trn8_8(p2, p3);2677dct_trn8_8(p4, p5);2678dct_trn8_8(p6, p7);26792680// pass 22681dct_trn8_16(p0, p2);2682dct_trn8_16(p1, p3);2683dct_trn8_16(p4, p6);2684dct_trn8_16(p5, p7);26852686// pass 32687dct_trn8_32(p0, p4);2688dct_trn8_32(p1, p5);2689dct_trn8_32(p2, p6);2690dct_trn8_32(p3, p7);26912692// store2693vst1_u8(out, p0); out += out_stride;2694vst1_u8(out, p1); out += out_stride;2695vst1_u8(out, p2); out += out_stride;2696vst1_u8(out, p3); out += out_stride;2697vst1_u8(out, p4); out += out_stride;2698vst1_u8(out, p5); out += out_stride;2699vst1_u8(out, p6); out += out_stride;2700vst1_u8(out, p7);27012702#undef dct_trn8_82703#undef dct_trn8_162704#undef dct_trn8_322705}27062707#undef dct_long_mul2708#undef dct_long_mac2709#undef dct_widen2710#undef dct_wadd2711#undef dct_wsub2712#undef dct_bfly32o2713#undef dct_pass2714}27152716#endif // STBI_NEON27172718#define STBI__MARKER_none 0xff2719// if there's a pending marker from the entropy stream, return that2720// otherwise, fetch from the stream and get a marker. if there's no2721// marker, return 0xff, which is never a valid marker value2722static stbi_uc stbi__get_marker(stbi__jpeg *j)2723{2724stbi_uc x;2725if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; }2726x = stbi__get8(j->s);2727if (x != 0xff) return STBI__MARKER_none;2728while (x == 0xff)2729x = stbi__get8(j->s); // consume repeated 0xff fill bytes2730return x;2731}27322733// in each scan, we'll have scan_n components, and the order2734// of the components is specified by order[]2735#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7)27362737// after a restart interval, stbi__jpeg_reset the entropy decoder and2738// the dc prediction2739static void stbi__jpeg_reset(stbi__jpeg *j)2740{2741j->code_bits = 0;2742j->code_buffer = 0;2743j->nomore = 0;2744j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = j->img_comp[3].dc_pred = 0;2745j->marker = STBI__MARKER_none;2746j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff;2747j->eob_run = 0;2748// no more than 1<<31 MCUs if no restart_interal? that's plenty safe,2749// since we don't even allow 1<<30 pixels2750}27512752static int stbi__parse_entropy_coded_data(stbi__jpeg *z)2753{2754stbi__jpeg_reset(z);2755if (!z->progressive) {2756if (z->scan_n == 1) {2757int i,j;2758STBI_SIMD_ALIGN(short, data[64]);2759int n = z->order[0];2760// non-interleaved data, we just need to process one block at a time,2761// in trivial scanline order2762// number of blocks to do just depends on how many actual "pixels" this2763// component has, independent of interleaved MCU blocking and such2764int w = (z->img_comp[n].x+7) >> 3;2765int h = (z->img_comp[n].y+7) >> 3;2766for (j=0; j < h; ++j) {2767for (i=0; i < w; ++i) {2768int ha = z->img_comp[n].ha;2769if (!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;2770z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);2771// every data block is an MCU, so countdown the restart interval2772if (--z->todo <= 0) {2773if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);2774// if it's NOT a restart, then just bail, so we get corrupt data2775// rather than no data2776if (!STBI__RESTART(z->marker)) return 1;2777stbi__jpeg_reset(z);2778}2779}2780}2781return 1;2782} else { // interleaved2783int i,j,k,x,y;2784STBI_SIMD_ALIGN(short, data[64]);2785for (j=0; j < z->img_mcu_y; ++j) {2786for (i=0; i < z->img_mcu_x; ++i) {2787// scan an interleaved mcu... process scan_n components in order2788for (k=0; k < z->scan_n; ++k) {2789int n = z->order[k];2790// scan out an mcu's worth of this component; that's just determined2791// by the basic H and V specified for the component2792for (y=0; y < z->img_comp[n].v; ++y) {2793for (x=0; x < z->img_comp[n].h; ++x) {2794int x2 = (i*z->img_comp[n].h + x)*8;2795int y2 = (j*z->img_comp[n].v + y)*8;2796int ha = z->img_comp[n].ha;2797if (!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;2798z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data);2799}2800}2801}2802// after all interleaved components, that's an interleaved MCU,2803// so now count down the restart interval2804if (--z->todo <= 0) {2805if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);2806if (!STBI__RESTART(z->marker)) return 1;2807stbi__jpeg_reset(z);2808}2809}2810}2811return 1;2812}2813} else {2814if (z->scan_n == 1) {2815int i,j;2816int n = z->order[0];2817// non-interleaved data, we just need to process one block at a time,2818// in trivial scanline order2819// number of blocks to do just depends on how many actual "pixels" this2820// component has, independent of interleaved MCU blocking and such2821int w = (z->img_comp[n].x+7) >> 3;2822int h = (z->img_comp[n].y+7) >> 3;2823for (j=0; j < h; ++j) {2824for (i=0; i < w; ++i) {2825short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);2826if (z->spec_start == 0) {2827if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))2828return 0;2829} else {2830int ha = z->img_comp[n].ha;2831if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha]))2832return 0;2833}2834// every data block is an MCU, so countdown the restart interval2835if (--z->todo <= 0) {2836if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);2837if (!STBI__RESTART(z->marker)) return 1;2838stbi__jpeg_reset(z);2839}2840}2841}2842return 1;2843} else { // interleaved2844int i,j,k,x,y;2845for (j=0; j < z->img_mcu_y; ++j) {2846for (i=0; i < z->img_mcu_x; ++i) {2847// scan an interleaved mcu... process scan_n components in order2848for (k=0; k < z->scan_n; ++k) {2849int n = z->order[k];2850// scan out an mcu's worth of this component; that's just determined2851// by the basic H and V specified for the component2852for (y=0; y < z->img_comp[n].v; ++y) {2853for (x=0; x < z->img_comp[n].h; ++x) {2854int x2 = (i*z->img_comp[n].h + x);2855int y2 = (j*z->img_comp[n].v + y);2856short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w);2857if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n))2858return 0;2859}2860}2861}2862// after all interleaved components, that's an interleaved MCU,2863// so now count down the restart interval2864if (--z->todo <= 0) {2865if (z->code_bits < 24) stbi__grow_buffer_unsafe(z);2866if (!STBI__RESTART(z->marker)) return 1;2867stbi__jpeg_reset(z);2868}2869}2870}2871return 1;2872}2873}2874}28752876static void stbi__jpeg_dequantize(short *data, stbi__uint16 *dequant)2877{2878int i;2879for (i=0; i < 64; ++i)2880data[i] *= dequant[i];2881}28822883static void stbi__jpeg_finish(stbi__jpeg *z)2884{2885if (z->progressive) {2886// dequantize and idct the data2887int i,j,n;2888for (n=0; n < z->s->img_n; ++n) {2889int w = (z->img_comp[n].x+7) >> 3;2890int h = (z->img_comp[n].y+7) >> 3;2891for (j=0; j < h; ++j) {2892for (i=0; i < w; ++i) {2893short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w);2894stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]);2895z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data);2896}2897}2898}2899}2900}29012902static int stbi__process_marker(stbi__jpeg *z, int m)2903{2904int L;2905switch (m) {2906case STBI__MARKER_none: // no marker found2907return stbi__err("expected marker","Corrupt JPEG");29082909case 0xDD: // DRI - specify restart interval2910if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG");2911z->restart_interval = stbi__get16be(z->s);2912return 1;29132914case 0xDB: // DQT - define quantization table2915L = stbi__get16be(z->s)-2;2916while (L > 0) {2917int q = stbi__get8(z->s);2918int p = q >> 4, sixteen = (p != 0);2919int t = q & 15,i;2920if (p != 0 && p != 1) return stbi__err("bad DQT type","Corrupt JPEG");2921if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG");29222923for (i=0; i < 64; ++i)2924z->dequant[t][stbi__jpeg_dezigzag[i]] = (stbi__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s));2925L -= (sixteen ? 129 : 65);2926}2927return L==0;29282929case 0xC4: // DHT - define huffman table2930L = stbi__get16be(z->s)-2;2931while (L > 0) {2932stbi_uc *v;2933int sizes[16],i,n=0;2934int q = stbi__get8(z->s);2935int tc = q >> 4;2936int th = q & 15;2937if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG");2938for (i=0; i < 16; ++i) {2939sizes[i] = stbi__get8(z->s);2940n += sizes[i];2941}2942L -= 17;2943if (tc == 0) {2944if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0;2945v = z->huff_dc[th].values;2946} else {2947if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0;2948v = z->huff_ac[th].values;2949}2950for (i=0; i < n; ++i)2951v[i] = stbi__get8(z->s);2952if (tc != 0)2953stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th);2954L -= n;2955}2956return L==0;2957}29582959// check for comment block or APP blocks2960if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) {2961L = stbi__get16be(z->s);2962if (L < 2) {2963if (m == 0xFE)2964return stbi__err("bad COM len","Corrupt JPEG");2965else2966return stbi__err("bad APP len","Corrupt JPEG");2967}2968L -= 2;29692970if (m == 0xE0 && L >= 5) { // JFIF APP0 segment2971static const unsigned char tag[5] = {'J','F','I','F','\0'};2972int ok = 1;2973int i;2974for (i=0; i < 5; ++i)2975if (stbi__get8(z->s) != tag[i])2976ok = 0;2977L -= 5;2978if (ok)2979z->jfif = 1;2980} else if (m == 0xEE && L >= 12) { // Adobe APP14 segment2981static const unsigned char tag[6] = {'A','d','o','b','e','\0'};2982int ok = 1;2983int i;2984for (i=0; i < 6; ++i)2985if (stbi__get8(z->s) != tag[i])2986ok = 0;2987L -= 6;2988if (ok) {2989stbi__get8(z->s); // version2990stbi__get16be(z->s); // flags02991stbi__get16be(z->s); // flags12992z->app14_color_transform = stbi__get8(z->s); // color transform2993L -= 6;2994}2995}29962997stbi__skip(z->s, L);2998return 1;2999}30003001return stbi__err("unknown marker","Corrupt JPEG");3002}30033004// after we see SOS3005static int stbi__process_scan_header(stbi__jpeg *z)3006{3007int i;3008int Ls = stbi__get16be(z->s);3009z->scan_n = stbi__get8(z->s);3010if (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");3011if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG");3012for (i=0; i < z->scan_n; ++i) {3013int id = stbi__get8(z->s), which;3014int q = stbi__get8(z->s);3015for (which = 0; which < z->s->img_n; ++which)3016if (z->img_comp[which].id == id)3017break;3018if (which == z->s->img_n) return 0; // no match3019z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG");3020z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG");3021z->order[i] = which;3022}30233024{3025int aa;3026z->spec_start = stbi__get8(z->s);3027z->spec_end = stbi__get8(z->s); // should be 63, but might be 03028aa = stbi__get8(z->s);3029z->succ_high = (aa >> 4);3030z->succ_low = (aa & 15);3031if (z->progressive) {3032if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13)3033return stbi__err("bad SOS", "Corrupt JPEG");3034} else {3035if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG");3036if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG");3037z->spec_end = 63;3038}3039}30403041return 1;3042}30433044static int stbi__free_jpeg_components(stbi__jpeg *z, int ncomp, int why)3045{3046int i;3047for (i=0; i < ncomp; ++i) {3048if (z->img_comp[i].raw_data) {3049STBI_FREE(z->img_comp[i].raw_data);3050z->img_comp[i].raw_data = NULL;3051z->img_comp[i].data = NULL;3052}3053if (z->img_comp[i].raw_coeff) {3054STBI_FREE(z->img_comp[i].raw_coeff);3055z->img_comp[i].raw_coeff = 0;3056z->img_comp[i].coeff = 0;3057}3058if (z->img_comp[i].linebuf) {3059STBI_FREE(z->img_comp[i].linebuf);3060z->img_comp[i].linebuf = NULL;3061}3062}3063return why;3064}30653066static int stbi__process_frame_header(stbi__jpeg *z, int scan)3067{3068stbi__context *s = z->s;3069int Lf,p,i,q, h_max=1,v_max=1,c;3070Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG3071p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline3072s->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 IJG3073s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires3074c = stbi__get8(s);3075if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG");3076s->img_n = c;3077for (i=0; i < c; ++i) {3078z->img_comp[i].data = NULL;3079z->img_comp[i].linebuf = NULL;3080}30813082if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG");30833084z->rgb = 0;3085for (i=0; i < s->img_n; ++i) {3086static const unsigned char rgb[3] = { 'R', 'G', 'B' };3087z->img_comp[i].id = stbi__get8(s);3088if (s->img_n == 3 && z->img_comp[i].id == rgb[i])3089++z->rgb;3090q = stbi__get8(s);3091z->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");3092z->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");3093z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG");3094}30953096if (scan != STBI__SCAN_load) return 1;30973098if (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) return stbi__err("too large", "Image too large to decode");30993100for (i=0; i < s->img_n; ++i) {3101if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h;3102if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v;3103}31043105// compute interleaved mcu info3106z->img_h_max = h_max;3107z->img_v_max = v_max;3108z->img_mcu_w = h_max * 8;3109z->img_mcu_h = v_max * 8;3110// these sizes can't be more than 17 bits3111z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w;3112z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h;31133114for (i=0; i < s->img_n; ++i) {3115// number of effective pixels (e.g. for non-interleaved MCU)3116z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max;3117z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max;3118// to simplify generation, we'll allocate enough memory to decode3119// the bogus oversized data from using interleaved MCUs and their3120// big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't3121// discard the extra data until colorspace conversion3122//3123// img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier)3124// so these muls can't overflow with 32-bit ints (which we require)3125z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8;3126z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8;3127z->img_comp[i].coeff = 0;3128z->img_comp[i].raw_coeff = 0;3129z->img_comp[i].linebuf = NULL;3130z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15);3131if (z->img_comp[i].raw_data == NULL)3132return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));3133// align blocks for idct using mmx/sse3134z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15);3135if (z->progressive) {3136// w2, h2 are multiples of 8 (see above)3137z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8;3138z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8;3139z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15);3140if (z->img_comp[i].raw_coeff == NULL)3141return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory"));3142z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15);3143}3144}31453146return 1;3147}31483149// use comparisons since in some cases we handle more than one case (e.g. SOF)3150#define stbi__DNL(x) ((x) == 0xdc)3151#define stbi__SOI(x) ((x) == 0xd8)3152#define stbi__EOI(x) ((x) == 0xd9)3153#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2)3154#define stbi__SOS(x) ((x) == 0xda)31553156#define stbi__SOF_progressive(x) ((x) == 0xc2)31573158static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan)3159{3160int m;3161z->jfif = 0;3162z->app14_color_transform = -1; // valid values are 0,1,23163z->marker = STBI__MARKER_none; // initialize cached marker to empty3164m = stbi__get_marker(z);3165if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG");3166if (scan == STBI__SCAN_type) return 1;3167m = stbi__get_marker(z);3168while (!stbi__SOF(m)) {3169if (!stbi__process_marker(z,m)) return 0;3170m = stbi__get_marker(z);3171while (m == STBI__MARKER_none) {3172// some files have extra padding after their blocks, so ok, we'll scan3173if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG");3174m = stbi__get_marker(z);3175}3176}3177z->progressive = stbi__SOF_progressive(m);3178if (!stbi__process_frame_header(z, scan)) return 0;3179return 1;3180}31813182// decode image to YCbCr format3183static int stbi__decode_jpeg_image(stbi__jpeg *j)3184{3185int m;3186for (m = 0; m < 4; m++) {3187j->img_comp[m].raw_data = NULL;3188j->img_comp[m].raw_coeff = NULL;3189}3190j->restart_interval = 0;3191if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0;3192m = stbi__get_marker(j);3193while (!stbi__EOI(m)) {3194if (stbi__SOS(m)) {3195if (!stbi__process_scan_header(j)) return 0;3196if (!stbi__parse_entropy_coded_data(j)) return 0;3197if (j->marker == STBI__MARKER_none ) {3198// handle 0s at the end of image data from IP Kamera 90603199while (!stbi__at_eof(j->s)) {3200int x = stbi__get8(j->s);3201if (x == 255) {3202j->marker = stbi__get8(j->s);3203break;3204}3205}3206// if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 03207}3208} else if (stbi__DNL(m)) {3209int Ld = stbi__get16be(j->s);3210stbi__uint32 NL = stbi__get16be(j->s);3211if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG");3212if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG");3213} else {3214if (!stbi__process_marker(j, m)) return 0;3215}3216m = stbi__get_marker(j);3217}3218if (j->progressive)3219stbi__jpeg_finish(j);3220return 1;3221}32223223// static jfif-centered resampling (across block boundaries)32243225typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1,3226int w, int hs);32273228#define stbi__div4(x) ((stbi_uc) ((x) >> 2))32293230static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)3231{3232STBI_NOTUSED(out);3233STBI_NOTUSED(in_far);3234STBI_NOTUSED(w);3235STBI_NOTUSED(hs);3236return in_near;3237}32383239static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)3240{3241// need to generate two samples vertically for every one in input3242int i;3243STBI_NOTUSED(hs);3244for (i=0; i < w; ++i)3245out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2);3246return out;3247}32483249static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)3250{3251// need to generate two samples horizontally for every one in input3252int i;3253stbi_uc *input = in_near;32543255if (w == 1) {3256// if only one sample, can't do any interpolation3257out[0] = out[1] = input[0];3258return out;3259}32603261out[0] = input[0];3262out[1] = stbi__div4(input[0]*3 + input[1] + 2);3263for (i=1; i < w-1; ++i) {3264int n = 3*input[i]+2;3265out[i*2+0] = stbi__div4(n+input[i-1]);3266out[i*2+1] = stbi__div4(n+input[i+1]);3267}3268out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2);3269out[i*2+1] = input[w-1];32703271STBI_NOTUSED(in_far);3272STBI_NOTUSED(hs);32733274return out;3275}32763277#define stbi__div16(x) ((stbi_uc) ((x) >> 4))32783279static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)3280{3281// need to generate 2x2 samples for every one in input3282int i,t0,t1;3283if (w == 1) {3284out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);3285return out;3286}32873288t1 = 3*in_near[0] + in_far[0];3289out[0] = stbi__div4(t1+2);3290for (i=1; i < w; ++i) {3291t0 = t1;3292t1 = 3*in_near[i]+in_far[i];3293out[i*2-1] = stbi__div16(3*t0 + t1 + 8);3294out[i*2 ] = stbi__div16(3*t1 + t0 + 8);3295}3296out[w*2-1] = stbi__div4(t1+2);32973298STBI_NOTUSED(hs);32993300return out;3301}33023303#if defined(STBI_SSE2) || defined(STBI_NEON)3304static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)3305{3306// need to generate 2x2 samples for every one in input3307int i=0,t0,t1;33083309if (w == 1) {3310out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2);3311return out;3312}33133314t1 = 3*in_near[0] + in_far[0];3315// process groups of 8 pixels for as long as we can.3316// note we can't handle the last pixel in a row in this loop3317// because we need to handle the filter boundary conditions.3318for (; i < ((w-1) & ~7); i += 8) {3319#if defined(STBI_SSE2)3320// load and perform the vertical filtering pass3321// this uses 3*x + y = 4*x + (y - x)3322__m128i zero = _mm_setzero_si128();3323__m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i));3324__m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i));3325__m128i farw = _mm_unpacklo_epi8(farb, zero);3326__m128i nearw = _mm_unpacklo_epi8(nearb, zero);3327__m128i diff = _mm_sub_epi16(farw, nearw);3328__m128i nears = _mm_slli_epi16(nearw, 2);3329__m128i curr = _mm_add_epi16(nears, diff); // current row33303331// horizontal filter works the same based on shifted vers of current3332// row. "prev" is current row shifted right by 1 pixel; we need to3333// insert the previous pixel value (from t1).3334// "next" is current row shifted left by 1 pixel, with first pixel3335// of next block of 8 pixels added in.3336__m128i prv0 = _mm_slli_si128(curr, 2);3337__m128i nxt0 = _mm_srli_si128(curr, 2);3338__m128i prev = _mm_insert_epi16(prv0, t1, 0);3339__m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7);33403341// horizontal filter, polyphase implementation since it's convenient:3342// even pixels = 3*cur + prev = cur*4 + (prev - cur)3343// odd pixels = 3*cur + next = cur*4 + (next - cur)3344// note the shared term.3345__m128i bias = _mm_set1_epi16(8);3346__m128i curs = _mm_slli_epi16(curr, 2);3347__m128i prvd = _mm_sub_epi16(prev, curr);3348__m128i nxtd = _mm_sub_epi16(next, curr);3349__m128i curb = _mm_add_epi16(curs, bias);3350__m128i even = _mm_add_epi16(prvd, curb);3351__m128i odd = _mm_add_epi16(nxtd, curb);33523353// interleave even and odd pixels, then undo scaling.3354__m128i int0 = _mm_unpacklo_epi16(even, odd);3355__m128i int1 = _mm_unpackhi_epi16(even, odd);3356__m128i de0 = _mm_srli_epi16(int0, 4);3357__m128i de1 = _mm_srli_epi16(int1, 4);33583359// pack and write output3360__m128i outv = _mm_packus_epi16(de0, de1);3361_mm_storeu_si128((__m128i *) (out + i*2), outv);3362#elif defined(STBI_NEON)3363// load and perform the vertical filtering pass3364// this uses 3*x + y = 4*x + (y - x)3365uint8x8_t farb = vld1_u8(in_far + i);3366uint8x8_t nearb = vld1_u8(in_near + i);3367int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb));3368int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2));3369int16x8_t curr = vaddq_s16(nears, diff); // current row33703371// horizontal filter works the same based on shifted vers of current3372// row. "prev" is current row shifted right by 1 pixel; we need to3373// insert the previous pixel value (from t1).3374// "next" is current row shifted left by 1 pixel, with first pixel3375// of next block of 8 pixels added in.3376int16x8_t prv0 = vextq_s16(curr, curr, 7);3377int16x8_t nxt0 = vextq_s16(curr, curr, 1);3378int16x8_t prev = vsetq_lane_s16(t1, prv0, 0);3379int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7);33803381// horizontal filter, polyphase implementation since it's convenient:3382// even pixels = 3*cur + prev = cur*4 + (prev - cur)3383// odd pixels = 3*cur + next = cur*4 + (next - cur)3384// note the shared term.3385int16x8_t curs = vshlq_n_s16(curr, 2);3386int16x8_t prvd = vsubq_s16(prev, curr);3387int16x8_t nxtd = vsubq_s16(next, curr);3388int16x8_t even = vaddq_s16(curs, prvd);3389int16x8_t odd = vaddq_s16(curs, nxtd);33903391// undo scaling and round, then store with even/odd phases interleaved3392uint8x8x2_t o;3393o.val[0] = vqrshrun_n_s16(even, 4);3394o.val[1] = vqrshrun_n_s16(odd, 4);3395vst2_u8(out + i*2, o);3396#endif33973398// "previous" value for next iter3399t1 = 3*in_near[i+7] + in_far[i+7];3400}34013402t0 = t1;3403t1 = 3*in_near[i] + in_far[i];3404out[i*2] = stbi__div16(3*t1 + t0 + 8);34053406for (++i; i < w; ++i) {3407t0 = t1;3408t1 = 3*in_near[i]+in_far[i];3409out[i*2-1] = stbi__div16(3*t0 + t1 + 8);3410out[i*2 ] = stbi__div16(3*t1 + t0 + 8);3411}3412out[w*2-1] = stbi__div4(t1+2);34133414STBI_NOTUSED(hs);34153416return out;3417}3418#endif34193420static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs)3421{3422// resample with nearest-neighbor3423int i,j;3424STBI_NOTUSED(in_far);3425for (i=0; i < w; ++i)3426for (j=0; j < hs; ++j)3427out[i*hs+j] = in_near[i];3428return out;3429}34303431// this is a reduced-precision calculation of YCbCr-to-RGB introduced3432// to make sure the code produces the same results in both SIMD and scalar3433#define stbi__float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8)3434static 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)3435{3436int i;3437for (i=0; i < count; ++i) {3438int y_fixed = (y[i] << 20) + (1<<19); // rounding3439int r,g,b;3440int cr = pcr[i] - 128;3441int cb = pcb[i] - 128;3442r = y_fixed + cr* stbi__float2fixed(1.40200f);3443g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);3444b = y_fixed + cb* stbi__float2fixed(1.77200f);3445r >>= 20;3446g >>= 20;3447b >>= 20;3448if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }3449if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }3450if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }3451out[0] = (stbi_uc)r;3452out[1] = (stbi_uc)g;3453out[2] = (stbi_uc)b;3454out[3] = 255;3455out += step;3456}3457}34583459#if defined(STBI_SSE2) || defined(STBI_NEON)3460static 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)3461{3462int i = 0;34633464#ifdef STBI_SSE23465// step == 3 is pretty ugly on the final interleave, and i'm not convinced3466// it's useful in practice (you wouldn't use it for textures, for example).3467// so just accelerate step == 4 case.3468if (step == 4) {3469// this is a fairly straightforward implementation and not super-optimized.3470__m128i signflip = _mm_set1_epi8(-0x80);3471__m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f));3472__m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f));3473__m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f));3474__m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f));3475__m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128);3476__m128i xw = _mm_set1_epi16(255); // alpha channel34773478for (; i+7 < count; i += 8) {3479// load3480__m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i));3481__m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i));3482__m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i));3483__m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -1283484__m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -12834853486// unpack to short (and left-shift cr, cb by 8)3487__m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes);3488__m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased);3489__m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased);34903491// color transform3492__m128i yws = _mm_srli_epi16(yw, 4);3493__m128i cr0 = _mm_mulhi_epi16(cr_const0, crw);3494__m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw);3495__m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1);3496__m128i cr1 = _mm_mulhi_epi16(crw, cr_const1);3497__m128i rws = _mm_add_epi16(cr0, yws);3498__m128i gwt = _mm_add_epi16(cb0, yws);3499__m128i bws = _mm_add_epi16(yws, cb1);3500__m128i gws = _mm_add_epi16(gwt, cr1);35013502// descale3503__m128i rw = _mm_srai_epi16(rws, 4);3504__m128i bw = _mm_srai_epi16(bws, 4);3505__m128i gw = _mm_srai_epi16(gws, 4);35063507// back to byte, set up for transpose3508__m128i brb = _mm_packus_epi16(rw, bw);3509__m128i gxb = _mm_packus_epi16(gw, xw);35103511// transpose to interleave channels3512__m128i t0 = _mm_unpacklo_epi8(brb, gxb);3513__m128i t1 = _mm_unpackhi_epi8(brb, gxb);3514__m128i o0 = _mm_unpacklo_epi16(t0, t1);3515__m128i o1 = _mm_unpackhi_epi16(t0, t1);35163517// store3518_mm_storeu_si128((__m128i *) (out + 0), o0);3519_mm_storeu_si128((__m128i *) (out + 16), o1);3520out += 32;3521}3522}3523#endif35243525#ifdef STBI_NEON3526// in this version, step=3 support would be easy to add. but is there demand?3527if (step == 4) {3528// this is a fairly straightforward implementation and not super-optimized.3529uint8x8_t signflip = vdup_n_u8(0x80);3530int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f));3531int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f));3532int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f));3533int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f));35343535for (; i+7 < count; i += 8) {3536// load3537uint8x8_t y_bytes = vld1_u8(y + i);3538uint8x8_t cr_bytes = vld1_u8(pcr + i);3539uint8x8_t cb_bytes = vld1_u8(pcb + i);3540int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip));3541int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip));35423543// expand to s163544int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4));3545int16x8_t crw = vshll_n_s8(cr_biased, 7);3546int16x8_t cbw = vshll_n_s8(cb_biased, 7);35473548// color transform3549int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0);3550int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0);3551int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1);3552int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1);3553int16x8_t rws = vaddq_s16(yws, cr0);3554int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1);3555int16x8_t bws = vaddq_s16(yws, cb1);35563557// undo scaling, round, convert to byte3558uint8x8x4_t o;3559o.val[0] = vqrshrun_n_s16(rws, 4);3560o.val[1] = vqrshrun_n_s16(gws, 4);3561o.val[2] = vqrshrun_n_s16(bws, 4);3562o.val[3] = vdup_n_u8(255);35633564// store, interleaving r/g/b/a3565vst4_u8(out, o);3566out += 8*4;3567}3568}3569#endif35703571for (; i < count; ++i) {3572int y_fixed = (y[i] << 20) + (1<<19); // rounding3573int r,g,b;3574int cr = pcr[i] - 128;3575int cb = pcb[i] - 128;3576r = y_fixed + cr* stbi__float2fixed(1.40200f);3577g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000);3578b = y_fixed + cb* stbi__float2fixed(1.77200f);3579r >>= 20;3580g >>= 20;3581b >>= 20;3582if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; }3583if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; }3584if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; }3585out[0] = (stbi_uc)r;3586out[1] = (stbi_uc)g;3587out[2] = (stbi_uc)b;3588out[3] = 255;3589out += step;3590}3591}3592#endif35933594// set up the kernels3595static void stbi__setup_jpeg(stbi__jpeg *j)3596{3597j->idct_block_kernel = stbi__idct_block;3598j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row;3599j->resample_row_hv_2_kernel = stbi__resample_row_hv_2;36003601#ifdef STBI_SSE23602if (stbi__sse2_available()) {3603j->idct_block_kernel = stbi__idct_simd;3604j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;3605j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;3606}3607#endif36083609#ifdef STBI_NEON3610j->idct_block_kernel = stbi__idct_simd;3611j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd;3612j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd;3613#endif3614}36153616// clean up the temporary component buffers3617static void stbi__cleanup_jpeg(stbi__jpeg *j)3618{3619stbi__free_jpeg_components(j, j->s->img_n, 0);3620}36213622typedef struct3623{3624resample_row_func resample;3625stbi_uc *line0,*line1;3626int hs,vs; // expansion factor in each axis3627int w_lores; // horizontal pixels pre-expansion3628int ystep; // how far through vertical expansion we are3629int ypos; // which pre-expansion row we're on3630} stbi__resample;36313632// fast 0..255 * 0..255 => 0..255 rounded multiplication3633static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y)3634{3635unsigned int t = x*y + 128;3636return (stbi_uc) ((t + (t >>8)) >> 8);3637}36383639static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp)3640{3641int n, decode_n, is_rgb;3642z->s->img_n = 0; // make stbi__cleanup_jpeg safe36433644// validate req_comp3645if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");36463647// load a jpeg image from whichever source, but leave in YCbCr format3648if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; }36493650// determine actual number of components to generate3651n = req_comp ? req_comp : z->s->img_n >= 3 ? 3 : 1;36523653is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif));36543655if (z->s->img_n == 3 && n < 3 && !is_rgb)3656decode_n = 1;3657else3658decode_n = z->s->img_n;36593660// resample and color-convert3661{3662int k;3663unsigned int i,j;3664stbi_uc *output;3665stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL };36663667stbi__resample res_comp[4];36683669for (k=0; k < decode_n; ++k) {3670stbi__resample *r = &res_comp[k];36713672// allocate line buffer big enough for upsampling off the edges3673// with upsample factor of 43674z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3);3675if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }36763677r->hs = z->img_h_max / z->img_comp[k].h;3678r->vs = z->img_v_max / z->img_comp[k].v;3679r->ystep = r->vs >> 1;3680r->w_lores = (z->s->img_x + r->hs-1) / r->hs;3681r->ypos = 0;3682r->line0 = r->line1 = z->img_comp[k].data;36833684if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1;3685else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2;3686else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2;3687else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel;3688else r->resample = stbi__resample_row_generic;3689}36903691// can't error after this so, this is safe3692output = (stbi_uc *) stbi__malloc_mad3(n, z->s->img_x, z->s->img_y, 1);3693if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); }36943695// now go ahead and resample3696for (j=0; j < z->s->img_y; ++j) {3697stbi_uc *out = output + n * z->s->img_x * j;3698for (k=0; k < decode_n; ++k) {3699stbi__resample *r = &res_comp[k];3700int y_bot = r->ystep >= (r->vs >> 1);3701coutput[k] = r->resample(z->img_comp[k].linebuf,3702y_bot ? r->line1 : r->line0,3703y_bot ? r->line0 : r->line1,3704r->w_lores, r->hs);3705if (++r->ystep >= r->vs) {3706r->ystep = 0;3707r->line0 = r->line1;3708if (++r->ypos < z->img_comp[k].y)3709r->line1 += z->img_comp[k].w2;3710}3711}3712if (n >= 3) {3713stbi_uc *y = coutput[0];3714if (z->s->img_n == 3) {3715if (is_rgb) {3716for (i=0; i < z->s->img_x; ++i) {3717out[0] = y[i];3718out[1] = coutput[1][i];3719out[2] = coutput[2][i];3720out[3] = 255;3721out += n;3722}3723} else {3724z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);3725}3726} else if (z->s->img_n == 4) {3727if (z->app14_color_transform == 0) { // CMYK3728for (i=0; i < z->s->img_x; ++i) {3729stbi_uc m = coutput[3][i];3730out[0] = stbi__blinn_8x8(coutput[0][i], m);3731out[1] = stbi__blinn_8x8(coutput[1][i], m);3732out[2] = stbi__blinn_8x8(coutput[2][i], m);3733out[3] = 255;3734out += n;3735}3736} else if (z->app14_color_transform == 2) { // YCCK3737z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);3738for (i=0; i < z->s->img_x; ++i) {3739stbi_uc m = coutput[3][i];3740out[0] = stbi__blinn_8x8(255 - out[0], m);3741out[1] = stbi__blinn_8x8(255 - out[1], m);3742out[2] = stbi__blinn_8x8(255 - out[2], m);3743out += n;3744}3745} else { // YCbCr + alpha? Ignore the fourth channel for now3746z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n);3747}3748} else3749for (i=0; i < z->s->img_x; ++i) {3750out[0] = out[1] = out[2] = y[i];3751out[3] = 255; // not used if n==33752out += n;3753}3754} else {3755if (is_rgb) {3756if (n == 1)3757for (i=0; i < z->s->img_x; ++i)3758*out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);3759else {3760for (i=0; i < z->s->img_x; ++i, out += 2) {3761out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]);3762out[1] = 255;3763}3764}3765} else if (z->s->img_n == 4 && z->app14_color_transform == 0) {3766for (i=0; i < z->s->img_x; ++i) {3767stbi_uc m = coutput[3][i];3768stbi_uc r = stbi__blinn_8x8(coutput[0][i], m);3769stbi_uc g = stbi__blinn_8x8(coutput[1][i], m);3770stbi_uc b = stbi__blinn_8x8(coutput[2][i], m);3771out[0] = stbi__compute_y(r, g, b);3772out[1] = 255;3773out += n;3774}3775} else if (z->s->img_n == 4 && z->app14_color_transform == 2) {3776for (i=0; i < z->s->img_x; ++i) {3777out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]);3778out[1] = 255;3779out += n;3780}3781} else {3782stbi_uc *y = coutput[0];3783if (n == 1)3784for (i=0; i < z->s->img_x; ++i) out[i] = y[i];3785else3786for (i=0; i < z->s->img_x; ++i) { *out++ = y[i]; *out++ = 255; }3787}3788}3789}3790stbi__cleanup_jpeg(z);3791*out_x = z->s->img_x;3792*out_y = z->s->img_y;3793if (comp) *comp = z->s->img_n >= 3 ? 3 : 1; // report original components, not output3794return output;3795}3796}37973798static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)3799{3800unsigned char* result;3801stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg));3802STBI_NOTUSED(ri);3803j->s = s;3804stbi__setup_jpeg(j);3805result = load_jpeg_image(j, x,y,comp,req_comp);3806STBI_FREE(j);3807return result;3808}38093810static int stbi__jpeg_test(stbi__context *s)3811{3812int r;3813stbi__jpeg* j = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg));3814j->s = s;3815stbi__setup_jpeg(j);3816r = stbi__decode_jpeg_header(j, STBI__SCAN_type);3817stbi__rewind(s);3818STBI_FREE(j);3819return r;3820}38213822static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp)3823{3824if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) {3825stbi__rewind( j->s );3826return 0;3827}3828if (x) *x = j->s->img_x;3829if (y) *y = j->s->img_y;3830if (comp) *comp = j->s->img_n >= 3 ? 3 : 1;3831return 1;3832}38333834static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)3835{3836int result;3837stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg)));3838j->s = s;3839result = stbi__jpeg_info_raw(j, x, y, comp);3840STBI_FREE(j);3841return result;3842}3843#endif38443845// public domain zlib decode v0.2 Sean Barrett 2006-11-183846// simple implementation3847// - all input must be provided in an upfront buffer3848// - all output is written to a single output buffer (can malloc/realloc)3849// performance3850// - fast huffman38513852#ifndef STBI_NO_ZLIB38533854// fast-way is faster to check than jpeg huffman, but slow way is slower3855#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables3856#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)38573858// zlib-style huffman encoding3859// (jpegs packs from left, zlib from right, so can't share code)3860typedef struct3861{3862stbi__uint16 fast[1 << STBI__ZFAST_BITS];3863stbi__uint16 firstcode[16];3864int maxcode[17];3865stbi__uint16 firstsymbol[16];3866stbi_uc size[288];3867stbi__uint16 value[288];3868} stbi__zhuffman;38693870stbi_inline static int stbi__bitreverse16(int n)3871{3872n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1);3873n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2);3874n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4);3875n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8);3876return n;3877}38783879stbi_inline static int stbi__bit_reverse(int v, int bits)3880{3881STBI_ASSERT(bits <= 16);3882// to bit reverse n bits, reverse 16 and shift3883// e.g. 11 bits, bit reverse and shift away 53884return stbi__bitreverse16(v) >> (16-bits);3885}38863887static int stbi__zbuild_huffman(stbi__zhuffman *z, const stbi_uc *sizelist, int num)3888{3889int i,k=0;3890int code, next_code[16], sizes[17];38913892// DEFLATE spec for generating codes3893memset(sizes, 0, sizeof(sizes));3894memset(z->fast, 0, sizeof(z->fast));3895for (i=0; i < num; ++i)3896++sizes[sizelist[i]];3897sizes[0] = 0;3898for (i=1; i < 16; ++i)3899if (sizes[i] > (1 << i))3900return stbi__err("bad sizes", "Corrupt PNG");3901code = 0;3902for (i=1; i < 16; ++i) {3903next_code[i] = code;3904z->firstcode[i] = (stbi__uint16) code;3905z->firstsymbol[i] = (stbi__uint16) k;3906code = (code + sizes[i]);3907if (sizes[i])3908if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG");3909z->maxcode[i] = code << (16-i); // preshift for inner loop3910code <<= 1;3911k += sizes[i];3912}3913z->maxcode[16] = 0x10000; // sentinel3914for (i=0; i < num; ++i) {3915int s = sizelist[i];3916if (s) {3917int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s];3918stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i);3919z->size [c] = (stbi_uc ) s;3920z->value[c] = (stbi__uint16) i;3921if (s <= STBI__ZFAST_BITS) {3922int j = stbi__bit_reverse(next_code[s],s);3923while (j < (1 << STBI__ZFAST_BITS)) {3924z->fast[j] = fastv;3925j += (1 << s);3926}3927}3928++next_code[s];3929}3930}3931return 1;3932}39333934// zlib-from-memory implementation for PNG reading3935// because PNG allows splitting the zlib stream arbitrarily,3936// and it's annoying structurally to have PNG call ZLIB call PNG,3937// we require PNG read all the IDATs and combine them into a single3938// memory buffer39393940typedef struct3941{3942stbi_uc *zbuffer, *zbuffer_end;3943int num_bits;3944stbi__uint32 code_buffer;39453946char *zout;3947char *zout_start;3948char *zout_end;3949int z_expandable;39503951stbi__zhuffman z_length, z_distance;3952} stbi__zbuf;39533954stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z)3955{3956if (z->zbuffer >= z->zbuffer_end) return 0;3957return *z->zbuffer++;3958}39593960static void stbi__fill_bits(stbi__zbuf *z)3961{3962do {3963STBI_ASSERT(z->code_buffer < (1U << z->num_bits));3964z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits;3965z->num_bits += 8;3966} while (z->num_bits <= 24);3967}39683969stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n)3970{3971unsigned int k;3972if (z->num_bits < n) stbi__fill_bits(z);3973k = z->code_buffer & ((1 << n) - 1);3974z->code_buffer >>= n;3975z->num_bits -= n;3976return k;3977}39783979static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z)3980{3981int b,s,k;3982// not resolved by fast table, so compute it the slow way3983// use jpeg approach, which requires MSbits at top3984k = stbi__bit_reverse(a->code_buffer, 16);3985for (s=STBI__ZFAST_BITS+1; ; ++s)3986if (k < z->maxcode[s])3987break;3988if (s == 16) return -1; // invalid code!3989// code size is s, so:3990b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s];3991STBI_ASSERT(z->size[b] == s);3992a->code_buffer >>= s;3993a->num_bits -= s;3994return z->value[b];3995}39963997stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z)3998{3999int b,s;4000if (a->num_bits < 16) stbi__fill_bits(a);4001b = z->fast[a->code_buffer & STBI__ZFAST_MASK];4002if (b) {4003s = b >> 9;4004a->code_buffer >>= s;4005a->num_bits -= s;4006return b & 511;4007}4008return stbi__zhuffman_decode_slowpath(a, z);4009}40104011static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes4012{4013char *q;4014int cur, limit, old_limit;4015z->zout = zout;4016if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG");4017cur = (int) (z->zout - z->zout_start);4018limit = old_limit = (int) (z->zout_end - z->zout_start);4019while (cur + n > limit)4020limit *= 2;4021q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit);4022STBI_NOTUSED(old_limit);4023if (q == NULL) return stbi__err("outofmem", "Out of memory");4024z->zout_start = q;4025z->zout = q + cur;4026z->zout_end = q + limit;4027return 1;4028}40294030static const int stbi__zlength_base[31] = {40313,4,5,6,7,8,9,10,11,13,403215,17,19,23,27,31,35,43,51,59,403367,83,99,115,131,163,195,227,258,0,0 };40344035static const int stbi__zlength_extra[31]=4036{ 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 };40374038static const int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193,4039257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0};40404041static const int stbi__zdist_extra[32] =4042{ 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};40434044static int stbi__parse_huffman_block(stbi__zbuf *a)4045{4046char *zout = a->zout;4047for(;;) {4048int z = stbi__zhuffman_decode(a, &a->z_length);4049if (z < 256) {4050if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes4051if (zout >= a->zout_end) {4052if (!stbi__zexpand(a, zout, 1)) return 0;4053zout = a->zout;4054}4055*zout++ = (char) z;4056} else {4057stbi_uc *p;4058int len,dist;4059if (z == 256) {4060a->zout = zout;4061return 1;4062}4063z -= 257;4064len = stbi__zlength_base[z];4065if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]);4066z = stbi__zhuffman_decode(a, &a->z_distance);4067if (z < 0) return stbi__err("bad huffman code","Corrupt PNG");4068dist = stbi__zdist_base[z];4069if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]);4070if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG");4071if (zout + len > a->zout_end) {4072if (!stbi__zexpand(a, zout, len)) return 0;4073zout = a->zout;4074}4075p = (stbi_uc *) (zout - dist);4076if (dist == 1) { // run of one byte; common in images.4077stbi_uc v = *p;4078if (len) { do *zout++ = v; while (--len); }4079} else {4080if (len) { do *zout++ = *p++; while (--len); }4081}4082}4083}4084}40854086static int stbi__compute_huffman_codes(stbi__zbuf *a)4087{4088static 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 };4089stbi__zhuffman z_codelength;4090stbi_uc lencodes[286+32+137];//padding for maximum single op4091stbi_uc codelength_sizes[19];4092int i,n;40934094int hlit = stbi__zreceive(a,5) + 257;4095int hdist = stbi__zreceive(a,5) + 1;4096int hclen = stbi__zreceive(a,4) + 4;4097int ntot = hlit + hdist;40984099memset(codelength_sizes, 0, sizeof(codelength_sizes));4100for (i=0; i < hclen; ++i) {4101int s = stbi__zreceive(a,3);4102codelength_sizes[length_dezigzag[i]] = (stbi_uc) s;4103}4104if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0;41054106n = 0;4107while (n < ntot) {4108int c = stbi__zhuffman_decode(a, &z_codelength);4109if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG");4110if (c < 16)4111lencodes[n++] = (stbi_uc) c;4112else {4113stbi_uc fill = 0;4114if (c == 16) {4115c = stbi__zreceive(a,2)+3;4116if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG");4117fill = lencodes[n-1];4118} else if (c == 17)4119c = stbi__zreceive(a,3)+3;4120else {4121STBI_ASSERT(c == 18);4122c = stbi__zreceive(a,7)+11;4123}4124if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG");4125memset(lencodes+n, fill, c);4126n += c;4127}4128}4129if (n != ntot) return stbi__err("bad codelengths","Corrupt PNG");4130if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0;4131if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0;4132return 1;4133}41344135static int stbi__parse_uncompressed_block(stbi__zbuf *a)4136{4137stbi_uc header[4];4138int len,nlen,k;4139if (a->num_bits & 7)4140stbi__zreceive(a, a->num_bits & 7); // discard4141// drain the bit-packed data into header4142k = 0;4143while (a->num_bits > 0) {4144header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check4145a->code_buffer >>= 8;4146a->num_bits -= 8;4147}4148STBI_ASSERT(a->num_bits == 0);4149// now fill header the normal way4150while (k < 4)4151header[k++] = stbi__zget8(a);4152len = header[1] * 256 + header[0];4153nlen = header[3] * 256 + header[2];4154if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG");4155if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG");4156if (a->zout + len > a->zout_end)4157if (!stbi__zexpand(a, a->zout, len)) return 0;4158memcpy(a->zout, a->zbuffer, len);4159a->zbuffer += len;4160a->zout += len;4161return 1;4162}41634164static int stbi__parse_zlib_header(stbi__zbuf *a)4165{4166int cmf = stbi__zget8(a);4167int cm = cmf & 15;4168/* int cinfo = cmf >> 4; */4169int flg = stbi__zget8(a);4170if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec4171if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png4172if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png4173// window = 1 << (8 + cinfo)... but who cares, we fully buffer output4174return 1;4175}41764177static const stbi_uc stbi__zdefault_length[288] =4178{41798,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,41808,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,41818,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,41828,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,41838,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,41849,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,41859,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,41869,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,41877,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,84188};4189static const stbi_uc stbi__zdefault_distance[32] =4190{41915,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,54192};4193/*4194Init algorithm:4195{4196int i; // use <= to match clearly with spec4197for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8;4198for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9;4199for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7;4200for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8;42014202for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5;4203}4204*/42054206static int stbi__parse_zlib(stbi__zbuf *a, int parse_header)4207{4208int final, type;4209if (parse_header)4210if (!stbi__parse_zlib_header(a)) return 0;4211a->num_bits = 0;4212a->code_buffer = 0;4213do {4214final = stbi__zreceive(a,1);4215type = stbi__zreceive(a,2);4216if (type == 0) {4217if (!stbi__parse_uncompressed_block(a)) return 0;4218} else if (type == 3) {4219return 0;4220} else {4221if (type == 1) {4222// use fixed code lengths4223if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0;4224if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0;4225} else {4226if (!stbi__compute_huffman_codes(a)) return 0;4227}4228if (!stbi__parse_huffman_block(a)) return 0;4229}4230} while (!final);4231return 1;4232}42334234static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header)4235{4236a->zout_start = obuf;4237a->zout = obuf;4238a->zout_end = obuf + olen;4239a->z_expandable = exp;42404241return stbi__parse_zlib(a, parse_header);4242}42434244STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen)4245{4246stbi__zbuf a;4247char *p = (char *) stbi__malloc(initial_size);4248if (p == NULL) return NULL;4249a.zbuffer = (stbi_uc *) buffer;4250a.zbuffer_end = (stbi_uc *) buffer + len;4251if (stbi__do_zlib(&a, p, initial_size, 1, 1)) {4252if (outlen) *outlen = (int) (a.zout - a.zout_start);4253return a.zout_start;4254} else {4255STBI_FREE(a.zout_start);4256return NULL;4257}4258}42594260STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen)4261{4262return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen);4263}42644265STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header)4266{4267stbi__zbuf a;4268char *p = (char *) stbi__malloc(initial_size);4269if (p == NULL) return NULL;4270a.zbuffer = (stbi_uc *) buffer;4271a.zbuffer_end = (stbi_uc *) buffer + len;4272if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) {4273if (outlen) *outlen = (int) (a.zout - a.zout_start);4274return a.zout_start;4275} else {4276STBI_FREE(a.zout_start);4277return NULL;4278}4279}42804281STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen)4282{4283stbi__zbuf a;4284a.zbuffer = (stbi_uc *) ibuffer;4285a.zbuffer_end = (stbi_uc *) ibuffer + ilen;4286if (stbi__do_zlib(&a, obuffer, olen, 0, 1))4287return (int) (a.zout - a.zout_start);4288else4289return -1;4290}42914292STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen)4293{4294stbi__zbuf a;4295char *p = (char *) stbi__malloc(16384);4296if (p == NULL) return NULL;4297a.zbuffer = (stbi_uc *) buffer;4298a.zbuffer_end = (stbi_uc *) buffer+len;4299if (stbi__do_zlib(&a, p, 16384, 1, 0)) {4300if (outlen) *outlen = (int) (a.zout - a.zout_start);4301return a.zout_start;4302} else {4303STBI_FREE(a.zout_start);4304return NULL;4305}4306}43074308STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen)4309{4310stbi__zbuf a;4311a.zbuffer = (stbi_uc *) ibuffer;4312a.zbuffer_end = (stbi_uc *) ibuffer + ilen;4313if (stbi__do_zlib(&a, obuffer, olen, 0, 0))4314return (int) (a.zout - a.zout_start);4315else4316return -1;4317}4318#endif43194320// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-184321// simple implementation4322// - only 8-bit samples4323// - no CRC checking4324// - allocates lots of intermediate memory4325// - avoids problem of streaming data between subsystems4326// - avoids explicit window management4327// performance4328// - uses stb_zlib, a PD zlib implementation with fast huffman decoding43294330#ifndef STBI_NO_PNG4331typedef struct4332{4333stbi__uint32 length;4334stbi__uint32 type;4335} stbi__pngchunk;43364337static stbi__pngchunk stbi__get_chunk_header(stbi__context *s)4338{4339stbi__pngchunk c;4340c.length = stbi__get32be(s);4341c.type = stbi__get32be(s);4342return c;4343}43444345static int stbi__check_png_header(stbi__context *s)4346{4347static const stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 };4348int i;4349for (i=0; i < 8; ++i)4350if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG");4351return 1;4352}43534354typedef struct4355{4356stbi__context *s;4357stbi_uc *idata, *expanded, *out;4358int depth;4359} stbi__png;436043614362enum {4363STBI__F_none=0,4364STBI__F_sub=1,4365STBI__F_up=2,4366STBI__F_avg=3,4367STBI__F_paeth=4,4368// synthetic filters used for first scanline to avoid needing a dummy row of 0s4369STBI__F_avg_first,4370STBI__F_paeth_first4371};43724373static stbi_uc first_row_filter[5] =4374{4375STBI__F_none,4376STBI__F_sub,4377STBI__F_none,4378STBI__F_avg_first,4379STBI__F_paeth_first4380};43814382static int stbi__paeth(int a, int b, int c)4383{4384int p = a + b - c;4385int pa = abs(p-a);4386int pb = abs(p-b);4387int pc = abs(p-c);4388if (pa <= pb && pa <= pc) return a;4389if (pb <= pc) return b;4390return c;4391}43924393static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };43944395// create the png data from post-deflated data4396static 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)4397{4398int bytes = (depth == 16? 2 : 1);4399stbi__context *s = a->s;4400stbi__uint32 i,j,stride = x*out_n*bytes;4401stbi__uint32 img_len, img_width_bytes;4402int k;4403int img_n = s->img_n; // copy it into a local for later44044405int output_bytes = out_n*bytes;4406int filter_bytes = img_n*bytes;4407int width = x;44084409STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1);4410a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into4411if (!a->out) return stbi__err("outofmem", "Out of memory");44124413if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG");4414img_width_bytes = (((img_n * x * depth) + 7) >> 3);4415img_len = (img_width_bytes + 1) * y;44164417// we used to check for exact match between raw_len and img_len on non-interlaced PNGs,4418// but issue #276 reported a PNG in the wild that had extra data at the end (all zeros),4419// so just check for raw_len < img_len always.4420if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG");44214422for (j=0; j < y; ++j) {4423stbi_uc *cur = a->out + stride*j;4424stbi_uc *prior;4425int filter = *raw++;44264427if (filter > 4)4428return stbi__err("invalid filter","Corrupt PNG");44294430if (depth < 8) {4431STBI_ASSERT(img_width_bytes <= x);4432cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place4433filter_bytes = 1;4434width = img_width_bytes;4435}4436prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above44374438// if first row, use special filter that doesn't sample previous row4439if (j == 0) filter = first_row_filter[filter];44404441// handle first byte explicitly4442for (k=0; k < filter_bytes; ++k) {4443switch (filter) {4444case STBI__F_none : cur[k] = raw[k]; break;4445case STBI__F_sub : cur[k] = raw[k]; break;4446case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break;4447case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break;4448case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break;4449case STBI__F_avg_first : cur[k] = raw[k]; break;4450case STBI__F_paeth_first: cur[k] = raw[k]; break;4451}4452}44534454if (depth == 8) {4455if (img_n != out_n)4456cur[img_n] = 255; // first pixel4457raw += img_n;4458cur += out_n;4459prior += out_n;4460} else if (depth == 16) {4461if (img_n != out_n) {4462cur[filter_bytes] = 255; // first pixel top byte4463cur[filter_bytes+1] = 255; // first pixel bottom byte4464}4465raw += filter_bytes;4466cur += output_bytes;4467prior += output_bytes;4468} else {4469raw += 1;4470cur += 1;4471prior += 1;4472}44734474// this is a little gross, so that we don't switch per-pixel or per-component4475if (depth < 8 || img_n == out_n) {4476int nk = (width - 1)*filter_bytes;4477#define STBI__CASE(f) \4478case f: \4479for (k=0; k < nk; ++k)4480switch (filter) {4481// "none" filter turns into a memcpy here; make that explicit.4482case STBI__F_none: memcpy(cur, raw, nk); break;4483STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break;4484STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;4485STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break;4486STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break;4487STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break;4488STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break;4489}4490#undef STBI__CASE4491raw += nk;4492} else {4493STBI_ASSERT(img_n+1 == out_n);4494#define STBI__CASE(f) \4495case f: \4496for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \4497for (k=0; k < filter_bytes; ++k)4498switch (filter) {4499STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break;4500STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break;4501STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break;4502STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break;4503STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break;4504STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break;4505STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break;4506}4507#undef STBI__CASE45084509// the loop above sets the high byte of the pixels' alpha, but for4510// 16 bit png files we also need the low byte set. we'll do that here.4511if (depth == 16) {4512cur = a->out + stride*j; // start at the beginning of the row again4513for (i=0; i < x; ++i,cur+=output_bytes) {4514cur[filter_bytes+1] = 255;4515}4516}4517}4518}45194520// we make a separate pass to expand bits to pixels; for performance,4521// this could run two scanlines behind the above code, so it won't4522// intefere with filtering but will still be in the cache.4523if (depth < 8) {4524for (j=0; j < y; ++j) {4525stbi_uc *cur = a->out + stride*j;4526stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes;4527// unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit4528// png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop4529stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range45304531// note that the final byte might overshoot and write more data than desired.4532// we can allocate enough data that this never writes out of memory, but it4533// could also overwrite the next scanline. can it overwrite non-empty data4534// on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel.4535// so we need to explicitly clamp the final ones45364537if (depth == 4) {4538for (k=x*img_n; k >= 2; k-=2, ++in) {4539*cur++ = scale * ((*in >> 4) );4540*cur++ = scale * ((*in ) & 0x0f);4541}4542if (k > 0) *cur++ = scale * ((*in >> 4) );4543} else if (depth == 2) {4544for (k=x*img_n; k >= 4; k-=4, ++in) {4545*cur++ = scale * ((*in >> 6) );4546*cur++ = scale * ((*in >> 4) & 0x03);4547*cur++ = scale * ((*in >> 2) & 0x03);4548*cur++ = scale * ((*in ) & 0x03);4549}4550if (k > 0) *cur++ = scale * ((*in >> 6) );4551if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03);4552if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03);4553} else if (depth == 1) {4554for (k=x*img_n; k >= 8; k-=8, ++in) {4555*cur++ = scale * ((*in >> 7) );4556*cur++ = scale * ((*in >> 6) & 0x01);4557*cur++ = scale * ((*in >> 5) & 0x01);4558*cur++ = scale * ((*in >> 4) & 0x01);4559*cur++ = scale * ((*in >> 3) & 0x01);4560*cur++ = scale * ((*in >> 2) & 0x01);4561*cur++ = scale * ((*in >> 1) & 0x01);4562*cur++ = scale * ((*in ) & 0x01);4563}4564if (k > 0) *cur++ = scale * ((*in >> 7) );4565if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01);4566if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01);4567if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01);4568if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01);4569if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01);4570if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01);4571}4572if (img_n != out_n) {4573int q;4574// insert alpha = 2554575cur = a->out + stride*j;4576if (img_n == 1) {4577for (q=x-1; q >= 0; --q) {4578cur[q*2+1] = 255;4579cur[q*2+0] = cur[q];4580}4581} else {4582STBI_ASSERT(img_n == 3);4583for (q=x-1; q >= 0; --q) {4584cur[q*4+3] = 255;4585cur[q*4+2] = cur[q*3+2];4586cur[q*4+1] = cur[q*3+1];4587cur[q*4+0] = cur[q*3+0];4588}4589}4590}4591}4592} else if (depth == 16) {4593// force the image data from big-endian to platform-native.4594// this is done in a separate pass due to the decoding relying4595// on the data being untouched, but could probably be done4596// per-line during decode if care is taken.4597stbi_uc *cur = a->out;4598stbi__uint16 *cur16 = (stbi__uint16*)cur;45994600for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) {4601*cur16 = (cur[0] << 8) | cur[1];4602}4603}46044605return 1;4606}46074608static 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)4609{4610int bytes = (depth == 16 ? 2 : 1);4611int out_bytes = out_n * bytes;4612stbi_uc *final;4613int p;4614if (!interlaced)4615return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color);46164617// de-interlacing4618final = (stbi_uc *) stbi__malloc_mad3(a->s->img_x, a->s->img_y, out_bytes, 0);4619for (p=0; p < 7; ++p) {4620int xorig[] = { 0,4,0,2,0,1,0 };4621int yorig[] = { 0,0,4,0,2,0,1 };4622int xspc[] = { 8,8,4,4,2,2,1 };4623int yspc[] = { 8,8,8,4,4,2,2 };4624int i,j,x,y;4625// pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 14626x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p];4627y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p];4628if (x && y) {4629stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y;4630if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) {4631STBI_FREE(final);4632return 0;4633}4634for (j=0; j < y; ++j) {4635for (i=0; i < x; ++i) {4636int out_y = j*yspc[p]+yorig[p];4637int out_x = i*xspc[p]+xorig[p];4638memcpy(final + out_y*a->s->img_x*out_bytes + out_x*out_bytes,4639a->out + (j*x+i)*out_bytes, out_bytes);4640}4641}4642STBI_FREE(a->out);4643image_data += img_len;4644image_data_len -= img_len;4645}4646}4647a->out = final;46484649return 1;4650}46514652static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n)4653{4654stbi__context *s = z->s;4655stbi__uint32 i, pixel_count = s->img_x * s->img_y;4656stbi_uc *p = z->out;46574658// compute color-based transparency, assuming we've4659// already got 255 as the alpha value in the output4660STBI_ASSERT(out_n == 2 || out_n == 4);46614662if (out_n == 2) {4663for (i=0; i < pixel_count; ++i) {4664p[1] = (p[0] == tc[0] ? 0 : 255);4665p += 2;4666}4667} else {4668for (i=0; i < pixel_count; ++i) {4669if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])4670p[3] = 0;4671p += 4;4672}4673}4674return 1;4675}46764677static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n)4678{4679stbi__context *s = z->s;4680stbi__uint32 i, pixel_count = s->img_x * s->img_y;4681stbi__uint16 *p = (stbi__uint16*) z->out;46824683// compute color-based transparency, assuming we've4684// already got 65535 as the alpha value in the output4685STBI_ASSERT(out_n == 2 || out_n == 4);46864687if (out_n == 2) {4688for (i = 0; i < pixel_count; ++i) {4689p[1] = (p[0] == tc[0] ? 0 : 65535);4690p += 2;4691}4692} else {4693for (i = 0; i < pixel_count; ++i) {4694if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2])4695p[3] = 0;4696p += 4;4697}4698}4699return 1;4700}47014702static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n)4703{4704stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y;4705stbi_uc *p, *temp_out, *orig = a->out;47064707p = (stbi_uc *) stbi__malloc_mad2(pixel_count, pal_img_n, 0);4708if (p == NULL) return stbi__err("outofmem", "Out of memory");47094710// between here and free(out) below, exitting would leak4711temp_out = p;47124713if (pal_img_n == 3) {4714for (i=0; i < pixel_count; ++i) {4715int n = orig[i]*4;4716p[0] = palette[n ];4717p[1] = palette[n+1];4718p[2] = palette[n+2];4719p += 3;4720}4721} else {4722for (i=0; i < pixel_count; ++i) {4723int n = orig[i]*4;4724p[0] = palette[n ];4725p[1] = palette[n+1];4726p[2] = palette[n+2];4727p[3] = palette[n+3];4728p += 4;4729}4730}4731STBI_FREE(a->out);4732a->out = temp_out;47334734STBI_NOTUSED(len);47354736return 1;4737}47384739static int stbi__unpremultiply_on_load = 0;4740static int stbi__de_iphone_flag = 0;47414742STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply)4743{4744stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply;4745}47464747STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert)4748{4749stbi__de_iphone_flag = flag_true_if_should_convert;4750}47514752static void stbi__de_iphone(stbi__png *z)4753{4754stbi__context *s = z->s;4755stbi__uint32 i, pixel_count = s->img_x * s->img_y;4756stbi_uc *p = z->out;47574758if (s->img_out_n == 3) { // convert bgr to rgb4759for (i=0; i < pixel_count; ++i) {4760stbi_uc t = p[0];4761p[0] = p[2];4762p[2] = t;4763p += 3;4764}4765} else {4766STBI_ASSERT(s->img_out_n == 4);4767if (stbi__unpremultiply_on_load) {4768// convert bgr to rgb and unpremultiply4769for (i=0; i < pixel_count; ++i) {4770stbi_uc a = p[3];4771stbi_uc t = p[0];4772if (a) {4773stbi_uc half = a / 2;4774p[0] = (p[2] * 255 + half) / a;4775p[1] = (p[1] * 255 + half) / a;4776p[2] = ( t * 255 + half) / a;4777} else {4778p[0] = p[2];4779p[2] = t;4780}4781p += 4;4782}4783} else {4784// convert bgr to rgb4785for (i=0; i < pixel_count; ++i) {4786stbi_uc t = p[0];4787p[0] = p[2];4788p[2] = t;4789p += 4;4790}4791}4792}4793}47944795#define STBI__PNG_TYPE(a,b,c,d) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (d))47964797static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp)4798{4799stbi_uc palette[1024], pal_img_n=0;4800stbi_uc has_trans=0, tc[3]={0};4801stbi__uint16 tc16[3];4802stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0;4803int first=1,k,interlace=0, color=0, is_iphone=0;4804stbi__context *s = z->s;48054806z->expanded = NULL;4807z->idata = NULL;4808z->out = NULL;48094810if (!stbi__check_png_header(s)) return 0;48114812if (scan == STBI__SCAN_type) return 1;48134814for (;;) {4815stbi__pngchunk c = stbi__get_chunk_header(s);4816switch (c.type) {4817case STBI__PNG_TYPE('C','g','B','I'):4818is_iphone = 1;4819stbi__skip(s, c.length);4820break;4821case STBI__PNG_TYPE('I','H','D','R'): {4822int comp,filter;4823if (!first) return stbi__err("multiple IHDR","Corrupt PNG");4824first = 0;4825if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG");4826s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");4827s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)");4828z->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");4829color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG");4830if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG");4831if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG");4832comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG");4833filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG");4834interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG");4835if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG");4836if (!pal_img_n) {4837s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0);4838if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode");4839if (scan == STBI__SCAN_header) return 1;4840} else {4841// if paletted, then pal_n is our final components, and4842// img_n is # components to decompress/filter.4843s->img_n = 1;4844if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG");4845// if SCAN_header, have to scan to see if we have a tRNS4846}4847break;4848}48494850case STBI__PNG_TYPE('P','L','T','E'): {4851if (first) return stbi__err("first not IHDR", "Corrupt PNG");4852if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG");4853pal_len = c.length / 3;4854if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG");4855for (i=0; i < pal_len; ++i) {4856palette[i*4+0] = stbi__get8(s);4857palette[i*4+1] = stbi__get8(s);4858palette[i*4+2] = stbi__get8(s);4859palette[i*4+3] = 255;4860}4861break;4862}48634864case STBI__PNG_TYPE('t','R','N','S'): {4865if (first) return stbi__err("first not IHDR", "Corrupt PNG");4866if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG");4867if (pal_img_n) {4868if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; }4869if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG");4870if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG");4871pal_img_n = 4;4872for (i=0; i < c.length; ++i)4873palette[i*4+3] = stbi__get8(s);4874} else {4875if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG");4876if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG");4877has_trans = 1;4878if (z->depth == 16) {4879for (k = 0; k < s->img_n; ++k) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is4880} else {4881for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger4882}4883}4884break;4885}48864887case STBI__PNG_TYPE('I','D','A','T'): {4888if (first) return stbi__err("first not IHDR", "Corrupt PNG");4889if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG");4890if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; }4891if ((int)(ioff + c.length) < (int)ioff) return 0;4892if (ioff + c.length > idata_limit) {4893stbi__uint32 idata_limit_old = idata_limit;4894stbi_uc *p;4895if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096;4896while (ioff + c.length > idata_limit)4897idata_limit *= 2;4898STBI_NOTUSED(idata_limit_old);4899p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory");4900z->idata = p;4901}4902if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG");4903ioff += c.length;4904break;4905}49064907case STBI__PNG_TYPE('I','E','N','D'): {4908stbi__uint32 raw_len, bpl;4909if (first) return stbi__err("first not IHDR", "Corrupt PNG");4910if (scan != STBI__SCAN_load) return 1;4911if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG");4912// initial guess for decoded data size to avoid unnecessary reallocs4913bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component4914raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */;4915z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone);4916if (z->expanded == NULL) return 0; // zlib should set error4917STBI_FREE(z->idata); z->idata = NULL;4918if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans)4919s->img_out_n = s->img_n+1;4920else4921s->img_out_n = s->img_n;4922if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0;4923if (has_trans) {4924if (z->depth == 16) {4925if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0;4926} else {4927if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0;4928}4929}4930if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2)4931stbi__de_iphone(z);4932if (pal_img_n) {4933// pal_img_n == 3 or 44934s->img_n = pal_img_n; // record the actual colors we had4935s->img_out_n = pal_img_n;4936if (req_comp >= 3) s->img_out_n = req_comp;4937if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n))4938return 0;4939} else if (has_trans) {4940// non-paletted image with tRNS -> source image has (constant) alpha4941++s->img_n;4942}4943STBI_FREE(z->expanded); z->expanded = NULL;4944return 1;4945}49464947default:4948// if critical, fail4949if (first) return stbi__err("first not IHDR", "Corrupt PNG");4950if ((c.type & (1 << 29)) == 0) {4951#ifndef STBI_NO_FAILURE_STRINGS4952// not threadsafe4953static char invalid_chunk[] = "XXXX PNG chunk not known";4954invalid_chunk[0] = STBI__BYTECAST(c.type >> 24);4955invalid_chunk[1] = STBI__BYTECAST(c.type >> 16);4956invalid_chunk[2] = STBI__BYTECAST(c.type >> 8);4957invalid_chunk[3] = STBI__BYTECAST(c.type >> 0);4958#endif4959return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type");4960}4961stbi__skip(s, c.length);4962break;4963}4964// end of PNG chunk, read and skip CRC4965stbi__get32be(s);4966}4967}49684969static void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri)4970{4971void *result=NULL;4972if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error");4973if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) {4974if (p->depth < 8)4975ri->bits_per_channel = 8;4976else4977ri->bits_per_channel = p->depth;4978result = p->out;4979p->out = NULL;4980if (req_comp && req_comp != p->s->img_out_n) {4981if (ri->bits_per_channel == 8)4982result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);4983else4984result = stbi__convert_format16((stbi__uint16 *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y);4985p->s->img_out_n = req_comp;4986if (result == NULL) return result;4987}4988*x = p->s->img_x;4989*y = p->s->img_y;4990if (n) *n = p->s->img_n;4991}4992STBI_FREE(p->out); p->out = NULL;4993STBI_FREE(p->expanded); p->expanded = NULL;4994STBI_FREE(p->idata); p->idata = NULL;49954996return result;4997}49984999static void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)5000{5001stbi__png p;5002p.s = s;5003return stbi__do_png(&p, x,y,comp,req_comp, ri);5004}50055006static int stbi__png_test(stbi__context *s)5007{5008int r;5009r = stbi__check_png_header(s);5010stbi__rewind(s);5011return r;5012}50135014static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp)5015{5016if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) {5017stbi__rewind( p->s );5018return 0;5019}5020if (x) *x = p->s->img_x;5021if (y) *y = p->s->img_y;5022if (comp) *comp = p->s->img_n;5023return 1;5024}50255026static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)5027{5028stbi__png p;5029p.s = s;5030return stbi__png_info_raw(&p, x, y, comp);5031}50325033static int stbi__png_is16(stbi__context *s)5034{5035stbi__png p;5036p.s = s;5037if (!stbi__png_info_raw(&p, NULL, NULL, NULL))5038return 0;5039if (p.depth != 16) {5040stbi__rewind(p.s);5041return 0;5042}5043return 1;5044}5045#endif50465047// Microsoft/Windows BMP image50485049#ifndef STBI_NO_BMP5050static int stbi__bmp_test_raw(stbi__context *s)5051{5052int r;5053int sz;5054if (stbi__get8(s) != 'B') return 0;5055if (stbi__get8(s) != 'M') return 0;5056stbi__get32le(s); // discard filesize5057stbi__get16le(s); // discard reserved5058stbi__get16le(s); // discard reserved5059stbi__get32le(s); // discard data offset5060sz = stbi__get32le(s);5061r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124);5062return r;5063}50645065static int stbi__bmp_test(stbi__context *s)5066{5067int r = stbi__bmp_test_raw(s);5068stbi__rewind(s);5069return r;5070}507150725073// returns 0..31 for the highest set bit5074static int stbi__high_bit(unsigned int z)5075{5076int n=0;5077if (z == 0) return -1;5078if (z >= 0x10000) { n += 16; z >>= 16; }5079if (z >= 0x00100) { n += 8; z >>= 8; }5080if (z >= 0x00010) { n += 4; z >>= 4; }5081if (z >= 0x00004) { n += 2; z >>= 2; }5082if (z >= 0x00002) { n += 1;/* >>= 1;*/ }5083return n;5084}50855086static int stbi__bitcount(unsigned int a)5087{5088a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 25089a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 45090a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits5091a = (a + (a >> 8)); // max 16 per 8 bits5092a = (a + (a >> 16)); // max 32 per 8 bits5093return a & 0xff;5094}50955096// extract an arbitrarily-aligned N-bit value (N=bits)5097// from v, and then make it 8-bits long and fractionally5098// extend it to full full range.5099static int stbi__shiftsigned(unsigned int v, int shift, int bits)5100{5101static unsigned int mul_table[9] = {51020,51030xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/,51040x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/,5105};5106static unsigned int shift_table[9] = {51070, 0,0,1,0,2,4,6,0,5108};5109if (shift < 0)5110v <<= -shift;5111else5112v >>= shift;5113STBI_ASSERT(v >= 0 && v < 256);5114v >>= (8-bits);5115STBI_ASSERT(bits >= 0 && bits <= 8);5116return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits];5117}51185119typedef struct5120{5121int bpp, offset, hsz;5122unsigned int mr,mg,mb,ma, all_a;5123} stbi__bmp_data;51245125static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info)5126{5127int hsz;5128if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP");5129stbi__get32le(s); // discard filesize5130stbi__get16le(s); // discard reserved5131stbi__get16le(s); // discard reserved5132info->offset = stbi__get32le(s);5133info->hsz = hsz = stbi__get32le(s);5134info->mr = info->mg = info->mb = info->ma = 0;51355136if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown");5137if (hsz == 12) {5138s->img_x = stbi__get16le(s);5139s->img_y = stbi__get16le(s);5140} else {5141s->img_x = stbi__get32le(s);5142s->img_y = stbi__get32le(s);5143}5144if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP");5145info->bpp = stbi__get16le(s);5146if (hsz != 12) {5147int compress = stbi__get32le(s);5148if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE");5149stbi__get32le(s); // discard sizeof5150stbi__get32le(s); // discard hres5151stbi__get32le(s); // discard vres5152stbi__get32le(s); // discard colorsused5153stbi__get32le(s); // discard max important5154if (hsz == 40 || hsz == 56) {5155if (hsz == 56) {5156stbi__get32le(s);5157stbi__get32le(s);5158stbi__get32le(s);5159stbi__get32le(s);5160}5161if (info->bpp == 16 || info->bpp == 32) {5162if (compress == 0) {5163if (info->bpp == 32) {5164info->mr = 0xffu << 16;5165info->mg = 0xffu << 8;5166info->mb = 0xffu << 0;5167info->ma = 0xffu << 24;5168info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 05169} else {5170info->mr = 31u << 10;5171info->mg = 31u << 5;5172info->mb = 31u << 0;5173}5174} else if (compress == 3) {5175info->mr = stbi__get32le(s);5176info->mg = stbi__get32le(s);5177info->mb = stbi__get32le(s);5178// not documented, but generated by photoshop and handled by mspaint5179if (info->mr == info->mg && info->mg == info->mb) {5180// ?!?!?5181return stbi__errpuc("bad BMP", "bad BMP");5182}5183} else5184return stbi__errpuc("bad BMP", "bad BMP");5185}5186} else {5187int i;5188if (hsz != 108 && hsz != 124)5189return stbi__errpuc("bad BMP", "bad BMP");5190info->mr = stbi__get32le(s);5191info->mg = stbi__get32le(s);5192info->mb = stbi__get32le(s);5193info->ma = stbi__get32le(s);5194stbi__get32le(s); // discard color space5195for (i=0; i < 12; ++i)5196stbi__get32le(s); // discard color space parameters5197if (hsz == 124) {5198stbi__get32le(s); // discard rendering intent5199stbi__get32le(s); // discard offset of profile data5200stbi__get32le(s); // discard size of profile data5201stbi__get32le(s); // discard reserved5202}5203}5204}5205return (void *) 1;5206}520752085209static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)5210{5211stbi_uc *out;5212unsigned int mr=0,mg=0,mb=0,ma=0, all_a;5213stbi_uc pal[256][4];5214int psize=0,i,j,width;5215int flip_vertically, pad, target;5216stbi__bmp_data info;5217STBI_NOTUSED(ri);52185219info.all_a = 255;5220if (stbi__bmp_parse_header(s, &info) == NULL)5221return NULL; // error code already set52225223flip_vertically = ((int) s->img_y) > 0;5224s->img_y = abs((int) s->img_y);52255226mr = info.mr;5227mg = info.mg;5228mb = info.mb;5229ma = info.ma;5230all_a = info.all_a;52315232if (info.hsz == 12) {5233if (info.bpp < 24)5234psize = (info.offset - 14 - 24) / 3;5235} else {5236if (info.bpp < 16)5237psize = (info.offset - 14 - info.hsz) >> 2;5238}52395240if (info.bpp == 24 && ma == 0xff000000)5241s->img_n = 3;5242else5243s->img_n = ma ? 4 : 3;5244if (req_comp && req_comp >= 3) // we can directly decode 3 or 45245target = req_comp;5246else5247target = s->img_n; // if they want monochrome, we'll post-convert52485249// sanity-check size5250if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0))5251return stbi__errpuc("too large", "Corrupt BMP");52525253out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0);5254if (!out) return stbi__errpuc("outofmem", "Out of memory");5255if (info.bpp < 16) {5256int z=0;5257if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); }5258for (i=0; i < psize; ++i) {5259pal[i][2] = stbi__get8(s);5260pal[i][1] = stbi__get8(s);5261pal[i][0] = stbi__get8(s);5262if (info.hsz != 12) stbi__get8(s);5263pal[i][3] = 255;5264}5265stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4));5266if (info.bpp == 1) width = (s->img_x + 7) >> 3;5267else if (info.bpp == 4) width = (s->img_x + 1) >> 1;5268else if (info.bpp == 8) width = s->img_x;5269else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); }5270pad = (-width)&3;5271if (info.bpp == 1) {5272for (j=0; j < (int) s->img_y; ++j) {5273int bit_offset = 7, v = stbi__get8(s);5274for (i=0; i < (int) s->img_x; ++i) {5275int color = (v>>bit_offset)&0x1;5276out[z++] = pal[color][0];5277out[z++] = pal[color][1];5278out[z++] = pal[color][2];5279if (target == 4) out[z++] = 255;5280if (i+1 == (int) s->img_x) break;5281if((--bit_offset) < 0) {5282bit_offset = 7;5283v = stbi__get8(s);5284}5285}5286stbi__skip(s, pad);5287}5288} else {5289for (j=0; j < (int) s->img_y; ++j) {5290for (i=0; i < (int) s->img_x; i += 2) {5291int v=stbi__get8(s),v2=0;5292if (info.bpp == 4) {5293v2 = v & 15;5294v >>= 4;5295}5296out[z++] = pal[v][0];5297out[z++] = pal[v][1];5298out[z++] = pal[v][2];5299if (target == 4) out[z++] = 255;5300if (i+1 == (int) s->img_x) break;5301v = (info.bpp == 8) ? stbi__get8(s) : v2;5302out[z++] = pal[v][0];5303out[z++] = pal[v][1];5304out[z++] = pal[v][2];5305if (target == 4) out[z++] = 255;5306}5307stbi__skip(s, pad);5308}5309}5310} else {5311int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0;5312int z = 0;5313int easy=0;5314stbi__skip(s, info.offset - 14 - info.hsz);5315if (info.bpp == 24) width = 3 * s->img_x;5316else if (info.bpp == 16) width = 2*s->img_x;5317else /* bpp = 32 and pad = 0 */ width=0;5318pad = (-width) & 3;5319if (info.bpp == 24) {5320easy = 1;5321} else if (info.bpp == 32) {5322if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000)5323easy = 2;5324}5325if (!easy) {5326if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); }5327// right shift amt to put high bit in position #75328rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr);5329gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg);5330bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb);5331ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma);5332}5333for (j=0; j < (int) s->img_y; ++j) {5334if (easy) {5335for (i=0; i < (int) s->img_x; ++i) {5336unsigned char a;5337out[z+2] = stbi__get8(s);5338out[z+1] = stbi__get8(s);5339out[z+0] = stbi__get8(s);5340z += 3;5341a = (easy == 2 ? stbi__get8(s) : 255);5342all_a |= a;5343if (target == 4) out[z++] = a;5344}5345} else {5346int bpp = info.bpp;5347for (i=0; i < (int) s->img_x; ++i) {5348stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s));5349unsigned int a;5350out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount));5351out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount));5352out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount));5353a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255);5354all_a |= a;5355if (target == 4) out[z++] = STBI__BYTECAST(a);5356}5357}5358stbi__skip(s, pad);5359}5360}53615362// if alpha channel is all 0s, replace with all 255s5363if (target == 4 && all_a == 0)5364for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4)5365out[i] = 255;53665367if (flip_vertically) {5368stbi_uc t;5369for (j=0; j < (int) s->img_y>>1; ++j) {5370stbi_uc *p1 = out + j *s->img_x*target;5371stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target;5372for (i=0; i < (int) s->img_x*target; ++i) {5373t = p1[i]; p1[i] = p2[i]; p2[i] = t;5374}5375}5376}53775378if (req_comp && req_comp != target) {5379out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y);5380if (out == NULL) return out; // stbi__convert_format frees input on failure5381}53825383*x = s->img_x;5384*y = s->img_y;5385if (comp) *comp = s->img_n;5386return out;5387}5388#endif53895390// Targa Truevision - TGA5391// by Jonathan Dummer5392#ifndef STBI_NO_TGA5393// returns STBI_rgb or whatever, 0 on error5394static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16)5395{5396// only RGB or RGBA (incl. 16bit) or grey allowed5397if (is_rgb16) *is_rgb16 = 0;5398switch(bits_per_pixel) {5399case 8: return STBI_grey;5400case 16: if(is_grey) return STBI_grey_alpha;5401// fallthrough5402case 15: if(is_rgb16) *is_rgb16 = 1;5403return STBI_rgb;5404case 24: // fallthrough5405case 32: return bits_per_pixel/8;5406default: return 0;5407}5408}54095410static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)5411{5412int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp;5413int sz, tga_colormap_type;5414stbi__get8(s); // discard Offset5415tga_colormap_type = stbi__get8(s); // colormap type5416if( tga_colormap_type > 1 ) {5417stbi__rewind(s);5418return 0; // only RGB or indexed allowed5419}5420tga_image_type = stbi__get8(s); // image type5421if ( tga_colormap_type == 1 ) { // colormapped (paletted) image5422if (tga_image_type != 1 && tga_image_type != 9) {5423stbi__rewind(s);5424return 0;5425}5426stbi__skip(s,4); // skip index of first colormap entry and number of entries5427sz = stbi__get8(s); // check bits per palette color entry5428if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) {5429stbi__rewind(s);5430return 0;5431}5432stbi__skip(s,4); // skip image x and y origin5433tga_colormap_bpp = sz;5434} else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE5435if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) {5436stbi__rewind(s);5437return 0; // only RGB or grey allowed, +/- RLE5438}5439stbi__skip(s,9); // skip colormap specification and image x/y origin5440tga_colormap_bpp = 0;5441}5442tga_w = stbi__get16le(s);5443if( tga_w < 1 ) {5444stbi__rewind(s);5445return 0; // test width5446}5447tga_h = stbi__get16le(s);5448if( tga_h < 1 ) {5449stbi__rewind(s);5450return 0; // test height5451}5452tga_bits_per_pixel = stbi__get8(s); // bits per pixel5453stbi__get8(s); // ignore alpha bits5454if (tga_colormap_bpp != 0) {5455if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) {5456// when using a colormap, tga_bits_per_pixel is the size of the indexes5457// I don't think anything but 8 or 16bit indexes makes sense5458stbi__rewind(s);5459return 0;5460}5461tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL);5462} else {5463tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL);5464}5465if(!tga_comp) {5466stbi__rewind(s);5467return 0;5468}5469if (x) *x = tga_w;5470if (y) *y = tga_h;5471if (comp) *comp = tga_comp;5472return 1; // seems to have passed everything5473}54745475static int stbi__tga_test(stbi__context *s)5476{5477int res = 0;5478int sz, tga_color_type;5479stbi__get8(s); // discard Offset5480tga_color_type = stbi__get8(s); // color type5481if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed5482sz = stbi__get8(s); // image type5483if ( tga_color_type == 1 ) { // colormapped (paletted) image5484if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 95485stbi__skip(s,4); // skip index of first colormap entry and number of entries5486sz = stbi__get8(s); // check bits per palette color entry5487if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;5488stbi__skip(s,4); // skip image x and y origin5489} else { // "normal" image w/o colormap5490if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE5491stbi__skip(s,9); // skip colormap specification and image x/y origin5492}5493if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width5494if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height5495sz = stbi__get8(s); // bits per pixel5496if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index5497if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd;54985499res = 1; // if we got this far, everything's good and we can return 1 instead of 055005501errorEnd:5502stbi__rewind(s);5503return res;5504}55055506// read 16bit value and convert to 24bit RGB5507static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out)5508{5509stbi__uint16 px = (stbi__uint16)stbi__get16le(s);5510stbi__uint16 fiveBitMask = 31;5511// we have 3 channels with 5bits each5512int r = (px >> 10) & fiveBitMask;5513int g = (px >> 5) & fiveBitMask;5514int b = px & fiveBitMask;5515// Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later5516out[0] = (stbi_uc)((r * 255)/31);5517out[1] = (stbi_uc)((g * 255)/31);5518out[2] = (stbi_uc)((b * 255)/31);55195520// some people claim that the most significant bit might be used for alpha5521// (possibly if an alpha-bit is set in the "image descriptor byte")5522// but that only made 16bit test images completely translucent..5523// so let's treat all 15 and 16bit TGAs as RGB with no alpha.5524}55255526static void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)5527{5528// read in the TGA header stuff5529int tga_offset = stbi__get8(s);5530int tga_indexed = stbi__get8(s);5531int tga_image_type = stbi__get8(s);5532int tga_is_RLE = 0;5533int tga_palette_start = stbi__get16le(s);5534int tga_palette_len = stbi__get16le(s);5535int tga_palette_bits = stbi__get8(s);5536int tga_x_origin = stbi__get16le(s);5537int tga_y_origin = stbi__get16le(s);5538int tga_width = stbi__get16le(s);5539int tga_height = stbi__get16le(s);5540int tga_bits_per_pixel = stbi__get8(s);5541int tga_comp, tga_rgb16=0;5542int tga_inverted = stbi__get8(s);5543// int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?)5544// image data5545unsigned char *tga_data;5546unsigned char *tga_palette = NULL;5547int i, j;5548unsigned char raw_data[4] = {0};5549int RLE_count = 0;5550int RLE_repeating = 0;5551int read_next_pixel = 1;5552STBI_NOTUSED(ri);5553STBI_NOTUSED(tga_x_origin); // @TODO5554STBI_NOTUSED(tga_y_origin); // @TODO55555556// do a tiny bit of precessing5557if ( tga_image_type >= 8 )5558{5559tga_image_type -= 8;5560tga_is_RLE = 1;5561}5562tga_inverted = 1 - ((tga_inverted >> 5) & 1);55635564// If I'm paletted, then I'll use the number of bits from the palette5565if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16);5566else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16);55675568if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency5569return stbi__errpuc("bad format", "Can't find out TGA pixelformat");55705571// tga info5572*x = tga_width;5573*y = tga_height;5574if (comp) *comp = tga_comp;55755576if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0))5577return stbi__errpuc("too large", "Corrupt TGA");55785579tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0);5580if (!tga_data) return stbi__errpuc("outofmem", "Out of memory");55815582// skip to the data's starting position (offset usually = 0)5583stbi__skip(s, tga_offset );55845585if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) {5586for (i=0; i < tga_height; ++i) {5587int row = tga_inverted ? tga_height -i - 1 : i;5588stbi_uc *tga_row = tga_data + row*tga_width*tga_comp;5589stbi__getn(s, tga_row, tga_width * tga_comp);5590}5591} else {5592// do I need to load a palette?5593if ( tga_indexed)5594{5595// any data to skip? (offset usually = 0)5596stbi__skip(s, tga_palette_start );5597// load the palette5598tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0);5599if (!tga_palette) {5600STBI_FREE(tga_data);5601return stbi__errpuc("outofmem", "Out of memory");5602}5603if (tga_rgb16) {5604stbi_uc *pal_entry = tga_palette;5605STBI_ASSERT(tga_comp == STBI_rgb);5606for (i=0; i < tga_palette_len; ++i) {5607stbi__tga_read_rgb16(s, pal_entry);5608pal_entry += tga_comp;5609}5610} else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) {5611STBI_FREE(tga_data);5612STBI_FREE(tga_palette);5613return stbi__errpuc("bad palette", "Corrupt TGA");5614}5615}5616// load the data5617for (i=0; i < tga_width * tga_height; ++i)5618{5619// if I'm in RLE mode, do I need to get a RLE stbi__pngchunk?5620if ( tga_is_RLE )5621{5622if ( RLE_count == 0 )5623{5624// yep, get the next byte as a RLE command5625int RLE_cmd = stbi__get8(s);5626RLE_count = 1 + (RLE_cmd & 127);5627RLE_repeating = RLE_cmd >> 7;5628read_next_pixel = 1;5629} else if ( !RLE_repeating )5630{5631read_next_pixel = 1;5632}5633} else5634{5635read_next_pixel = 1;5636}5637// OK, if I need to read a pixel, do it now5638if ( read_next_pixel )5639{5640// load however much data we did have5641if ( tga_indexed )5642{5643// read in index, then perform the lookup5644int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s);5645if ( pal_idx >= tga_palette_len ) {5646// invalid index5647pal_idx = 0;5648}5649pal_idx *= tga_comp;5650for (j = 0; j < tga_comp; ++j) {5651raw_data[j] = tga_palette[pal_idx+j];5652}5653} else if(tga_rgb16) {5654STBI_ASSERT(tga_comp == STBI_rgb);5655stbi__tga_read_rgb16(s, raw_data);5656} else {5657// read in the data raw5658for (j = 0; j < tga_comp; ++j) {5659raw_data[j] = stbi__get8(s);5660}5661}5662// clear the reading flag for the next pixel5663read_next_pixel = 0;5664} // end of reading a pixel56655666// copy data5667for (j = 0; j < tga_comp; ++j)5668tga_data[i*tga_comp+j] = raw_data[j];56695670// in case we're in RLE mode, keep counting down5671--RLE_count;5672}5673// do I need to invert the image?5674if ( tga_inverted )5675{5676for (j = 0; j*2 < tga_height; ++j)5677{5678int index1 = j * tga_width * tga_comp;5679int index2 = (tga_height - 1 - j) * tga_width * tga_comp;5680for (i = tga_width * tga_comp; i > 0; --i)5681{5682unsigned char temp = tga_data[index1];5683tga_data[index1] = tga_data[index2];5684tga_data[index2] = temp;5685++index1;5686++index2;5687}5688}5689}5690// clear my palette, if I had one5691if ( tga_palette != NULL )5692{5693STBI_FREE( tga_palette );5694}5695}56965697// swap RGB - if the source data was RGB16, it already is in the right order5698if (tga_comp >= 3 && !tga_rgb16)5699{5700unsigned char* tga_pixel = tga_data;5701for (i=0; i < tga_width * tga_height; ++i)5702{5703unsigned char temp = tga_pixel[0];5704tga_pixel[0] = tga_pixel[2];5705tga_pixel[2] = temp;5706tga_pixel += tga_comp;5707}5708}57095710// convert to target component count5711if (req_comp && req_comp != tga_comp)5712tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height);57135714// the things I do to get rid of an error message, and yet keep5715// Microsoft's C compilers happy... [8^(5716tga_palette_start = tga_palette_len = tga_palette_bits =5717tga_x_origin = tga_y_origin = 0;5718STBI_NOTUSED(tga_palette_start);5719// OK, done5720return tga_data;5721}5722#endif57235724// *************************************************************************************************5725// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB57265727#ifndef STBI_NO_PSD5728static int stbi__psd_test(stbi__context *s)5729{5730int r = (stbi__get32be(s) == 0x38425053);5731stbi__rewind(s);5732return r;5733}57345735static int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount)5736{5737int count, nleft, len;57385739count = 0;5740while ((nleft = pixelCount - count) > 0) {5741len = stbi__get8(s);5742if (len == 128) {5743// No-op.5744} else if (len < 128) {5745// Copy next len+1 bytes literally.5746len++;5747if (len > nleft) return 0; // corrupt data5748count += len;5749while (len) {5750*p = stbi__get8(s);5751p += 4;5752len--;5753}5754} else if (len > 128) {5755stbi_uc val;5756// Next -len+1 bytes in the dest are replicated from next source byte.5757// (Interpret len as a negative 8-bit int.)5758len = 257 - len;5759if (len > nleft) return 0; // corrupt data5760val = stbi__get8(s);5761count += len;5762while (len) {5763*p = val;5764p += 4;5765len--;5766}5767}5768}57695770return 1;5771}57725773static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc)5774{5775int pixelCount;5776int channelCount, compression;5777int channel, i;5778int bitdepth;5779int w,h;5780stbi_uc *out;5781STBI_NOTUSED(ri);57825783// Check identifier5784if (stbi__get32be(s) != 0x38425053) // "8BPS"5785return stbi__errpuc("not PSD", "Corrupt PSD image");57865787// Check file type version.5788if (stbi__get16be(s) != 1)5789return stbi__errpuc("wrong version", "Unsupported version of PSD image");57905791// Skip 6 reserved bytes.5792stbi__skip(s, 6 );57935794// Read the number of channels (R, G, B, A, etc).5795channelCount = stbi__get16be(s);5796if (channelCount < 0 || channelCount > 16)5797return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image");57985799// Read the rows and columns of the image.5800h = stbi__get32be(s);5801w = stbi__get32be(s);58025803// Make sure the depth is 8 bits.5804bitdepth = stbi__get16be(s);5805if (bitdepth != 8 && bitdepth != 16)5806return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit");58075808// Make sure the color mode is RGB.5809// Valid options are:5810// 0: Bitmap5811// 1: Grayscale5812// 2: Indexed color5813// 3: RGB color5814// 4: CMYK color5815// 7: Multichannel5816// 8: Duotone5817// 9: Lab color5818if (stbi__get16be(s) != 3)5819return stbi__errpuc("wrong color format", "PSD is not in RGB color format");58205821// Skip the Mode Data. (It's the palette for indexed color; other info for other modes.)5822stbi__skip(s,stbi__get32be(s) );58235824// Skip the image resources. (resolution, pen tool paths, etc)5825stbi__skip(s, stbi__get32be(s) );58265827// Skip the reserved data.5828stbi__skip(s, stbi__get32be(s) );58295830// Find out if the data is compressed.5831// Known values:5832// 0: no compression5833// 1: RLE compressed5834compression = stbi__get16be(s);5835if (compression > 1)5836return stbi__errpuc("bad compression", "PSD has an unknown compression format");58375838// Check size5839if (!stbi__mad3sizes_valid(4, w, h, 0))5840return stbi__errpuc("too large", "Corrupt PSD");58415842// Create the destination image.58435844if (!compression && bitdepth == 16 && bpc == 16) {5845out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0);5846ri->bits_per_channel = 16;5847} else5848out = (stbi_uc *) stbi__malloc(4 * w*h);58495850if (!out) return stbi__errpuc("outofmem", "Out of memory");5851pixelCount = w*h;58525853// Initialize the data to zero.5854//memset( out, 0, pixelCount * 4 );58555856// Finally, the image data.5857if (compression) {5858// RLE as used by .PSD and .TIFF5859// Loop until you get the number of unpacked bytes you are expecting:5860// Read the next source byte into n.5861// If n is between 0 and 127 inclusive, copy the next n+1 bytes literally.5862// Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times.5863// Else if n is 128, noop.5864// Endloop58655866// The RLE-compressed data is preceded by a 2-byte data count for each row in the data,5867// which we're going to just skip.5868stbi__skip(s, h * channelCount * 2 );58695870// Read the RLE data by channel.5871for (channel = 0; channel < 4; channel++) {5872stbi_uc *p;58735874p = out+channel;5875if (channel >= channelCount) {5876// Fill this channel with default data.5877for (i = 0; i < pixelCount; i++, p += 4)5878*p = (channel == 3 ? 255 : 0);5879} else {5880// Read the RLE data.5881if (!stbi__psd_decode_rle(s, p, pixelCount)) {5882STBI_FREE(out);5883return stbi__errpuc("corrupt", "bad RLE data");5884}5885}5886}58875888} else {5889// We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...)5890// where each channel consists of an 8-bit (or 16-bit) value for each pixel in the image.58915892// Read the data by channel.5893for (channel = 0; channel < 4; channel++) {5894if (channel >= channelCount) {5895// Fill this channel with default data.5896if (bitdepth == 16 && bpc == 16) {5897stbi__uint16 *q = ((stbi__uint16 *) out) + channel;5898stbi__uint16 val = channel == 3 ? 65535 : 0;5899for (i = 0; i < pixelCount; i++, q += 4)5900*q = val;5901} else {5902stbi_uc *p = out+channel;5903stbi_uc val = channel == 3 ? 255 : 0;5904for (i = 0; i < pixelCount; i++, p += 4)5905*p = val;5906}5907} else {5908if (ri->bits_per_channel == 16) { // output bpc5909stbi__uint16 *q = ((stbi__uint16 *) out) + channel;5910for (i = 0; i < pixelCount; i++, q += 4)5911*q = (stbi__uint16) stbi__get16be(s);5912} else {5913stbi_uc *p = out+channel;5914if (bitdepth == 16) { // input bpc5915for (i = 0; i < pixelCount; i++, p += 4)5916*p = (stbi_uc) (stbi__get16be(s) >> 8);5917} else {5918for (i = 0; i < pixelCount; i++, p += 4)5919*p = stbi__get8(s);5920}5921}5922}5923}5924}59255926// remove weird white matte from PSD5927if (channelCount >= 4) {5928if (ri->bits_per_channel == 16) {5929for (i=0; i < w*h; ++i) {5930stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i;5931if (pixel[3] != 0 && pixel[3] != 65535) {5932float a = pixel[3] / 65535.0f;5933float ra = 1.0f / a;5934float inv_a = 65535.0f * (1 - ra);5935pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a);5936pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a);5937pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a);5938}5939}5940} else {5941for (i=0; i < w*h; ++i) {5942unsigned char *pixel = out + 4*i;5943if (pixel[3] != 0 && pixel[3] != 255) {5944float a = pixel[3] / 255.0f;5945float ra = 1.0f / a;5946float inv_a = 255.0f * (1 - ra);5947pixel[0] = (unsigned char) (pixel[0]*ra + inv_a);5948pixel[1] = (unsigned char) (pixel[1]*ra + inv_a);5949pixel[2] = (unsigned char) (pixel[2]*ra + inv_a);5950}5951}5952}5953}59545955// convert to desired output format5956if (req_comp && req_comp != 4) {5957if (ri->bits_per_channel == 16)5958out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h);5959else5960out = stbi__convert_format(out, 4, req_comp, w, h);5961if (out == NULL) return out; // stbi__convert_format frees input on failure5962}59635964if (comp) *comp = 4;5965*y = h;5966*x = w;59675968return out;5969}5970#endif59715972// *************************************************************************************************5973// Softimage PIC loader5974// by Tom Seddon5975//5976// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format5977// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/59785979#ifndef STBI_NO_PIC5980static int stbi__pic_is4(stbi__context *s,const char *str)5981{5982int i;5983for (i=0; i<4; ++i)5984if (stbi__get8(s) != (stbi_uc)str[i])5985return 0;59865987return 1;5988}59895990static int stbi__pic_test_core(stbi__context *s)5991{5992int i;59935994if (!stbi__pic_is4(s,"\x53\x80\xF6\x34"))5995return 0;59965997for(i=0;i<84;++i)5998stbi__get8(s);59996000if (!stbi__pic_is4(s,"PICT"))6001return 0;60026003return 1;6004}60056006typedef struct6007{6008stbi_uc size,type,channel;6009} stbi__pic_packet;60106011static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest)6012{6013int mask=0x80, i;60146015for (i=0; i<4; ++i, mask>>=1) {6016if (channel & mask) {6017if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short");6018dest[i]=stbi__get8(s);6019}6020}60216022return dest;6023}60246025static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src)6026{6027int mask=0x80,i;60286029for (i=0;i<4; ++i, mask>>=1)6030if (channel&mask)6031dest[i]=src[i];6032}60336034static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result)6035{6036int act_comp=0,num_packets=0,y,chained;6037stbi__pic_packet packets[10];60386039// this will (should...) cater for even some bizarre stuff like having data6040// for the same channel in multiple packets.6041do {6042stbi__pic_packet *packet;60436044if (num_packets==sizeof(packets)/sizeof(packets[0]))6045return stbi__errpuc("bad format","too many packets");60466047packet = &packets[num_packets++];60486049chained = stbi__get8(s);6050packet->size = stbi__get8(s);6051packet->type = stbi__get8(s);6052packet->channel = stbi__get8(s);60536054act_comp |= packet->channel;60556056if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)");6057if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp");6058} while (chained);60596060*comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel?60616062for(y=0; y<height; ++y) {6063int packet_idx;60646065for(packet_idx=0; packet_idx < num_packets; ++packet_idx) {6066stbi__pic_packet *packet = &packets[packet_idx];6067stbi_uc *dest = result+y*width*4;60686069switch (packet->type) {6070default:6071return stbi__errpuc("bad format","packet has bad compression type");60726073case 0: {//uncompressed6074int x;60756076for(x=0;x<width;++x, dest+=4)6077if (!stbi__readval(s,packet->channel,dest))6078return 0;6079break;6080}60816082case 1://Pure RLE6083{6084int left=width, i;60856086while (left>0) {6087stbi_uc count,value[4];60886089count=stbi__get8(s);6090if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)");60916092if (count > left)6093count = (stbi_uc) left;60946095if (!stbi__readval(s,packet->channel,value)) return 0;60966097for(i=0; i<count; ++i,dest+=4)6098stbi__copyval(packet->channel,dest,value);6099left -= count;6100}6101}6102break;61036104case 2: {//Mixed RLE6105int left=width;6106while (left>0) {6107int count = stbi__get8(s), i;6108if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)");61096110if (count >= 128) { // Repeated6111stbi_uc value[4];61126113if (count==128)6114count = stbi__get16be(s);6115else6116count -= 127;6117if (count > left)6118return stbi__errpuc("bad file","scanline overrun");61196120if (!stbi__readval(s,packet->channel,value))6121return 0;61226123for(i=0;i<count;++i, dest += 4)6124stbi__copyval(packet->channel,dest,value);6125} else { // Raw6126++count;6127if (count>left) return stbi__errpuc("bad file","scanline overrun");61286129for(i=0;i<count;++i, dest+=4)6130if (!stbi__readval(s,packet->channel,dest))6131return 0;6132}6133left-=count;6134}6135break;6136}6137}6138}6139}61406141return result;6142}61436144static void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri)6145{6146stbi_uc *result;6147int i, x,y, internal_comp;6148STBI_NOTUSED(ri);61496150if (!comp) comp = &internal_comp;61516152for (i=0; i<92; ++i)6153stbi__get8(s);61546155x = stbi__get16be(s);6156y = stbi__get16be(s);6157if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)");6158if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC image too large to decode");61596160stbi__get32be(s); //skip `ratio'6161stbi__get16be(s); //skip `fields'6162stbi__get16be(s); //skip `pad'61636164// intermediate buffer is RGBA6165result = (stbi_uc *) stbi__malloc_mad3(x, y, 4, 0);6166memset(result, 0xff, x*y*4);61676168if (!stbi__pic_load_core(s,x,y,comp, result)) {6169STBI_FREE(result);6170result=0;6171}6172*px = x;6173*py = y;6174if (req_comp == 0) req_comp = *comp;6175result=stbi__convert_format(result,4,req_comp,x,y);61766177return result;6178}61796180static int stbi__pic_test(stbi__context *s)6181{6182int r = stbi__pic_test_core(s);6183stbi__rewind(s);6184return r;6185}6186#endif61876188// *************************************************************************************************6189// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb61906191#ifndef STBI_NO_GIF6192typedef struct6193{6194stbi__int16 prefix;6195stbi_uc first;6196stbi_uc suffix;6197} stbi__gif_lzw;61986199typedef struct6200{6201int w,h;6202stbi_uc *out; // output buffer (always 4 components)6203stbi_uc *background; // The current "background" as far as a gif is concerned6204stbi_uc *history;6205int flags, bgindex, ratio, transparent, eflags;6206stbi_uc pal[256][4];6207stbi_uc lpal[256][4];6208stbi__gif_lzw codes[8192];6209stbi_uc *color_table;6210int parse, step;6211int lflags;6212int start_x, start_y;6213int max_x, max_y;6214int cur_x, cur_y;6215int line_size;6216int delay;6217} stbi__gif;62186219static int stbi__gif_test_raw(stbi__context *s)6220{6221int sz;6222if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0;6223sz = stbi__get8(s);6224if (sz != '9' && sz != '7') return 0;6225if (stbi__get8(s) != 'a') return 0;6226return 1;6227}62286229static int stbi__gif_test(stbi__context *s)6230{6231int r = stbi__gif_test_raw(s);6232stbi__rewind(s);6233return r;6234}62356236static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp)6237{6238int i;6239for (i=0; i < num_entries; ++i) {6240pal[i][2] = stbi__get8(s);6241pal[i][1] = stbi__get8(s);6242pal[i][0] = stbi__get8(s);6243pal[i][3] = transp == i ? 0 : 255;6244}6245}62466247static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info)6248{6249stbi_uc version;6250if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8')6251return stbi__err("not GIF", "Corrupt GIF");62526253version = stbi__get8(s);6254if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF");6255if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF");62566257stbi__g_failure_reason = "";6258g->w = stbi__get16le(s);6259g->h = stbi__get16le(s);6260g->flags = stbi__get8(s);6261g->bgindex = stbi__get8(s);6262g->ratio = stbi__get8(s);6263g->transparent = -1;62646265if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments62666267if (is_info) return 1;62686269if (g->flags & 0x80)6270stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1);62716272return 1;6273}62746275static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp)6276{6277stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif));6278if (!stbi__gif_header(s, g, comp, 1)) {6279STBI_FREE(g);6280stbi__rewind( s );6281return 0;6282}6283if (x) *x = g->w;6284if (y) *y = g->h;6285STBI_FREE(g);6286return 1;6287}62886289static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code)6290{6291stbi_uc *p, *c;6292int idx;62936294// recurse to decode the prefixes, since the linked-list is backwards,6295// and working backwards through an interleaved image would be nasty6296if (g->codes[code].prefix >= 0)6297stbi__out_gif_code(g, g->codes[code].prefix);62986299if (g->cur_y >= g->max_y) return;63006301idx = g->cur_x + g->cur_y;6302p = &g->out[idx];6303g->history[idx / 4] = 1;63046305c = &g->color_table[g->codes[code].suffix * 4];6306if (c[3] > 128) { // don't render transparent pixels;6307p[0] = c[2];6308p[1] = c[1];6309p[2] = c[0];6310p[3] = c[3];6311}6312g->cur_x += 4;63136314if (g->cur_x >= g->max_x) {6315g->cur_x = g->start_x;6316g->cur_y += g->step;63176318while (g->cur_y >= g->max_y && g->parse > 0) {6319g->step = (1 << g->parse) * g->line_size;6320g->cur_y = g->start_y + (g->step >> 1);6321--g->parse;6322}6323}6324}63256326static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g)6327{6328stbi_uc lzw_cs;6329stbi__int32 len, init_code;6330stbi__uint32 first;6331stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear;6332stbi__gif_lzw *p;63336334lzw_cs = stbi__get8(s);6335if (lzw_cs > 12) return NULL;6336clear = 1 << lzw_cs;6337first = 1;6338codesize = lzw_cs + 1;6339codemask = (1 << codesize) - 1;6340bits = 0;6341valid_bits = 0;6342for (init_code = 0; init_code < clear; init_code++) {6343g->codes[init_code].prefix = -1;6344g->codes[init_code].first = (stbi_uc) init_code;6345g->codes[init_code].suffix = (stbi_uc) init_code;6346}63476348// support no starting clear code6349avail = clear+2;6350oldcode = -1;63516352len = 0;6353for(;;) {6354if (valid_bits < codesize) {6355if (len == 0) {6356len = stbi__get8(s); // start new block6357if (len == 0)6358return g->out;6359}6360--len;6361bits |= (stbi__int32) stbi__get8(s) << valid_bits;6362valid_bits += 8;6363} else {6364stbi__int32 code = bits & codemask;6365bits >>= codesize;6366valid_bits -= codesize;6367// @OPTIMIZE: is there some way we can accelerate the non-clear path?6368if (code == clear) { // clear code6369codesize = lzw_cs + 1;6370codemask = (1 << codesize) - 1;6371avail = clear + 2;6372oldcode = -1;6373first = 0;6374} else if (code == clear + 1) { // end of stream code6375stbi__skip(s, len);6376while ((len = stbi__get8(s)) > 0)6377stbi__skip(s,len);6378return g->out;6379} else if (code <= avail) {6380if (first) {6381return stbi__errpuc("no clear code", "Corrupt GIF");6382}63836384if (oldcode >= 0) {6385p = &g->codes[avail++];6386if (avail > 8192) {6387return stbi__errpuc("too many codes", "Corrupt GIF");6388}63896390p->prefix = (stbi__int16) oldcode;6391p->first = g->codes[oldcode].first;6392p->suffix = (code == avail) ? p->first : g->codes[code].first;6393} else if (code == avail)6394return stbi__errpuc("illegal code in raster", "Corrupt GIF");63956396stbi__out_gif_code(g, (stbi__uint16) code);63976398if ((avail & codemask) == 0 && avail <= 0x0FFF) {6399codesize++;6400codemask = (1 << codesize) - 1;6401}64026403oldcode = code;6404} else {6405return stbi__errpuc("illegal code in raster", "Corrupt GIF");6406}6407}6408}6409}64106411// this function is designed to support animated gifs, although stb_image doesn't support it6412// two back is the image from two frames ago, used for a very specific disposal format6413static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back)6414{6415int dispose;6416int first_frame;6417int pi;6418int pcount;6419STBI_NOTUSED(req_comp);64206421// on first frame, any non-written pixels get the background colour (non-transparent)6422first_frame = 0;6423if (g->out == 0) {6424if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header6425if (!stbi__mad3sizes_valid(4, g->w, g->h, 0))6426return stbi__errpuc("too large", "GIF image is too large");6427pcount = g->w * g->h;6428g->out = (stbi_uc *) stbi__malloc(4 * pcount);6429g->background = (stbi_uc *) stbi__malloc(4 * pcount);6430g->history = (stbi_uc *) stbi__malloc(pcount);6431if (!g->out || !g->background || !g->history)6432return stbi__errpuc("outofmem", "Out of memory");64336434// image is treated as "transparent" at the start - ie, nothing overwrites the current background;6435// background colour is only used for pixels that are not rendered first frame, after that "background"6436// color refers to the color that was there the previous frame.6437memset(g->out, 0x00, 4 * pcount);6438memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent)6439memset(g->history, 0x00, pcount); // pixels that were affected previous frame6440first_frame = 1;6441} else {6442// second frame - how do we dispoase of the previous one?6443dispose = (g->eflags & 0x1C) >> 2;6444pcount = g->w * g->h;64456446if ((dispose == 3) && (two_back == 0)) {6447dispose = 2; // if I don't have an image to revert back to, default to the old background6448}64496450if (dispose == 3) { // use previous graphic6451for (pi = 0; pi < pcount; ++pi) {6452if (g->history[pi]) {6453memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 );6454}6455}6456} else if (dispose == 2) {6457// restore what was changed last frame to background before that frame;6458for (pi = 0; pi < pcount; ++pi) {6459if (g->history[pi]) {6460memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 );6461}6462}6463} else {6464// This is a non-disposal case eithe way, so just6465// leave the pixels as is, and they will become the new background6466// 1: do not dispose6467// 0: not specified.6468}64696470// background is what out is after the undoing of the previou frame;6471memcpy( g->background, g->out, 4 * g->w * g->h );6472}64736474// clear my history;6475memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame64766477for (;;) {6478int tag = stbi__get8(s);6479switch (tag) {6480case 0x2C: /* Image Descriptor */6481{6482stbi__int32 x, y, w, h;6483stbi_uc *o;64846485x = stbi__get16le(s);6486y = stbi__get16le(s);6487w = stbi__get16le(s);6488h = stbi__get16le(s);6489if (((x + w) > (g->w)) || ((y + h) > (g->h)))6490return stbi__errpuc("bad Image Descriptor", "Corrupt GIF");64916492g->line_size = g->w * 4;6493g->start_x = x * 4;6494g->start_y = y * g->line_size;6495g->max_x = g->start_x + w * 4;6496g->max_y = g->start_y + h * g->line_size;6497g->cur_x = g->start_x;6498g->cur_y = g->start_y;64996500// if the width of the specified rectangle is 0, that means6501// we may not see *any* pixels or the image is malformed;6502// to make sure this is caught, move the current y down to6503// max_y (which is what out_gif_code checks).6504if (w == 0)6505g->cur_y = g->max_y;65066507g->lflags = stbi__get8(s);65086509if (g->lflags & 0x40) {6510g->step = 8 * g->line_size; // first interlaced spacing6511g->parse = 3;6512} else {6513g->step = g->line_size;6514g->parse = 0;6515}65166517if (g->lflags & 0x80) {6518stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1);6519g->color_table = (stbi_uc *) g->lpal;6520} else if (g->flags & 0x80) {6521g->color_table = (stbi_uc *) g->pal;6522} else6523return stbi__errpuc("missing color table", "Corrupt GIF");65246525o = stbi__process_gif_raster(s, g);6526if (!o) return NULL;65276528// if this was the first frame,6529pcount = g->w * g->h;6530if (first_frame && (g->bgindex > 0)) {6531// if first frame, any pixel not drawn to gets the background color6532for (pi = 0; pi < pcount; ++pi) {6533if (g->history[pi] == 0) {6534g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be;6535memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 );6536}6537}6538}65396540return o;6541}65426543case 0x21: // Comment Extension.6544{6545int len;6546int ext = stbi__get8(s);6547if (ext == 0xF9) { // Graphic Control Extension.6548len = stbi__get8(s);6549if (len == 4) {6550g->eflags = stbi__get8(s);6551g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths.65526553// unset old transparent6554if (g->transparent >= 0) {6555g->pal[g->transparent][3] = 255;6556}6557if (g->eflags & 0x01) {6558g->transparent = stbi__get8(s);6559if (g->transparent >= 0) {6560g->pal[g->transparent][3] = 0;6561}6562} else {6563// don't need transparent6564stbi__skip(s, 1);6565g->transparent = -1;6566}6567} else {6568stbi__skip(s, len);6569break;6570}6571}6572while ((len = stbi__get8(s)) != 0) {6573stbi__skip(s, len);6574}6575break;6576}65776578case 0x3B: // gif stream termination code6579return (stbi_uc *) s; // using '1' causes warning on some compilers65806581default:6582return stbi__errpuc("unknown code", "Corrupt GIF");6583}6584}6585}65866587static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp)6588{6589if (stbi__gif_test(s)) {6590int layers = 0;6591stbi_uc *u = 0;6592stbi_uc *out = 0;6593stbi_uc *two_back = 0;6594stbi__gif g;6595int stride;6596memset(&g, 0, sizeof(g));6597if (delays) {6598*delays = 0;6599}66006601do {6602u = stbi__gif_load_next(s, &g, comp, req_comp, two_back);6603if (u == (stbi_uc *) s) u = 0; // end of animated gif marker66046605if (u) {6606*x = g.w;6607*y = g.h;6608++layers;6609stride = g.w * g.h * 4;66106611if (out) {6612out = (stbi_uc*) STBI_REALLOC( out, layers * stride );6613if (delays) {6614*delays = (int*) STBI_REALLOC( *delays, sizeof(int) * layers );6615}6616} else {6617out = (stbi_uc*)stbi__malloc( layers * stride );6618if (delays) {6619*delays = (int*) stbi__malloc( layers * sizeof(int) );6620}6621}6622memcpy( out + ((layers - 1) * stride), u, stride );6623if (layers >= 2) {6624two_back = out - 2 * stride;6625}66266627if (delays) {6628(*delays)[layers - 1U] = g.delay;6629}6630}6631} while (u != 0);66326633// free temp buffer;6634STBI_FREE(g.out);6635STBI_FREE(g.history);6636STBI_FREE(g.background);66376638// do the final conversion after loading everything;6639if (req_comp && req_comp != 4)6640out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h);66416642*z = layers;6643return out;6644} else {6645return stbi__errpuc("not GIF", "Image was not as a gif type.");6646}6647}66486649static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)6650{6651stbi_uc *u = 0;6652stbi__gif g;6653memset(&g, 0, sizeof(g));6654STBI_NOTUSED(ri);66556656u = stbi__gif_load_next(s, &g, comp, req_comp, 0);6657if (u == (stbi_uc *) s) u = 0; // end of animated gif marker6658if (u) {6659*x = g.w;6660*y = g.h;66616662// moved conversion to after successful load so that the same6663// can be done for multiple frames.6664if (req_comp && req_comp != 4)6665u = stbi__convert_format(u, 4, req_comp, g.w, g.h);6666} else if (g.out) {6667// if there was an error and we allocated an image buffer, free it!6668STBI_FREE(g.out);6669}66706671// free buffers needed for multiple frame loading;6672STBI_FREE(g.history);6673STBI_FREE(g.background);66746675return u;6676}66776678static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)6679{6680return stbi__gif_info_raw(s,x,y,comp);6681}6682#endif66836684// *************************************************************************************************6685// Radiance RGBE HDR loader6686// originally by Nicolas Schulz6687#ifndef STBI_NO_HDR6688static int stbi__hdr_test_core(stbi__context *s, const char *signature)6689{6690int i;6691for (i=0; signature[i]; ++i)6692if (stbi__get8(s) != signature[i])6693return 0;6694stbi__rewind(s);6695return 1;6696}66976698static int stbi__hdr_test(stbi__context* s)6699{6700int r = stbi__hdr_test_core(s, "#?RADIANCE\n");6701stbi__rewind(s);6702if(!r) {6703r = stbi__hdr_test_core(s, "#?RGBE\n");6704stbi__rewind(s);6705}6706return r;6707}67086709#define STBI__HDR_BUFLEN 10246710static char *stbi__hdr_gettoken(stbi__context *z, char *buffer)6711{6712int len=0;6713char c = '\0';67146715c = (char) stbi__get8(z);67166717while (!stbi__at_eof(z) && c != '\n') {6718buffer[len++] = c;6719if (len == STBI__HDR_BUFLEN-1) {6720// flush to end of line6721while (!stbi__at_eof(z) && stbi__get8(z) != '\n')6722;6723break;6724}6725c = (char) stbi__get8(z);6726}67276728buffer[len] = 0;6729return buffer;6730}67316732static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp)6733{6734if ( input[3] != 0 ) {6735float f1;6736// Exponent6737f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8));6738if (req_comp <= 2)6739output[0] = (input[0] + input[1] + input[2]) * f1 / 3;6740else {6741output[0] = input[0] * f1;6742output[1] = input[1] * f1;6743output[2] = input[2] * f1;6744}6745if (req_comp == 2) output[1] = 1;6746if (req_comp == 4) output[3] = 1;6747} else {6748switch (req_comp) {6749case 4: output[3] = 1; /* fallthrough */6750case 3: output[0] = output[1] = output[2] = 0;6751break;6752case 2: output[1] = 1; /* fallthrough */6753case 1: output[0] = 0;6754break;6755}6756}6757}67586759static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)6760{6761char buffer[STBI__HDR_BUFLEN];6762char *token;6763int valid = 0;6764int width, height;6765stbi_uc *scanline;6766float *hdr_data;6767int len;6768unsigned char count, value;6769int i, j, k, c1,c2, z;6770const char *headerToken;6771STBI_NOTUSED(ri);67726773// Check identifier6774headerToken = stbi__hdr_gettoken(s,buffer);6775if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 0)6776return stbi__errpf("not HDR", "Corrupt HDR image");67776778// Parse header6779for(;;) {6780token = stbi__hdr_gettoken(s,buffer);6781if (token[0] == 0) break;6782if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;6783}67846785if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format");67866787// Parse width and height6788// can't use sscanf() if we're not using stdio!6789token = stbi__hdr_gettoken(s,buffer);6790if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");6791token += 3;6792height = (int) strtol(token, &token, 10);6793while (*token == ' ') ++token;6794if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format");6795token += 3;6796width = (int) strtol(token, NULL, 10);67976798*x = width;6799*y = height;68006801if (comp) *comp = 3;6802if (req_comp == 0) req_comp = 3;68036804if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0))6805return stbi__errpf("too large", "HDR image is too large");68066807// Read data6808hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0);6809if (!hdr_data)6810return stbi__errpf("outofmem", "Out of memory");68116812// Load image data6813// image data is stored as some number of sca6814if ( width < 8 || width >= 32768) {6815// Read flat data6816for (j=0; j < height; ++j) {6817for (i=0; i < width; ++i) {6818stbi_uc rgbe[4];6819main_decode_loop:6820stbi__getn(s, rgbe, 4);6821stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp);6822}6823}6824} else {6825// Read RLE-encoded data6826scanline = NULL;68276828for (j = 0; j < height; ++j) {6829c1 = stbi__get8(s);6830c2 = stbi__get8(s);6831len = stbi__get8(s);6832if (c1 != 2 || c2 != 2 || (len & 0x80)) {6833// not run-length encoded, so we have to actually use THIS data as a decoded6834// pixel (note this can't be a valid pixel--one of RGB must be >= 128)6835stbi_uc rgbe[4];6836rgbe[0] = (stbi_uc) c1;6837rgbe[1] = (stbi_uc) c2;6838rgbe[2] = (stbi_uc) len;6839rgbe[3] = (stbi_uc) stbi__get8(s);6840stbi__hdr_convert(hdr_data, rgbe, req_comp);6841i = 1;6842j = 0;6843STBI_FREE(scanline);6844goto main_decode_loop; // yes, this makes no sense6845}6846len <<= 8;6847len |= stbi__get8(s);6848if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); }6849if (scanline == NULL) {6850scanline = (stbi_uc *) stbi__malloc_mad2(width, 4, 0);6851if (!scanline) {6852STBI_FREE(hdr_data);6853return stbi__errpf("outofmem", "Out of memory");6854}6855}68566857for (k = 0; k < 4; ++k) {6858int nleft;6859i = 0;6860while ((nleft = width - i) > 0) {6861count = stbi__get8(s);6862if (count > 128) {6863// Run6864value = stbi__get8(s);6865count -= 128;6866if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }6867for (z = 0; z < count; ++z)6868scanline[i++ * 4 + k] = value;6869} else {6870// Dump6871if (count > nleft) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); }6872for (z = 0; z < count; ++z)6873scanline[i++ * 4 + k] = stbi__get8(s);6874}6875}6876}6877for (i=0; i < width; ++i)6878stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp);6879}6880if (scanline)6881STBI_FREE(scanline);6882}68836884return hdr_data;6885}68866887static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)6888{6889char buffer[STBI__HDR_BUFLEN];6890char *token;6891int valid = 0;6892int dummy;68936894if (!x) x = &dummy;6895if (!y) y = &dummy;6896if (!comp) comp = &dummy;68976898if (stbi__hdr_test(s) == 0) {6899stbi__rewind( s );6900return 0;6901}69026903for(;;) {6904token = stbi__hdr_gettoken(s,buffer);6905if (token[0] == 0) break;6906if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1;6907}69086909if (!valid) {6910stbi__rewind( s );6911return 0;6912}6913token = stbi__hdr_gettoken(s,buffer);6914if (strncmp(token, "-Y ", 3)) {6915stbi__rewind( s );6916return 0;6917}6918token += 3;6919*y = (int) strtol(token, &token, 10);6920while (*token == ' ') ++token;6921if (strncmp(token, "+X ", 3)) {6922stbi__rewind( s );6923return 0;6924}6925token += 3;6926*x = (int) strtol(token, NULL, 10);6927*comp = 3;6928return 1;6929}6930#endif // STBI_NO_HDR69316932#ifndef STBI_NO_BMP6933static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)6934{6935void *p;6936stbi__bmp_data info;69376938info.all_a = 255;6939p = stbi__bmp_parse_header(s, &info);6940stbi__rewind( s );6941if (p == NULL)6942return 0;6943if (x) *x = s->img_x;6944if (y) *y = s->img_y;6945if (comp) {6946if (info.bpp == 24 && info.ma == 0xff000000)6947*comp = 3;6948else6949*comp = info.ma ? 4 : 3;6950}6951return 1;6952}6953#endif69546955#ifndef STBI_NO_PSD6956static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)6957{6958int channelCount, dummy, depth;6959if (!x) x = &dummy;6960if (!y) y = &dummy;6961if (!comp) comp = &dummy;6962if (stbi__get32be(s) != 0x38425053) {6963stbi__rewind( s );6964return 0;6965}6966if (stbi__get16be(s) != 1) {6967stbi__rewind( s );6968return 0;6969}6970stbi__skip(s, 6);6971channelCount = stbi__get16be(s);6972if (channelCount < 0 || channelCount > 16) {6973stbi__rewind( s );6974return 0;6975}6976*y = stbi__get32be(s);6977*x = stbi__get32be(s);6978depth = stbi__get16be(s);6979if (depth != 8 && depth != 16) {6980stbi__rewind( s );6981return 0;6982}6983if (stbi__get16be(s) != 3) {6984stbi__rewind( s );6985return 0;6986}6987*comp = 4;6988return 1;6989}69906991static int stbi__psd_is16(stbi__context *s)6992{6993int channelCount, depth;6994if (stbi__get32be(s) != 0x38425053) {6995stbi__rewind( s );6996return 0;6997}6998if (stbi__get16be(s) != 1) {6999stbi__rewind( s );7000return 0;7001}7002stbi__skip(s, 6);7003channelCount = stbi__get16be(s);7004if (channelCount < 0 || channelCount > 16) {7005stbi__rewind( s );7006return 0;7007}7008(void) stbi__get32be(s);7009(void) stbi__get32be(s);7010depth = stbi__get16be(s);7011if (depth != 16) {7012stbi__rewind( s );7013return 0;7014}7015return 1;7016}7017#endif70187019#ifndef STBI_NO_PIC7020static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)7021{7022int act_comp=0,num_packets=0,chained,dummy;7023stbi__pic_packet packets[10];70247025if (!x) x = &dummy;7026if (!y) y = &dummy;7027if (!comp) comp = &dummy;70287029if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) {7030stbi__rewind(s);7031return 0;7032}70337034stbi__skip(s, 88);70357036*x = stbi__get16be(s);7037*y = stbi__get16be(s);7038if (stbi__at_eof(s)) {7039stbi__rewind( s);7040return 0;7041}7042if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) {7043stbi__rewind( s );7044return 0;7045}70467047stbi__skip(s, 8);70487049do {7050stbi__pic_packet *packet;70517052if (num_packets==sizeof(packets)/sizeof(packets[0]))7053return 0;70547055packet = &packets[num_packets++];7056chained = stbi__get8(s);7057packet->size = stbi__get8(s);7058packet->type = stbi__get8(s);7059packet->channel = stbi__get8(s);7060act_comp |= packet->channel;70617062if (stbi__at_eof(s)) {7063stbi__rewind( s );7064return 0;7065}7066if (packet->size != 8) {7067stbi__rewind( s );7068return 0;7069}7070} while (chained);70717072*comp = (act_comp & 0x10 ? 4 : 3);70737074return 1;7075}7076#endif70777078// *************************************************************************************************7079// Portable Gray Map and Portable Pixel Map loader7080// by Ken Miller7081//7082// PGM: http://netpbm.sourceforge.net/doc/pgm.html7083// PPM: http://netpbm.sourceforge.net/doc/ppm.html7084//7085// Known limitations:7086// Does not support comments in the header section7087// Does not support ASCII image data (formats P2 and P3)7088// Does not support 16-bit-per-channel70897090#ifndef STBI_NO_PNM70917092static int stbi__pnm_test(stbi__context *s)7093{7094char p, t;7095p = (char) stbi__get8(s);7096t = (char) stbi__get8(s);7097if (p != 'P' || (t != '5' && t != '6')) {7098stbi__rewind( s );7099return 0;7100}7101return 1;7102}71037104static void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri)7105{7106stbi_uc *out;7107STBI_NOTUSED(ri);71087109if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n))7110return 0;71117112*x = s->img_x;7113*y = s->img_y;7114if (comp) *comp = s->img_n;71157116if (!stbi__mad3sizes_valid(s->img_n, s->img_x, s->img_y, 0))7117return stbi__errpuc("too large", "PNM too large");71187119out = (stbi_uc *) stbi__malloc_mad3(s->img_n, s->img_x, s->img_y, 0);7120if (!out) return stbi__errpuc("outofmem", "Out of memory");7121stbi__getn(s, out, s->img_n * s->img_x * s->img_y);71227123if (req_comp && req_comp != s->img_n) {7124out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y);7125if (out == NULL) return out; // stbi__convert_format frees input on failure7126}7127return out;7128}71297130static int stbi__pnm_isspace(char c)7131{7132return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r';7133}71347135static void stbi__pnm_skip_whitespace(stbi__context *s, char *c)7136{7137for (;;) {7138while (!stbi__at_eof(s) && stbi__pnm_isspace(*c))7139*c = (char) stbi__get8(s);71407141if (stbi__at_eof(s) || *c != '#')7142break;71437144while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' )7145*c = (char) stbi__get8(s);7146}7147}71487149static int stbi__pnm_isdigit(char c)7150{7151return c >= '0' && c <= '9';7152}71537154static int stbi__pnm_getinteger(stbi__context *s, char *c)7155{7156int value = 0;71577158while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) {7159value = value*10 + (*c - '0');7160*c = (char) stbi__get8(s);7161}71627163return value;7164}71657166static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)7167{7168int maxv, dummy;7169char c, p, t;71707171if (!x) x = &dummy;7172if (!y) y = &dummy;7173if (!comp) comp = &dummy;71747175stbi__rewind(s);71767177// Get identifier7178p = (char) stbi__get8(s);7179t = (char) stbi__get8(s);7180if (p != 'P' || (t != '5' && t != '6')) {7181stbi__rewind(s);7182return 0;7183}71847185*comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm71867187c = (char) stbi__get8(s);7188stbi__pnm_skip_whitespace(s, &c);71897190*x = stbi__pnm_getinteger(s, &c); // read width7191stbi__pnm_skip_whitespace(s, &c);71927193*y = stbi__pnm_getinteger(s, &c); // read height7194stbi__pnm_skip_whitespace(s, &c);71957196maxv = stbi__pnm_getinteger(s, &c); // read max value71977198if (maxv > 255)7199return stbi__err("max value > 255", "PPM image not 8-bit");7200else7201return 1;7202}7203#endif72047205static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)7206{7207#ifndef STBI_NO_JPEG7208if (stbi__jpeg_info(s, x, y, comp)) return 1;7209#endif72107211#ifndef STBI_NO_PNG7212if (stbi__png_info(s, x, y, comp)) return 1;7213#endif72147215#ifndef STBI_NO_GIF7216if (stbi__gif_info(s, x, y, comp)) return 1;7217#endif72187219#ifndef STBI_NO_BMP7220if (stbi__bmp_info(s, x, y, comp)) return 1;7221#endif72227223#ifndef STBI_NO_PSD7224if (stbi__psd_info(s, x, y, comp)) return 1;7225#endif72267227#ifndef STBI_NO_PIC7228if (stbi__pic_info(s, x, y, comp)) return 1;7229#endif72307231#ifndef STBI_NO_PNM7232if (stbi__pnm_info(s, x, y, comp)) return 1;7233#endif72347235#ifndef STBI_NO_HDR7236if (stbi__hdr_info(s, x, y, comp)) return 1;7237#endif72387239// test tga last because it's a crappy test!7240#ifndef STBI_NO_TGA7241if (stbi__tga_info(s, x, y, comp))7242return 1;7243#endif7244return stbi__err("unknown image type", "Image not of any known type, or corrupt");7245}72467247static int stbi__is_16_main(stbi__context *s)7248{7249#ifndef STBI_NO_PNG7250if (stbi__png_is16(s)) return 1;7251#endif72527253#ifndef STBI_NO_PSD7254if (stbi__psd_is16(s)) return 1;7255#endif72567257return 0;7258}72597260#ifndef STBI_NO_STDIO7261STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp)7262{7263FILE *f = stbi__fopen(filename, "rb");7264int result;7265if (!f) return stbi__err("can't fopen", "Unable to open file");7266result = stbi_info_from_file(f, x, y, comp);7267fclose(f);7268return result;7269}72707271STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp)7272{7273int r;7274stbi__context s;7275long pos = ftell(f);7276stbi__start_file(&s, f);7277r = stbi__info_main(&s,x,y,comp);7278fseek(f,pos,SEEK_SET);7279return r;7280}72817282STBIDEF int stbi_is_16_bit(char const *filename)7283{7284FILE *f = stbi__fopen(filename, "rb");7285int result;7286if (!f) return stbi__err("can't fopen", "Unable to open file");7287result = stbi_is_16_bit_from_file(f);7288fclose(f);7289return result;7290}72917292STBIDEF int stbi_is_16_bit_from_file(FILE *f)7293{7294int r;7295stbi__context s;7296long pos = ftell(f);7297stbi__start_file(&s, f);7298r = stbi__is_16_main(&s);7299fseek(f,pos,SEEK_SET);7300return r;7301}7302#endif // !STBI_NO_STDIO73037304STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp)7305{7306stbi__context s;7307stbi__start_mem(&s,buffer,len);7308return stbi__info_main(&s,x,y,comp);7309}73107311STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp)7312{7313stbi__context s;7314stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);7315return stbi__info_main(&s,x,y,comp);7316}73177318STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len)7319{7320stbi__context s;7321stbi__start_mem(&s,buffer,len);7322return stbi__is_16_main(&s);7323}73247325STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user)7326{7327stbi__context s;7328stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user);7329return stbi__is_16_main(&s);7330}73317332#endif // STB_IMAGE_IMPLEMENTATION73337334/*7335revision history:73362.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs73372.19 (2018-02-11) fix warning73382.18 (2018-01-30) fix warnings73392.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug73401-bit BMP7341*_is_16_bit api7342avoid warnings73432.16 (2017-07-23) all functions have 16-bit variants;7344STBI_NO_STDIO works again;7345compilation fixes;7346fix rounding in unpremultiply;7347optimize vertical flip;7348disable raw_len validation;7349documentation fixes73502.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode;7351warning fixes; disable run-time SSE detection on gcc;7352uniform handling of optional "return" values;7353thread-safe initialization of zlib tables73542.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs73552.13 (2016-11-29) add 16-bit API, only supported for PNG right now73562.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes73572.11 (2016-04-02) allocate large structures on the stack7358remove white matting for transparent PSD7359fix reported channel count for PNG & BMP7360re-enable SSE2 in non-gcc 64-bit7361support RGB-formatted JPEG7362read 16-bit PNGs (only as 8-bit)73632.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED73642.09 (2016-01-16) allow comments in PNM files736516-bit-per-pixel TGA (not bit-per-component)7366info() for TGA could break due to .hdr handling7367info() for BMP to shares code instead of sloppy parse7368can use STBI_REALLOC_SIZED if allocator doesn't support realloc7369code cleanup73702.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA73712.07 (2015-09-13) fix compiler warnings7372partial animated GIF support7373limited 16-bpc PSD support7374#ifdef unused functions7375bug with < 92 byte PIC,PNM,HDR,TGA73762.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value73772.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning73782.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit73792.03 (2015-04-12) extra corruption checking (mmozeiko)7380stbi_set_flip_vertically_on_load (nguillemot)7381fix NEON support; fix mingw support73822.02 (2015-01-19) fix incorrect assert, fix warning73832.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse273842.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG73852.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)7386progressive JPEG (stb)7387PGM/PPM support (Ken Miller)7388STBI_MALLOC,STBI_REALLOC,STBI_FREE7389GIF bugfix -- seemingly never worked7390STBI_NO_*, STBI_ONLY_*73911.48 (2014-12-14) fix incorrectly-named assert()73921.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)7393optimize PNG (ryg)7394fix bug in interlaced PNG with user-specified channel count (stb)73951.46 (2014-08-26)7396fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG73971.45 (2014-08-16)7398fix MSVC-ARM internal compiler error by wrapping malloc73991.44 (2014-08-07)7400various warning fixes from Ronny Chevalier74011.43 (2014-07-15)7402fix MSVC-only compiler problem in code changed in 1.4274031.42 (2014-07-09)7404don't define _CRT_SECURE_NO_WARNINGS (affects user code)7405fixes to stbi__cleanup_jpeg path7406added STBI_ASSERT to avoid requiring assert.h74071.41 (2014-06-25)7408fix search&replace from 1.36 that messed up comments/error messages74091.40 (2014-06-22)7410fix gcc struct-initialization warning74111.39 (2014-06-15)7412fix to TGA optimization when req_comp != number of components in TGA;7413fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite)7414add support for BMP version 5 (more ignored fields)74151.38 (2014-06-06)7416suppress MSVC warnings on integer casts truncating values7417fix accidental rename of 'skip' field of I/O74181.37 (2014-06-04)7419remove duplicate typedef74201.36 (2014-06-03)7421convert to header file single-file library7422if de-iphone isn't set, load iphone images color-swapped instead of returning NULL74231.35 (2014-05-27)7424various warnings7425fix broken STBI_SIMD path7426fix bug where stbi_load_from_file no longer left file pointer in correct place7427fix broken non-easy path for 32-bit BMP (possibly never used)7428TGA optimization by Arseny Kapoulkine74291.34 (unknown)7430use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case74311.33 (2011-07-14)7432make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements74331.32 (2011-07-13)7434support for "info" function for all supported filetypes (SpartanJ)74351.31 (2011-06-20)7436a few more leak fixes, bug in PNG handling (SpartanJ)74371.30 (2011-06-11)7438added ability to load files via callbacks to accomidate custom input streams (Ben Wenger)7439removed deprecated format-specific test/load functions7440removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway7441error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha)7442fix inefficiency in decoding 32-bit BMP (David Woo)74431.29 (2010-08-16)7444various warning fixes from Aurelien Pocheville74451.28 (2010-08-01)7446fix bug in GIF palette transparency (SpartanJ)74471.27 (2010-08-01)7448cast-to-stbi_uc to fix warnings74491.26 (2010-07-24)7450fix bug in file buffering for PNG reported by SpartanJ74511.25 (2010-07-17)7452refix trans_data warning (Won Chun)74531.24 (2010-07-12)7454perf improvements reading from files on platforms with lock-heavy fgetc()7455minor perf improvements for jpeg7456deprecated type-specific functions so we'll get feedback if they're needed7457attempt to fix trans_data warning (Won Chun)74581.23 fixed bug in iPhone support74591.22 (2010-07-10)7460removed image *writing* support7461stbi_info support from Jetro Lauha7462GIF support from Jean-Marc Lienher7463iPhone PNG-extensions from James Brown7464warning-fixes from Nicolas Schulz and Janez Zemva (i.stbi__err. Janez (U+017D)emva)74651.21 fix use of 'stbi_uc' in header (reported by jon blow)74661.20 added support for Softimage PIC, by Tom Seddon74671.19 bug in interlaced PNG corruption check (found by ryg)74681.18 (2008-08-02)7469fix a threading bug (local mutable static)74701.17 support interlaced PNG74711.16 major bugfix - stbi__convert_format converted one too many pixels74721.15 initialize some fields for thread safety74731.14 fix threadsafe conversion bug7474header-file-only version (#define STBI_HEADER_FILE_ONLY before including)74751.13 threadsafe74761.12 const qualifiers in the API74771.11 Support installable IDCT, colorspace conversion routines74781.10 Fixes for 64-bit (don't use "unsigned long")7479optimized upsampling by Fabian "ryg" Giesen74801.09 Fix format-conversion for PSD code (bad global variables!)74811.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz74821.07 attempt to fix C++ warning/errors again74831.06 attempt to fix C++ warning/errors again74841.05 fix TGA loading to return correct *comp and use good luminance calc74851.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free74861.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR74871.02 support for (subset of) HDR files, float interface for preferred access to them74881.01 fix bug: possible bug in handling right-side up bmps... not sure7489fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all74901.00 interface to zlib that skips zlib header74910.99 correct handling of alpha in palette74920.98 TGA loader by lonesock; dynamically add loaders (untested)74930.97 jpeg errors on too large a file; also catch another malloc failure74940.96 fix detection of invalid v value - particleman@mollyrocket forum74950.95 during header scan, seek to markers in case of padding74960.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same74970.93 handle jpegtran output; verbose errors74980.92 read 4,8,16,24,32-bit BMP files of several formats74990.91 output 24-bit Windows 3.0 BMP files75000.90 fix a few more warnings; bump version number to approach 1.075010.61 bugfixes due to Marc LeBlanc, Christopher Lloyd75020.60 fix compiling as c++75030.59 fix warnings: merge Dave Moore's -Wall fixes75040.58 fix bug: zlib uncompressed mode len/nlen was wrong endian75050.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available75060.56 fix bug: zlib uncompressed mode len vs. nlen75070.55 fix bug: restart_interval not initialized to 075080.54 allow NULL for 'int *comp'75090.53 fix bug in png 3->4; speedup png decoding75100.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments75110.51 obey req_comp requests, 1-component jpegs return as 1-component,7512on 'test' only check type, not whether we support this variant75130.50 (2006-11-19)7514first released version7515*/751675177518/*7519------------------------------------------------------------------------------7520This software is available under 2 licenses -- choose whichever you prefer.7521------------------------------------------------------------------------------7522ALTERNATIVE A - MIT License7523Copyright (c) 2017 Sean Barrett7524Permission is hereby granted, free of charge, to any person obtaining a copy of7525this software and associated documentation files (the "Software"), to deal in7526the Software without restriction, including without limitation the rights to7527use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies7528of the Software, and to permit persons to whom the Software is furnished to do7529so, subject to the following conditions:7530The above copyright notice and this permission notice shall be included in all7531copies or substantial portions of the Software.7532THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR7533IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,7534FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE7535AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER7536LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,7537OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE7538SOFTWARE.7539------------------------------------------------------------------------------7540ALTERNATIVE B - Public Domain (www.unlicense.org)7541This is free and unencumbered software released into the public domain.7542Anyone is free to copy, modify, publish, use, compile, sell, or distribute this7543software, either in source code form or as a compiled binary, for any purpose,7544commercial or non-commercial, and by any means.7545In jurisdictions that recognize copyright laws, the author or authors of this7546software dedicate any and all copyright interest in the software to the public7547domain. We make this dedication for the benefit of the public at large and to7548the detriment of our heirs and successors. We intend this dedication to be an7549overt act of relinquishment in perpetuity of all present and future rights to7550this software under copyright law.7551THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR7552IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,7553FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE7554AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN7555ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION7556WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.7557------------------------------------------------------------------------------7558*/755975607561