add #defines to allow disabling decoders for unwanted formats
This commit is contained in:
parent
53ca163e85
commit
7f94e7e591
266
stb_image.h
266
stb_image.h
@ -44,18 +44,65 @@
|
|||||||
default, but NEON must be enabled explicitly; see docs.
|
default, but NEON must be enabled explicitly; see docs.
|
||||||
|
|
||||||
With other JPEG optimizations included in this version, we see
|
With other JPEG optimizations included in this version, we see
|
||||||
2x speedup on a JPEGs on an x86 machine, and a 1.5x speedup
|
2x speedup on a JPEG on an x86 machine, and a 1.5x speedup
|
||||||
on a JPEG on an ARM machine, relative to previous versions of this
|
on a JPEG on an ARM machine, relative to previous versions of this
|
||||||
library. The same results will not obtain for all JPGs and for all
|
library. The same results will not obtain for all JPGs and for all
|
||||||
X86/ARM machines. (Note that progressive JPEGs are significantly
|
x86/ARM machines. (Note that progressive JPEGs are significantly
|
||||||
slower to decode than regular JPEGs.) This doesn't mean that this
|
slower to decode than regular JPEGs.) This doesn't mean that this
|
||||||
is the fastest JPEG decoder in the land; rather, it brings it
|
is the fastest JPEG decoder in the land; rather, it brings it
|
||||||
closer to parity with standard libraries. If you want the fastest
|
closer to parity with standard libraries. If you want the fastest
|
||||||
decode, look elsewhere. (See "Philosophy" section of docs below.)
|
decode, look elsewhere. (See "Philosophy" section of docs below.)
|
||||||
|
|
||||||
|
See final bullet items below for more info on SIMD.
|
||||||
|
|
||||||
|
- Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing
|
||||||
|
the memory allocator. Unlike other STBI libraries, these macros don't
|
||||||
|
support a context parameter, so if you need to pass a context in to
|
||||||
|
the allocator, you'll have to store it in a global or a thread-local
|
||||||
|
variable.
|
||||||
|
|
||||||
|
- Split existing STBI_NO_HDR flag into two flags, STBI_NO_HDR and
|
||||||
|
STBI_NO_LINEAR.
|
||||||
|
STBI_NO_HDR: suppress implementation of .hdr reader format
|
||||||
|
STBI_NO_LINEAR: suppress high-dynamic-range light-linear float API
|
||||||
|
|
||||||
|
- 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)
|
||||||
|
|
||||||
|
Note that you can define multiples of these, and you will get all
|
||||||
|
of them ("only x" and "only y" is interpreted to mean "only x&y").
|
||||||
|
|
||||||
|
- If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still
|
||||||
|
want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB
|
||||||
|
|
||||||
- Compilation of all SIMD code can be suppressed with
|
- Compilation of all SIMD code can be suppressed with
|
||||||
#define STBI_NO_SIMD
|
#define STBI_NO_SIMD
|
||||||
It should not be necessary to disable it unless you have issues
|
It should not be necessary to disable SIMD unless you have issues
|
||||||
compiling (e.g. using an x86 compiler which doesn't support SSE
|
compiling (e.g. using an x86 compiler which doesn't support SSE
|
||||||
intrinsics or that doesn't support the method used to detect
|
intrinsics or that doesn't support the method used to detect
|
||||||
SSE2 support at run-time), and even those can be reported as
|
SSE2 support at run-time), and even those can be reported as
|
||||||
@ -87,18 +134,13 @@
|
|||||||
removed in future versions of the library. It is only intended for
|
removed in future versions of the library. It is only intended for
|
||||||
near-term back-compatibility use.
|
near-term back-compatibility use.
|
||||||
|
|
||||||
- Added STBI_MALLOC, STBI_REALLOC, and STBI_FREE macros for replacing
|
|
||||||
the memory allocator. Unlike other STBI libraries, these macros don't
|
|
||||||
support a context parameter, so if you need to pass a context in to
|
|
||||||
the allocator, you'll have to store it in a global or a thread-local
|
|
||||||
variable.
|
|
||||||
|
|
||||||
|
|
||||||
Latest revision history:
|
Latest revision history:
|
||||||
2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD
|
2.00 (2014-12-25) optimize JPEG, including x86 SSE2 & ARM NEON SIMD
|
||||||
progressive JPEG
|
progressive JPEG
|
||||||
PGM/PPM support
|
PGM/PPM support
|
||||||
STBI_MALLOC,STBI_REALLOC,STBI_FREE
|
STBI_MALLOC,STBI_REALLOC,STBI_FREE
|
||||||
|
STBI_NO_*, STBI_ONLY_*
|
||||||
GIF bugfix
|
GIF bugfix
|
||||||
1.48 (2014-12-14) fix incorrectly-named assert()
|
1.48 (2014-12-14) fix incorrectly-named assert()
|
||||||
1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted)
|
1.47 (2014-12-14) 1/2/4-bit PNG support (both grayscale and paletted)
|
||||||
@ -375,7 +417,7 @@ STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y,
|
|||||||
// for stbi_load_from_file, file pointer is left pointing immediately after image
|
// for stbi_load_from_file, file pointer is left pointing immediately after image
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifndef STBI_NO_HDR
|
#ifndef STBI_NO_LINEAR
|
||||||
STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *comp, int req_comp);
|
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_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_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp);
|
||||||
@ -388,7 +430,9 @@ STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y,
|
|||||||
#ifndef STBI_NO_HDR
|
#ifndef STBI_NO_HDR
|
||||||
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);
|
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma);
|
||||||
STBIDEF void stbi_hdr_to_ldr_scale(float scale);
|
STBIDEF void stbi_hdr_to_ldr_scale(float scale);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_LINEAR
|
||||||
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);
|
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma);
|
||||||
STBIDEF void stbi_ldr_to_hdr_scale(float scale);
|
STBIDEF void stbi_ldr_to_hdr_scale(float scale);
|
||||||
#endif // STBI_NO_HDR
|
#endif // STBI_NO_HDR
|
||||||
@ -453,12 +497,50 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const ch
|
|||||||
|
|
||||||
#ifdef STB_IMAGE_IMPLEMENTATION
|
#ifdef STB_IMAGE_IMPLEMENTATION
|
||||||
|
|
||||||
|
#if defined(STBI_ONLY_JPEG) || defined(STBI_ONLY_PNG) || defined(STBI_ONLY_BMP) \
|
||||||
|
|| defined(STBI_ONLY_TGA) || defined(STBI_ONLY_GIF) || defined(STBI_ONLY_PSD) \
|
||||||
|
|| defined(STBI_ONLY_HDR) || defined(STBI_ONLY_PIC) || defined(STBI_ONLY_PNM) \
|
||||||
|
|| defined(STBI_ONLY_ZLIB)
|
||||||
|
#ifndef STBI_ONLY_JPEG
|
||||||
|
#define STBI_NO_JPEG
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_ONLY_PNG
|
||||||
|
#define STBI_NO_PNG
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_ONLY_BMP
|
||||||
|
#define STBI_NO_BMP
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_ONLY_PSD
|
||||||
|
#define STBI_NO_PSD
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_ONLY_TGA
|
||||||
|
#define STBI_NO_TGA
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_ONLY_GIF
|
||||||
|
#define STBI_NO_GIF
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_ONLY_HDR
|
||||||
|
#define STBI_NO_HDR
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_ONLY_PIC
|
||||||
|
#define STBI_NO_PIC
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_ONLY_PNM
|
||||||
|
#define STBI_NO_PNM
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(STBI_NO_PNG) && !defined(STBI_SUPPORT_ZLIB) && !defined(STBI_NO_ZLIB)
|
||||||
|
#define STBI_NO_ZLIB
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stddef.h> // ptrdiff_t on osx
|
#include <stddef.h> // ptrdiff_t on osx
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
#ifndef STBI_NO_HDR
|
#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR)
|
||||||
#include <math.h> // ldexp
|
#include <math.h> // ldexp
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -680,32 +762,59 @@ static void stbi__rewind(stbi__context *s)
|
|||||||
s->img_buffer = s->img_buffer_original;
|
s->img_buffer = s->img_buffer_original;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#ifndef STBI_NO_JPEG
|
||||||
static int stbi__jpeg_test(stbi__context *s);
|
static int stbi__jpeg_test(stbi__context *s);
|
||||||
static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
static stbi_uc *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
||||||
static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
|
static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PNG
|
||||||
static int stbi__png_test(stbi__context *s);
|
static int stbi__png_test(stbi__context *s);
|
||||||
static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
static stbi_uc *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
||||||
static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
|
static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_BMP
|
||||||
static int stbi__bmp_test(stbi__context *s);
|
static int stbi__bmp_test(stbi__context *s);
|
||||||
static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
||||||
|
static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_TGA
|
||||||
static int stbi__tga_test(stbi__context *s);
|
static int stbi__tga_test(stbi__context *s);
|
||||||
static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
||||||
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
|
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PSD
|
||||||
static int stbi__psd_test(stbi__context *s);
|
static int stbi__psd_test(stbi__context *s);
|
||||||
static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
||||||
|
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef STBI_NO_HDR
|
#ifndef STBI_NO_HDR
|
||||||
static int stbi__hdr_test(stbi__context *s);
|
static int stbi__hdr_test(stbi__context *s);
|
||||||
static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
||||||
|
static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PIC
|
||||||
static int stbi__pic_test(stbi__context *s);
|
static int stbi__pic_test(stbi__context *s);
|
||||||
static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
static stbi_uc *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
||||||
|
static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_GIF
|
||||||
static int stbi__gif_test(stbi__context *s);
|
static int stbi__gif_test(stbi__context *s);
|
||||||
static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
||||||
static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
|
static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PNM
|
||||||
static int stbi__pnm_test(stbi__context *s);
|
static int stbi__pnm_test(stbi__context *s);
|
||||||
static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp);
|
||||||
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
|
static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
// this is not threadsafe
|
// this is not threadsafe
|
||||||
static const char *stbi__g_failure_reason;
|
static const char *stbi__g_failure_reason;
|
||||||
@ -746,20 +855,37 @@ STBIDEF void stbi_image_free(void *retval_from_stbi_load)
|
|||||||
STBI_FREE(retval_from_stbi_load);
|
STBI_FREE(retval_from_stbi_load);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef STBI_NO_HDR
|
#ifndef STBI_NO_LINEAR
|
||||||
static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
|
static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_HDR
|
||||||
static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp);
|
static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
|
static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
|
||||||
{
|
{
|
||||||
|
#ifndef STBI_NO_JPEG
|
||||||
if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp);
|
if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp);
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_NO_PNG
|
||||||
if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp);
|
if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp);
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_NO_BMP
|
||||||
if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp);
|
if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp);
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_NO_GIF
|
||||||
if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp);
|
if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp);
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_NO_PSD
|
||||||
if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp);
|
if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp);
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_NO_PIC
|
||||||
if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp);
|
if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp);
|
||||||
|
#endif
|
||||||
|
#ifndef STBI_NO_PNM
|
||||||
if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp);
|
if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifndef STBI_NO_HDR
|
#ifndef STBI_NO_HDR
|
||||||
if (stbi__hdr_test(s)) {
|
if (stbi__hdr_test(s)) {
|
||||||
@ -768,9 +894,12 @@ static unsigned char *stbi_load_main(stbi__context *s, int *x, int *y, int *comp
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_TGA
|
||||||
// test tga last because it's a crappy test!
|
// test tga last because it's a crappy test!
|
||||||
if (stbi__tga_test(s))
|
if (stbi__tga_test(s))
|
||||||
return stbi__tga_load(s,x,y,comp,req_comp);
|
return stbi__tga_load(s,x,y,comp,req_comp);
|
||||||
|
#endif
|
||||||
|
|
||||||
return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
|
return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -827,8 +956,7 @@ STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk, void *u
|
|||||||
return stbi_load_main(&s,x,y,comp,req_comp);
|
return stbi_load_main(&s,x,y,comp,req_comp);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef STBI_NO_HDR
|
#ifndef STBI_NO_LINEAR
|
||||||
|
|
||||||
static float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
|
static float *stbi_loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp)
|
||||||
{
|
{
|
||||||
unsigned char *data;
|
unsigned char *data;
|
||||||
@ -875,10 +1003,10 @@ STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_
|
|||||||
}
|
}
|
||||||
#endif // !STBI_NO_STDIO
|
#endif // !STBI_NO_STDIO
|
||||||
|
|
||||||
#endif // !STBI_NO_HDR
|
#endif // !STBI_NO_LINEAR
|
||||||
|
|
||||||
// these is-hdr-or-not is defined independent of whether STBI_NO_HDR is
|
// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is
|
||||||
// defined, for API simplicity; if STBI_NO_HDR is defined, it always
|
// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always
|
||||||
// reports false!
|
// reports false!
|
||||||
|
|
||||||
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
|
STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len)
|
||||||
@ -929,17 +1057,17 @@ STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef STBI_NO_HDR
|
|
||||||
static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
|
static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f;
|
||||||
static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
|
static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f;
|
||||||
|
|
||||||
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
|
#ifndef STBI_NO_LINEAR
|
||||||
STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
|
|
||||||
|
|
||||||
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
|
STBIDEF void stbi_ldr_to_hdr_gamma(float gamma) { stbi__l2h_gamma = gamma; }
|
||||||
STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
|
STBIDEF void stbi_ldr_to_hdr_scale(float scale) { stbi__l2h_scale = scale; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
STBIDEF void stbi_hdr_to_ldr_gamma(float gamma) { stbi__h2l_gamma_i = 1/gamma; }
|
||||||
|
STBIDEF void stbi_hdr_to_ldr_scale(float scale) { stbi__h2l_scale_i = 1/scale; }
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
@ -1053,6 +1181,9 @@ static stbi__uint32 stbi__get32le(stbi__context *s)
|
|||||||
return z + (stbi__get16le(s) << 16);
|
return z + (stbi__get16le(s) << 16);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
|
||||||
|
|
||||||
|
|
||||||
//////////////////////////////////////////////////////////////////////////////
|
//////////////////////////////////////////////////////////////////////////////
|
||||||
//
|
//
|
||||||
// generic converter from built-in img_n to req_comp
|
// generic converter from built-in img_n to req_comp
|
||||||
@ -1113,7 +1244,7 @@ static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int r
|
|||||||
return good;
|
return good;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef STBI_NO_HDR
|
#ifndef STBI_NO_LINEAR
|
||||||
static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
|
static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
|
||||||
{
|
{
|
||||||
int i,k,n;
|
int i,k,n;
|
||||||
@ -1130,7 +1261,9 @@ static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp)
|
|||||||
STBI_FREE(data);
|
STBI_FREE(data);
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_HDR
|
||||||
#define stbi__float2int(x) ((int) (x))
|
#define stbi__float2int(x) ((int) (x))
|
||||||
static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
|
static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
|
||||||
{
|
{
|
||||||
@ -1185,6 +1318,8 @@ static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp)
|
|||||||
// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG)
|
// IJG 1998: 0.98 seconds (MSVC6, makefile provided by IJG)
|
||||||
// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro)
|
// IJG 1998: 0.95 seconds (MSVC6, makefile + proc=PPro)
|
||||||
|
|
||||||
|
#ifndef STBI_NO_JPEG
|
||||||
|
|
||||||
// huffman decoding acceleration
|
// huffman decoding acceleration
|
||||||
#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
|
#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache
|
||||||
|
|
||||||
@ -3171,6 +3306,7 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
j.s = s;
|
j.s = s;
|
||||||
return stbi__jpeg_info_raw(&j, x, y, comp);
|
return stbi__jpeg_info_raw(&j, x, y, comp);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// public domain zlib decode v0.2 Sean Barrett 2006-11-18
|
// public domain zlib decode v0.2 Sean Barrett 2006-11-18
|
||||||
// simple implementation
|
// simple implementation
|
||||||
@ -3179,6 +3315,8 @@ static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
// performance
|
// performance
|
||||||
// - fast huffman
|
// - fast huffman
|
||||||
|
|
||||||
|
#ifndef STBI_NO_ZLIB
|
||||||
|
|
||||||
// fast-way is faster to check than jpeg huffman, but slow way is slower
|
// fast-way is faster to check than jpeg huffman, but slow way is slower
|
||||||
#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
|
#define STBI__ZFAST_BITS 9 // accelerate all cases in default tables
|
||||||
#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
|
#define STBI__ZFAST_MASK ((1 << STBI__ZFAST_BITS) - 1)
|
||||||
@ -3623,6 +3761,7 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char
|
|||||||
else
|
else
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18
|
// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18
|
||||||
// simple implementation
|
// simple implementation
|
||||||
@ -3634,7 +3773,7 @@ STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char
|
|||||||
// performance
|
// performance
|
||||||
// - uses stb_zlib, a PD zlib implementation with fast huffman decoding
|
// - uses stb_zlib, a PD zlib implementation with fast huffman decoding
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PNG
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
stbi__uint32 length;
|
stbi__uint32 length;
|
||||||
@ -3696,8 +3835,6 @@ static int stbi__paeth(int a, int b, int c)
|
|||||||
return c;
|
return c;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings
|
|
||||||
|
|
||||||
static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
|
static stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 };
|
||||||
|
|
||||||
// create the png data from post-deflated data
|
// create the png data from post-deflated data
|
||||||
@ -4251,8 +4388,11 @@ static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
p.s = s;
|
p.s = s;
|
||||||
return stbi__png_info_raw(&p, x, y, comp);
|
return stbi__png_info_raw(&p, x, y, comp);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Microsoft/Windows BMP image
|
// Microsoft/Windows BMP image
|
||||||
|
|
||||||
|
#ifndef STBI_NO_BMP
|
||||||
static int stbi__bmp_test_raw(stbi__context *s)
|
static int stbi__bmp_test_raw(stbi__context *s)
|
||||||
{
|
{
|
||||||
int r;
|
int r;
|
||||||
@ -4517,10 +4657,11 @@ static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int
|
|||||||
if (comp) *comp = s->img_n;
|
if (comp) *comp = s->img_n;
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// Targa Truevision - TGA
|
// Targa Truevision - TGA
|
||||||
// by Jonathan Dummer
|
// by Jonathan Dummer
|
||||||
|
#ifndef STBI_NO_TGA
|
||||||
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
|
static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp)
|
||||||
{
|
{
|
||||||
int tga_w, tga_h, tga_comp;
|
int tga_w, tga_h, tga_comp;
|
||||||
@ -4776,10 +4917,12 @@ static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int
|
|||||||
// OK, done
|
// OK, done
|
||||||
return tga_data;
|
return tga_data;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// *************************************************************************************************
|
// *************************************************************************************************
|
||||||
// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
|
// Photoshop PSD loader -- PD by Thatcher Ulrich, integration by Nicolas Schulz, tweaked by STB
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PSD
|
||||||
static int stbi__psd_test(stbi__context *s)
|
static int stbi__psd_test(stbi__context *s)
|
||||||
{
|
{
|
||||||
int r = (stbi__get32be(s) == 0x38425053);
|
int r = (stbi__get32be(s) == 0x38425053);
|
||||||
@ -4944,6 +5087,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int
|
|||||||
|
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// *************************************************************************************************
|
// *************************************************************************************************
|
||||||
// Softimage PIC loader
|
// Softimage PIC loader
|
||||||
@ -4952,6 +5096,7 @@ static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int
|
|||||||
// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
|
// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format
|
||||||
// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
|
// See http://ozviz.wasp.uwa.edu.au/~pbourke/dataformats/softimagepic/
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PIC
|
||||||
static int stbi__pic_is4(stbi__context *s,const char *str)
|
static int stbi__pic_is4(stbi__context *s,const char *str)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
@ -5156,9 +5301,12 @@ static int stbi__pic_test(stbi__context *s)
|
|||||||
stbi__rewind(s);
|
stbi__rewind(s);
|
||||||
return r;
|
return r;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// *************************************************************************************************
|
// *************************************************************************************************
|
||||||
// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
|
// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb
|
||||||
|
|
||||||
|
#ifndef STBI_NO_GIF
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
stbi__int16 prefix;
|
stbi__int16 prefix;
|
||||||
@ -5499,7 +5647,7 @@ static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
{
|
{
|
||||||
return stbi__gif_info_raw(s,x,y,comp);
|
return stbi__gif_info_raw(s,x,y,comp);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// *************************************************************************************************
|
// *************************************************************************************************
|
||||||
// Radiance RGBE HDR loader
|
// Radiance RGBE HDR loader
|
||||||
@ -5723,6 +5871,7 @@ static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
}
|
}
|
||||||
#endif // STBI_NO_HDR
|
#endif // STBI_NO_HDR
|
||||||
|
|
||||||
|
#ifndef STBI_NO_BMP
|
||||||
static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
|
static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
|
||||||
{
|
{
|
||||||
int hsz;
|
int hsz;
|
||||||
@ -5750,7 +5899,9 @@ static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
*comp = stbi__get16le(s) / 8;
|
*comp = stbi__get16le(s) / 8;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PSD
|
||||||
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
|
static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
|
||||||
{
|
{
|
||||||
int channelCount;
|
int channelCount;
|
||||||
@ -5781,7 +5932,9 @@ static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
*comp = 4;
|
*comp = 4;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PIC
|
||||||
static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
|
static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
|
||||||
{
|
{
|
||||||
int act_comp=0,num_packets=0,chained;
|
int act_comp=0,num_packets=0,chained;
|
||||||
@ -5826,6 +5979,7 @@ static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
// *************************************************************************************************
|
// *************************************************************************************************
|
||||||
// Portable Gray Map and Portable Pixel Map loader
|
// Portable Gray Map and Portable Pixel Map loader
|
||||||
@ -5839,6 +5993,8 @@ static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
// Does not support ASCII image data (formats P2 and P3)
|
// Does not support ASCII image data (formats P2 and P3)
|
||||||
// Does not support 16-bit-per-channel
|
// Does not support 16-bit-per-channel
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PNM
|
||||||
|
|
||||||
static int stbi__pnm_test(stbi__context *s)
|
static int stbi__pnm_test(stbi__context *s)
|
||||||
{
|
{
|
||||||
char p, t;
|
char p, t;
|
||||||
@ -5932,30 +6088,47 @@ static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp)
|
|||||||
else
|
else
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
|
static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp)
|
||||||
{
|
{
|
||||||
if (stbi__jpeg_info(s, x, y, comp))
|
#ifndef STBI_NO_JPEG
|
||||||
return 1;
|
if (stbi__jpeg_info(s, x, y, comp)) return 1;
|
||||||
if (stbi__png_info(s, x, y, comp))
|
|
||||||
return 1;
|
|
||||||
if (stbi__gif_info(s, x, y, comp))
|
|
||||||
return 1;
|
|
||||||
if (stbi__bmp_info(s, x, y, comp))
|
|
||||||
return 1;
|
|
||||||
if (stbi__psd_info(s, x, y, comp))
|
|
||||||
return 1;
|
|
||||||
if (stbi__pic_info(s, x, y, comp))
|
|
||||||
return 1;
|
|
||||||
if (stbi__pnm_info(s, x, y, comp))
|
|
||||||
return 1;
|
|
||||||
#ifndef STBI_NO_HDR
|
|
||||||
if (stbi__hdr_info(s, x, y, comp))
|
|
||||||
return 1;
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PNG
|
||||||
|
if (stbi__png_info(s, x, y, comp)) return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_GIF
|
||||||
|
if (stbi__gif_info(s, x, y, comp)) return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_BMP
|
||||||
|
if (stbi__bmp_info(s, x, y, comp)) return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PSD
|
||||||
|
if (stbi__psd_info(s, x, y, comp)) return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PIC
|
||||||
|
if (stbi__pic_info(s, x, y, comp)) return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_PNM
|
||||||
|
if (stbi__pnm_info(s, x, y, comp)) return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifndef STBI_NO_HDR
|
||||||
|
if (stbi__hdr_info(s, x, y, comp)) return 1;
|
||||||
|
#endif
|
||||||
|
|
||||||
// test tga last because it's a crappy test!
|
// test tga last because it's a crappy test!
|
||||||
|
#ifndef STBI_NO_TGA
|
||||||
if (stbi__tga_info(s, x, y, comp))
|
if (stbi__tga_info(s, x, y, comp))
|
||||||
return 1;
|
return 1;
|
||||||
|
#endif
|
||||||
return stbi__err("unknown image type", "Image not of any known type, or corrupt");
|
return stbi__err("unknown image type", "Image not of any known type, or corrupt");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -6000,11 +6173,12 @@ STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
revision history:
|
revision history:
|
||||||
2.00 (2014-12-25) optimize JPG, incl. x86 & NEON SIMD (ryg)
|
2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg)
|
||||||
progressive JPEG (stb)
|
progressive JPEG (stb)
|
||||||
PGM/PPM support (Ken Miller)
|
PGM/PPM support (Ken Miller)
|
||||||
STBI_MALLOC,STBI_REALLOC,STBI_FREE
|
STBI_MALLOC,STBI_REALLOC,STBI_FREE
|
||||||
GIF bugfix -- seemingly never worked
|
GIF bugfix -- seemingly never worked
|
||||||
|
STBI_NO_*, STBI_ONLY_*
|
||||||
1.48 (2014-12-14) fix incorrectly-named assert()
|
1.48 (2014-12-14) fix incorrectly-named assert()
|
||||||
1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)
|
1.47 (2014-12-14) 1/2/4-bit PNG support, both direct and paletted (Omar Cornut & stb)
|
||||||
optimize PNG (ryg)
|
optimize PNG (ryg)
|
||||||
|
Loading…
Reference in New Issue
Block a user