123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413 |
- /* stbi-1.29 - public domain JPEG/PNG reader - http://nothings.org/stb_image.c
- when you control the images you're loading
- no warranty implied; use at your own risk
- QUICK NOTES:
- Primarily of interest to game developers and other people who can
- avoid problematic images and only need the trivial interface
- JPEG baseline (no JPEG progressive)
- PNG 8-bit only
- TGA (not sure what subset, if a subset)
- BMP non-1bpp, non-RLE
- PSD (composited view only, no extra channels)
- GIF (*comp always reports as 4-channel)
- HDR (radiance rgbE format)
- PIC (Softimage PIC)
- - decoded from memory or through stdio FILE (define STBI_NO_STDIO to remove code)
- - supports installable dequantizing-IDCT, YCbCr-to-RGB conversion (define STBI_SIMD)
- Latest revisions:
- 1.29 (2010-08-16) various warning fixes from Aurelien Pocheville
- 1.28 (2010-08-01) fix bug in GIF palette transparency (SpartanJ)
- 1.27 (2010-08-01) cast-to-uint8 to fix warnings (Laurent Gomila)
- allow trailing 0s at end of image data (Laurent Gomila)
- 1.26 (2010-07-24) fix bug in file buffering for PNG reported by SpartanJ
- 1.25 (2010-07-17) refix trans_data warning (Won Chun)
- 1.24 (2010-07-12) perf improvements reading from files
- minor perf improvements for jpeg
- deprecated type-specific functions in hope of feedback
- attempt to fix trans_data warning (Won Chun)
- 1.23 fixed bug in iPhone support
- 1.22 (2010-07-10) removed image *writing* support to stb_image_write.h
- stbi_info support from Jetro Lauha
- GIF support from Jean-Marc Lienher
- iPhone PNG-extensions from James Brown
- warning-fixes from Nicolas Schulz and Janez Zemva
- 1.21 fix use of 'uint8' in header (reported by jon blow)
- 1.20 added support for Softimage PIC, by Tom Seddon
- See end of file for full revision history.
- TODO:
- stbi_info support for BMP,PSD,HDR,PIC
- rewrite stbi_info and load_file variations to share file handling code
- (current system allows individual functions to be called directly,
- since each does all the work, but I doubt anyone uses this in practice)
- ============================ Contributors =========================
-
- Image formats Optimizations & bugfixes
- Sean Barrett (jpeg, png, bmp) Fabian "ryg" Giesen
- Nicolas Schulz (hdr, psd)
- Jonathan Dummer (tga) Bug fixes & warning fixes
- Jean-Marc Lienher (gif) Marc LeBlanc
- Tom Seddon (pic) Christpher Lloyd
- Thatcher Ulrich (psd) Dave Moore
- Won Chun
- the Horde3D community
- Extensions, features Janez Zemva
- Jetro Lauha (stbi_info) Jonathan Blow
- James "moose2000" Brown (iPhone PNG) Laurent Gomila
- Aruelien Pocheville
- If your name should be here but isn't, let Sean know.
- */
- #ifndef STBI_INCLUDE_STB_IMAGE_H
- #define STBI_INCLUDE_STB_IMAGE_H
- // To get a header file for this, either cut and paste the header,
- // or create stb_image.h, #define STBI_HEADER_FILE_ONLY, and
- // then include stb_image.c from it.
- //// begin header file ////////////////////////////////////////////////////
- //
- // Limitations:
- // - no jpeg progressive support
- // - non-HDR formats support 8-bit samples only (jpeg, png)
- // - no delayed line count (jpeg) -- IJG doesn't support either
- // - no 1-bit BMP
- // - GIF always returns *comp=4
- //
- // Basic usage (see HDR discussion below):
- // 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
- // stbi_image_free(data)
- //
- // Standard parameters:
- // int *x -- outputs image width in pixels
- // int *y -- outputs image height in pixels
- // int *comp -- outputs # of image components in image file
- // int req_comp -- 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. 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 easily see if it's opaque.
- //
- // 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.
- //
- // ===========================================================================
- //
- // iPhone PNG support:
- //
- // By default we convert iphone-formatted PNGs back to RGB; nominally they
- // would silently load as BGR, except the existing code should have just
- // failed on such iPhone PNGs. But 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.
- //
- // 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).
- //
- // ===========================================================================
- //
- // 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);
- #ifndef STBI_NO_STDIO
- #include <stdio.h>
- #endif
- #define STBI_VERSION 1
- enum
- {
- STBI_default = 0, // only used for req_comp
- STBI_grey = 1,
- STBI_grey_alpha = 2,
- STBI_rgb = 3,
- STBI_rgb_alpha = 4
- };
- typedef unsigned char stbi_uc;
- #ifdef __cplusplus
- extern "C" {
- #endif
- // PRIMARY API - works on images of any type
- // load image by filename, open file, or memory buffer
- extern stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- #ifndef STBI_NO_STDIO
- extern stbi_uc *stbi_load (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- // for stbi_load_from_file, file pointer is left pointing immediately after image
- #endif
- #ifndef STBI_NO_HDR
- extern float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- #ifndef STBI_NO_STDIO
- extern float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- #endif
- extern void stbi_hdr_to_ldr_gamma(float gamma);
- extern void stbi_hdr_to_ldr_scale(float scale);
- extern void stbi_ldr_to_hdr_gamma(float gamma);
- extern void stbi_ldr_to_hdr_scale(float scale);
- #endif // STBI_NO_HDR
- // get a VERY brief reason for failure
- // NOT THREADSAFE
- extern const char *stbi_failure_reason (void);
- // free the loaded image -- this is just free()
- extern void stbi_image_free (void *retval_from_stbi_load);
- // get image dimensions & components without fully decoding
- extern int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
- extern int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len);
- #ifndef STBI_NO_STDIO
- extern int stbi_info (char const *filename, int *x, int *y, int *comp);
- extern int stbi_info_from_file (FILE *f, int *x, int *y, int *comp);
- extern int stbi_is_hdr (char const *filename);
- extern int stbi_is_hdr_from_file(FILE *f);
- #endif
- // for image formats that explicitly notate that they have premultiplied alpha,
- // we just return the colors as stored in the file. set this flag to force
- // unpremultiplication. results are undefined if the unpremultiply overflow.
- extern void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply);
- // indicate whether we should process iphone images back to canonical format,
- // or just pass them through "as-is"
- extern void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert);
- // ZLIB client - used by PNG, available for other purposes
- extern char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen);
- extern char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen);
- extern int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
- extern char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen);
- extern int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen);
- // define new loaders
- typedef struct
- {
- int (*test_memory)(stbi_uc const *buffer, int len);
- stbi_uc * (*load_from_memory)(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- #ifndef STBI_NO_STDIO
- int (*test_file)(FILE *f);
- stbi_uc * (*load_from_file)(FILE *f, int *x, int *y, int *comp, int req_comp);
- #endif
- } stbi_loader;
- // register a loader by filling out the above structure (you must define ALL functions)
- // returns 1 if added or already added, 0 if not added (too many loaders)
- // NOT THREADSAFE
- extern int stbi_register_loader(stbi_loader *loader);
- // define faster low-level operations (typically SIMD support)
- #ifdef STBI_SIMD
- typedef void (*stbi_idct_8x8)(stbi_uc *out, int out_stride, short data[64], unsigned short *dequantize);
- // compute an integer IDCT on "input"
- // input[x] = data[x] * dequantize[x]
- // write results to 'out': 64 samples, each run of 8 spaced by 'out_stride'
- // CLAMP results to 0..255
- typedef void (*stbi_YCbCr_to_RGB_run)(stbi_uc *output, stbi_uc const *y, stbi_uc const *cb, stbi_uc const *cr, int count, int step);
- // compute a conversion from YCbCr to RGB
- // 'count' pixels
- // write pixels to 'output'; each pixel is 'step' bytes (either 3 or 4; if 4, write '255' as 4th), order R,G,B
- // y: Y input channel
- // cb: Cb input channel; scale/biased to be 0..255
- // cr: Cr input channel; scale/biased to be 0..255
- extern void stbi_install_idct(stbi_idct_8x8 func);
- extern void stbi_install_YCbCr_to_RGB(stbi_YCbCr_to_RGB_run func);
- #endif // STBI_SIMD
- // TYPE-SPECIFIC ACCESS
- #ifdef STBI_TYPE_SPECIFIC_FUNCTIONS
- // is it a jpeg?
- extern int stbi_jpeg_test_memory (stbi_uc const *buffer, int len);
- extern stbi_uc *stbi_jpeg_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- extern int stbi_jpeg_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp);
- #ifndef STBI_NO_STDIO
- extern stbi_uc *stbi_jpeg_load (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern int stbi_jpeg_test_file (FILE *f);
- extern stbi_uc *stbi_jpeg_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- extern int stbi_jpeg_info (char const *filename, int *x, int *y, int *comp);
- extern int stbi_jpeg_info_from_file (FILE *f, int *x, int *y, int *comp);
- #endif
- // is it a png?
- extern int stbi_png_test_memory (stbi_uc const *buffer, int len);
- extern stbi_uc *stbi_png_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- extern int stbi_png_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
- #ifndef STBI_NO_STDIO
- extern stbi_uc *stbi_png_load (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern int stbi_png_info (char const *filename, int *x, int *y, int *comp);
- extern int stbi_png_test_file (FILE *f);
- extern stbi_uc *stbi_png_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- extern int stbi_png_info_from_file (FILE *f, int *x, int *y, int *comp);
- #endif
- // is it a bmp?
- extern int stbi_bmp_test_memory (stbi_uc const *buffer, int len);
- extern stbi_uc *stbi_bmp_load (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern stbi_uc *stbi_bmp_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- #ifndef STBI_NO_STDIO
- extern int stbi_bmp_test_file (FILE *f);
- extern stbi_uc *stbi_bmp_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- #endif
- // is it a tga?
- extern int stbi_tga_test_memory (stbi_uc const *buffer, int len);
- extern stbi_uc *stbi_tga_load (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern stbi_uc *stbi_tga_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- #ifndef STBI_NO_STDIO
- extern int stbi_tga_test_file (FILE *f);
- extern stbi_uc *stbi_tga_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- #endif
- // is it a psd?
- extern int stbi_psd_test_memory (stbi_uc const *buffer, int len);
- extern stbi_uc *stbi_psd_load (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern stbi_uc *stbi_psd_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- #ifndef STBI_NO_STDIO
- extern int stbi_psd_test_file (FILE *f);
- extern stbi_uc *stbi_psd_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- #endif
- // is it an hdr?
- extern int stbi_hdr_test_memory (stbi_uc const *buffer, int len);
- extern float * stbi_hdr_load (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern float * stbi_hdr_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- #ifndef STBI_NO_STDIO
- extern int stbi_hdr_test_file (FILE *f);
- extern float * stbi_hdr_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- #endif
- // is it a pic?
- extern int stbi_pic_test_memory (stbi_uc const *buffer, int len);
- extern stbi_uc *stbi_pic_load (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern stbi_uc *stbi_pic_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- #ifndef STBI_NO_STDIO
- extern int stbi_pic_test_file (FILE *f);
- extern stbi_uc *stbi_pic_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- #endif
- // is it a gif?
- extern int stbi_gif_test_memory (stbi_uc const *buffer, int len);
- extern stbi_uc *stbi_gif_load (char const *filename, int *x, int *y, int *comp, int req_comp);
- extern stbi_uc *stbi_gif_load_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp);
- extern int stbi_gif_info_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *comp);
- #ifndef STBI_NO_STDIO
- extern int stbi_gif_test_file (FILE *f);
- extern stbi_uc *stbi_gif_load_from_file (FILE *f, int *x, int *y, int *comp, int req_comp);
- extern int stbi_gif_info (char const *filename, int *x, int *y, int *comp);
- extern int stbi_gif_info_from_file (FILE *f, int *x, int *y, int *comp);
- #endif
- #endif//STBI_TYPE_SPECIFIC_FUNCTIONS
- #ifdef __cplusplus
- }
- #endif
- //
- //
- //// end header file /////////////////////////////////////////////////////
- #endif // STBI_INCLUDE_STB_IMAGE_H
|