|
@@ -1,7 +1,306 @@
|
|
|
+/* stb_image - v2.14 - public domain image loader - http://nothings.org/stb_image.h
|
|
|
+ no warranty implied; use at your own risk
|
|
|
+
|
|
|
+ Do this:
|
|
|
+ #define STB_IMAGE_IMPLEMENTATION
|
|
|
+ before you include this file in *one* C or C++ file to create the implementation.
|
|
|
+
|
|
|
+ // i.e. it should look like this:
|
|
|
+ #include ...
|
|
|
+ #include ...
|
|
|
+ #include ...
|
|
|
+ #define STB_IMAGE_IMPLEMENTATION
|
|
|
+ #include "stb_image.h"
|
|
|
+
|
|
|
+ You can #define STBI_ASSERT(x) before the #include to avoid using assert.h.
|
|
|
+ And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free
|
|
|
+
|
|
|
+
|
|
|
+ QUICK NOTES:
|
|
|
+ Primarily of interest to game developers and other people who can
|
|
|
+ avoid problematic images and only need the trivial interface
|
|
|
+
|
|
|
+ JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib)
|
|
|
+ PNG 1/2/4/8/16-bit-per-channel
|
|
|
+
|
|
|
+ TGA (not sure what subset, if a subset)
|
|
|
+ BMP non-1bpp, non-RLE
|
|
|
+ PSD (composited view only, no extra channels, 8/16 bit-per-channel)
|
|
|
+
|
|
|
+ GIF (*comp always reports as 4-channel)
|
|
|
+ HDR (radiance rgbE format)
|
|
|
+ PIC (Softimage PIC)
|
|
|
+ PNM (PPM and PGM binary only)
|
|
|
+
|
|
|
+ Animated GIF still needs a proper API, but here's one way to do it:
|
|
|
+ http://gist.github.com/urraka/685d9a6340b26b830d49
|
|
|
+
|
|
|
+ - decode from memory or through FILE (define STBI_NO_STDIO to remove code)
|
|
|
+ - decode from arbitrary I/O callbacks
|
|
|
+ - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON)
|
|
|
+
|
|
|
+ Full documentation under "DOCUMENTATION" below.
|
|
|
+
|
|
|
+
|
|
|
+LICENSE
|
|
|
+
|
|
|
+ See end of file for license information.
|
|
|
+
|
|
|
+RECENT REVISION HISTORY:
|
|
|
+
|
|
|
+ 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs
|
|
|
+ 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes
|
|
|
+ 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes
|
|
|
+ 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64
|
|
|
+ RGB-format JPEG; remove white matting in PSD;
|
|
|
+ allocate large structures on the stack;
|
|
|
+ correct channel count for PNG & BMP
|
|
|
+ 2.10 (2016-01-22) avoid warning introduced in 2.09
|
|
|
+ 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED
|
|
|
+ 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA
|
|
|
+ 2.07 (2015-09-13) partial animated GIF support
|
|
|
+ limited 16-bit PSD support
|
|
|
+ minor bugs, code cleanup, and compiler warnings
|
|
|
+
|
|
|
+ See end of file for full revision history.
|
|
|
+
|
|
|
+
|
|
|
+ ============================ Contributors =========================
|
|
|
+
|
|
|
+ Image formats Extensions, features
|
|
|
+ Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info)
|
|
|
+ Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info)
|
|
|
+ Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG)
|
|
|
+ Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks)
|
|
|
+ Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG)
|
|
|
+ Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip)
|
|
|
+ Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD)
|
|
|
+ github:urraka (animated gif) Junggon Kim (PNM comments)
|
|
|
+ Daniel Gibson (16-bit TGA)
|
|
|
+ socks-the-fox (16-bit TGA)
|
|
|
+ Jeremy Sawicki (handle all ImageNet JPGs)
|
|
|
+ Optimizations & bugfixes
|
|
|
+ Fabian "ryg" Giesen
|
|
|
+ Arseny Kapoulkine
|
|
|
+
|
|
|
+ Bug & warning fixes
|
|
|
+ Marc LeBlanc David Woo Guillaume George Martins Mozeiko
|
|
|
+ Christpher Lloyd Martin Golini Jerry Jansson Joseph Thomson
|
|
|
+ Dave Moore Roy Eltham Hayaki Saito Phil Jordan
|
|
|
+ Won Chun Luke Graham Johan Duparc Nathan Reed
|
|
|
+ the Horde3D community Thomas Ruf Ronny Chevalier Nick Verigakis
|
|
|
+ Janez Zemva John Bartholomew Michal Cichon github:svdijk
|
|
|
+ Jonathan Blow Ken Hamada Tero Hanninen Baldur Karlsson
|
|
|
+ Laurent Gomila Cort Stratton Sergio Gonzalez github:romigrou
|
|
|
+ Aruelien Pocheville Thibault Reuille Cass Everitt Matthew Gregan
|
|
|
+ Ryamond Barbiero Paul Du Bois Engin Manap github:snagar
|
|
|
+ Michaelangel007@github Oriol Ferrer Mesia Dale Weiler github:Zelex
|
|
|
+ Philipp Wiesemann Josh Tobin github:rlyeh github:grim210@github
|
|
|
+ Blazej Dariusz Roszkowski github:sammyhw
|
|
|
+
|
|
|
+*/
|
|
|
|
|
|
#ifndef STBI_INCLUDE_STB_IMAGE_H
|
|
|
#define STBI_INCLUDE_STB_IMAGE_H
|
|
|
|
|
|
+// DOCUMENTATION
|
|
|
+//
|
|
|
+// Limitations:
|
|
|
+// - no 16-bit-per-channel PNG
|
|
|
+// - no 12-bit-per-channel JPEG
|
|
|
+// - no JPEGs with arithmetic coding
|
|
|
+// - no 1-bit BMP
|
|
|
+// - GIF always returns *comp=4
|
|
|
+//
|
|
|
+// Basic usage (see HDR discussion below for HDR usage):
|
|
|
+// int x,y,n;
|
|
|
+// unsigned char *data = stbi_load(filename, &x, &y, &n, 0);
|
|
|
+// // ... process data if not NULL ...
|
|
|
+// // ... x = width, y = height, n = # 8-bit components per pixel ...
|
|
|
+// // ... replace '0' with '1'..'4' to force that many components per pixel
|
|
|
+// // ... but 'n' will always be the number that it would have been if you said 0
|
|
|
+// stbi_image_free(data)
|
|
|
+//
|
|
|
+// Standard parameters:
|
|
|
+// int *x -- outputs image width in pixels
|
|
|
+// int *y -- outputs image height in pixels
|
|
|
+// int *channels_in_file -- outputs # of image components in image file
|
|
|
+// int desired_channels -- if non-zero, # of image components requested in result
|
|
|
+//
|
|
|
+// The return value from an image loader is an 'unsigned char *' which points
|
|
|
+// to the pixel data, or NULL on an allocation failure or if the image is
|
|
|
+// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels,
|
|
|
+// with each pixel consisting of N interleaved 8-bit components; the first
|
|
|
+// pixel pointed to is top-left-most in the image. There is no padding between
|
|
|
+// image scanlines or between pixels, regardless of format. The number of
|
|
|
+// components N is 'req_comp' if req_comp is non-zero, or *comp otherwise.
|
|
|
+// If req_comp is non-zero, *comp has the number of components that _would_
|
|
|
+// have been output otherwise. E.g. if you set req_comp to 4, you will always
|
|
|
+// get RGBA output, but you can check *comp to see if it's trivially opaque
|
|
|
+// because e.g. there were only 3 channels in the source image.
|
|
|
+//
|
|
|
+// An output image with N components has the following components interleaved
|
|
|
+// in this order in each pixel:
|
|
|
+//
|
|
|
+// N=#comp components
|
|
|
+// 1 grey
|
|
|
+// 2 grey, alpha
|
|
|
+// 3 red, green, blue
|
|
|
+// 4 red, green, blue, alpha
|
|
|
+//
|
|
|
+// If image loading fails for any reason, the return value will be NULL,
|
|
|
+// and *x, *y, *comp will be unchanged. The function stbi_failure_reason()
|
|
|
+// can be queried for an extremely brief, end-user unfriendly explanation
|
|
|
+// of why the load failed. Define STBI_NO_FAILURE_STRINGS to avoid
|
|
|
+// compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly
|
|
|
+// more user-friendly ones.
|
|
|
+//
|
|
|
+// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized.
|
|
|
+//
|
|
|
+// ===========================================================================
|
|
|
+//
|
|
|
+// Philosophy
|
|
|
+//
|
|
|
+// stb libraries are designed with the following priorities:
|
|
|
+//
|
|
|
+// 1. easy to use
|
|
|
+// 2. easy to maintain
|
|
|
+// 3. good performance
|
|
|
+//
|
|
|
+// Sometimes I let "good performance" creep up in priority over "easy to maintain",
|
|
|
+// and for best performance I may provide less-easy-to-use APIs that give higher
|
|
|
+// performance, in addition to the easy to use ones. Nevertheless, it's important
|
|
|
+// to keep in mind that from the standpoint of you, a client of this library,
|
|
|
+// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all.
|
|
|
+//
|
|
|
+// Some secondary priorities arise directly from the first two, some of which
|
|
|
+// make more explicit reasons why performance can't be emphasized.
|
|
|
+//
|
|
|
+// - Portable ("ease of use")
|
|
|
+// - Small source code footprint ("easy to maintain")
|
|
|
+// - No dependencies ("ease of use")
|
|
|
+//
|
|
|
+// ===========================================================================
|
|
|
+//
|
|
|
+// I/O callbacks
|
|
|
+//
|
|
|
+// I/O callbacks allow you to read from arbitrary sources, like packaged
|
|
|
+// files or some other source. Data read from callbacks are processed
|
|
|
+// through a small internal buffer (currently 128 bytes) to try to reduce
|
|
|
+// overhead.
|
|
|
+//
|
|
|
+// The three functions you must define are "read" (reads some bytes of data),
|
|
|
+// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end).
|
|
|
+//
|
|
|
+// ===========================================================================
|
|
|
+//
|
|
|
+// SIMD support
|
|
|
+//
|
|
|
+// The JPEG decoder will try to automatically use SIMD kernels on x86 when
|
|
|
+// supported by the compiler. For ARM Neon support, you must explicitly
|
|
|
+// request it.
|
|
|
+//
|
|
|
+// (The old do-it-yourself SIMD API is no longer supported in the current
|
|
|
+// code.)
|
|
|
+//
|
|
|
+// On x86, SSE2 will automatically be used when available based on a run-time
|
|
|
+// test; if not, the generic C versions are used as a fall-back. On ARM targets,
|
|
|
+// the typical path is to have separate builds for NEON and non-NEON devices
|
|
|
+// (at least this is true for iOS and Android). Therefore, the NEON support is
|
|
|
+// toggled by a build flag: define STBI_NEON to get NEON loops.
|
|
|
+//
|
|
|
+// If for some reason you do not want to use any of SIMD code, or if
|
|
|
+// you have issues compiling it, you can disable it entirely by
|
|
|
+// defining STBI_NO_SIMD.
|
|
|
+//
|
|
|
+// ===========================================================================
|
|
|
+//
|
|
|
+// HDR image support (disable by defining STBI_NO_HDR)
|
|
|
+//
|
|
|
+// stb_image now supports loading HDR images in general, and currently
|
|
|
+// the Radiance .HDR file format, although the support is provided
|
|
|
+// generically. You can still load any file through the existing interface;
|
|
|
+// if you attempt to load an HDR file, it will be automatically remapped to
|
|
|
+// LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1;
|
|
|
+// both of these constants can be reconfigured through this interface:
|
|
|
+//
|
|
|
+// stbi_hdr_to_ldr_gamma(2.2f);
|
|
|
+// stbi_hdr_to_ldr_scale(1.0f);
|
|
|
+//
|
|
|
+// (note, do not use _inverse_ constants; stbi_image will invert them
|
|
|
+// appropriately).
|
|
|
+//
|
|
|
+// Additionally, there is a new, parallel interface for loading files as
|
|
|
+// (linear) floats to preserve the full dynamic range:
|
|
|
+//
|
|
|
+// float *data = stbi_loadf(filename, &x, &y, &n, 0);
|
|
|
+//
|
|
|
+// If you load LDR images through this interface, those images will
|
|
|
+// be promoted to floating point values, run through the inverse of
|
|
|
+// constants corresponding to the above:
|
|
|
+//
|
|
|
+// stbi_ldr_to_hdr_scale(1.0f);
|
|
|
+// stbi_ldr_to_hdr_gamma(2.2f);
|
|
|
+//
|
|
|
+// Finally, given a filename (or an open file or memory block--see header
|
|
|
+// file for details) containing image data, you can query for the "most
|
|
|
+// appropriate" interface to use (that is, whether the image is HDR or
|
|
|
+// not), using:
|
|
|
+//
|
|
|
+// stbi_is_hdr(char *filename);
|
|
|
+//
|
|
|
+// ===========================================================================
|
|
|
+//
|
|
|
+// iPhone PNG support:
|
|
|
+//
|
|
|
+// By default we convert iphone-formatted PNGs back to RGB, even though
|
|
|
+// they are internally encoded differently. You can disable this conversion
|
|
|
+// by by calling stbi_convert_iphone_png_to_rgb(0), in which case
|
|
|
+// you will always just get the native iphone "format" through (which
|
|
|
+// is BGR stored in RGB).
|
|
|
+//
|
|
|
+// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per
|
|
|
+// pixel to remove any premultiplied alpha *only* if the image file explicitly
|
|
|
+// says there's premultiplied data (currently only happens in iPhone images,
|
|
|
+// and only if iPhone convert-to-rgb processing is on).
|
|
|
+//
|
|
|
+// ===========================================================================
|
|
|
+//
|
|
|
+// ADDITIONAL CONFIGURATION
|
|
|
+//
|
|
|
+// - You can suppress implementation of any of the decoders to reduce
|
|
|
+// your code footprint by #defining one or more of the following
|
|
|
+// symbols before creating the implementation.
|
|
|
+//
|
|
|
+// STBI_NO_JPEG
|
|
|
+// STBI_NO_PNG
|
|
|
+// STBI_NO_BMP
|
|
|
+// STBI_NO_PSD
|
|
|
+// STBI_NO_TGA
|
|
|
+// STBI_NO_GIF
|
|
|
+// STBI_NO_HDR
|
|
|
+// STBI_NO_PIC
|
|
|
+// STBI_NO_PNM (.ppm and .pgm)
|
|
|
+//
|
|
|
+// - You can request *only* certain decoders and suppress all other ones
|
|
|
+// (this will be more forward-compatible, as addition of new decoders
|
|
|
+// doesn't require you to disable them explicitly):
|
|
|
+//
|
|
|
+// STBI_ONLY_JPEG
|
|
|
+// STBI_ONLY_PNG
|
|
|
+// STBI_ONLY_BMP
|
|
|
+// STBI_ONLY_PSD
|
|
|
+// STBI_ONLY_TGA
|
|
|
+// STBI_ONLY_GIF
|
|
|
+// STBI_ONLY_HDR
|
|
|
+// STBI_ONLY_PIC
|
|
|
+// STBI_ONLY_PNM (.ppm and .pgm)
|
|
|
+//
|
|
|
+// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
|
|
|
+// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
|
|
|
+//
|
|
|
+
|
|
|
+
|
|
|
#ifndef STBI_NO_STDIO
|
|
|
#include <stdio.h>
|
|
|
#endif // STBI_NO_STDIO
|
|
@@ -19,6 +318,7 @@ enum
|
|
|
};
|
|
|
|
|
|
typedef unsigned char stbi_uc;
|
|
|
+typedef unsigned short stbi_us;
|
|
|
|
|
|
#ifdef __cplusplus
|
|
|
extern "C" {
|
|
@@ -46,34 +346,54 @@ typedef struct
|
|
|
int (*eof) (void *user); // returns nonzero if we are at end of file/data
|
|
|
} stbi_io_callbacks;
|
|
|
|
|
|
-STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp);
|
|
|
-STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *comp, int req_comp);
|
|
|
-STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *comp, int req_comp);
|
|
|
+////////////////////////////////////
|
|
|
+//
|
|
|
+// 8-bits-per-channel interface
|
|
|
+//
|
|
|
+
|
|
|
+STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
+STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
+STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
|
|
|
#ifndef STBI_NO_STDIO
|
|
|
-STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
|
|
|
+STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
// for stbi_load_from_file, file pointer is left pointing immediately after image
|
|
|
#endif
|
|
|
|
|
|
+////////////////////////////////////
|
|
|
+//
|
|
|
+// 16-bits-per-channel interface
|
|
|
+//
|
|
|
+
|
|
|
+STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
+#ifndef STBI_NO_STDIO
|
|
|
+STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
+#endif
|
|
|
+// @TODO the other variants
|
|
|
+
|
|
|
+////////////////////////////////////
|
|
|
+//
|
|
|
+// float-per-channel interface
|
|
|
+//
|
|
|
#ifndef STBI_NO_LINEAR
|
|
|
- STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp);
|
|
|
- STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
|
|
|
- STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);
|
|
|
+ STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
+ STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
+ STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
|
|
|
#ifndef STBI_NO_STDIO
|
|
|
- STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
|
|
|
+ STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels);
|
|
|
#endif
|
|
|
#endif
|
|
|
|
|
|
#ifndef STBI_NO_HDR
|
|
|
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);
|
|
|
STBIDEF void stbi_hdr_to_ldr_scale(float scale);
|
|
|
-#endif
|
|
|
+#endif // STBI_NO_HDR
|
|
|
|
|
|
#ifndef STBI_NO_LINEAR
|
|
|
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);
|
|
|
STBIDEF void stbi_ldr_to_hdr_scale(float scale);
|
|
|
-#endif // STBI_NO_HDR
|
|
|
+#endif // STBI_NO_LINEAR
|
|
|
|
|
|
// stbi_is_hdr is always defined, but always returns false if STBI_NO_HDR
|
|
|
STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user);
|