From 68da0178ec10243a687305419988fa242a6a36b9 Mon Sep 17 00:00:00 2001 From: Kenneth van Ewijk Date: Mon, 25 Apr 2016 11:27:21 +0200 Subject: [PATCH] load textures --- OpenGL2/Main.cpp | 61 +- OpenGL2/OpenGL2.vcxproj | 3 + OpenGL2/OpenGL2.vcxproj.filters | 5 + OpenGL2/grass.jpg | Bin 0 -> 171272 bytes OpenGL2/stb_image.h | 6755 +++++++++++++++++++++++++++++++ OpenGL2/terrain.png | Bin 0 -> 88395 bytes 6 files changed, 6817 insertions(+), 7 deletions(-) create mode 100644 OpenGL2/grass.jpg create mode 100644 OpenGL2/stb_image.h create mode 100644 OpenGL2/terrain.png diff --git a/OpenGL2/Main.cpp b/OpenGL2/Main.cpp index dd8d8fa..147dc56 100644 --- a/OpenGL2/Main.cpp +++ b/OpenGL2/Main.cpp @@ -3,10 +3,13 @@ #define _USE_MATH_DEFINES #include +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" + float lastFrameTime = 0; int width, height; - +GLuint grassTexture, blocksTexture; struct Camera { @@ -76,14 +79,16 @@ void display() glRotatef(camera.rotY, 0, 1, 0); glTranslatef(camera.posX, 0, camera.posY); - - glColor3f(0.1f, 1.0f, 0.2f); + glEnable(GL_TEXTURE_2D); + glColor3f(1.0f, 1.0f, 1.0f); + glBindTexture(GL_TEXTURE_2D, grassTexture); glBegin(GL_QUADS); - glVertex3f(-15, -1, -15); - glVertex3f( 15, -1, -15); - glVertex3f( 15, -1, 15); - glVertex3f(-15, -1, 15); + glTexCoord2f(0, 0); glVertex3f(-15, -1, -15); + glTexCoord2f(0, 1); glVertex3f( 15, -1, -15); + glTexCoord2f(1, 1); glVertex3f( 15, -1, 15); + glTexCoord2f(1, 0); glVertex3f(-15, -1, 15); glEnd(); + glDisable(GL_TEXTURE_2D); for (int x = -10; x <= 10; x += 5) { @@ -161,7 +166,49 @@ int main(int argc, char* argv[]) glutKeyboardUpFunc(keyboardUp); glutPassiveMotionFunc(mousePassiveMotion); + //Cursor glutWarpPointer(width / 2, height / 2); + glutSetCursor(GLUT_CURSOR_NONE); + + //Load Textures :: grass + int width1, height1, bpp1; + unsigned char* imgData1 = stbi_load("grass.jpg", &width1, &height1, &bpp1, 4); + + glGenTextures(1, &grassTexture); + glBindTexture(GL_TEXTURE_2D, grassTexture); + + glTexImage2D(GL_TEXTURE_2D, + 0, //level + GL_RGBA, //internal format + width1, //width + height1, //height + 0, //border + GL_RGBA, //data format + GL_UNSIGNED_BYTE, //data type + imgData1); //data + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + stbi_image_free(imgData1); + + + //Load Textures :: blocks + int width2, height2, bpp2; + unsigned char* imgData2 = stbi_load("terrain.jpg", &width2, &height2, &bpp2, 4); + + glGenTextures(1, &blocksTexture); + glBindTexture(GL_TEXTURE_2D, blocksTexture); + + glTexImage2D(GL_TEXTURE_2D, + 0, //level + GL_RGBA, //internal format + width2, //width + height2, //height + 0, //border + GL_RGBA, //data format + GL_UNSIGNED_BYTE, //data type + imgData2); //data + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + stbi_image_free(imgData2); + glutMainLoop(); diff --git a/OpenGL2/OpenGL2.vcxproj b/OpenGL2/OpenGL2.vcxproj index 527dbb9..c1ff947 100644 --- a/OpenGL2/OpenGL2.vcxproj +++ b/OpenGL2/OpenGL2.vcxproj @@ -148,6 +148,9 @@ + + + diff --git a/OpenGL2/OpenGL2.vcxproj.filters b/OpenGL2/OpenGL2.vcxproj.filters index 948faed..65e0a6e 100644 --- a/OpenGL2/OpenGL2.vcxproj.filters +++ b/OpenGL2/OpenGL2.vcxproj.filters @@ -19,4 +19,9 @@ Source Files + + + Header Files + + \ No newline at end of file diff --git a/OpenGL2/grass.jpg b/OpenGL2/grass.jpg new file mode 100644 index 0000000000000000000000000000000000000000..b6cbedd5d5d3095caa4df146179a44ff662b93d6 GIT binary patch literal 171272 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 sxuh8&CRf!4l~~z5rRkk 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�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 +#endif // STBI_NO_STDIO + +#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 + +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// PRIMARY API - works on images of any type +// + +// +// load image by filename, open file, or memory buffer +// + +typedef struct +{ + int (*read) (void *user,char *data,int size); // fill 'data' with 'size' bytes. return number of bytes actually read + void (*skip) (void *user,int n); // skip the next 'n' bytes, or 'unget' the last -n bytes if negative + 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); + +#ifndef STBI_NO_STDIO +STBIDEF 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_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); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *comp, int req_comp); + #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 // 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_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); +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len); +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename); +STBIDEF int stbi_is_hdr_from_file(FILE *f); +#endif // STBI_NO_STDIO + + +// get a VERY brief reason for failure +// NOT THREADSAFE +STBIDEF const char *stbi_failure_reason (void); + +// free the loaded image -- this is just free() +STBIDEF void stbi_image_free (void *retval_from_stbi_load); + +// get image dimensions & components without fully decoding +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp); + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info (char const *filename, int *x, int *y, int *comp); +STBIDEF int stbi_info_from_file (FILE *f, int *x, int *y, int *comp); + +#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. +STBIDEF 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" +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert); + +// flip the image vertically, so the first pixel in the output array is the bottom left +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip); + +// ZLIB client - used by PNG, available for other purposes + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen); +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header); +STBIDEF char *stbi_zlib_decode_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + +STBIDEF char *stbi_zlib_decode_noheader_malloc(const char *buffer, int len, int *outlen); +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen); + + +#ifdef __cplusplus +} +#endif + +// +// +//// end header file ///////////////////////////////////////////////////// +#endif // STBI_INCLUDE_STB_IMAGE_H + +#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 +#include // ptrdiff_t on osx +#include +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + + +#ifdef _MSC_VER +typedef unsigned short stbi__uint16; +typedef signed short stbi__int16; +typedef unsigned int stbi__uint32; +typedef signed int stbi__int32; +#else +#include +typedef uint16_t stbi__uint16; +typedef int16_t stbi__int16; +typedef uint32_t stbi__uint32; +typedef int32_t stbi__int32; +#endif + +// should produce compiler error if size is wrong +typedef unsigned char validate_uint32[sizeof(stbi__uint32)==4 ? 1 : -1]; + +#ifdef _MSC_VER +#define STBI_NOTUSED(v) (void)(v) +#else +#define STBI_NOTUSED(v) (void)sizeof(v) +#endif + +#ifdef _MSC_VER +#define STBI_HAS_LROTL +#endif + +#ifdef STBI_HAS_LROTL + #define stbi_lrot(x,y) _lrotl(x,y) +#else + #define stbi_lrot(x,y) (((x) << (y)) | ((x) >> (32 - (y)))) +#endif + +#if defined(STBI_MALLOC) && defined(STBI_FREE) && (defined(STBI_REALLOC) || defined(STBI_REALLOC_SIZED)) +// ok +#elif !defined(STBI_MALLOC) && !defined(STBI_FREE) && !defined(STBI_REALLOC) && !defined(STBI_REALLOC_SIZED) +// ok +#else +#error "Must define all or none of STBI_MALLOC, STBI_FREE, and STBI_REALLOC (or STBI_REALLOC_SIZED)." +#endif + +#ifndef STBI_MALLOC +#define STBI_MALLOC(sz) malloc(sz) +#define STBI_REALLOC(p,newsz) realloc(p,newsz) +#define STBI_FREE(p) free(p) +#endif + +#ifndef STBI_REALLOC_SIZED +#define STBI_REALLOC_SIZED(p,oldsz,newsz) STBI_REALLOC(p,newsz) +#endif + +// x86/x64 detection +#if defined(__x86_64__) || defined(_M_X64) +#define STBI__X64_TARGET +#elif defined(__i386) || defined(_M_IX86) +#define STBI__X86_TARGET +#endif + +#if defined(__GNUC__) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) && !defined(__SSE2__) && !defined(STBI_NO_SIMD) +// NOTE: not clear do we actually need this for the 64-bit path? +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// (but compiling with -msse2 allows the compiler to use SSE2 everywhere; +// this is just broken and gcc are jerks for not fixing it properly +// http://www.virtualdub.org/blog/pivot/entry.php?id=363 ) +#define STBI_NO_SIMD +#endif + +#if defined(__MINGW32__) && defined(STBI__X86_TARGET) && !defined(STBI_MINGW_ENABLE_SSE2) && !defined(STBI_NO_SIMD) +// Note that __MINGW32__ doesn't actually mean 32-bit, so we have to avoid STBI__X64_TARGET +// +// 32-bit MinGW wants ESP to be 16-byte aligned, but this is not in the +// Windows ABI and VC++ as well as Windows DLLs don't maintain that invariant. +// As a result, enabling SSE2 on 32-bit MinGW is dangerous when not +// simultaneously enabling "-mstackrealign". +// +// See https://github.com/nothings/stb/issues/81 for more information. +// +// So default to no SSE2 on 32-bit MinGW. If you've read this far and added +// -mstackrealign to your build settings, feel free to #define STBI_MINGW_ENABLE_SSE2. +#define STBI_NO_SIMD +#endif + +#if !defined(STBI_NO_SIMD) && (defined(STBI__X86_TARGET) || defined(STBI__X64_TARGET)) +#define STBI_SSE2 +#include + +#ifdef _MSC_VER + +#if _MSC_VER >= 1400 // not VC6 +#include // __cpuid +static int stbi__cpuid3(void) +{ + int info[4]; + __cpuid(info,1); + return info[3]; +} +#else +static int stbi__cpuid3(void) +{ + int res; + __asm { + mov eax,1 + cpuid + mov res,edx + } + return res; +} +#endif + +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name + +static int stbi__sse2_available() +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +static int stbi__sse2_available() +{ +#if defined(__GNUC__) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 408 // GCC 4.8 or later + // GCC 4.8+ has a nice way to do this + return __builtin_cpu_supports("sse2"); +#else + // portable way to do this, preferably without using GCC inline ASM? + // just bail for now. + return 0; +#endif +} +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +// assume GCC or Clang on ARM targets +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +/////////////////////////////////////////////// +// +// stbi__context struct and start_xxx functions + +// stbi__context structure is our basic context used by all images, so it +// contains all the IO context, plus some basic image information +typedef struct +{ + stbi__uint32 img_x, img_y; + int img_n, img_out_n; + + stbi_io_callbacks io; + void *io_user_data; + + int read_from_callbacks; + int buflen; + stbi_uc buffer_start[128]; + + stbi_uc *img_buffer, *img_buffer_end; + stbi_uc *img_buffer_original, *img_buffer_original_end; +} stbi__context; + + +static void stbi__refill_buffer(stbi__context *s); + +// initialize a memory-decode context +static void stbi__start_mem(stbi__context *s, stbi_uc const *buffer, int len) +{ + s->io.read = NULL; + s->read_from_callbacks = 0; + s->img_buffer = s->img_buffer_original = (stbi_uc *) buffer; + s->img_buffer_end = s->img_buffer_original_end = (stbi_uc *) buffer+len; +} + +// initialize a callback-based context +static void stbi__start_callbacks(stbi__context *s, stbi_io_callbacks *c, void *user) +{ + s->io = *c; + s->io_user_data = user; + s->buflen = sizeof(s->buffer_start); + s->read_from_callbacks = 1; + s->img_buffer_original = s->buffer_start; + stbi__refill_buffer(s); + s->img_buffer_original_end = s->img_buffer_end; +} + +#ifndef STBI_NO_STDIO + +static int stbi__stdio_read(void *user, char *data, int size) +{ + return (int) fread(data,1,size,(FILE*) user); +} + +static void stbi__stdio_skip(void *user, int n) +{ + fseek((FILE*) user, n, SEEK_CUR); +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user); +} + +static stbi_io_callbacks stbi__stdio_callbacks = +{ + stbi__stdio_read, + stbi__stdio_skip, + stbi__stdio_eof, +}; + +static void stbi__start_file(stbi__context *s, FILE *f) +{ + stbi__start_callbacks(s, &stbi__stdio_callbacks, (void *) f); +} + +//static void stop_file(stbi__context *s) { } + +#endif // !STBI_NO_STDIO + +static void stbi__rewind(stbi__context *s) +{ + // conceptually rewind SHOULD rewind to the beginning of the stream, + // but we just rewind to the beginning of the initial buffer, because + // we only use it after doing 'test', which only ever looks at at most 92 bytes + s->img_buffer = s->img_buffer_original; + s->img_buffer_end = s->img_buffer_original_end; +} + +#ifndef STBI_NO_JPEG +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 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 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); +#endif + +#ifndef STBI_NO_BMP +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 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 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); +#endif + +#ifndef STBI_NO_PSD +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 int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_HDR +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 int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +#ifndef STBI_NO_PIC +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 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 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); +#endif + +#ifndef STBI_NO_PNM +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 int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +#endif + +// this is not threadsafe +static const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stbi__err - error +// stbi__errpf - error returning pointer to float +// stbi__errpuc - error returning pointer to unsigned char + +#ifdef STBI_NO_FAILURE_STRINGS + #define stbi__err(x,y) 0 +#elif defined(STBI_FAILURE_USERMSG) + #define stbi__err(x,y) stbi__err(y) +#else + #define stbi__err(x,y) stbi__err(x) +#endif + +#define stbi__errpf(x,y) ((float *)(size_t) (stbi__err(x,y)?NULL:NULL)) +#define stbi__errpuc(x,y) ((unsigned char *)(size_t) (stbi__err(x,y)?NULL:NULL)) + +STBIDEF void stbi_image_free(void *retval_from_stbi_load) +{ + STBI_FREE(retval_from_stbi_load); +} + +#ifndef STBI_NO_LINEAR +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); +#endif + +static int stbi__vertically_flip_on_load = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load = flag_true_if_should_flip; +} + +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); + #endif + #ifndef STBI_NO_PNG + 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); + #endif + #ifndef STBI_NO_GIF + 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); + #endif + #ifndef STBI_NO_PIC + 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); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp); + return stbi__hdr_to_ldr(hdr, *x, *y, req_comp ? req_comp : *comp); + } + #endif + + #ifndef STBI_NO_TGA + // test tga last because it's a crappy test! + if (stbi__tga_test(s)) + 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"); +} + +static unsigned char *stbi__load_flip(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result = stbi__load_main(s, x, y, comp, req_comp); + + if (stbi__vertically_flip_on_load && result != NULL) { + int w = *x, h = *y; + int depth = req_comp ? req_comp : *comp; + int row,col,z; + stbi_uc temp; + + // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once + for (row = 0; row < (h>>1); row++) { + for (col = 0; col < w; col++) { + for (z = 0; z < depth; z++) { + temp = result[(row * w + col) * depth + z]; + result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; + result[((h - row - 1) * w + col) * depth + z] = temp; + } + } + } + } + + return result; +} + +#ifndef STBI_NO_HDR +static void stbi__float_postprocess(float *result, int *x, int *y, int *comp, int req_comp) +{ + if (stbi__vertically_flip_on_load && result != NULL) { + int w = *x, h = *y; + int depth = req_comp ? req_comp : *comp; + int row,col,z; + float temp; + + // @OPTIMIZE: use a bigger temp buffer and memcpy multiple pixels at once + for (row = 0; row < (h>>1); row++) { + for (col = 0; col < w; col++) { + for (z = 0; z < depth; z++) { + temp = result[(row * w + col) * depth + z]; + result[(row * w + col) * depth + z] = result[((h - row - 1) * w + col) * depth + z]; + result[((h - row - 1) * w + col) * depth + z] = temp; + } + } + } + } +} +#endif + +#ifndef STBI_NO_STDIO + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != fopen_s(&f, filename, mode)) + f=0; +#else + f = fopen(filename, mode); +#endif + return f; +} + + +STBIDEF stbi_uc *stbi_load(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + unsigned char *result; + if (!f) return stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF stbi_uc *stbi_load_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_flip(&s,x,y,comp,req_comp); + if (result) { + // need to 'unget' all the characters in the IO buffer + fseek(f, - (int) (s.img_buffer_end - s.img_buffer), SEEK_CUR); + } + return result; +} +#endif //!STBI_NO_STDIO + +STBIDEF stbi_uc *stbi_load_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_flip(&s,x,y,comp,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) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__load_flip(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_LINEAR +static float *stbi__loadf_main(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char *data; + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_flip(s, x, y, comp, req_comp); + if (data) + return stbi__ldr_to_hdr(data, *x, *y, req_comp ? req_comp : *comp); + return stbi__errpf("unknown image type", "Image not of any known type, or corrupt"); +} + +STBIDEF float *stbi_loadf_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +STBIDEF float *stbi_loadf_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_STDIO +STBIDEF float *stbi_loadf(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + float *result; + FILE *f = stbi__fopen(filename, "rb"); + if (!f) return stbi__errpf("can't fopen", "Unable to open file"); + result = stbi_loadf_from_file(f,x,y,comp,req_comp); + fclose(f); + return result; +} + +STBIDEF float *stbi_loadf_from_file(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__context s; + stbi__start_file(&s,f); + return stbi__loadf_main(&s,x,y,comp,req_comp); +} +#endif // !STBI_NO_STDIO + +#endif // !STBI_NO_LINEAR + +// these is-hdr-or-not is defined independent of whether STBI_NO_LINEAR is +// defined, for API simplicity; if STBI_NO_LINEAR is defined, it always +// reports false! + +STBIDEF int stbi_is_hdr_from_memory(stbi_uc const *buffer, int len) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(buffer); + STBI_NOTUSED(len); + return 0; + #endif +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_is_hdr (char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result=0; + if (f) { + result = stbi_is_hdr_from_file(f); + fclose(f); + } + return result; +} + +STBIDEF int stbi_is_hdr_from_file(FILE *f) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_file(&s,f); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(f); + return 0; + #endif +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_is_hdr_from_callbacks(stbi_io_callbacks const *clbk, void *user) +{ + #ifndef STBI_NO_HDR + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) clbk, user); + return stbi__hdr_test(&s); + #else + STBI_NOTUSED(clbk); + STBI_NOTUSED(user); + return 0; + #endif +} + +#ifndef STBI_NO_LINEAR +static float stbi__l2h_gamma=2.2f, stbi__l2h_scale=1.0f; + +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; } +#endif + +static float stbi__h2l_gamma_i=1.0f/2.2f, stbi__h2l_scale_i=1.0f; + +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; } + + +////////////////////////////////////////////////////////////////////////////// +// +// Common code used by all image loaders +// + +enum +{ + STBI__SCAN_load=0, + STBI__SCAN_type, + STBI__SCAN_header +}; + +static void stbi__refill_buffer(stbi__context *s) +{ + int n = (s->io.read)(s->io_user_data,(char*)s->buffer_start,s->buflen); + if (n == 0) { + // at end of file, treat same as if from memory, but need to handle case + // where s->img_buffer isn't pointing to safe memory, e.g. 0-byte file + s->read_from_callbacks = 0; + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start+1; + *s->img_buffer = 0; + } else { + s->img_buffer = s->buffer_start; + s->img_buffer_end = s->buffer_start + n; + } +} + +stbi_inline static stbi_uc stbi__get8(stbi__context *s) +{ + if (s->img_buffer < s->img_buffer_end) + return *s->img_buffer++; + if (s->read_from_callbacks) { + stbi__refill_buffer(s); + return *s->img_buffer++; + } + return 0; +} + +stbi_inline static int stbi__at_eof(stbi__context *s) +{ + if (s->io.read) { + if (!(s->io.eof)(s->io_user_data)) return 0; + // if feof() is true, check if buffer = end + // special case: we've only got the special 0 character at the end + if (s->read_from_callbacks == 0) return 1; + } + + return s->img_buffer >= s->img_buffer_end; +} + +static void stbi__skip(stbi__context *s, int n) +{ + if (n < 0) { + s->img_buffer = s->img_buffer_end; + return; + } + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + s->img_buffer = s->img_buffer_end; + (s->io.skip)(s->io_user_data, n - blen); + return; + } + } + s->img_buffer += n; +} + +static int stbi__getn(stbi__context *s, stbi_uc *buffer, int n) +{ + if (s->io.read) { + int blen = (int) (s->img_buffer_end - s->img_buffer); + if (blen < n) { + int res, count; + + memcpy(buffer, s->img_buffer, blen); + + count = (s->io.read)(s->io_user_data, (char*) buffer + blen, n - blen); + res = (count == (n-blen)); + s->img_buffer = s->img_buffer_end; + return res; + } + } + + if (s->img_buffer+n <= s->img_buffer_end) { + memcpy(buffer, s->img_buffer, n); + s->img_buffer += n; + return 1; + } else + return 0; +} + +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} + +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} + +#if defined(STBI_NO_BMP) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) +// nothing +#else +static int stbi__get16le(stbi__context *s) +{ + int z = stbi__get8(s); + return z + (stbi__get8(s) << 8); +} +#endif + +#ifndef STBI_NO_BMP +static stbi__uint32 stbi__get32le(stbi__context *s) +{ + stbi__uint32 z = stbi__get16le(s); + return z + (stbi__get16le(s) << 16); +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + + +////////////////////////////////////////////////////////////////////////////// +// +// generic converter from built-in img_n to req_comp +// individual types do this automatically as much as possible (e.g. jpeg +// does all cases internally since it needs to colorspace convert anyway, +// and it never has alpha, so very few cases ). png can automatically +// interleave an alpha=255 channel, but falls back to this for other cases +// +// assume data buffer is malloced, so malloc a new one and free that one +// only failure mode is malloc failing + +static stbi_uc stbi__compute_y(int r, int g, int b) +{ + return (stbi_uc) (((r*77) + (g*150) + (29*b)) >> 8); +} + +static unsigned char *stbi__convert_format(unsigned char *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + unsigned char *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (unsigned char *) stbi__malloc(req_comp * x * y); + if (good == NULL) { + STBI_FREE(data); + return stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + unsigned char *src = data + j * x * img_n ; + unsigned char *dest = good + j * x * req_comp; + + #define COMBO(a,b) ((a)*8+(b)) + #define CASE(a,b) case COMBO(a,b): for(i=x-1; i >= 0; --i, src += a, dest += b) + // convert source image with img_n components to one with req_comp components; + // avoid switch per pixel, so use switch per scanline and massive macros + switch (COMBO(img_n, req_comp)) { + CASE(1,2) dest[0]=src[0], dest[1]=255; break; + CASE(1,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(1,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=255; break; + CASE(2,1) dest[0]=src[0]; break; + CASE(2,3) dest[0]=dest[1]=dest[2]=src[0]; break; + CASE(2,4) dest[0]=dest[1]=dest[2]=src[0], dest[3]=src[1]; break; + CASE(3,4) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2],dest[3]=255; break; + CASE(3,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; + CASE(3,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = 255; break; + CASE(4,1) dest[0]=stbi__compute_y(src[0],src[1],src[2]); break; + CASE(4,2) dest[0]=stbi__compute_y(src[0],src[1],src[2]), dest[1] = src[3]; break; + CASE(4,3) dest[0]=src[0],dest[1]=src[1],dest[2]=src[2]; break; + default: STBI_ASSERT(0); + } + #undef CASE + } + + STBI_FREE(data); + return good; +} + +#ifndef STBI_NO_LINEAR +static float *stbi__ldr_to_hdr(stbi_uc *data, int x, int y, int comp) +{ + int i,k,n; + float *output = (float *) stbi__malloc(x * y * comp * sizeof(float)); + if (output == NULL) { STBI_FREE(data); return stbi__errpf("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + output[i*comp + k] = (float) (pow(data[i*comp+k]/255.0f, stbi__l2h_gamma) * stbi__l2h_scale); + } + if (k < comp) output[i*comp + k] = data[i*comp+k]/255.0f; + } + STBI_FREE(data); + return output; +} +#endif + +#ifndef STBI_NO_HDR +#define stbi__float2int(x) ((int) (x)) +static stbi_uc *stbi__hdr_to_ldr(float *data, int x, int y, int comp) +{ + int i,k,n; + stbi_uc *output = (stbi_uc *) stbi__malloc(x * y * comp); + if (output == NULL) { STBI_FREE(data); return stbi__errpuc("outofmem", "Out of memory"); } + // compute number of non-alpha components + if (comp & 1) n = comp; else n = comp-1; + for (i=0; i < x*y; ++i) { + for (k=0; k < n; ++k) { + float z = (float) pow(data[i*comp+k]*stbi__h2l_scale_i, stbi__h2l_gamma_i) * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + if (k < comp) { + float z = data[i*comp+k] * 255 + 0.5f; + if (z < 0) z = 0; + if (z > 255) z = 255; + output[i*comp + k] = (stbi_uc) stbi__float2int(z); + } + } + STBI_FREE(data); + return output; +} +#endif + +////////////////////////////////////////////////////////////////////////////// +// +// "baseline" JPEG/JFIF decoder +// +// simple implementation +// - doesn't support delayed output of y-dimension +// - simple interface (only one output format: 8-bit interleaved RGB) +// - doesn't try to recover corrupt jpegs +// - doesn't allow partial loading, loading multiple at once +// - still fast on x86 (copying globals into locals doesn't help x86) +// - allocates lots of intermediate memory (full size of all components) +// - non-interleaved case requires this anyway +// - allows good upsampling (see next) +// high-quality +// - upsampled channels are bilinearly interpolated, even across blocks +// - quality integer IDCT derived from IJG's 'slow' +// performance +// - fast huffman; reasonable integer IDCT +// - some SIMD kernels for common paths on targets with SSE2/NEON +// - uses a lot of intermediate memory, could cache poorly + +#ifndef STBI_NO_JPEG + +// huffman decoding acceleration +#define FAST_BITS 9 // larger handles more cases; smaller stomps less cache + +typedef struct +{ + stbi_uc fast[1 << FAST_BITS]; + // weirdly, repacking this into AoS is a 10% speed loss, instead of a win + stbi__uint16 code[256]; + stbi_uc values[256]; + stbi_uc size[257]; + unsigned int maxcode[18]; + int delta[17]; // old 'firstsymbol' - old 'firstcode' +} stbi__huffman; + +typedef struct +{ + stbi__context *s; + stbi__huffman huff_dc[4]; + stbi__huffman huff_ac[4]; + stbi_uc dequant[4][64]; + stbi__int16 fast_ac[4][1 << FAST_BITS]; + +// sizes for components, interleaved MCUs + int img_h_max, img_v_max; + int img_mcu_x, img_mcu_y; + int img_mcu_w, img_mcu_h; + +// definition of jpeg image component + struct + { + int id; + int h,v; + int tq; + int hd,ha; + int dc_pred; + + int x,y,w2,h2; + stbi_uc *data; + void *raw_data, *raw_coeff; + stbi_uc *linebuf; + short *coeff; // progressive only + int coeff_w, coeff_h; // number of 8x8 coefficient blocks + } img_comp[4]; + + stbi__uint32 code_buffer; // jpeg entropy-coded buffer + int code_bits; // number of valid bits + unsigned char marker; // marker seen while filling entropy buffer + int nomore; // flag if we saw a marker so must stop + + int progressive; + int spec_start; + int spec_end; + int succ_high; + int succ_low; + int eob_run; + int rgb; + + int scan_n, order[4]; + int restart_interval, todo; + +// kernels + void (*idct_block_kernel)(stbi_uc *out, int out_stride, short data[64]); + void (*YCbCr_to_RGB_kernel)(stbi_uc *out, const stbi_uc *y, const stbi_uc *pcb, const stbi_uc *pcr, int count, int step); + stbi_uc *(*resample_row_hv_2_kernel)(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs); +} stbi__jpeg; + +static int stbi__build_huffman(stbi__huffman *h, int *count) +{ + int i,j,k=0,code; + // build size list for each symbol (from JPEG spec) + for (i=0; i < 16; ++i) + for (j=0; j < count[i]; ++j) + h->size[k++] = (stbi_uc) (i+1); + h->size[k] = 0; + + // compute actual symbols (from jpeg spec) + code = 0; + k = 0; + for(j=1; j <= 16; ++j) { + // compute delta to add to code to compute symbol id + h->delta[j] = k - code; + if (h->size[k] == j) { + while (h->size[k] == j) + h->code[k++] = (stbi__uint16) (code++); + if (code-1 >= (1 << j)) return stbi__err("bad code lengths","Corrupt JPEG"); + } + // compute largest code + 1 for this size, preshifted as needed later + h->maxcode[j] = code << (16-j); + code <<= 1; + } + h->maxcode[j] = 0xffffffff; + + // build non-spec acceleration table; 255 is flag for not-accelerated + memset(h->fast, 255, 1 << FAST_BITS); + for (i=0; i < k; ++i) { + int s = h->size[i]; + if (s <= FAST_BITS) { + int c = h->code[i] << (FAST_BITS-s); + int m = 1 << (FAST_BITS-s); + for (j=0; j < m; ++j) { + h->fast[c+j] = (stbi_uc) i; + } + } + } + return 1; +} + +// build a table that decodes both magnitude and value of small ACs in +// one go. +static void stbi__build_fast_ac(stbi__int16 *fast_ac, stbi__huffman *h) +{ + int i; + for (i=0; i < (1 << FAST_BITS); ++i) { + stbi_uc fast = h->fast[i]; + fast_ac[i] = 0; + if (fast < 255) { + int rs = h->values[fast]; + int run = (rs >> 4) & 15; + int magbits = rs & 15; + int len = h->size[fast]; + + if (magbits && len + magbits <= FAST_BITS) { + // magnitude code followed by receive_extend code + int k = ((i << len) & ((1 << FAST_BITS) - 1)) >> (FAST_BITS - magbits); + int m = 1 << (magbits - 1); + if (k < m) k += (-1 << magbits) + 1; + // if the result is small enough, we can fit it in fast_ac table + if (k >= -128 && k <= 127) + fast_ac[i] = (stbi__int16) ((k << 8) + (run << 4) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + if (c != 0) { + j->marker = (unsigned char) c; + j->nomore = 1; + return; + } + } + j->code_buffer |= b << (24 - j->code_bits); + j->code_bits += 8; + } while (j->code_bits <= 24); +} + +// (1 << n) - 1 +static stbi__uint32 stbi__bmask[17]={0,1,3,7,15,31,63,127,255,511,1023,2047,4095,8191,16383,32767,65535}; + +// decode a jpeg huffman value from the bitstream +stbi_inline static int stbi__jpeg_huff_decode(stbi__jpeg *j, stbi__huffman *h) +{ + unsigned int temp; + int c,k; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + // look at the top FAST_BITS and determine what symbol ID it is, + // if the code is <= FAST_BITS + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + k = h->fast[c]; + if (k < 255) { + int s = h->size[k]; + if (s > j->code_bits) + return -1; + j->code_buffer <<= s; + j->code_bits -= s; + return h->values[k]; + } + + // naive test is to shift the code_buffer down so k bits are + // valid, then test against maxcode. To speed this up, we've + // preshifted maxcode left so that it has (16-k) 0s at the + // end; in other words, regardless of the number of bits, it + // wants to be compared against something shifted to have 16; + // that way we don't need to shift inside the loop. + temp = j->code_buffer >> 16; + for (k=FAST_BITS+1 ; ; ++k) + if (temp < h->maxcode[k]) + break; + if (k == 17) { + // error! code not found + j->code_bits -= 16; + return -1; + } + + if (k > j->code_bits) + return -1; + + // convert the huffman code to the symbol id + c = ((j->code_buffer >> (32 - k)) & stbi__bmask[k]) + h->delta[k]; + STBI_ASSERT((((j->code_buffer) >> (32 - h->size[c])) & stbi__bmask[h->size[c]]) == h->code[c]); + + // convert the id to a symbol + j->code_bits -= k; + j->code_buffer <<= k; + return h->values[c]; +} + +// bias[n] = (-1<code_bits < n) stbi__grow_buffer_unsafe(j); + + sgn = (stbi__int32)j->code_buffer >> 31; // sign bit is always in MSB + k = stbi_lrot(j->code_buffer, n); + STBI_ASSERT(n >= 0 && n < (int) (sizeof(stbi__bmask)/sizeof(*stbi__bmask))); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k + (stbi__jbias[n] & ~sgn); +} + +// get some unsigned bits +stbi_inline static int stbi__jpeg_get_bits(stbi__jpeg *j, int n) +{ + unsigned int k; + if (j->code_bits < n) stbi__grow_buffer_unsafe(j); + k = stbi_lrot(j->code_buffer, n); + j->code_buffer = k & ~stbi__bmask[n]; + k &= stbi__bmask[n]; + j->code_bits -= n; + return k; +} + +stbi_inline static int stbi__jpeg_get_bit(stbi__jpeg *j) +{ + unsigned int k; + if (j->code_bits < 1) stbi__grow_buffer_unsafe(j); + k = j->code_buffer; + j->code_buffer <<= 1; + --j->code_bits; + return k & 0x80000000; +} + +// given a value that's at position X in the zigzag stream, +// where does it appear in the 8x8 matrix coded as row-major? +static stbi_uc stbi__jpeg_dezigzag[64+15] = +{ + 0, 1, 8, 16, 9, 2, 3, 10, + 17, 24, 32, 25, 18, 11, 4, 5, + 12, 19, 26, 33, 40, 48, 41, 34, + 27, 20, 13, 6, 7, 14, 21, 28, + 35, 42, 49, 56, 57, 50, 43, 36, + 29, 22, 15, 23, 30, 37, 44, 51, + 58, 59, 52, 45, 38, 31, 39, 46, + 53, 60, 61, 54, 47, 55, 62, 63, + // let corrupt input sample past end + 63, 63, 63, 63, 63, 63, 63, 63, + 63, 63, 63, 63, 63, 63, 63 +}; + +// decode one 64-entry block-- +static int stbi__jpeg_decode_block(stbi__jpeg *j, short data[64], stbi__huffman *hdc, stbi__huffman *hac, stbi__int16 *fac, int b, stbi_uc *dequant) +{ + int diff,dc,k; + int t; + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + t = stbi__jpeg_huff_decode(j, hdc); + if (t < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + + // 0 all the ac values now so we can do it 32-bits at a time + memset(data,0,64*sizeof(data[0])); + + diff = t ? stbi__extend_receive(j, t) : 0; + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc * dequant[0]); + + // decode AC components, see JPEG spec + k = 1; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * dequant[zig]); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (rs != 0xf0) break; // end block + k += 16; + } else { + k += r; + // decode into unzigzag'd location + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) * dequant[zig]); + } + } + } while (k < 64); + return 1; +} + +static int stbi__jpeg_decode_block_prog_dc(stbi__jpeg *j, short data[64], stbi__huffman *hdc, int b) +{ + int diff,dc; + int t; + if (j->spec_end != 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + + if (j->succ_high == 0) { + // first scan for DC coefficient, must be first + memset(data,0,64*sizeof(data[0])); // 0 all the ac values now + t = stbi__jpeg_huff_decode(j, hdc); + diff = t ? stbi__extend_receive(j, t) : 0; + + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + data[0] = (short) (dc << j->succ_low); + } else { + // refinement scan for DC coefficient + if (stbi__jpeg_get_bit(j)) + data[0] += (short) (1 << j->succ_low); + } + return 1; +} + +// @OPTIMIZE: store non-zigzagged during the decode passes, +// and only de-zigzag when dequantizing +static int stbi__jpeg_decode_block_prog_ac(stbi__jpeg *j, short data[64], stbi__huffman *hac, stbi__int16 *fac) +{ + int k; + if (j->spec_start == 0) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + + if (j->succ_high == 0) { + int shift = j->succ_low; + + if (j->eob_run) { + --j->eob_run; + return 1; + } + + k = j->spec_start; + do { + unsigned int zig; + int c,r,s; + if (j->code_bits < 16) stbi__grow_buffer_unsafe(j); + c = (j->code_buffer >> (32 - FAST_BITS)) & ((1 << FAST_BITS)-1); + r = fac[c]; + if (r) { // fast-AC path + k += (r >> 4) & 15; // run + s = r & 15; // combined length + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) << shift); + } else { + int rs = stbi__jpeg_huff_decode(j, hac); + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r); + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + --j->eob_run; + break; + } + k += 16; + } else { + k += r; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) (stbi__extend_receive(j,s) << shift); + } + } + } while (k <= j->spec_end); + } else { + // refinement scan for these AC coefficients + + short bit = (short) (1 << j->succ_low); + + if (j->eob_run) { + --j->eob_run; + for (k = j->spec_start; k <= j->spec_end; ++k) { + short *p = &data[stbi__jpeg_dezigzag[k]]; + if (*p != 0) + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } + } else { + k = j->spec_start; + do { + int r,s; + int rs = stbi__jpeg_huff_decode(j, hac); // @OPTIMIZE see if we can use the fast path here, advance-by-r is so slow, eh + if (rs < 0) return stbi__err("bad huffman code","Corrupt JPEG"); + s = rs & 15; + r = rs >> 4; + if (s == 0) { + if (r < 15) { + j->eob_run = (1 << r) - 1; + if (r) + j->eob_run += stbi__jpeg_get_bits(j, r); + r = 64; // force end of block + } else { + // r=15 s=0 should write 16 0s, so we just do + // a run of 15 0s and then write s (which is 0), + // so we don't have to do anything special here + } + } else { + if (s != 1) return stbi__err("bad huffman code", "Corrupt JPEG"); + // sign bit + if (stbi__jpeg_get_bit(j)) + s = bit; + else + s = -bit; + } + + // advance by r + while (k <= j->spec_end) { + short *p = &data[stbi__jpeg_dezigzag[k++]]; + if (*p != 0) { + if (stbi__jpeg_get_bit(j)) + if ((*p & bit)==0) { + if (*p > 0) + *p += bit; + else + *p -= bit; + } + } else { + if (r == 0) { + *p = (short) s; + break; + } + --r; + } + } + } while (k <= j->spec_end); + } + } + return 1; +} + +// take a -128..127 value and stbi__clamp it and convert to 0..255 +stbi_inline static stbi_uc stbi__clamp(int x) +{ + // trick to use a single test to catch both cases + if ((unsigned int) x > 255) { + if (x < 0) return 0; + if (x > 255) return 255; + } + return (stbi_uc) x; +} + +#define stbi__f2f(x) ((int) (((x) * 4096 + 0.5))) +#define stbi__fsh(x) ((x) << 12) + +// derived from jidctint -- DCT_ISLOW +#define STBI__IDCT_1D(s0,s1,s2,s3,s4,s5,s6,s7) \ + int t0,t1,t2,t3,p1,p2,p3,p4,p5,x0,x1,x2,x3; \ + p2 = s2; \ + p3 = s6; \ + p1 = (p2+p3) * stbi__f2f(0.5411961f); \ + t2 = p1 + p3*stbi__f2f(-1.847759065f); \ + t3 = p1 + p2*stbi__f2f( 0.765366865f); \ + p2 = s0; \ + p3 = s4; \ + t0 = stbi__fsh(p2+p3); \ + t1 = stbi__fsh(p2-p3); \ + x0 = t0+t3; \ + x3 = t0-t3; \ + x1 = t1+t2; \ + x2 = t1-t2; \ + t0 = s7; \ + t1 = s5; \ + t2 = s3; \ + t3 = s1; \ + p3 = t0+t2; \ + p4 = t1+t3; \ + p1 = t0+t3; \ + p2 = t1+t2; \ + p5 = (p3+p4)*stbi__f2f( 1.175875602f); \ + t0 = t0*stbi__f2f( 0.298631336f); \ + t1 = t1*stbi__f2f( 2.053119869f); \ + t2 = t2*stbi__f2f( 3.072711026f); \ + t3 = t3*stbi__f2f( 1.501321110f); \ + p1 = p5 + p1*stbi__f2f(-0.899976223f); \ + p2 = p5 + p2*stbi__f2f(-2.562915447f); \ + p3 = p3*stbi__f2f(-1.961570560f); \ + p4 = p4*stbi__f2f(-0.390180644f); \ + t3 += p1+p4; \ + t2 += p2+p3; \ + t1 += p2+p4; \ + t0 += p1+p3; + +static void stbi__idct_block(stbi_uc *out, int out_stride, short data[64]) +{ + int i,val[64],*v=val; + stbi_uc *o; + short *d = data; + + // columns + for (i=0; i < 8; ++i,++d, ++v) { + // if all zeroes, shortcut -- this avoids dequantizing 0s and IDCTing + if (d[ 8]==0 && d[16]==0 && d[24]==0 && d[32]==0 + && d[40]==0 && d[48]==0 && d[56]==0) { + // no shortcut 0 seconds + // (1|2|3|4|5|6|7)==0 0 seconds + // all separate -0.047 seconds + // 1 && 2|3 && 4|5 && 6|7: -0.047 seconds + int dcterm = d[0] << 2; + v[0] = v[8] = v[16] = v[24] = v[32] = v[40] = v[48] = v[56] = dcterm; + } else { + STBI__IDCT_1D(d[ 0],d[ 8],d[16],d[24],d[32],d[40],d[48],d[56]) + // constants scaled things up by 1<<12; let's bring them back + // down, but keep 2 extra bits of precision + x0 += 512; x1 += 512; x2 += 512; x3 += 512; + v[ 0] = (x0+t3) >> 10; + v[56] = (x0-t3) >> 10; + v[ 8] = (x1+t2) >> 10; + v[48] = (x1-t2) >> 10; + v[16] = (x2+t1) >> 10; + v[40] = (x2-t1) >> 10; + v[24] = (x3+t0) >> 10; + v[32] = (x3-t0) >> 10; + } + } + + for (i=0, v=val, o=out; i < 8; ++i,v+=8,o+=out_stride) { + // no fast case since the first 1D IDCT spread components out + STBI__IDCT_1D(v[0],v[1],v[2],v[3],v[4],v[5],v[6],v[7]) + // constants scaled things up by 1<<12, plus we had 1<<2 from first + // loop, plus horizontal and vertical each scale by sqrt(8) so together + // we've got an extra 1<<3, so 1<<17 total we need to remove. + // so we want to round that, which means adding 0.5 * 1<<17, + // aka 65536. Also, we'll end up with -128 to 127 that we want + // to encode as 0..255 by adding 128, so we'll add that before the shift + x0 += 65536 + (128<<17); + x1 += 65536 + (128<<17); + x2 += 65536 + (128<<17); + x3 += 65536 + (128<<17); + // tried computing the shifts into temps, or'ing the temps to see + // if any were out of range, but that was slower + o[0] = stbi__clamp((x0+t3) >> 17); + o[7] = stbi__clamp((x0-t3) >> 17); + o[1] = stbi__clamp((x1+t2) >> 17); + o[6] = stbi__clamp((x1-t2) >> 17); + o[2] = stbi__clamp((x2+t1) >> 17); + o[5] = stbi__clamp((x2-t1) >> 17); + o[3] = stbi__clamp((x3+t0) >> 17); + o[4] = stbi__clamp((x3-t0) >> 17); + } +} + +#ifdef STBI_SSE2 +// sse2 integer IDCT. not the fastest possible implementation but it +// produces bit-identical results to the generic C version so it's +// fully "transparent". +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + // This is constructed to match our regular (generic) integer IDCT exactly. + __m128i row0, row1, row2, row3, row4, row5, row6, row7; + __m128i tmp; + + // dot product constant: even elems=x, odd elems=y + #define dct_const(x,y) _mm_setr_epi16((x),(y),(x),(y),(x),(y),(x),(y)) + + // out(0) = c0[even]*x + c0[odd]*y (c0, x, y 16-bit, out 32-bit) + // out(1) = c1[even]*x + c1[odd]*y + #define dct_rot(out0,out1, x,y,c0,c1) \ + __m128i c0##lo = _mm_unpacklo_epi16((x),(y)); \ + __m128i c0##hi = _mm_unpackhi_epi16((x),(y)); \ + __m128i out0##_l = _mm_madd_epi16(c0##lo, c0); \ + __m128i out0##_h = _mm_madd_epi16(c0##hi, c0); \ + __m128i out1##_l = _mm_madd_epi16(c0##lo, c1); \ + __m128i out1##_h = _mm_madd_epi16(c0##hi, c1) + + // out = in << 12 (in 16-bit, out 32-bit) + #define dct_widen(out, in) \ + __m128i out##_l = _mm_srai_epi32(_mm_unpacklo_epi16(_mm_setzero_si128(), (in)), 4); \ + __m128i out##_h = _mm_srai_epi32(_mm_unpackhi_epi16(_mm_setzero_si128(), (in)), 4) + + // wide add + #define dct_wadd(out, a, b) \ + __m128i out##_l = _mm_add_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_add_epi32(a##_h, b##_h) + + // wide sub + #define dct_wsub(out, a, b) \ + __m128i out##_l = _mm_sub_epi32(a##_l, b##_l); \ + __m128i out##_h = _mm_sub_epi32(a##_h, b##_h) + + // butterfly a/b, add bias, then shift by "s" and pack + #define dct_bfly32o(out0, out1, a,b,bias,s) \ + { \ + __m128i abiased_l = _mm_add_epi32(a##_l, bias); \ + __m128i abiased_h = _mm_add_epi32(a##_h, bias); \ + dct_wadd(sum, abiased, b); \ + dct_wsub(dif, abiased, b); \ + out0 = _mm_packs_epi32(_mm_srai_epi32(sum_l, s), _mm_srai_epi32(sum_h, s)); \ + out1 = _mm_packs_epi32(_mm_srai_epi32(dif_l, s), _mm_srai_epi32(dif_h, s)); \ + } + + // 8-bit interleave step (for transposes) + #define dct_interleave8(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi8(a, b); \ + b = _mm_unpackhi_epi8(tmp, b) + + // 16-bit interleave step (for transposes) + #define dct_interleave16(a, b) \ + tmp = a; \ + a = _mm_unpacklo_epi16(a, b); \ + b = _mm_unpackhi_epi16(tmp, b) + + #define dct_pass(bias,shift) \ + { \ + /* even part */ \ + dct_rot(t2e,t3e, row2,row6, rot0_0,rot0_1); \ + __m128i sum04 = _mm_add_epi16(row0, row4); \ + __m128i dif04 = _mm_sub_epi16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + dct_rot(y0o,y2o, row7,row3, rot2_0,rot2_1); \ + dct_rot(y1o,y3o, row5,row1, rot3_0,rot3_1); \ + __m128i sum17 = _mm_add_epi16(row1, row7); \ + __m128i sum35 = _mm_add_epi16(row3, row5); \ + dct_rot(y4o,y5o, sum17,sum35, rot1_0,rot1_1); \ + dct_wadd(x4, y0o, y4o); \ + dct_wadd(x5, y1o, y5o); \ + dct_wadd(x6, y2o, y5o); \ + dct_wadd(x7, y3o, y4o); \ + dct_bfly32o(row0,row7, x0,x7,bias,shift); \ + dct_bfly32o(row1,row6, x1,x6,bias,shift); \ + dct_bfly32o(row2,row5, x2,x5,bias,shift); \ + dct_bfly32o(row3,row4, x3,x4,bias,shift); \ + } + + __m128i rot0_0 = dct_const(stbi__f2f(0.5411961f), stbi__f2f(0.5411961f) + stbi__f2f(-1.847759065f)); + __m128i rot0_1 = dct_const(stbi__f2f(0.5411961f) + stbi__f2f( 0.765366865f), stbi__f2f(0.5411961f)); + __m128i rot1_0 = dct_const(stbi__f2f(1.175875602f) + stbi__f2f(-0.899976223f), stbi__f2f(1.175875602f)); + __m128i rot1_1 = dct_const(stbi__f2f(1.175875602f), stbi__f2f(1.175875602f) + stbi__f2f(-2.562915447f)); + __m128i rot2_0 = dct_const(stbi__f2f(-1.961570560f) + stbi__f2f( 0.298631336f), stbi__f2f(-1.961570560f)); + __m128i rot2_1 = dct_const(stbi__f2f(-1.961570560f), stbi__f2f(-1.961570560f) + stbi__f2f( 3.072711026f)); + __m128i rot3_0 = dct_const(stbi__f2f(-0.390180644f) + stbi__f2f( 2.053119869f), stbi__f2f(-0.390180644f)); + __m128i rot3_1 = dct_const(stbi__f2f(-0.390180644f), stbi__f2f(-0.390180644f) + stbi__f2f( 1.501321110f)); + + // rounding biases in column/row passes, see stbi__idct_block for explanation. + __m128i bias_0 = _mm_set1_epi32(512); + __m128i bias_1 = _mm_set1_epi32(65536 + (128<<17)); + + // load + row0 = _mm_load_si128((const __m128i *) (data + 0*8)); + row1 = _mm_load_si128((const __m128i *) (data + 1*8)); + row2 = _mm_load_si128((const __m128i *) (data + 2*8)); + row3 = _mm_load_si128((const __m128i *) (data + 3*8)); + row4 = _mm_load_si128((const __m128i *) (data + 4*8)); + row5 = _mm_load_si128((const __m128i *) (data + 5*8)); + row6 = _mm_load_si128((const __m128i *) (data + 6*8)); + row7 = _mm_load_si128((const __m128i *) (data + 7*8)); + + // column pass + dct_pass(bias_0, 10); + + { + // 16bit 8x8 transpose pass 1 + dct_interleave16(row0, row4); + dct_interleave16(row1, row5); + dct_interleave16(row2, row6); + dct_interleave16(row3, row7); + + // transpose pass 2 + dct_interleave16(row0, row2); + dct_interleave16(row1, row3); + dct_interleave16(row4, row6); + dct_interleave16(row5, row7); + + // transpose pass 3 + dct_interleave16(row0, row1); + dct_interleave16(row2, row3); + dct_interleave16(row4, row5); + dct_interleave16(row6, row7); + } + + // row pass + dct_pass(bias_1, 17); + + { + // pack + __m128i p0 = _mm_packus_epi16(row0, row1); // a0a1a2a3...a7b0b1b2b3...b7 + __m128i p1 = _mm_packus_epi16(row2, row3); + __m128i p2 = _mm_packus_epi16(row4, row5); + __m128i p3 = _mm_packus_epi16(row6, row7); + + // 8bit 8x8 transpose pass 1 + dct_interleave8(p0, p2); // a0e0a1e1... + dct_interleave8(p1, p3); // c0g0c1g1... + + // transpose pass 2 + dct_interleave8(p0, p1); // a0c0e0g0... + dct_interleave8(p2, p3); // b0d0f0h0... + + // transpose pass 3 + dct_interleave8(p0, p2); // a0b0c0d0... + dct_interleave8(p1, p3); // a4b4c4d4... + + // store + _mm_storel_epi64((__m128i *) out, p0); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p0, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p2); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p2, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p1); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p1, 0x4e)); out += out_stride; + _mm_storel_epi64((__m128i *) out, p3); out += out_stride; + _mm_storel_epi64((__m128i *) out, _mm_shuffle_epi32(p3, 0x4e)); + } + +#undef dct_const +#undef dct_rot +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_interleave8 +#undef dct_interleave16 +#undef dct_pass +} + +#endif // STBI_SSE2 + +#ifdef STBI_NEON + +// NEON integer IDCT. should produce bit-identical +// results to the generic C version. +static void stbi__idct_simd(stbi_uc *out, int out_stride, short data[64]) +{ + int16x8_t row0, row1, row2, row3, row4, row5, row6, row7; + + int16x4_t rot0_0 = vdup_n_s16(stbi__f2f(0.5411961f)); + int16x4_t rot0_1 = vdup_n_s16(stbi__f2f(-1.847759065f)); + int16x4_t rot0_2 = vdup_n_s16(stbi__f2f( 0.765366865f)); + int16x4_t rot1_0 = vdup_n_s16(stbi__f2f( 1.175875602f)); + int16x4_t rot1_1 = vdup_n_s16(stbi__f2f(-0.899976223f)); + int16x4_t rot1_2 = vdup_n_s16(stbi__f2f(-2.562915447f)); + int16x4_t rot2_0 = vdup_n_s16(stbi__f2f(-1.961570560f)); + int16x4_t rot2_1 = vdup_n_s16(stbi__f2f(-0.390180644f)); + int16x4_t rot3_0 = vdup_n_s16(stbi__f2f( 0.298631336f)); + int16x4_t rot3_1 = vdup_n_s16(stbi__f2f( 2.053119869f)); + int16x4_t rot3_2 = vdup_n_s16(stbi__f2f( 3.072711026f)); + int16x4_t rot3_3 = vdup_n_s16(stbi__f2f( 1.501321110f)); + +#define dct_long_mul(out, inq, coeff) \ + int32x4_t out##_l = vmull_s16(vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmull_s16(vget_high_s16(inq), coeff) + +#define dct_long_mac(out, acc, inq, coeff) \ + int32x4_t out##_l = vmlal_s16(acc##_l, vget_low_s16(inq), coeff); \ + int32x4_t out##_h = vmlal_s16(acc##_h, vget_high_s16(inq), coeff) + +#define dct_widen(out, inq) \ + int32x4_t out##_l = vshll_n_s16(vget_low_s16(inq), 12); \ + int32x4_t out##_h = vshll_n_s16(vget_high_s16(inq), 12) + +// wide add +#define dct_wadd(out, a, b) \ + int32x4_t out##_l = vaddq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vaddq_s32(a##_h, b##_h) + +// wide sub +#define dct_wsub(out, a, b) \ + int32x4_t out##_l = vsubq_s32(a##_l, b##_l); \ + int32x4_t out##_h = vsubq_s32(a##_h, b##_h) + +// butterfly a/b, then shift using "shiftop" by "s" and pack +#define dct_bfly32o(out0,out1, a,b,shiftop,s) \ + { \ + dct_wadd(sum, a, b); \ + dct_wsub(dif, a, b); \ + out0 = vcombine_s16(shiftop(sum_l, s), shiftop(sum_h, s)); \ + out1 = vcombine_s16(shiftop(dif_l, s), shiftop(dif_h, s)); \ + } + +#define dct_pass(shiftop, shift) \ + { \ + /* even part */ \ + int16x8_t sum26 = vaddq_s16(row2, row6); \ + dct_long_mul(p1e, sum26, rot0_0); \ + dct_long_mac(t2e, p1e, row6, rot0_1); \ + dct_long_mac(t3e, p1e, row2, rot0_2); \ + int16x8_t sum04 = vaddq_s16(row0, row4); \ + int16x8_t dif04 = vsubq_s16(row0, row4); \ + dct_widen(t0e, sum04); \ + dct_widen(t1e, dif04); \ + dct_wadd(x0, t0e, t3e); \ + dct_wsub(x3, t0e, t3e); \ + dct_wadd(x1, t1e, t2e); \ + dct_wsub(x2, t1e, t2e); \ + /* odd part */ \ + int16x8_t sum15 = vaddq_s16(row1, row5); \ + int16x8_t sum17 = vaddq_s16(row1, row7); \ + int16x8_t sum35 = vaddq_s16(row3, row5); \ + int16x8_t sum37 = vaddq_s16(row3, row7); \ + int16x8_t sumodd = vaddq_s16(sum17, sum35); \ + dct_long_mul(p5o, sumodd, rot1_0); \ + dct_long_mac(p1o, p5o, sum17, rot1_1); \ + dct_long_mac(p2o, p5o, sum35, rot1_2); \ + dct_long_mul(p3o, sum37, rot2_0); \ + dct_long_mul(p4o, sum15, rot2_1); \ + dct_wadd(sump13o, p1o, p3o); \ + dct_wadd(sump24o, p2o, p4o); \ + dct_wadd(sump23o, p2o, p3o); \ + dct_wadd(sump14o, p1o, p4o); \ + dct_long_mac(x4, sump13o, row7, rot3_0); \ + dct_long_mac(x5, sump24o, row5, rot3_1); \ + dct_long_mac(x6, sump23o, row3, rot3_2); \ + dct_long_mac(x7, sump14o, row1, rot3_3); \ + dct_bfly32o(row0,row7, x0,x7,shiftop,shift); \ + dct_bfly32o(row1,row6, x1,x6,shiftop,shift); \ + dct_bfly32o(row2,row5, x2,x5,shiftop,shift); \ + dct_bfly32o(row3,row4, x3,x4,shiftop,shift); \ + } + + // load + row0 = vld1q_s16(data + 0*8); + row1 = vld1q_s16(data + 1*8); + row2 = vld1q_s16(data + 2*8); + row3 = vld1q_s16(data + 3*8); + row4 = vld1q_s16(data + 4*8); + row5 = vld1q_s16(data + 5*8); + row6 = vld1q_s16(data + 6*8); + row7 = vld1q_s16(data + 7*8); + + // add DC bias + row0 = vaddq_s16(row0, vsetq_lane_s16(1024, vdupq_n_s16(0), 0)); + + // column pass + dct_pass(vrshrn_n_s32, 10); + + // 16bit 8x8 transpose + { +// these three map to a single VTRN.16, VTRN.32, and VSWP, respectively. +// whether compilers actually get this is another story, sadly. +#define dct_trn16(x, y) { int16x8x2_t t = vtrnq_s16(x, y); x = t.val[0]; y = t.val[1]; } +#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]); } +#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)); } + + // pass 1 + dct_trn16(row0, row1); // a0b0a2b2a4b4a6b6 + dct_trn16(row2, row3); + dct_trn16(row4, row5); + dct_trn16(row6, row7); + + // pass 2 + dct_trn32(row0, row2); // a0b0c0d0a4b4c4d4 + dct_trn32(row1, row3); + dct_trn32(row4, row6); + dct_trn32(row5, row7); + + // pass 3 + dct_trn64(row0, row4); // a0b0c0d0e0f0g0h0 + dct_trn64(row1, row5); + dct_trn64(row2, row6); + dct_trn64(row3, row7); + +#undef dct_trn16 +#undef dct_trn32 +#undef dct_trn64 + } + + // row pass + // vrshrn_n_s32 only supports shifts up to 16, we need + // 17. so do a non-rounding shift of 16 first then follow + // up with a rounding shift by 1. + dct_pass(vshrn_n_s32, 16); + + { + // pack and round + uint8x8_t p0 = vqrshrun_n_s16(row0, 1); + uint8x8_t p1 = vqrshrun_n_s16(row1, 1); + uint8x8_t p2 = vqrshrun_n_s16(row2, 1); + uint8x8_t p3 = vqrshrun_n_s16(row3, 1); + uint8x8_t p4 = vqrshrun_n_s16(row4, 1); + uint8x8_t p5 = vqrshrun_n_s16(row5, 1); + uint8x8_t p6 = vqrshrun_n_s16(row6, 1); + uint8x8_t p7 = vqrshrun_n_s16(row7, 1); + + // again, these can translate into one instruction, but often don't. +#define dct_trn8_8(x, y) { uint8x8x2_t t = vtrn_u8(x, y); x = t.val[0]; y = t.val[1]; } +#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]); } +#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]); } + + // sadly can't use interleaved stores here since we only write + // 8 bytes to each scan line! + + // 8x8 8-bit transpose pass 1 + dct_trn8_8(p0, p1); + dct_trn8_8(p2, p3); + dct_trn8_8(p4, p5); + dct_trn8_8(p6, p7); + + // pass 2 + dct_trn8_16(p0, p2); + dct_trn8_16(p1, p3); + dct_trn8_16(p4, p6); + dct_trn8_16(p5, p7); + + // pass 3 + dct_trn8_32(p0, p4); + dct_trn8_32(p1, p5); + dct_trn8_32(p2, p6); + dct_trn8_32(p3, p7); + + // store + vst1_u8(out, p0); out += out_stride; + vst1_u8(out, p1); out += out_stride; + vst1_u8(out, p2); out += out_stride; + vst1_u8(out, p3); out += out_stride; + vst1_u8(out, p4); out += out_stride; + vst1_u8(out, p5); out += out_stride; + vst1_u8(out, p6); out += out_stride; + vst1_u8(out, p7); + +#undef dct_trn8_8 +#undef dct_trn8_16 +#undef dct_trn8_32 + } + +#undef dct_long_mul +#undef dct_long_mac +#undef dct_widen +#undef dct_wadd +#undef dct_wsub +#undef dct_bfly32o +#undef dct_pass +} + +#endif // STBI_NEON + +#define STBI__MARKER_none 0xff +// if there's a pending marker from the entropy stream, return that +// otherwise, fetch from the stream and get a marker. if there's no +// marker, return 0xff, which is never a valid marker value +static stbi_uc stbi__get_marker(stbi__jpeg *j) +{ + stbi_uc x; + if (j->marker != STBI__MARKER_none) { x = j->marker; j->marker = STBI__MARKER_none; return x; } + x = stbi__get8(j->s); + if (x != 0xff) return STBI__MARKER_none; + while (x == 0xff) + x = stbi__get8(j->s); + return x; +} + +// in each scan, we'll have scan_n components, and the order +// of the components is specified by order[] +#define STBI__RESTART(x) ((x) >= 0xd0 && (x) <= 0xd7) + +// after a restart interval, stbi__jpeg_reset the entropy decoder and +// the dc prediction +static void stbi__jpeg_reset(stbi__jpeg *j) +{ + j->code_bits = 0; + j->code_buffer = 0; + j->nomore = 0; + j->img_comp[0].dc_pred = j->img_comp[1].dc_pred = j->img_comp[2].dc_pred = 0; + j->marker = STBI__MARKER_none; + j->todo = j->restart_interval ? j->restart_interval : 0x7fffffff; + j->eob_run = 0; + // no more than 1<<31 MCUs if no restart_interal? that's plenty safe, + // since we don't even allow 1<<30 pixels +} + +static int stbi__parse_entropy_coded_data(stbi__jpeg *z) +{ + stbi__jpeg_reset(z); + if (!z->progressive) { + if (z->scan_n == 1) { + int i,j; + STBI_SIMD_ALIGN(short, data[64]); + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + int ha = z->img_comp[n].ha; + if (!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; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + // if it's NOT a restart, then just bail, so we get corrupt data + // rather than no data + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + STBI_SIMD_ALIGN(short, data[64]); + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x)*8; + int y2 = (j*z->img_comp[n].v + y)*8; + int ha = z->img_comp[n].ha; + if (!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; + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*y2+x2, z->img_comp[n].w2, data); + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } else { + if (z->scan_n == 1) { + int i,j; + int n = z->order[0]; + // non-interleaved data, we just need to process one block at a time, + // in trivial scanline order + // number of blocks to do just depends on how many actual "pixels" this + // component has, independent of interleaved MCU blocking and such + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + if (z->spec_start == 0) { + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } else { + int ha = z->img_comp[n].ha; + if (!stbi__jpeg_decode_block_prog_ac(z, data, &z->huff_ac[ha], z->fast_ac[ha])) + return 0; + } + // every data block is an MCU, so countdown the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } else { // interleaved + int i,j,k,x,y; + for (j=0; j < z->img_mcu_y; ++j) { + for (i=0; i < z->img_mcu_x; ++i) { + // scan an interleaved mcu... process scan_n components in order + for (k=0; k < z->scan_n; ++k) { + int n = z->order[k]; + // scan out an mcu's worth of this component; that's just determined + // by the basic H and V specified for the component + for (y=0; y < z->img_comp[n].v; ++y) { + for (x=0; x < z->img_comp[n].h; ++x) { + int x2 = (i*z->img_comp[n].h + x); + int y2 = (j*z->img_comp[n].v + y); + short *data = z->img_comp[n].coeff + 64 * (x2 + y2 * z->img_comp[n].coeff_w); + if (!stbi__jpeg_decode_block_prog_dc(z, data, &z->huff_dc[z->img_comp[n].hd], n)) + return 0; + } + } + } + // after all interleaved components, that's an interleaved MCU, + // so now count down the restart interval + if (--z->todo <= 0) { + if (z->code_bits < 24) stbi__grow_buffer_unsafe(z); + if (!STBI__RESTART(z->marker)) return 1; + stbi__jpeg_reset(z); + } + } + } + return 1; + } + } +} + +static void stbi__jpeg_dequantize(short *data, stbi_uc *dequant) +{ + int i; + for (i=0; i < 64; ++i) + data[i] *= dequant[i]; +} + +static void stbi__jpeg_finish(stbi__jpeg *z) +{ + if (z->progressive) { + // dequantize and idct the data + int i,j,n; + for (n=0; n < z->s->img_n; ++n) { + int w = (z->img_comp[n].x+7) >> 3; + int h = (z->img_comp[n].y+7) >> 3; + for (j=0; j < h; ++j) { + for (i=0; i < w; ++i) { + short *data = z->img_comp[n].coeff + 64 * (i + j * z->img_comp[n].coeff_w); + stbi__jpeg_dequantize(data, z->dequant[z->img_comp[n].tq]); + z->idct_block_kernel(z->img_comp[n].data+z->img_comp[n].w2*j*8+i*8, z->img_comp[n].w2, data); + } + } + } + } +} + +static int stbi__process_marker(stbi__jpeg *z, int m) +{ + int L; + switch (m) { + case STBI__MARKER_none: // no marker found + return stbi__err("expected marker","Corrupt JPEG"); + + case 0xDD: // DRI - specify restart interval + if (stbi__get16be(z->s) != 4) return stbi__err("bad DRI len","Corrupt JPEG"); + z->restart_interval = stbi__get16be(z->s); + return 1; + + case 0xDB: // DQT - define quantization table + L = stbi__get16be(z->s)-2; + while (L > 0) { + int q = stbi__get8(z->s); + int p = q >> 4; + int t = q & 15,i; + if (p != 0) return stbi__err("bad DQT type","Corrupt JPEG"); + if (t > 3) return stbi__err("bad DQT table","Corrupt JPEG"); + for (i=0; i < 64; ++i) + z->dequant[t][stbi__jpeg_dezigzag[i]] = stbi__get8(z->s); + L -= 65; + } + return L==0; + + case 0xC4: // DHT - define huffman table + L = stbi__get16be(z->s)-2; + while (L > 0) { + stbi_uc *v; + int sizes[16],i,n=0; + int q = stbi__get8(z->s); + int tc = q >> 4; + int th = q & 15; + if (tc > 1 || th > 3) return stbi__err("bad DHT header","Corrupt JPEG"); + for (i=0; i < 16; ++i) { + sizes[i] = stbi__get8(z->s); + n += sizes[i]; + } + L -= 17; + if (tc == 0) { + if (!stbi__build_huffman(z->huff_dc+th, sizes)) return 0; + v = z->huff_dc[th].values; + } else { + if (!stbi__build_huffman(z->huff_ac+th, sizes)) return 0; + v = z->huff_ac[th].values; + } + for (i=0; i < n; ++i) + v[i] = stbi__get8(z->s); + if (tc != 0) + stbi__build_fast_ac(z->fast_ac[th], z->huff_ac + th); + L -= n; + } + return L==0; + } + // check for comment block or APP blocks + if ((m >= 0xE0 && m <= 0xEF) || m == 0xFE) { + stbi__skip(z->s, stbi__get16be(z->s)-2); + return 1; + } + return 0; +} + +// after we see SOS +static int stbi__process_scan_header(stbi__jpeg *z) +{ + int i; + int Ls = stbi__get16be(z->s); + z->scan_n = stbi__get8(z->s); + if (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"); + if (Ls != 6+2*z->scan_n) return stbi__err("bad SOS len","Corrupt JPEG"); + for (i=0; i < z->scan_n; ++i) { + int id = stbi__get8(z->s), which; + int q = stbi__get8(z->s); + for (which = 0; which < z->s->img_n; ++which) + if (z->img_comp[which].id == id) + break; + if (which == z->s->img_n) return 0; // no match + z->img_comp[which].hd = q >> 4; if (z->img_comp[which].hd > 3) return stbi__err("bad DC huff","Corrupt JPEG"); + z->img_comp[which].ha = q & 15; if (z->img_comp[which].ha > 3) return stbi__err("bad AC huff","Corrupt JPEG"); + z->order[i] = which; + } + + { + int aa; + z->spec_start = stbi__get8(z->s); + z->spec_end = stbi__get8(z->s); // should be 63, but might be 0 + aa = stbi__get8(z->s); + z->succ_high = (aa >> 4); + z->succ_low = (aa & 15); + if (z->progressive) { + if (z->spec_start > 63 || z->spec_end > 63 || z->spec_start > z->spec_end || z->succ_high > 13 || z->succ_low > 13) + return stbi__err("bad SOS", "Corrupt JPEG"); + } else { + if (z->spec_start != 0) return stbi__err("bad SOS","Corrupt JPEG"); + if (z->succ_high != 0 || z->succ_low != 0) return stbi__err("bad SOS","Corrupt JPEG"); + z->spec_end = 63; + } + } + + return 1; +} + +static int stbi__process_frame_header(stbi__jpeg *z, int scan) +{ + stbi__context *s = z->s; + int Lf,p,i,q, h_max=1,v_max=1,c; + Lf = stbi__get16be(s); if (Lf < 11) return stbi__err("bad SOF len","Corrupt JPEG"); // JPEG + p = stbi__get8(s); if (p != 8) return stbi__err("only 8-bit","JPEG format not supported: 8-bit only"); // JPEG baseline + s->img_y = stbi__get16be(s); if (s->img_y == 0) return stbi__err("no header height", "JPEG format not supported: delayed height"); // Legal, but we don't handle it--but neither does IJG + s->img_x = stbi__get16be(s); if (s->img_x == 0) return stbi__err("0 width","Corrupt JPEG"); // JPEG requires + c = stbi__get8(s); + if (c != 3 && c != 1) return stbi__err("bad component count","Corrupt JPEG"); // JFIF requires + s->img_n = c; + for (i=0; i < c; ++i) { + z->img_comp[i].data = NULL; + z->img_comp[i].linebuf = NULL; + } + + if (Lf != 8+3*s->img_n) return stbi__err("bad SOF len","Corrupt JPEG"); + + z->rgb = 0; + for (i=0; i < s->img_n; ++i) { + static unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (z->img_comp[i].id != i+1) // JFIF requires + if (z->img_comp[i].id != i) { // some version of jpegtran outputs non-JFIF-compliant files! + // somethings output this (see http://fileformats.archiveteam.org/wiki/JPEG#Color_format) + if (z->img_comp[i].id != rgb[i]) + return stbi__err("bad component ID","Corrupt JPEG"); + ++z->rgb; + } + q = stbi__get8(s); + z->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"); + z->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"); + z->img_comp[i].tq = stbi__get8(s); if (z->img_comp[i].tq > 3) return stbi__err("bad TQ","Corrupt JPEG"); + } + + if (scan != STBI__SCAN_load) return 1; + + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + + for (i=0; i < s->img_n; ++i) { + if (z->img_comp[i].h > h_max) h_max = z->img_comp[i].h; + if (z->img_comp[i].v > v_max) v_max = z->img_comp[i].v; + } + + // compute interleaved mcu info + z->img_h_max = h_max; + z->img_v_max = v_max; + z->img_mcu_w = h_max * 8; + z->img_mcu_h = v_max * 8; + z->img_mcu_x = (s->img_x + z->img_mcu_w-1) / z->img_mcu_w; + z->img_mcu_y = (s->img_y + z->img_mcu_h-1) / z->img_mcu_h; + + for (i=0; i < s->img_n; ++i) { + // number of effective pixels (e.g. for non-interleaved MCU) + z->img_comp[i].x = (s->img_x * z->img_comp[i].h + h_max-1) / h_max; + z->img_comp[i].y = (s->img_y * z->img_comp[i].v + v_max-1) / v_max; + // to simplify generation, we'll allocate enough memory to decode + // the bogus oversized data from using interleaved MCUs and their + // big blocks (e.g. a 16x16 iMCU on an image of width 33); we won't + // discard the extra data until colorspace conversion + z->img_comp[i].w2 = z->img_mcu_x * z->img_comp[i].h * 8; + z->img_comp[i].h2 = z->img_mcu_y * z->img_comp[i].v * 8; + z->img_comp[i].raw_data = stbi__malloc(z->img_comp[i].w2 * z->img_comp[i].h2+15); + + if (z->img_comp[i].raw_data == NULL) { + for(--i; i >= 0; --i) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + } + return stbi__err("outofmem", "Out of memory"); + } + // align blocks for idct using mmx/sse + z->img_comp[i].data = (stbi_uc*) (((size_t) z->img_comp[i].raw_data + 15) & ~15); + z->img_comp[i].linebuf = NULL; + if (z->progressive) { + z->img_comp[i].coeff_w = (z->img_comp[i].w2 + 7) >> 3; + z->img_comp[i].coeff_h = (z->img_comp[i].h2 + 7) >> 3; + z->img_comp[i].raw_coeff = STBI_MALLOC(z->img_comp[i].coeff_w * z->img_comp[i].coeff_h * 64 * sizeof(short) + 15); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } else { + z->img_comp[i].coeff = 0; + z->img_comp[i].raw_coeff = 0; + } + } + + return 1; +} + +// use comparisons since in some cases we handle more than one case (e.g. SOF) +#define stbi__DNL(x) ((x) == 0xdc) +#define stbi__SOI(x) ((x) == 0xd8) +#define stbi__EOI(x) ((x) == 0xd9) +#define stbi__SOF(x) ((x) == 0xc0 || (x) == 0xc1 || (x) == 0xc2) +#define stbi__SOS(x) ((x) == 0xda) + +#define stbi__SOF_progressive(x) ((x) == 0xc2) + +static int stbi__decode_jpeg_header(stbi__jpeg *z, int scan) +{ + int m; + z->marker = STBI__MARKER_none; // initialize cached marker to empty + m = stbi__get_marker(z); + if (!stbi__SOI(m)) return stbi__err("no SOI","Corrupt JPEG"); + if (scan == STBI__SCAN_type) return 1; + m = stbi__get_marker(z); + while (!stbi__SOF(m)) { + if (!stbi__process_marker(z,m)) return 0; + m = stbi__get_marker(z); + while (m == STBI__MARKER_none) { + // some files have extra padding after their blocks, so ok, we'll scan + if (stbi__at_eof(z->s)) return stbi__err("no SOF", "Corrupt JPEG"); + m = stbi__get_marker(z); + } + } + z->progressive = stbi__SOF_progressive(m); + if (!stbi__process_frame_header(z, scan)) return 0; + return 1; +} + +// decode image to YCbCr format +static int stbi__decode_jpeg_image(stbi__jpeg *j) +{ + int m; + for (m = 0; m < 4; m++) { + j->img_comp[m].raw_data = NULL; + j->img_comp[m].raw_coeff = NULL; + } + j->restart_interval = 0; + if (!stbi__decode_jpeg_header(j, STBI__SCAN_load)) return 0; + m = stbi__get_marker(j); + while (!stbi__EOI(m)) { + if (stbi__SOS(m)) { + if (!stbi__process_scan_header(j)) return 0; + if (!stbi__parse_entropy_coded_data(j)) return 0; + if (j->marker == STBI__MARKER_none ) { + // handle 0s at the end of image data from IP Kamera 9060 + while (!stbi__at_eof(j->s)) { + int x = stbi__get8(j->s); + if (x == 255) { + j->marker = stbi__get8(j->s); + break; + } else if (x != 0) { + return stbi__err("junk before marker", "Corrupt JPEG"); + } + } + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + } else { + if (!stbi__process_marker(j, m)) return 0; + } + m = stbi__get_marker(j); + } + if (j->progressive) + stbi__jpeg_finish(j); + return 1; +} + +// static jfif-centered resampling (across block boundaries) + +typedef stbi_uc *(*resample_row_func)(stbi_uc *out, stbi_uc *in0, stbi_uc *in1, + int w, int hs); + +#define stbi__div4(x) ((stbi_uc) ((x) >> 2)) + +static stbi_uc *resample_row_1(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + STBI_NOTUSED(out); + STBI_NOTUSED(in_far); + STBI_NOTUSED(w); + STBI_NOTUSED(hs); + return in_near; +} + +static stbi_uc* stbi__resample_row_v_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples vertically for every one in input + int i; + STBI_NOTUSED(hs); + for (i=0; i < w; ++i) + out[i] = stbi__div4(3*in_near[i] + in_far[i] + 2); + return out; +} + +static stbi_uc* stbi__resample_row_h_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate two samples horizontally for every one in input + int i; + stbi_uc *input = in_near; + + if (w == 1) { + // if only one sample, can't do any interpolation + out[0] = out[1] = input[0]; + return out; + } + + out[0] = input[0]; + out[1] = stbi__div4(input[0]*3 + input[1] + 2); + for (i=1; i < w-1; ++i) { + int n = 3*input[i]+2; + out[i*2+0] = stbi__div4(n+input[i-1]); + out[i*2+1] = stbi__div4(n+input[i+1]); + } + out[i*2+0] = stbi__div4(input[w-2]*3 + input[w-1] + 2); + out[i*2+1] = input[w-1]; + + STBI_NOTUSED(in_far); + STBI_NOTUSED(hs); + + return out; +} + +#define stbi__div16(x) ((stbi_uc) ((x) >> 4)) + +static stbi_uc *stbi__resample_row_hv_2(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i,t0,t1; + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + out[0] = stbi__div4(t1+2); + for (i=1; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static stbi_uc *stbi__resample_row_hv_2_simd(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // need to generate 2x2 samples for every one in input + int i=0,t0,t1; + + if (w == 1) { + out[0] = out[1] = stbi__div4(3*in_near[0] + in_far[0] + 2); + return out; + } + + t1 = 3*in_near[0] + in_far[0]; + // process groups of 8 pixels for as long as we can. + // note we can't handle the last pixel in a row in this loop + // because we need to handle the filter boundary conditions. + for (; i < ((w-1) & ~7); i += 8) { +#if defined(STBI_SSE2) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + __m128i zero = _mm_setzero_si128(); + __m128i farb = _mm_loadl_epi64((__m128i *) (in_far + i)); + __m128i nearb = _mm_loadl_epi64((__m128i *) (in_near + i)); + __m128i farw = _mm_unpacklo_epi8(farb, zero); + __m128i nearw = _mm_unpacklo_epi8(nearb, zero); + __m128i diff = _mm_sub_epi16(farw, nearw); + __m128i nears = _mm_slli_epi16(nearw, 2); + __m128i curr = _mm_add_epi16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + __m128i prv0 = _mm_slli_si128(curr, 2); + __m128i nxt0 = _mm_srli_si128(curr, 2); + __m128i prev = _mm_insert_epi16(prv0, t1, 0); + __m128i next = _mm_insert_epi16(nxt0, 3*in_near[i+8] + in_far[i+8], 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + __m128i bias = _mm_set1_epi16(8); + __m128i curs = _mm_slli_epi16(curr, 2); + __m128i prvd = _mm_sub_epi16(prev, curr); + __m128i nxtd = _mm_sub_epi16(next, curr); + __m128i curb = _mm_add_epi16(curs, bias); + __m128i even = _mm_add_epi16(prvd, curb); + __m128i odd = _mm_add_epi16(nxtd, curb); + + // interleave even and odd pixels, then undo scaling. + __m128i int0 = _mm_unpacklo_epi16(even, odd); + __m128i int1 = _mm_unpackhi_epi16(even, odd); + __m128i de0 = _mm_srli_epi16(int0, 4); + __m128i de1 = _mm_srli_epi16(int1, 4); + + // pack and write output + __m128i outv = _mm_packus_epi16(de0, de1); + _mm_storeu_si128((__m128i *) (out + i*2), outv); +#elif defined(STBI_NEON) + // load and perform the vertical filtering pass + // this uses 3*x + y = 4*x + (y - x) + uint8x8_t farb = vld1_u8(in_far + i); + uint8x8_t nearb = vld1_u8(in_near + i); + int16x8_t diff = vreinterpretq_s16_u16(vsubl_u8(farb, nearb)); + int16x8_t nears = vreinterpretq_s16_u16(vshll_n_u8(nearb, 2)); + int16x8_t curr = vaddq_s16(nears, diff); // current row + + // horizontal filter works the same based on shifted vers of current + // row. "prev" is current row shifted right by 1 pixel; we need to + // insert the previous pixel value (from t1). + // "next" is current row shifted left by 1 pixel, with first pixel + // of next block of 8 pixels added in. + int16x8_t prv0 = vextq_s16(curr, curr, 7); + int16x8_t nxt0 = vextq_s16(curr, curr, 1); + int16x8_t prev = vsetq_lane_s16(t1, prv0, 0); + int16x8_t next = vsetq_lane_s16(3*in_near[i+8] + in_far[i+8], nxt0, 7); + + // horizontal filter, polyphase implementation since it's convenient: + // even pixels = 3*cur + prev = cur*4 + (prev - cur) + // odd pixels = 3*cur + next = cur*4 + (next - cur) + // note the shared term. + int16x8_t curs = vshlq_n_s16(curr, 2); + int16x8_t prvd = vsubq_s16(prev, curr); + int16x8_t nxtd = vsubq_s16(next, curr); + int16x8_t even = vaddq_s16(curs, prvd); + int16x8_t odd = vaddq_s16(curs, nxtd); + + // undo scaling and round, then store with even/odd phases interleaved + uint8x8x2_t o; + o.val[0] = vqrshrun_n_s16(even, 4); + o.val[1] = vqrshrun_n_s16(odd, 4); + vst2_u8(out + i*2, o); +#endif + + // "previous" value for next iter + t1 = 3*in_near[i+7] + in_far[i+7]; + } + + t0 = t1; + t1 = 3*in_near[i] + in_far[i]; + out[i*2] = stbi__div16(3*t1 + t0 + 8); + + for (++i; i < w; ++i) { + t0 = t1; + t1 = 3*in_near[i]+in_far[i]; + out[i*2-1] = stbi__div16(3*t0 + t1 + 8); + out[i*2 ] = stbi__div16(3*t1 + t0 + 8); + } + out[w*2-1] = stbi__div4(t1+2); + + STBI_NOTUSED(hs); + + return out; +} +#endif + +static stbi_uc *stbi__resample_row_generic(stbi_uc *out, stbi_uc *in_near, stbi_uc *in_far, int w, int hs) +{ + // resample with nearest-neighbor + int i,j; + STBI_NOTUSED(in_far); + for (i=0; i < w; ++i) + for (j=0; j < hs; ++j) + out[i*hs+j] = in_near[i]; + return out; +} + +#ifdef STBI_JPEG_OLD +// this is the same YCbCr-to-RGB calculation that stb_image has used +// historically before the algorithm changes in 1.49 +#define float2fixed(x) ((int) ((x) * 65536 + 0.5)) +static 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) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 16) + 32768; // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr*float2fixed(1.40200f); + g = y_fixed - cr*float2fixed(0.71414f) - cb*float2fixed(0.34414f); + b = y_fixed + cb*float2fixed(1.77200f); + r >>= 16; + g >>= 16; + b >>= 16; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#else +// this is a reduced-precision calculation of YCbCr-to-RGB introduced +// to make sure the code produces the same results in both SIMD and scalar +#define float2fixed(x) (((int) ((x) * 4096.0f + 0.5f)) << 8) +static 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) +{ + int i; + for (i=0; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* float2fixed(1.40200f); + g = y_fixed + (cr*-float2fixed(0.71414f)) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +#if defined(STBI_SSE2) || defined(STBI_NEON) +static 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) +{ + int i = 0; + +#ifdef STBI_SSE2 + // step == 3 is pretty ugly on the final interleave, and i'm not convinced + // it's useful in practice (you wouldn't use it for textures, for example). + // so just accelerate step == 4 case. + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + __m128i signflip = _mm_set1_epi8(-0x80); + __m128i cr_const0 = _mm_set1_epi16( (short) ( 1.40200f*4096.0f+0.5f)); + __m128i cr_const1 = _mm_set1_epi16( - (short) ( 0.71414f*4096.0f+0.5f)); + __m128i cb_const0 = _mm_set1_epi16( - (short) ( 0.34414f*4096.0f+0.5f)); + __m128i cb_const1 = _mm_set1_epi16( (short) ( 1.77200f*4096.0f+0.5f)); + __m128i y_bias = _mm_set1_epi8((char) (unsigned char) 128); + __m128i xw = _mm_set1_epi16(255); // alpha channel + + for (; i+7 < count; i += 8) { + // load + __m128i y_bytes = _mm_loadl_epi64((__m128i *) (y+i)); + __m128i cr_bytes = _mm_loadl_epi64((__m128i *) (pcr+i)); + __m128i cb_bytes = _mm_loadl_epi64((__m128i *) (pcb+i)); + __m128i cr_biased = _mm_xor_si128(cr_bytes, signflip); // -128 + __m128i cb_biased = _mm_xor_si128(cb_bytes, signflip); // -128 + + // unpack to short (and left-shift cr, cb by 8) + __m128i yw = _mm_unpacklo_epi8(y_bias, y_bytes); + __m128i crw = _mm_unpacklo_epi8(_mm_setzero_si128(), cr_biased); + __m128i cbw = _mm_unpacklo_epi8(_mm_setzero_si128(), cb_biased); + + // color transform + __m128i yws = _mm_srli_epi16(yw, 4); + __m128i cr0 = _mm_mulhi_epi16(cr_const0, crw); + __m128i cb0 = _mm_mulhi_epi16(cb_const0, cbw); + __m128i cb1 = _mm_mulhi_epi16(cbw, cb_const1); + __m128i cr1 = _mm_mulhi_epi16(crw, cr_const1); + __m128i rws = _mm_add_epi16(cr0, yws); + __m128i gwt = _mm_add_epi16(cb0, yws); + __m128i bws = _mm_add_epi16(yws, cb1); + __m128i gws = _mm_add_epi16(gwt, cr1); + + // descale + __m128i rw = _mm_srai_epi16(rws, 4); + __m128i bw = _mm_srai_epi16(bws, 4); + __m128i gw = _mm_srai_epi16(gws, 4); + + // back to byte, set up for transpose + __m128i brb = _mm_packus_epi16(rw, bw); + __m128i gxb = _mm_packus_epi16(gw, xw); + + // transpose to interleave channels + __m128i t0 = _mm_unpacklo_epi8(brb, gxb); + __m128i t1 = _mm_unpackhi_epi8(brb, gxb); + __m128i o0 = _mm_unpacklo_epi16(t0, t1); + __m128i o1 = _mm_unpackhi_epi16(t0, t1); + + // store + _mm_storeu_si128((__m128i *) (out + 0), o0); + _mm_storeu_si128((__m128i *) (out + 16), o1); + out += 32; + } + } +#endif + +#ifdef STBI_NEON + // in this version, step=3 support would be easy to add. but is there demand? + if (step == 4) { + // this is a fairly straightforward implementation and not super-optimized. + uint8x8_t signflip = vdup_n_u8(0x80); + int16x8_t cr_const0 = vdupq_n_s16( (short) ( 1.40200f*4096.0f+0.5f)); + int16x8_t cr_const1 = vdupq_n_s16( - (short) ( 0.71414f*4096.0f+0.5f)); + int16x8_t cb_const0 = vdupq_n_s16( - (short) ( 0.34414f*4096.0f+0.5f)); + int16x8_t cb_const1 = vdupq_n_s16( (short) ( 1.77200f*4096.0f+0.5f)); + + for (; i+7 < count; i += 8) { + // load + uint8x8_t y_bytes = vld1_u8(y + i); + uint8x8_t cr_bytes = vld1_u8(pcr + i); + uint8x8_t cb_bytes = vld1_u8(pcb + i); + int8x8_t cr_biased = vreinterpret_s8_u8(vsub_u8(cr_bytes, signflip)); + int8x8_t cb_biased = vreinterpret_s8_u8(vsub_u8(cb_bytes, signflip)); + + // expand to s16 + int16x8_t yws = vreinterpretq_s16_u16(vshll_n_u8(y_bytes, 4)); + int16x8_t crw = vshll_n_s8(cr_biased, 7); + int16x8_t cbw = vshll_n_s8(cb_biased, 7); + + // color transform + int16x8_t cr0 = vqdmulhq_s16(crw, cr_const0); + int16x8_t cb0 = vqdmulhq_s16(cbw, cb_const0); + int16x8_t cr1 = vqdmulhq_s16(crw, cr_const1); + int16x8_t cb1 = vqdmulhq_s16(cbw, cb_const1); + int16x8_t rws = vaddq_s16(yws, cr0); + int16x8_t gws = vaddq_s16(vaddq_s16(yws, cb0), cr1); + int16x8_t bws = vaddq_s16(yws, cb1); + + // undo scaling, round, convert to byte + uint8x8x4_t o; + o.val[0] = vqrshrun_n_s16(rws, 4); + o.val[1] = vqrshrun_n_s16(gws, 4); + o.val[2] = vqrshrun_n_s16(bws, 4); + o.val[3] = vdup_n_u8(255); + + // store, interleaving r/g/b/a + vst4_u8(out, o); + out += 8*4; + } + } +#endif + + for (; i < count; ++i) { + int y_fixed = (y[i] << 20) + (1<<19); // rounding + int r,g,b; + int cr = pcr[i] - 128; + int cb = pcb[i] - 128; + r = y_fixed + cr* float2fixed(1.40200f); + g = y_fixed + cr*-float2fixed(0.71414f) + ((cb*-float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* float2fixed(1.77200f); + r >>= 20; + g >>= 20; + b >>= 20; + if ((unsigned) r > 255) { if (r < 0) r = 0; else r = 255; } + if ((unsigned) g > 255) { if (g < 0) g = 0; else g = 255; } + if ((unsigned) b > 255) { if (b < 0) b = 0; else b = 255; } + out[0] = (stbi_uc)r; + out[1] = (stbi_uc)g; + out[2] = (stbi_uc)b; + out[3] = 255; + out += step; + } +} +#endif + +// set up the kernels +static void stbi__setup_jpeg(stbi__jpeg *j) +{ + j->idct_block_kernel = stbi__idct_block; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_row; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2; + +#ifdef STBI_SSE2 + if (stbi__sse2_available()) { + j->idct_block_kernel = stbi__idct_simd; + #ifndef STBI_JPEG_OLD + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + #endif + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + #ifndef STBI_JPEG_OLD + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + #endif + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; +#endif +} + +// clean up the temporary component buffers +static void stbi__cleanup_jpeg(stbi__jpeg *j) +{ + int i; + for (i=0; i < j->s->img_n; ++i) { + if (j->img_comp[i].raw_data) { + STBI_FREE(j->img_comp[i].raw_data); + j->img_comp[i].raw_data = NULL; + j->img_comp[i].data = NULL; + } + if (j->img_comp[i].raw_coeff) { + STBI_FREE(j->img_comp[i].raw_coeff); + j->img_comp[i].raw_coeff = 0; + j->img_comp[i].coeff = 0; + } + if (j->img_comp[i].linebuf) { + STBI_FREE(j->img_comp[i].linebuf); + j->img_comp[i].linebuf = NULL; + } + } +} + +typedef struct +{ + resample_row_func resample; + stbi_uc *line0,*line1; + int hs,vs; // expansion factor in each axis + int w_lores; // horizontal pixels pre-expansion + int ystep; // how far through vertical expansion we are + int ypos; // which pre-expansion row we're on +} stbi__resample; + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n; + z->s->img_n = 0; // make stbi__cleanup_jpeg safe + + // validate req_comp + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + + // load a jpeg image from whichever source, but leave in YCbCr format + if (!stbi__decode_jpeg_image(z)) { stbi__cleanup_jpeg(z); return NULL; } + + // determine actual number of components to generate + n = req_comp ? req_comp : z->s->img_n; + + if (z->s->img_n == 3 && n < 3) + decode_n = 1; + else + decode_n = z->s->img_n; + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4]; + + stbi__resample res_comp[4]; + + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + + // allocate line buffer big enough for upsampling off the edges + // with upsample factor of 4 + z->img_comp[k].linebuf = (stbi_uc *) stbi__malloc(z->s->img_x + 3); + if (!z->img_comp[k].linebuf) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + r->hs = z->img_h_max / z->img_comp[k].h; + r->vs = z->img_v_max / z->img_comp[k].v; + r->ystep = r->vs >> 1; + r->w_lores = (z->s->img_x + r->hs-1) / r->hs; + r->ypos = 0; + r->line0 = r->line1 = z->img_comp[k].data; + + if (r->hs == 1 && r->vs == 1) r->resample = resample_row_1; + else if (r->hs == 1 && r->vs == 2) r->resample = stbi__resample_row_v_2; + else if (r->hs == 2 && r->vs == 1) r->resample = stbi__resample_row_h_2; + else if (r->hs == 2 && r->vs == 2) r->resample = z->resample_row_hv_2_kernel; + else r->resample = stbi__resample_row_generic; + } + + // can't error after this so, this is safe + output = (stbi_uc *) stbi__malloc(n * z->s->img_x * z->s->img_y + 1); + if (!output) { stbi__cleanup_jpeg(z); return stbi__errpuc("outofmem", "Out of memory"); } + + // now go ahead and resample + for (j=0; j < z->s->img_y; ++j) { + stbi_uc *out = output + n * z->s->img_x * j; + for (k=0; k < decode_n; ++k) { + stbi__resample *r = &res_comp[k]; + int y_bot = r->ystep >= (r->vs >> 1); + coutput[k] = r->resample(z->img_comp[k].linebuf, + y_bot ? r->line1 : r->line0, + y_bot ? r->line0 : r->line1, + r->w_lores, r->hs); + if (++r->ystep >= r->vs) { + r->ystep = 0; + r->line0 = r->line1; + if (++r->ypos < z->img_comp[k].y) + r->line1 += z->img_comp[k].w2; + } + } + if (n >= 3) { + stbi_uc *y = coutput[0]; + if (z->s->img_n == 3) { + if (z->rgb == 3) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = y[i]; + out[1] = coutput[1][i]; + out[2] = coutput[2][i]; + out[3] = 255; + out += n; + } + } else { + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + } + } else + for (i=0; i < z->s->img_x; ++i) { + out[0] = out[1] = out[2] = y[i]; + out[3] = 255; // not used if n==3 + out += n; + } + } else { + stbi_uc *y = coutput[0]; + if (n == 1) + for (i=0; i < z->s->img_x; ++i) out[i] = y[i]; + else + for (i=0; i < z->s->img_x; ++i) *out++ = y[i], *out++ = 255; + } + } + stbi__cleanup_jpeg(z); + *out_x = z->s->img_x; + *out_y = z->s->img_y; + if (comp) *comp = z->s->img_n; // report original components, not output + return output; + } +} + +static unsigned char *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + result = load_jpeg_image(j, x,y,comp,req_comp); + STBI_FREE(j); + return result; +} + +static int stbi__jpeg_test(stbi__context *s) +{ + int r; + stbi__jpeg j; + j.s = s; + stbi__setup_jpeg(&j); + r = stbi__decode_jpeg_header(&j, STBI__SCAN_type); + stbi__rewind(s); + return r; +} + +static int stbi__jpeg_info_raw(stbi__jpeg *j, int *x, int *y, int *comp) +{ + if (!stbi__decode_jpeg_header(j, STBI__SCAN_header)) { + stbi__rewind( j->s ); + return 0; + } + if (x) *x = j->s->img_x; + if (y) *y = j->s->img_y; + if (comp) *comp = j->s->img_n; + return 1; +} + +static int stbi__jpeg_info(stbi__context *s, int *x, int *y, int *comp) +{ + int result; + stbi__jpeg* j = (stbi__jpeg*) (stbi__malloc(sizeof(stbi__jpeg))); + j->s = s; + result = stbi__jpeg_info_raw(j, x, y, comp); + STBI_FREE(j); + return result; +} +#endif + +// public domain zlib decode v0.2 Sean Barrett 2006-11-18 +// simple implementation +// - all input must be provided in an upfront buffer +// - all output is written to a single output buffer (can malloc/realloc) +// performance +// - fast huffman + +#ifndef STBI_NO_ZLIB + +// 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_MASK ((1 << STBI__ZFAST_BITS) - 1) + +// zlib-style huffman encoding +// (jpegs packs from left, zlib from right, so can't share code) +typedef struct +{ + stbi__uint16 fast[1 << STBI__ZFAST_BITS]; + stbi__uint16 firstcode[16]; + int maxcode[17]; + stbi__uint16 firstsymbol[16]; + stbi_uc size[288]; + stbi__uint16 value[288]; +} stbi__zhuffman; + +stbi_inline static int stbi__bitreverse16(int n) +{ + n = ((n & 0xAAAA) >> 1) | ((n & 0x5555) << 1); + n = ((n & 0xCCCC) >> 2) | ((n & 0x3333) << 2); + n = ((n & 0xF0F0) >> 4) | ((n & 0x0F0F) << 4); + n = ((n & 0xFF00) >> 8) | ((n & 0x00FF) << 8); + return n; +} + +stbi_inline static int stbi__bit_reverse(int v, int bits) +{ + STBI_ASSERT(bits <= 16); + // to bit reverse n bits, reverse 16 and shift + // e.g. 11 bits, bit reverse and shift away 5 + return stbi__bitreverse16(v) >> (16-bits); +} + +static int stbi__zbuild_huffman(stbi__zhuffman *z, stbi_uc *sizelist, int num) +{ + int i,k=0; + int code, next_code[16], sizes[17]; + + // DEFLATE spec for generating codes + memset(sizes, 0, sizeof(sizes)); + memset(z->fast, 0, sizeof(z->fast)); + for (i=0; i < num; ++i) + ++sizes[sizelist[i]]; + sizes[0] = 0; + for (i=1; i < 16; ++i) + if (sizes[i] > (1 << i)) + return stbi__err("bad sizes", "Corrupt PNG"); + code = 0; + for (i=1; i < 16; ++i) { + next_code[i] = code; + z->firstcode[i] = (stbi__uint16) code; + z->firstsymbol[i] = (stbi__uint16) k; + code = (code + sizes[i]); + if (sizes[i]) + if (code-1 >= (1 << i)) return stbi__err("bad codelengths","Corrupt PNG"); + z->maxcode[i] = code << (16-i); // preshift for inner loop + code <<= 1; + k += sizes[i]; + } + z->maxcode[16] = 0x10000; // sentinel + for (i=0; i < num; ++i) { + int s = sizelist[i]; + if (s) { + int c = next_code[s] - z->firstcode[s] + z->firstsymbol[s]; + stbi__uint16 fastv = (stbi__uint16) ((s << 9) | i); + z->size [c] = (stbi_uc ) s; + z->value[c] = (stbi__uint16) i; + if (s <= STBI__ZFAST_BITS) { + int j = stbi__bit_reverse(next_code[s],s); + while (j < (1 << STBI__ZFAST_BITS)) { + z->fast[j] = fastv; + j += (1 << s); + } + } + ++next_code[s]; + } + } + return 1; +} + +// zlib-from-memory implementation for PNG reading +// because PNG allows splitting the zlib stream arbitrarily, +// and it's annoying structurally to have PNG call ZLIB call PNG, +// we require PNG read all the IDATs and combine them into a single +// memory buffer + +typedef struct +{ + stbi_uc *zbuffer, *zbuffer_end; + int num_bits; + stbi__uint32 code_buffer; + + char *zout; + char *zout_start; + char *zout_end; + int z_expandable; + + stbi__zhuffman z_length, z_distance; +} stbi__zbuf; + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + if (z->zbuffer >= z->zbuffer_end) return 0; + return *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + STBI_ASSERT(z->code_buffer < (1U << z->num_bits)); + z->code_buffer |= (unsigned int) stbi__zget8(z) << z->num_bits; + z->num_bits += 8; + } while (z->num_bits <= 24); +} + +stbi_inline static unsigned int stbi__zreceive(stbi__zbuf *z, int n) +{ + unsigned int k; + if (z->num_bits < n) stbi__fill_bits(z); + k = z->code_buffer & ((1 << n) - 1); + z->code_buffer >>= n; + z->num_bits -= n; + return k; +} + +static int stbi__zhuffman_decode_slowpath(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s,k; + // not resolved by fast table, so compute it the slow way + // use jpeg approach, which requires MSbits at top + k = stbi__bit_reverse(a->code_buffer, 16); + for (s=STBI__ZFAST_BITS+1; ; ++s) + if (k < z->maxcode[s]) + break; + if (s == 16) return -1; // invalid code! + // code size is s, so: + b = (k >> (16-s)) - z->firstcode[s] + z->firstsymbol[s]; + STBI_ASSERT(z->size[b] == s); + a->code_buffer >>= s; + a->num_bits -= s; + return z->value[b]; +} + +stbi_inline static int stbi__zhuffman_decode(stbi__zbuf *a, stbi__zhuffman *z) +{ + int b,s; + if (a->num_bits < 16) stbi__fill_bits(a); + b = z->fast[a->code_buffer & STBI__ZFAST_MASK]; + if (b) { + s = b >> 9; + a->code_buffer >>= s; + a->num_bits -= s; + return b & 511; + } + return stbi__zhuffman_decode_slowpath(a, z); +} + +static int stbi__zexpand(stbi__zbuf *z, char *zout, int n) // need to make room for n bytes +{ + char *q; + int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (int) (z->zout - z->zout_start); + limit = old_limit = (int) (z->zout_end - z->zout_start); + while (cur + n > limit) + limit *= 2; + q = (char *) STBI_REALLOC_SIZED(z->zout_start, old_limit, limit); + STBI_NOTUSED(old_limit); + if (q == NULL) return stbi__err("outofmem", "Out of memory"); + z->zout_start = q; + z->zout = q + cur; + z->zout_end = q + limit; + return 1; +} + +static int stbi__zlength_base[31] = { + 3,4,5,6,7,8,9,10,11,13, + 15,17,19,23,27,31,35,43,51,59, + 67,83,99,115,131,163,195,227,258,0,0 }; + +static int stbi__zlength_extra[31]= +{ 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 }; + +static int stbi__zdist_base[32] = { 1,2,3,4,5,7,9,13,17,25,33,49,65,97,129,193, +257,385,513,769,1025,1537,2049,3073,4097,6145,8193,12289,16385,24577,0,0}; + +static int stbi__zdist_extra[32] = +{ 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}; + +static int stbi__parse_huffman_block(stbi__zbuf *a) +{ + char *zout = a->zout; + for(;;) { + int z = stbi__zhuffman_decode(a, &a->z_length); + if (z < 256) { + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); // error in huffman codes + if (zout >= a->zout_end) { + if (!stbi__zexpand(a, zout, 1)) return 0; + zout = a->zout; + } + *zout++ = (char) z; + } else { + stbi_uc *p; + int len,dist; + if (z == 256) { + a->zout = zout; + return 1; + } + z -= 257; + len = stbi__zlength_base[z]; + if (stbi__zlength_extra[z]) len += stbi__zreceive(a, stbi__zlength_extra[z]); + z = stbi__zhuffman_decode(a, &a->z_distance); + if (z < 0) return stbi__err("bad huffman code","Corrupt PNG"); + dist = stbi__zdist_base[z]; + if (stbi__zdist_extra[z]) dist += stbi__zreceive(a, stbi__zdist_extra[z]); + if (zout - a->zout_start < dist) return stbi__err("bad dist","Corrupt PNG"); + if (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + stbi__zhuffman z_codelength; + stbi_uc lencodes[286+32+137];//padding for maximum single op + stbi_uc codelength_sizes[19]; + int i,n; + + int hlit = stbi__zreceive(a,5) + 257; + int hdist = stbi__zreceive(a,5) + 1; + int hclen = stbi__zreceive(a,4) + 4; + + memset(codelength_sizes, 0, sizeof(codelength_sizes)); + for (i=0; i < hclen; ++i) { + int s = stbi__zreceive(a,3); + codelength_sizes[length_dezigzag[i]] = (stbi_uc) s; + } + if (!stbi__zbuild_huffman(&z_codelength, codelength_sizes, 19)) return 0; + + n = 0; + while (n < hlit + hdist) { + int c = stbi__zhuffman_decode(a, &z_codelength); + if (c < 0 || c >= 19) return stbi__err("bad codelengths", "Corrupt PNG"); + if (c < 16) + lencodes[n++] = (stbi_uc) c; + else if (c == 16) { + c = stbi__zreceive(a,2)+3; + memset(lencodes+n, lencodes[n-1], c); + n += c; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + memset(lencodes+n, 0, c); + n += c; + } else { + STBI_ASSERT(c == 18); + c = stbi__zreceive(a,7)+11; + memset(lencodes+n, 0, c); + n += c; + } + } + if (n != hlit+hdist) return stbi__err("bad codelengths","Corrupt PNG"); + if (!stbi__zbuild_huffman(&a->z_length, lencodes, hlit)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, lencodes+hlit, hdist)) return 0; + return 1; +} + +static int stbi__parse_uncompressed_block(stbi__zbuf *a) +{ + stbi_uc header[4]; + int len,nlen,k; + if (a->num_bits & 7) + stbi__zreceive(a, a->num_bits & 7); // discard + // drain the bit-packed data into header + k = 0; + while (a->num_bits > 0) { + header[k++] = (stbi_uc) (a->code_buffer & 255); // suppress MSVC run-time check + a->code_buffer >>= 8; + a->num_bits -= 8; + } + STBI_ASSERT(a->num_bits == 0); + // now fill header the normal way + while (k < 4) + header[k++] = stbi__zget8(a); + len = header[1] * 256 + header[0]; + nlen = header[3] * 256 + header[2]; + if (nlen != (len ^ 0xffff)) return stbi__err("zlib corrupt","Corrupt PNG"); + if (a->zbuffer + len > a->zbuffer_end) return stbi__err("read past buffer","Corrupt PNG"); + if (a->zout + len > a->zout_end) + if (!stbi__zexpand(a, a->zout, len)) return 0; + memcpy(a->zout, a->zbuffer, len); + a->zbuffer += len; + a->zout += len; + return 1; +} + +static int stbi__parse_zlib_header(stbi__zbuf *a) +{ + int cmf = stbi__zget8(a); + int cm = cmf & 15; + /* int cinfo = cmf >> 4; */ + int flg = stbi__zget8(a); + if ((cmf*256+flg) % 31 != 0) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + if (flg & 32) return stbi__err("no preset dict","Corrupt PNG"); // preset dictionary not allowed in png + if (cm != 8) return stbi__err("bad compression","Corrupt PNG"); // DEFLATE required for png + // window = 1 << (8 + cinfo)... but who cares, we fully buffer output + return 1; +} + +// @TODO: should statically initialize these for optimal thread safety +static stbi_uc stbi__zdefault_length[288], stbi__zdefault_distance[32]; +static void stbi__init_zdefaults(void) +{ + int i; // use <= to match clearly with spec + for (i=0; i <= 143; ++i) stbi__zdefault_length[i] = 8; + for ( ; i <= 255; ++i) stbi__zdefault_length[i] = 9; + for ( ; i <= 279; ++i) stbi__zdefault_length[i] = 7; + for ( ; i <= 287; ++i) stbi__zdefault_length[i] = 8; + + for (i=0; i <= 31; ++i) stbi__zdefault_distance[i] = 5; +} + +static int stbi__parse_zlib(stbi__zbuf *a, int parse_header) +{ + int final, type; + if (parse_header) + if (!stbi__parse_zlib_header(a)) return 0; + a->num_bits = 0; + a->code_buffer = 0; + do { + final = stbi__zreceive(a,1); + type = stbi__zreceive(a,2); + if (type == 0) { + if (!stbi__parse_uncompressed_block(a)) return 0; + } else if (type == 3) { + return 0; + } else { + if (type == 1) { + // use fixed code lengths + if (!stbi__zdefault_distance[31]) stbi__init_zdefaults(); + if (!stbi__zbuild_huffman(&a->z_length , stbi__zdefault_length , 288)) return 0; + if (!stbi__zbuild_huffman(&a->z_distance, stbi__zdefault_distance, 32)) return 0; + } else { + if (!stbi__compute_huffman_codes(a)) return 0; + } + if (!stbi__parse_huffman_block(a)) return 0; + } + } while (!final); + return 1; +} + +static int stbi__do_zlib(stbi__zbuf *a, char *obuf, int olen, int exp, int parse_header) +{ + a->zout_start = obuf; + a->zout = obuf; + a->zout_end = obuf + olen; + a->z_expandable = exp; + + return stbi__parse_zlib(a, parse_header); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize(const char *buffer, int len, int initial_size, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, 1)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF char *stbi_zlib_decode_malloc(char const *buffer, int len, int *outlen) +{ + return stbi_zlib_decode_malloc_guesssize(buffer, len, 16384, outlen); +} + +STBIDEF char *stbi_zlib_decode_malloc_guesssize_headerflag(const char *buffer, int len, int initial_size, int *outlen, int parse_header) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(initial_size); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer + len; + if (stbi__do_zlib(&a, p, initial_size, 1, parse_header)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_buffer(char *obuffer, int olen, char const *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 1)) + return (int) (a.zout - a.zout_start); + else + return -1; +} + +STBIDEF char *stbi_zlib_decode_noheader_malloc(char const *buffer, int len, int *outlen) +{ + stbi__zbuf a; + char *p = (char *) stbi__malloc(16384); + if (p == NULL) return NULL; + a.zbuffer = (stbi_uc *) buffer; + a.zbuffer_end = (stbi_uc *) buffer+len; + if (stbi__do_zlib(&a, p, 16384, 1, 0)) { + if (outlen) *outlen = (int) (a.zout - a.zout_start); + return a.zout_start; + } else { + STBI_FREE(a.zout_start); + return NULL; + } +} + +STBIDEF int stbi_zlib_decode_noheader_buffer(char *obuffer, int olen, const char *ibuffer, int ilen) +{ + stbi__zbuf a; + a.zbuffer = (stbi_uc *) ibuffer; + a.zbuffer_end = (stbi_uc *) ibuffer + ilen; + if (stbi__do_zlib(&a, obuffer, olen, 0, 0)) + return (int) (a.zout - a.zout_start); + else + return -1; +} +#endif + +// public domain "baseline" PNG decoder v0.10 Sean Barrett 2006-11-18 +// simple implementation +// - only 8-bit samples +// - no CRC checking +// - allocates lots of intermediate memory +// - avoids problem of streaming data between subsystems +// - avoids explicit window management +// performance +// - uses stb_zlib, a PD zlib implementation with fast huffman decoding + +#ifndef STBI_NO_PNG +typedef struct +{ + stbi__uint32 length; + stbi__uint32 type; +} stbi__pngchunk; + +static stbi__pngchunk stbi__get_chunk_header(stbi__context *s) +{ + stbi__pngchunk c; + c.length = stbi__get32be(s); + c.type = stbi__get32be(s); + return c; +} + +static int stbi__check_png_header(stbi__context *s) +{ + static stbi_uc png_sig[8] = { 137,80,78,71,13,10,26,10 }; + int i; + for (i=0; i < 8; ++i) + if (stbi__get8(s) != png_sig[i]) return stbi__err("bad png sig","Not a PNG"); + return 1; +} + +typedef struct +{ + stbi__context *s; + stbi_uc *idata, *expanded, *out; + int depth; +} stbi__png; + + +enum { + STBI__F_none=0, + STBI__F_sub=1, + STBI__F_up=2, + STBI__F_avg=3, + STBI__F_paeth=4, + // synthetic filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +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 +static 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) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc(x * y * output_bytes); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + img_len = (img_width_bytes + 1) * y; + if (s->img_x == x && s->img_y == y) { + if (raw_len != img_len) return stbi__err("not enough pixels","Corrupt PNG"); + } else { // interlaced: + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + } + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior = cur - stride; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + STBI_ASSERT(img_width_bytes <= x); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); break; + CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); break; + CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); break; + CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); break; + CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); break; + } + #undef CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + CASE(STBI__F_none) cur[k] = raw[k]; break; + CASE(STBI__F_sub) cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); break; + CASE(STBI__F_up) cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + CASE(STBI__F_avg) cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); break; + CASE(STBI__F_paeth) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); break; + CASE(STBI__F_avg_first) cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); break; + CASE(STBI__F_paeth_first) cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); break; + } + #undef CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // 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-bit + // 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 loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static 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) +{ + stbi_uc *final; + int p; + if (!interlaced) + return stbi__create_png_image_raw(a, image_data, image_data_len, out_n, a->s->img_x, a->s->img_y, depth, color); + + // de-interlacing + final = (stbi_uc *) stbi__malloc(a->s->img_x * a->s->img_y * out_n); + for (p=0; p < 7; ++p) { + int xorig[] = { 0,4,0,2,0,1,0 }; + int yorig[] = { 0,0,4,0,2,0,1 }; + int xspc[] = { 8,8,4,4,2,2,1 }; + int yspc[] = { 8,8,8,4,4,2,2 }; + int i,j,x,y; + // pass1_x[4] = 0, pass1_x[5] = 1, pass1_x[12] = 1 + x = (a->s->img_x - xorig[p] + xspc[p]-1) / xspc[p]; + y = (a->s->img_y - yorig[p] + yspc[p]-1) / yspc[p]; + if (x && y) { + stbi__uint32 img_len = ((((a->s->img_n * x * depth) + 7) >> 3) + 1) * y; + if (!stbi__create_png_image_raw(a, image_data, image_data_len, out_n, x, y, depth, color)) { + STBI_FREE(final); + return 0; + } + for (j=0; j < y; ++j) { + for (i=0; i < x; ++i) { + int out_y = j*yspc[p]+yorig[p]; + int out_x = i*xspc[p]+xorig[p]; + memcpy(final + out_y*a->s->img_x*out_n + out_x*out_n, + a->out + (j*x+i)*out_n, out_n); + } + } + STBI_FREE(a->out); + image_data += img_len; + image_data_len -= img_len; + } + } + a->out = final; + + return 1; +} + +static int stbi__compute_transparency(stbi__png *z, stbi_uc tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + // compute color-based transparency, assuming we've + // already got 255 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i=0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 255); + p += 2; + } + } else { + for (i=0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__compute_transparency16(stbi__png *z, stbi__uint16 tc[3], int out_n) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi__uint16 *p = (stbi__uint16*) z->out; + + // compute color-based transparency, assuming we've + // already got 65535 as the alpha value in the output + STBI_ASSERT(out_n == 2 || out_n == 4); + + if (out_n == 2) { + for (i = 0; i < pixel_count; ++i) { + p[1] = (p[0] == tc[0] ? 0 : 65535); + p += 2; + } + } else { + for (i = 0; i < pixel_count; ++i) { + if (p[0] == tc[0] && p[1] == tc[1] && p[2] == tc[2]) + p[3] = 0; + p += 4; + } + } + return 1; +} + +static int stbi__expand_png_palette(stbi__png *a, stbi_uc *palette, int len, int pal_img_n) +{ + stbi__uint32 i, pixel_count = a->s->img_x * a->s->img_y; + stbi_uc *p, *temp_out, *orig = a->out; + + p = (stbi_uc *) stbi__malloc(pixel_count * pal_img_n); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + // between here and free(out) below, exitting would leak + temp_out = p; + + if (pal_img_n == 3) { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p += 3; + } + } else { + for (i=0; i < pixel_count; ++i) { + int n = orig[i]*4; + p[0] = palette[n ]; + p[1] = palette[n+1]; + p[2] = palette[n+2]; + p[3] = palette[n+3]; + p += 4; + } + } + STBI_FREE(a->out); + a->out = temp_out; + + STBI_NOTUSED(len); + + return 1; +} + +static int stbi__reduce_png(stbi__png *p) +{ + int i; + int img_len = p->s->img_x * p->s->img_y * p->s->img_out_n; + stbi_uc *reduced; + stbi__uint16 *orig = (stbi__uint16*)p->out; + + if (p->depth != 16) return 1; // don't need to do anything if not 16-bit data + + reduced = (stbi_uc *)stbi__malloc(img_len); + if (p == NULL) return stbi__err("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) reduced[i] = (stbi_uc)((orig[i] >> 8) & 0xFF); // top half of each byte is a decent approx of 16->8 bit scaling + + p->out = reduced; + STBI_FREE(orig); + + return 1; +} + +static int stbi__unpremultiply_on_load = 0; +static int stbi__de_iphone_flag = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag = flag_true_if_should_convert; +} + +static void stbi__de_iphone(stbi__png *z) +{ + stbi__context *s = z->s; + stbi__uint32 i, pixel_count = s->img_x * s->img_y; + stbi_uc *p = z->out; + + if (s->img_out_n == 3) { // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 3; + } + } else { + STBI_ASSERT(s->img_out_n == 4); + if (stbi__unpremultiply_on_load) { + // convert bgr to rgb and unpremultiply + for (i=0; i < pixel_count; ++i) { + stbi_uc a = p[3]; + stbi_uc t = p[0]; + if (a) { + p[0] = p[2] * 255 / a; + p[1] = p[1] * 255 / a; + p[2] = t * 255 / a; + } else { + p[0] = p[2]; + p[2] = t; + } + p += 4; + } + } else { + // convert bgr to rgb + for (i=0; i < pixel_count; ++i) { + stbi_uc t = p[0]; + p[0] = p[2]; + p[2] = t; + p += 4; + } + } + } +} + +#define STBI__PNG_TYPE(a,b,c,d) (((a) << 24) + ((b) << 16) + ((c) << 8) + (d)) + +static int stbi__parse_png_file(stbi__png *z, int scan, int req_comp) +{ + stbi_uc palette[1024], pal_img_n=0; + stbi_uc has_trans=0, tc[3]; + stbi__uint16 tc16[3]; + stbi__uint32 ioff=0, idata_limit=0, i, pal_len=0; + int first=1,k,interlace=0, color=0, is_iphone=0; + stbi__context *s = z->s; + + z->expanded = NULL; + z->idata = NULL; + z->out = NULL; + + if (!stbi__check_png_header(s)) return 0; + + if (scan == STBI__SCAN_type) return 1; + + for (;;) { + stbi__pngchunk c = stbi__get_chunk_header(s); + switch (c.type) { + case STBI__PNG_TYPE('C','g','B','I'): + is_iphone = 1; + stbi__skip(s, c.length); + break; + case STBI__PNG_TYPE('I','H','D','R'): { + int comp,filter; + if (!first) return stbi__err("multiple IHDR","Corrupt PNG"); + first = 0; + if (c.length != 13) return stbi__err("bad IHDR len","Corrupt PNG"); + s->img_x = stbi__get32be(s); if (s->img_x > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + s->img_y = stbi__get32be(s); if (s->img_y > (1 << 24)) return stbi__err("too large","Very large image (corrupt?)"); + z->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"); + color = stbi__get8(s); if (color > 6) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3 && z->depth == 16) return stbi__err("bad ctype","Corrupt PNG"); + if (color == 3) pal_img_n = 3; else if (color & 1) return stbi__err("bad ctype","Corrupt PNG"); + comp = stbi__get8(s); if (comp) return stbi__err("bad comp method","Corrupt PNG"); + filter= stbi__get8(s); if (filter) return stbi__err("bad filter method","Corrupt PNG"); + interlace = stbi__get8(s); if (interlace>1) return stbi__err("bad interlace method","Corrupt PNG"); + if (!s->img_x || !s->img_y) return stbi__err("0-pixel image","Corrupt PNG"); + if (!pal_img_n) { + s->img_n = (color & 2 ? 3 : 1) + (color & 4 ? 1 : 0); + if ((1 << 30) / s->img_x / s->img_n < s->img_y) return stbi__err("too large", "Image too large to decode"); + if (scan == STBI__SCAN_header) return 1; + } else { + // if paletted, then pal_n is our final components, and + // img_n is # components to decompress/filter. + s->img_n = 1; + if ((1 << 30) / s->img_x / 4 < s->img_y) return stbi__err("too large","Corrupt PNG"); + // if SCAN_header, have to scan to see if we have a tRNS + } + break; + } + + case STBI__PNG_TYPE('P','L','T','E'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (c.length > 256*3) return stbi__err("invalid PLTE","Corrupt PNG"); + pal_len = c.length / 3; + if (pal_len * 3 != c.length) return stbi__err("invalid PLTE","Corrupt PNG"); + for (i=0; i < pal_len; ++i) { + palette[i*4+0] = stbi__get8(s); + palette[i*4+1] = stbi__get8(s); + palette[i*4+2] = stbi__get8(s); + palette[i*4+3] = 255; + } + break; + } + + case STBI__PNG_TYPE('t','R','N','S'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (z->idata) return stbi__err("tRNS after IDAT","Corrupt PNG"); + if (pal_img_n) { + if (scan == STBI__SCAN_header) { s->img_n = 4; return 1; } + if (pal_len == 0) return stbi__err("tRNS before PLTE","Corrupt PNG"); + if (c.length > pal_len) return stbi__err("bad tRNS len","Corrupt PNG"); + pal_img_n = 4; + for (i=0; i < c.length; ++i) + palette[i*4+3] = stbi__get8(s); + } else { + if (!(s->img_n & 1)) return stbi__err("tRNS with alpha","Corrupt PNG"); + if (c.length != (stbi__uint32) s->img_n*2) return stbi__err("bad tRNS len","Corrupt PNG"); + has_trans = 1; + if (z->depth == 16) { + for (k = 0; k < s->img_n; ++k) tc16[k] = stbi__get16be(s); // copy the values as-is + } else { + for (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 larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { s->img_n = pal_img_n; return 1; } + if ((int)(ioff + c.length) < (int)ioff) return 0; + if (ioff + c.length > idata_limit) { + stbi__uint32 idata_limit_old = idata_limit; + stbi_uc *p; + if (idata_limit == 0) idata_limit = c.length > 4096 ? c.length : 4096; + while (ioff + c.length > idata_limit) + idata_limit *= 2; + STBI_NOTUSED(idata_limit_old); + p = (stbi_uc *) STBI_REALLOC_SIZED(z->idata, idata_limit_old, idata_limit); if (p == NULL) return stbi__err("outofmem", "Out of memory"); + z->idata = p; + } + if (!stbi__getn(s, z->idata+ioff,c.length)) return stbi__err("outofdata","Corrupt PNG"); + ioff += c.length; + break; + } + + case STBI__PNG_TYPE('I','E','N','D'): { + stbi__uint32 raw_len, bpl; + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (scan != STBI__SCAN_load) return 1; + if (z->idata == NULL) return stbi__err("no IDAT","Corrupt PNG"); + // initial guess for decoded data size to avoid unnecessary reallocs + bpl = (s->img_x * z->depth + 7) / 8; // bytes per line, per component + raw_len = bpl * s->img_y * s->img_n /* pixels */ + s->img_y /* filter mode per row */; + z->expanded = (stbi_uc *) stbi_zlib_decode_malloc_guesssize_headerflag((char *) z->idata, ioff, raw_len, (int *) &raw_len, !is_iphone); + if (z->expanded == NULL) return 0; // zlib should set error + STBI_FREE(z->idata); z->idata = NULL; + if ((req_comp == s->img_n+1 && req_comp != 3 && !pal_img_n) || has_trans) + s->img_out_n = s->img_n+1; + else + s->img_out_n = s->img_n; + if (!stbi__create_png_image(z, z->expanded, raw_len, s->img_out_n, z->depth, color, interlace)) return 0; + if (has_trans) { + if (z->depth == 16) { + if (!stbi__compute_transparency16(z, tc16, s->img_out_n)) return 0; + } else { + if (!stbi__compute_transparency(z, tc, s->img_out_n)) return 0; + } + } + if (is_iphone && stbi__de_iphone_flag && s->img_out_n > 2) + stbi__de_iphone(z); + if (pal_img_n) { + // pal_img_n == 3 or 4 + s->img_n = pal_img_n; // record the actual colors we had + s->img_out_n = pal_img_n; + if (req_comp >= 3) s->img_out_n = req_comp; + if (!stbi__expand_png_palette(z, palette, pal_len, s->img_out_n)) + return 0; + } + STBI_FREE(z->expanded); z->expanded = NULL; + return 1; + } + + default: + // if critical, fail + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if ((c.type & (1 << 29)) == 0) { + #ifndef STBI_NO_FAILURE_STRINGS + // not threadsafe + static char invalid_chunk[] = "XXXX PNG chunk not known"; + invalid_chunk[0] = STBI__BYTECAST(c.type >> 24); + invalid_chunk[1] = STBI__BYTECAST(c.type >> 16); + invalid_chunk[2] = STBI__BYTECAST(c.type >> 8); + invalid_chunk[3] = STBI__BYTECAST(c.type >> 0); + #endif + return stbi__err(invalid_chunk, "PNG not supported: unknown PNG chunk type"); + } + stbi__skip(s, c.length); + break; + } + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + } +} + +static unsigned char *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp) +{ + unsigned char *result=NULL; + if (req_comp < 0 || req_comp > 4) return stbi__errpuc("bad req_comp", "Internal error"); + if (stbi__parse_png_file(p, STBI__SCAN_load, req_comp)) { + if (p->depth == 16) { + if (!stbi__reduce_png(p)) { + return result; + } + } + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + result = stbi__convert_format(result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + p->s->img_out_n = req_comp; + if (result == NULL) return result; + } + *x = p->s->img_x; + *y = p->s->img_y; + if (n) *n = p->s->img_n; + } + STBI_FREE(p->out); p->out = NULL; + STBI_FREE(p->expanded); p->expanded = NULL; + STBI_FREE(p->idata); p->idata = NULL; + + return result; +} + +static unsigned char *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp); +} + +static int stbi__png_test(stbi__context *s) +{ + int r; + r = stbi__check_png_header(s); + stbi__rewind(s); + return r; +} + +static int stbi__png_info_raw(stbi__png *p, int *x, int *y, int *comp) +{ + if (!stbi__parse_png_file(p, STBI__SCAN_header, 0)) { + stbi__rewind( p->s ); + return 0; + } + if (x) *x = p->s->img_x; + if (y) *y = p->s->img_y; + if (comp) *comp = p->s->img_n; + return 1; +} + +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__png p; + p.s = s; + return stbi__png_info_raw(&p, x, y, comp); +} +#endif + +// Microsoft/Windows BMP image + +#ifndef STBI_NO_BMP +static int stbi__bmp_test_raw(stbi__context *s) +{ + int r; + int sz; + if (stbi__get8(s) != 'B') return 0; + if (stbi__get8(s) != 'M') return 0; + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + stbi__get32le(s); // discard data offset + sz = stbi__get32le(s); + r = (sz == 12 || sz == 40 || sz == 56 || sz == 108 || sz == 124); + return r; +} + +static int stbi__bmp_test(stbi__context *s) +{ + int r = stbi__bmp_test_raw(s); + stbi__rewind(s); + return r; +} + + +// returns 0..31 for the highest set bit +static int stbi__high_bit(unsigned int z) +{ + int n=0; + if (z == 0) return -1; + if (z >= 0x10000) n += 16, z >>= 16; + if (z >= 0x00100) n += 8, z >>= 8; + if (z >= 0x00010) n += 4, z >>= 4; + if (z >= 0x00004) n += 2, z >>= 2; + if (z >= 0x00002) n += 1, z >>= 1; + return n; +} + +static int stbi__bitcount(unsigned int a) +{ + a = (a & 0x55555555) + ((a >> 1) & 0x55555555); // max 2 + a = (a & 0x33333333) + ((a >> 2) & 0x33333333); // max 4 + a = (a + (a >> 4)) & 0x0f0f0f0f; // max 8 per 4, now 8 bits + a = (a + (a >> 8)); // max 16 per 8 bits + a = (a + (a >> 16)); // max 32 per 8 bits + return a & 0xff; +} + +static int stbi__shiftsigned(int v, int shift, int bits) +{ + int result; + int z=0; + + if (shift < 0) v <<= -shift; + else v >>= shift; + result = v; + + z = bits; + while (z < 8) { + result += v >> z; + z += bits; + } + return result; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; +} stbi__bmp_data; + +static void *stbi__bmp_parse_header(stbi__context *s, stbi__bmp_data *info) +{ + int hsz; + if (stbi__get8(s) != 'B' || stbi__get8(s) != 'M') return stbi__errpuc("not BMP", "Corrupt BMP"); + stbi__get32le(s); // discard filesize + stbi__get16le(s); // discard reserved + stbi__get16le(s); // discard reserved + info->offset = stbi__get32le(s); + info->hsz = hsz = stbi__get32le(s); + info->mr = info->mg = info->mb = info->ma = 0; + + if (hsz != 12 && hsz != 40 && hsz != 56 && hsz != 108 && hsz != 124) return stbi__errpuc("unknown BMP", "BMP type not supported: unknown"); + if (hsz == 12) { + s->img_x = stbi__get16le(s); + s->img_y = stbi__get16le(s); + } else { + s->img_x = stbi__get32le(s); + s->img_y = stbi__get32le(s); + } + if (stbi__get16le(s) != 1) return stbi__errpuc("bad BMP", "bad BMP"); + info->bpp = stbi__get16le(s); + if (info->bpp == 1) return stbi__errpuc("monochrome", "BMP type not supported: 1-bit"); + if (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + stbi__get32le(s); // discard sizeof + stbi__get32le(s); // discard hres + stbi__get32le(s); // discard vres + stbi__get32le(s); // discard colorsused + stbi__get32le(s); // discard max important + if (hsz == 40 || hsz == 56) { + if (hsz == 56) { + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + stbi__get32le(s); + } + if (info->bpp == 16 || info->bpp == 32) { + if (compress == 0) { + if (info->bpp == 32) { + info->mr = 0xffu << 16; + info->mg = 0xffu << 8; + info->mb = 0xffu << 0; + info->ma = 0xffu << 24; + info->all_a = 0; // if all_a is 0 at end, then we loaded alpha channel but it was all 0 + } else { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + // not documented, but generated by photoshop and handled by mspaint + if (info->mr == info->mg && info->mg == info->mb) { + // ?!?!? + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else + return stbi__errpuc("bad BMP", "bad BMP"); + } + } else { + int i; + if (hsz != 108 && hsz != 124) + return stbi__errpuc("bad BMP", "bad BMP"); + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->ma = stbi__get32le(s); + stbi__get32le(s); // discard color space + for (i=0; i < 12; ++i) + stbi__get32le(s); // discard color space parameters + if (hsz == 124) { + stbi__get32le(s); // discard rendering intent + stbi__get32le(s); // discard offset of profile data + stbi__get32le(s); // discard size of profile data + stbi__get32le(s); // discard reserved + } + } + } + return (void *) 1; +} + + +static stbi_uc *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *out; + unsigned int mr=0,mg=0,mb=0,ma=0, all_a; + stbi_uc pal[256][4]; + int psize=0,i,j,width; + int flip_vertically, pad, target; + stbi__bmp_data info; + + info.all_a = 255; + if (stbi__bmp_parse_header(s, &info) == NULL) + return NULL; // error code already set + + flip_vertically = ((int) s->img_y) > 0; + s->img_y = abs((int) s->img_y); + + mr = info.mr; + mg = info.mg; + mb = info.mb; + ma = info.ma; + all_a = info.all_a; + + if (info.hsz == 12) { + if (info.bpp < 24) + psize = (info.offset - 14 - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - 14 - info.hsz) >> 2; + } + + s->img_n = ma ? 4 : 3; + if (req_comp && req_comp >= 3) // we can directly decode 3 or 4 + target = req_comp; + else + target = s->img_n; // if they want monochrome, we'll post-convert + + out = (stbi_uc *) stbi__malloc(target * s->img_x * s->img_y); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (info.bpp < 16) { + int z=0; + if (psize == 0 || psize > 256) { STBI_FREE(out); return stbi__errpuc("invalid", "Corrupt BMP"); } + for (i=0; i < psize; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + if (info.hsz != 12) stbi__get8(s); + pal[i][3] = 255; + } + stbi__skip(s, info.offset - 14 - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 4) width = (s->img_x + 1) >> 1; + else if (info.bpp == 8) width = s->img_x; + else { STBI_FREE(out); return stbi__errpuc("bad bpp", "Corrupt BMP"); } + pad = (-width)&3; + for (j=0; j < (int) s->img_y; ++j) { + for (i=0; i < (int) s->img_x; i += 2) { + int v=stbi__get8(s),v2=0; + if (info.bpp == 4) { + v2 = v & 15; + v >>= 4; + } + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + v = (info.bpp == 8) ? stbi__get8(s) : v2; + out[z++] = pal[v][0]; + out[z++] = pal[v][1]; + out[z++] = pal[v][2]; + if (target == 4) out[z++] = 255; + } + stbi__skip(s, pad); + } + } else { + int rshift=0,gshift=0,bshift=0,ashift=0,rcount=0,gcount=0,bcount=0,acount=0; + int z = 0; + int easy=0; + stbi__skip(s, info.offset - 14 - info.hsz); + if (info.bpp == 24) width = 3 * s->img_x; + else if (info.bpp == 16) width = 2*s->img_x; + else /* bpp = 32 and pad = 0 */ width=0; + pad = (-width) & 3; + if (info.bpp == 24) { + easy = 1; + } else if (info.bpp == 32) { + if (mb == 0xff && mg == 0xff00 && mr == 0x00ff0000 && ma == 0xff000000) + easy = 2; + } + if (!easy) { + if (!mr || !mg || !mb) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + // right shift amt to put high bit in position #7 + rshift = stbi__high_bit(mr)-7; rcount = stbi__bitcount(mr); + gshift = stbi__high_bit(mg)-7; gcount = stbi__bitcount(mg); + bshift = stbi__high_bit(mb)-7; bcount = stbi__bitcount(mb); + ashift = stbi__high_bit(ma)-7; acount = stbi__bitcount(ma); + } + for (j=0; j < (int) s->img_y; ++j) { + if (easy) { + for (i=0; i < (int) s->img_x; ++i) { + unsigned char a; + out[z+2] = stbi__get8(s); + out[z+1] = stbi__get8(s); + out[z+0] = stbi__get8(s); + z += 3; + a = (easy == 2 ? stbi__get8(s) : 255); + all_a |= a; + if (target == 4) out[z++] = a; + } + } else { + int bpp = info.bpp; + for (i=0; i < (int) s->img_x; ++i) { + stbi__uint32 v = (bpp == 16 ? (stbi__uint32) stbi__get16le(s) : stbi__get32le(s)); + int a; + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mr, rshift, rcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mg, gshift, gcount)); + out[z++] = STBI__BYTECAST(stbi__shiftsigned(v & mb, bshift, bcount)); + a = (ma ? stbi__shiftsigned(v & ma, ashift, acount) : 255); + all_a |= a; + if (target == 4) out[z++] = STBI__BYTECAST(a); + } + } + stbi__skip(s, pad); + } + } + + // if alpha channel is all 0s, replace with all 255s + if (target == 4 && all_a == 0) + for (i=4*s->img_x*s->img_y-1; i >= 0; i -= 4) + out[i] = 255; + + if (flip_vertically) { + stbi_uc t; + for (j=0; j < (int) s->img_y>>1; ++j) { + stbi_uc *p1 = out + j *s->img_x*target; + stbi_uc *p2 = out + (s->img_y-1-j)*s->img_x*target; + for (i=0; i < (int) s->img_x*target; ++i) { + t = p1[i], p1[i] = p2[i], p2[i] = t; + } + } + } + + if (req_comp && req_comp != target) { + out = stbi__convert_format(out, target, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + return out; +} +#endif + +// Targa Truevision - TGA +// by Jonathan Dummer +#ifndef STBI_NO_TGA +// returns STBI_rgb or whatever, 0 on error +static int stbi__tga_get_comp(int bits_per_pixel, int is_grey, int* is_rgb16) +{ + // only RGB or RGBA (incl. 16bit) or grey allowed + if(is_rgb16) *is_rgb16 = 0; + switch(bits_per_pixel) { + case 8: return STBI_grey; + case 16: if(is_grey) return STBI_grey_alpha; + // else: fall-through + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fall-through + case 32: return bits_per_pixel/8; + default: return 0; + } +} + +static int stbi__tga_info(stbi__context *s, int *x, int *y, int *comp) +{ + int tga_w, tga_h, tga_comp, tga_image_type, tga_bits_per_pixel, tga_colormap_bpp; + int sz, tga_colormap_type; + stbi__get8(s); // discard Offset + tga_colormap_type = stbi__get8(s); // colormap type + if( tga_colormap_type > 1 ) { + stbi__rewind(s); + return 0; // only RGB or indexed allowed + } + tga_image_type = stbi__get8(s); // image type + if ( tga_colormap_type == 1 ) { // colormapped (paletted) image + if (tga_image_type != 1 && tga_image_type != 9) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) { + stbi__rewind(s); + return 0; + } + stbi__skip(s,4); // skip image x and y origin + tga_colormap_bpp = sz; + } else { // "normal" image w/o colormap - only RGB or grey allowed, +/- RLE + if ( (tga_image_type != 2) && (tga_image_type != 3) && (tga_image_type != 10) && (tga_image_type != 11) ) { + stbi__rewind(s); + return 0; // only RGB or grey allowed, +/- RLE + } + stbi__skip(s,9); // skip colormap specification and image x/y origin + tga_colormap_bpp = 0; + } + tga_w = stbi__get16le(s); + if( tga_w < 1 ) { + stbi__rewind(s); + return 0; // test width + } + tga_h = stbi__get16le(s); + if( tga_h < 1 ) { + stbi__rewind(s); + return 0; // test height + } + tga_bits_per_pixel = stbi__get8(s); // bits per pixel + stbi__get8(s); // ignore alpha bits + if (tga_colormap_bpp != 0) { + if((tga_bits_per_pixel != 8) && (tga_bits_per_pixel != 16)) { + // when using a colormap, tga_bits_per_pixel is the size of the indexes + // I don't think anything but 8 or 16bit indexes makes sense + stbi__rewind(s); + return 0; + } + tga_comp = stbi__tga_get_comp(tga_colormap_bpp, 0, NULL); + } else { + tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3) || (tga_image_type == 11), NULL); + } + if(!tga_comp) { + stbi__rewind(s); + return 0; + } + if (x) *x = tga_w; + if (y) *y = tga_h; + if (comp) *comp = tga_comp; + return 1; // seems to have passed everything +} + +static int stbi__tga_test(stbi__context *s) +{ + int res = 0; + int sz, tga_color_type; + stbi__get8(s); // discard Offset + tga_color_type = stbi__get8(s); // color type + if ( tga_color_type > 1 ) goto errorEnd; // only RGB or indexed allowed + sz = stbi__get8(s); // image type + if ( tga_color_type == 1 ) { // colormapped (paletted) image + if (sz != 1 && sz != 9) goto errorEnd; // colortype 1 demands image type 1 or 9 + stbi__skip(s,4); // skip index of first colormap entry and number of entries + sz = stbi__get8(s); // check bits per palette color entry + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + stbi__skip(s,4); // skip image x and y origin + } else { // "normal" image w/o colormap + if ( (sz != 2) && (sz != 3) && (sz != 10) && (sz != 11) ) goto errorEnd; // only RGB or grey allowed, +/- RLE + stbi__skip(s,9); // skip colormap specification and image x/y origin + } + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test width + if ( stbi__get16le(s) < 1 ) goto errorEnd; // test height + sz = stbi__get8(s); // bits per pixel + if ( (tga_color_type == 1) && (sz != 8) && (sz != 16) ) goto errorEnd; // for colormapped images, bpp is size of an index + if ( (sz != 8) && (sz != 15) && (sz != 16) && (sz != 24) && (sz != 32) ) goto errorEnd; + + res = 1; // if we got this far, everything's good and we can return 1 instead of 0 + +errorEnd: + stbi__rewind(s); + return res; +} + +// read 16bit value and convert to 24bit RGB +void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = stbi__get16le(s); + stbi__uint16 fiveBitMask = 31; + // we have 3 channels with 5bits each + int r = (px >> 10) & fiveBitMask; + int g = (px >> 5) & fiveBitMask; + int b = px & fiveBitMask; + // Note that this saves the data in RGB(A) order, so it doesn't need to be swapped later + out[0] = (r * 255)/31; + out[1] = (g * 255)/31; + out[2] = (b * 255)/31; + + // some people claim that the most significant bit might be used for alpha + // (possibly if an alpha-bit is set in the "image descriptor byte") + // but that only made 16bit test images completely translucent.. + // so let's treat all 15 and 16bit TGAs as RGB with no alpha. +} + +static stbi_uc *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + // read in the TGA header stuff + int tga_offset = stbi__get8(s); + int tga_indexed = stbi__get8(s); + int tga_image_type = stbi__get8(s); + int tga_is_RLE = 0; + int tga_palette_start = stbi__get16le(s); + int tga_palette_len = stbi__get16le(s); + int tga_palette_bits = stbi__get8(s); + int tga_x_origin = stbi__get16le(s); + int tga_y_origin = stbi__get16le(s); + int tga_width = stbi__get16le(s); + int tga_height = stbi__get16le(s); + int tga_bits_per_pixel = stbi__get8(s); + int tga_comp, tga_rgb16=0; + int tga_inverted = stbi__get8(s); + // int tga_alpha_bits = tga_inverted & 15; // the 4 lowest bits - unused (useless?) + // image data + unsigned char *tga_data; + unsigned char *tga_palette = NULL; + int i, j; + unsigned char raw_data[4]; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + + // do a tiny bit of precessing + if ( tga_image_type >= 8 ) + { + tga_image_type -= 8; + tga_is_RLE = 1; + } + tga_inverted = 1 - ((tga_inverted >> 5) & 1); + + // If I'm paletted, then I'll use the number of bits from the palette + if ( tga_indexed ) tga_comp = stbi__tga_get_comp(tga_palette_bits, 0, &tga_rgb16); + else tga_comp = stbi__tga_get_comp(tga_bits_per_pixel, (tga_image_type == 3), &tga_rgb16); + + if(!tga_comp) // shouldn't really happen, stbi__tga_test() should have ensured basic consistency + return stbi__errpuc("bad format", "Can't find out TGA pixelformat"); + + // tga info + *x = tga_width; + *y = tga_height; + if (comp) *comp = tga_comp; + + tga_data = (unsigned char*)stbi__malloc( (size_t)tga_width * tga_height * tga_comp ); + if (!tga_data) return stbi__errpuc("outofmem", "Out of memory"); + + // skip to the data's starting position (offset usually = 0) + stbi__skip(s, tga_offset ); + + if ( !tga_indexed && !tga_is_RLE && !tga_rgb16 ) { + for (i=0; i < tga_height; ++i) { + int row = tga_inverted ? tga_height -i - 1 : i; + stbi_uc *tga_row = tga_data + row*tga_width*tga_comp; + stbi__getn(s, tga_row, tga_width * tga_comp); + } + } else { + // do I need to load a palette? + if ( tga_indexed) + { + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc( tga_palette_len * tga_comp ); + if (!tga_palette) { + STBI_FREE(tga_data); + return stbi__errpuc("outofmem", "Out of memory"); + } + if (tga_rgb16) { + stbi_uc *pal_entry = tga_palette; + STBI_ASSERT(tga_comp == STBI_rgb); + for (i=0; i < tga_palette_len; ++i) { + stbi__tga_read_rgb16(s, pal_entry); + pal_entry += tga_comp; + } + } else if (!stbi__getn(s, tga_palette, tga_palette_len * tga_comp)) { + STBI_FREE(tga_data); + STBI_FREE(tga_palette); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + } + // load the data + for (i=0; i < tga_width * tga_height; ++i) + { + // if I'm in RLE mode, do I need to get a RLE stbi__pngchunk? + if ( tga_is_RLE ) + { + if ( RLE_count == 0 ) + { + // yep, get the next byte as a RLE command + int RLE_cmd = stbi__get8(s); + RLE_count = 1 + (RLE_cmd & 127); + RLE_repeating = RLE_cmd >> 7; + read_next_pixel = 1; + } else if ( !RLE_repeating ) + { + read_next_pixel = 1; + } + } else + { + read_next_pixel = 1; + } + // OK, if I need to read a pixel, do it now + if ( read_next_pixel ) + { + // load however much data we did have + if ( tga_indexed ) + { + // read in index, then perform the lookup + int pal_idx = (tga_bits_per_pixel == 8) ? stbi__get8(s) : stbi__get16le(s); + if ( pal_idx >= tga_palette_len ) { + // invalid index + pal_idx = 0; + } + pal_idx *= tga_comp; + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = tga_palette[pal_idx+j]; + } + } else if(tga_rgb16) { + STBI_ASSERT(tga_comp == STBI_rgb); + stbi__tga_read_rgb16(s, raw_data); + } else { + // read in the data raw + for (j = 0; j < tga_comp; ++j) { + raw_data[j] = stbi__get8(s); + } + } + // clear the reading flag for the next pixel + read_next_pixel = 0; + } // end of reading a pixel + + // copy data + for (j = 0; j < tga_comp; ++j) + tga_data[i*tga_comp+j] = raw_data[j]; + + // in case we're in RLE mode, keep counting down + --RLE_count; + } + // do I need to invert the image? + if ( tga_inverted ) + { + for (j = 0; j*2 < tga_height; ++j) + { + int index1 = j * tga_width * tga_comp; + int index2 = (tga_height - 1 - j) * tga_width * tga_comp; + for (i = tga_width * tga_comp; i > 0; --i) + { + unsigned char temp = tga_data[index1]; + tga_data[index1] = tga_data[index2]; + tga_data[index2] = temp; + ++index1; + ++index2; + } + } + } + // clear my palette, if I had one + if ( tga_palette != NULL ) + { + STBI_FREE( tga_palette ); + } + } + + // swap RGB - if the source data was RGB16, it already is in the right order + if (tga_comp >= 3 && !tga_rgb16) + { + unsigned char* tga_pixel = tga_data; + for (i=0; i < tga_width * tga_height; ++i) + { + unsigned char temp = tga_pixel[0]; + tga_pixel[0] = tga_pixel[2]; + tga_pixel[2] = temp; + tga_pixel += tga_comp; + } + } + + // convert to target component count + if (req_comp && req_comp != tga_comp) + tga_data = stbi__convert_format(tga_data, tga_comp, req_comp, tga_width, tga_height); + + // the things I do to get rid of an error message, and yet keep + // Microsoft's C compilers happy... [8^( + tga_palette_start = tga_palette_len = tga_palette_bits = + tga_x_origin = tga_y_origin = 0; + // OK, done + return tga_data; +} +#endif + +// ************************************************************************************************* +// 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) +{ + int r = (stbi__get32be(s) == 0x38425053); + stbi__rewind(s); + return r; +} + +static stbi_uc *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + int pixelCount; + int channelCount, compression; + int channel, i, count, len; + int bitdepth; + int w,h; + stbi_uc *out; + + // Check identifier + if (stbi__get32be(s) != 0x38425053) // "8BPS" + return stbi__errpuc("not PSD", "Corrupt PSD image"); + + // Check file type version. + if (stbi__get16be(s) != 1) + return stbi__errpuc("wrong version", "Unsupported version of PSD image"); + + // Skip 6 reserved bytes. + stbi__skip(s, 6 ); + + // Read the number of channels (R, G, B, A, etc). + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) + return stbi__errpuc("wrong channel count", "Unsupported number of channels in PSD image"); + + // Read the rows and columns of the image. + h = stbi__get32be(s); + w = stbi__get32be(s); + + // Make sure the depth is 8 bits. + bitdepth = stbi__get16be(s); + if (bitdepth != 8 && bitdepth != 16) + return stbi__errpuc("unsupported bit depth", "PSD bit depth is not 8 or 16 bit"); + + // Make sure the color mode is RGB. + // Valid options are: + // 0: Bitmap + // 1: Grayscale + // 2: Indexed color + // 3: RGB color + // 4: CMYK color + // 7: Multichannel + // 8: Duotone + // 9: Lab color + if (stbi__get16be(s) != 3) + return stbi__errpuc("wrong color format", "PSD is not in RGB color format"); + + // Skip the Mode Data. (It's the palette for indexed color; other info for other modes.) + stbi__skip(s,stbi__get32be(s) ); + + // Skip the image resources. (resolution, pen tool paths, etc) + stbi__skip(s, stbi__get32be(s) ); + + // Skip the reserved data. + stbi__skip(s, stbi__get32be(s) ); + + // Find out if the data is compressed. + // Known values: + // 0: no compression + // 1: RLE compressed + compression = stbi__get16be(s); + if (compression > 1) + return stbi__errpuc("bad compression", "PSD has an unknown compression format"); + + // Create the destination image. + out = (stbi_uc *) stbi__malloc(4 * w*h); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + pixelCount = w*h; + + // Initialize the data to zero. + //memset( out, 0, pixelCount * 4 ); + + // Finally, the image data. + if (compression) { + // RLE as used by .PSD and .TIFF + // Loop until you get the number of unpacked bytes you are expecting: + // Read the next source byte into n. + // If n is between 0 and 127 inclusive, copy the next n+1 bytes literally. + // Else if n is between -127 and -1 inclusive, copy the next byte -n+1 times. + // Else if n is 128, noop. + // Endloop + + // The RLE-compressed data is preceeded by a 2-byte data count for each row in the data, + // which we're going to just skip. + stbi__skip(s, h * channelCount * 2 ); + + // Read the RLE data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out+channel; + if (channel >= channelCount) { + // Fill this channel with default data. + for (i = 0; i < pixelCount; i++, p += 4) + *p = (channel == 3 ? 255 : 0); + } else { + // Read the RLE data. + count = 0; + while (count < pixelCount) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + count += len; + while (len) { + *p = stbi__get8(s); + p += 4; + len--; + } + } else if (len > 128) { + stbi_uc val; + // Next -len+1 bytes in the dest are replicated from next source byte. + // (Interpret len as a negative 8-bit int.) + len ^= 0x0FF; + len += 2; + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + } + } + + } else { + // We're at the raw image data. It's each channel in order (Red, Green, Blue, Alpha, ...) + // where each channel consists of an 8-bit value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + stbi_uc *p; + + p = out + channel; + if (channel >= channelCount) { + // Fill this channel with default data. + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } else { + // Read the data. + if (bitdepth == 16) { + for (i = 0; i < pixelCount; i++, p += 4) + *p = (stbi_uc) (stbi__get16be(s) >> 8); + } else { + for (i = 0; i < pixelCount; i++, p += 4) + *p = stbi__get8(s); + } + } + } + } + + if (channelCount >= 4) { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + // remove weird white matte from PSD + float a = pixel[3] / 255.0f; + float ra = 1.0f / a; + float inv_a = 255.0f * (1 - ra); + pixel[0] = (unsigned char) (pixel[0]*ra + inv_a); + pixel[1] = (unsigned char) (pixel[1]*ra + inv_a); + pixel[2] = (unsigned char) (pixel[2]*ra + inv_a); + } + } + } + + if (req_comp && req_comp != 4) { + out = stbi__convert_format(out, 4, req_comp, w, h); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + + if (comp) *comp = 4; + *y = h; + *x = w; + + return out; +} +#endif + +// ************************************************************************************************* +// Softimage PIC loader +// by Tom Seddon +// +// See http://softimage.wiki.softimage.com/index.php/INFO:_PIC_file_format +// 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) +{ + int i; + for (i=0; i<4; ++i) + if (stbi__get8(s) != (stbi_uc)str[i]) + return 0; + + return 1; +} + +static int stbi__pic_test_core(stbi__context *s) +{ + int i; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) + return 0; + + for(i=0;i<84;++i) + stbi__get8(s); + + if (!stbi__pic_is4(s,"PICT")) + return 0; + + return 1; +} + +typedef struct +{ + stbi_uc size,type,channel; +} stbi__pic_packet; + +static stbi_uc *stbi__readval(stbi__context *s, int channel, stbi_uc *dest) +{ + int mask=0x80, i; + + for (i=0; i<4; ++i, mask>>=1) { + if (channel & mask) { + if (stbi__at_eof(s)) return stbi__errpuc("bad file","PIC file too short"); + dest[i]=stbi__get8(s); + } + } + + return dest; +} + +static void stbi__copyval(int channel,stbi_uc *dest,const stbi_uc *src) +{ + int mask=0x80,i; + + for (i=0;i<4; ++i, mask>>=1) + if (channel&mask) + dest[i]=src[i]; +} + +static stbi_uc *stbi__pic_load_core(stbi__context *s,int width,int height,int *comp, stbi_uc *result) +{ + int act_comp=0,num_packets=0,y,chained; + stbi__pic_packet packets[10]; + + // this will (should...) cater for even some bizarre stuff like having data + // for the same channel in multiple packets. + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return stbi__errpuc("bad format","too many packets"); + + packet = &packets[num_packets++]; + + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + + act_comp |= packet->channel; + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (reading packets)"); + if (packet->size != 8) return stbi__errpuc("bad format","packet isn't 8bpp"); + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); // has alpha channel? + + for(y=0; ytype) { + default: + return stbi__errpuc("bad format","packet has bad compression type"); + + case 0: {//uncompressed + int x; + + for(x=0;xchannel,dest)) + return 0; + break; + } + + case 1://Pure RLE + { + int left=width, i; + + while (left>0) { + stbi_uc count,value[4]; + + count=stbi__get8(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pure read count)"); + + if (count > left) + count = (stbi_uc) left; + + if (!stbi__readval(s,packet->channel,value)) return 0; + + for(i=0; ichannel,dest,value); + left -= count; + } + } + break; + + case 2: {//Mixed RLE + int left=width; + while (left>0) { + int count = stbi__get8(s), i; + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (mixed read count)"); + + if (count >= 128) { // Repeated + stbi_uc value[4]; + + if (count==128) + count = stbi__get16be(s); + else + count -= 127; + if (count > left) + return stbi__errpuc("bad file","scanline overrun"); + + if (!stbi__readval(s,packet->channel,value)) + return 0; + + for(i=0;ichannel,dest,value); + } else { // Raw + ++count; + if (count>left) return stbi__errpuc("bad file","scanline overrun"); + + for(i=0;ichannel,dest)) + return 0; + } + left-=count; + } + break; + } + } + } + } + + return result; +} + +static stbi_uc *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp) +{ + stbi_uc *result; + int i, x,y; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if ((1 << 28) / x < y) return stbi__errpuc("too large", "Image too large to decode"); + + stbi__get32be(s); //skip `ratio' + stbi__get16be(s); //skip `fields' + stbi__get16be(s); //skip `pad' + + // intermediate buffer is RGBA + result = (stbi_uc *) stbi__malloc(x*y*4); + memset(result, 0xff, x*y*4); + + if (!stbi__pic_load_core(s,x,y,comp, result)) { + STBI_FREE(result); + result=0; + } + *px = x; + *py = y; + if (req_comp == 0) req_comp = *comp; + result=stbi__convert_format(result,4,req_comp,x,y); + + return result; +} + +static int stbi__pic_test(stbi__context *s) +{ + int r = stbi__pic_test_core(s); + stbi__rewind(s); + return r; +} +#endif + +// ************************************************************************************************* +// GIF loader -- public domain by Jean-Marc Lienher -- simplified/shrunk by stb + +#ifndef STBI_NO_GIF +typedef struct +{ + stbi__int16 prefix; + stbi_uc first; + stbi_uc suffix; +} stbi__gif_lzw; + +typedef struct +{ + int w,h; + stbi_uc *out, *old_out; // output buffer (always 4 components) + int flags, bgindex, ratio, transparent, eflags, delay; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[4096]; + stbi_uc *color_table; + int parse, step; + int lflags; + int start_x, start_y; + int max_x, max_y; + int cur_x, cur_y; + int line_size; +} stbi__gif; + +static int stbi__gif_test_raw(stbi__context *s) +{ + int sz; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') return 0; + sz = stbi__get8(s); + if (sz != '9' && sz != '7') return 0; + if (stbi__get8(s) != 'a') return 0; + return 1; +} + +static int stbi__gif_test(stbi__context *s) +{ + int r = stbi__gif_test_raw(s); + stbi__rewind(s); + return r; +} + +static void stbi__gif_parse_colortable(stbi__context *s, stbi_uc pal[256][4], int num_entries, int transp) +{ + int i; + for (i=0; i < num_entries; ++i) { + pal[i][2] = stbi__get8(s); + pal[i][1] = stbi__get8(s); + pal[i][0] = stbi__get8(s); + pal[i][3] = transp == i ? 0 : 255; + } +} + +static int stbi__gif_header(stbi__context *s, stbi__gif *g, int *comp, int is_info) +{ + stbi_uc version; + if (stbi__get8(s) != 'G' || stbi__get8(s) != 'I' || stbi__get8(s) != 'F' || stbi__get8(s) != '8') + return stbi__err("not GIF", "Corrupt GIF"); + + version = stbi__get8(s); + if (version != '7' && version != '9') return stbi__err("not GIF", "Corrupt GIF"); + if (stbi__get8(s) != 'a') return stbi__err("not GIF", "Corrupt GIF"); + + stbi__g_failure_reason = ""; + g->w = stbi__get16le(s); + g->h = stbi__get16le(s); + g->flags = stbi__get8(s); + g->bgindex = stbi__get8(s); + g->ratio = stbi__get8(s); + g->transparent = -1; + + if (comp != 0) *comp = 4; // can't actually tell whether it's 3 or 4 until we parse the comments + + if (is_info) return 1; + + if (g->flags & 0x80) + stbi__gif_parse_colortable(s,g->pal, 2 << (g->flags & 7), -1); + + return 1; +} + +static int stbi__gif_info_raw(stbi__context *s, int *x, int *y, int *comp) +{ + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + if (!stbi__gif_header(s, g, comp, 1)) { + STBI_FREE(g); + stbi__rewind( s ); + return 0; + } + if (x) *x = g->w; + if (y) *y = g->h; + STBI_FREE(g); + return 1; +} + +static void stbi__out_gif_code(stbi__gif *g, stbi__uint16 code) +{ + stbi_uc *p, *c; + + // recurse to decode the prefixes, since the linked-list is backwards, + // and working backwards through an interleaved image would be nasty + if (g->codes[code].prefix >= 0) + stbi__out_gif_code(g, g->codes[code].prefix); + + if (g->cur_y >= g->max_y) return; + + p = &g->out[g->cur_x + g->cur_y]; + c = &g->color_table[g->codes[code].suffix * 4]; + + if (c[3] >= 128) { + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = c[3]; + } + g->cur_x += 4; + + if (g->cur_x >= g->max_x) { + g->cur_x = g->start_x; + g->cur_y += g->step; + + while (g->cur_y >= g->max_y && g->parse > 0) { + g->step = (1 << g->parse) * g->line_size; + g->cur_y = g->start_y + (g->step >> 1); + --g->parse; + } + } +} + +static stbi_uc *stbi__process_gif_raster(stbi__context *s, stbi__gif *g) +{ + stbi_uc lzw_cs; + stbi__int32 len, init_code; + stbi__uint32 first; + stbi__int32 codesize, codemask, avail, oldcode, bits, valid_bits, clear; + stbi__gif_lzw *p; + + lzw_cs = stbi__get8(s); + if (lzw_cs > 12) return NULL; + clear = 1 << lzw_cs; + first = 1; + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + bits = 0; + valid_bits = 0; + for (init_code = 0; init_code < clear; init_code++) { + g->codes[init_code].prefix = -1; + g->codes[init_code].first = (stbi_uc) init_code; + g->codes[init_code].suffix = (stbi_uc) init_code; + } + + // support no starting clear code + avail = clear+2; + oldcode = -1; + + len = 0; + for(;;) { + if (valid_bits < codesize) { + if (len == 0) { + len = stbi__get8(s); // start new block + if (len == 0) + return g->out; + } + --len; + bits |= (stbi__int32) stbi__get8(s) << valid_bits; + valid_bits += 8; + } else { + stbi__int32 code = bits & codemask; + bits >>= codesize; + valid_bits -= codesize; + // @OPTIMIZE: is there some way we can accelerate the non-clear path? + if (code == clear) { // clear code + codesize = lzw_cs + 1; + codemask = (1 << codesize) - 1; + avail = clear + 2; + oldcode = -1; + first = 0; + } else if (code == clear + 1) { // end of stream code + stbi__skip(s, len); + while ((len = stbi__get8(s)) > 0) + stbi__skip(s,len); + return g->out; + } else if (code <= avail) { + if (first) return stbi__errpuc("no clear code", "Corrupt GIF"); + + if (oldcode >= 0) { + p = &g->codes[avail++]; + if (avail > 4096) return stbi__errpuc("too many codes", "Corrupt GIF"); + p->prefix = (stbi__int16) oldcode; + p->first = g->codes[oldcode].first; + p->suffix = (code == avail) ? p->first : g->codes[code].first; + } else if (code == avail) + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + + stbi__out_gif_code(g, (stbi__uint16) code); + + if ((avail & codemask) == 0 && avail <= 0x0FFF) { + codesize++; + codemask = (1 << codesize) - 1; + } + + oldcode = code; + } else { + return stbi__errpuc("illegal code in raster", "Corrupt GIF"); + } + } + } +} + +static void stbi__fill_gif_background(stbi__gif *g, int x0, int y0, int x1, int y1) +{ + int x, y; + stbi_uc *c = g->pal[g->bgindex]; + for (y = y0; y < y1; y += 4 * g->w) { + for (x = x0; x < x1; x += 4) { + stbi_uc *p = &g->out[y + x]; + p[0] = c[2]; + p[1] = c[1]; + p[2] = c[0]; + p[3] = 0; + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp) +{ + int i; + stbi_uc *prev_out = 0; + + if (g->out == 0 && !stbi__gif_header(s, g, comp,0)) + return 0; // stbi__g_failure_reason set by stbi__gif_header + + prev_out = g->out; + g->out = (stbi_uc *) stbi__malloc(4 * g->w * g->h); + if (g->out == 0) return stbi__errpuc("outofmem", "Out of memory"); + + switch ((g->eflags & 0x1C) >> 2) { + case 0: // unspecified (also always used on 1st frame) + stbi__fill_gif_background(g, 0, 0, 4 * g->w, 4 * g->w * g->h); + break; + case 1: // do not dispose + if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h); + g->old_out = prev_out; + break; + case 2: // dispose to background + if (prev_out) memcpy(g->out, prev_out, 4 * g->w * g->h); + stbi__fill_gif_background(g, g->start_x, g->start_y, g->max_x, g->max_y); + break; + case 3: // dispose to previous + if (g->old_out) { + for (i = g->start_y; i < g->max_y; i += 4 * g->w) + memcpy(&g->out[i + g->start_x], &g->old_out[i + g->start_x], g->max_x - g->start_x); + } + break; + } + + for (;;) { + switch (stbi__get8(s)) { + case 0x2C: /* Image Descriptor */ + { + int prev_trans = -1; + stbi__int32 x, y, w, h; + stbi_uc *o; + + x = stbi__get16le(s); + y = stbi__get16le(s); + w = stbi__get16le(s); + h = stbi__get16le(s); + if (((x + w) > (g->w)) || ((y + h) > (g->h))) + return stbi__errpuc("bad Image Descriptor", "Corrupt GIF"); + + g->line_size = g->w * 4; + g->start_x = x * 4; + g->start_y = y * g->line_size; + g->max_x = g->start_x + w * 4; + g->max_y = g->start_y + h * g->line_size; + g->cur_x = g->start_x; + g->cur_y = g->start_y; + + g->lflags = stbi__get8(s); + + if (g->lflags & 0x40) { + g->step = 8 * g->line_size; // first interlaced spacing + g->parse = 3; + } else { + g->step = g->line_size; + g->parse = 0; + } + + if (g->lflags & 0x80) { + stbi__gif_parse_colortable(s,g->lpal, 2 << (g->lflags & 7), g->eflags & 0x01 ? g->transparent : -1); + g->color_table = (stbi_uc *) g->lpal; + } else if (g->flags & 0x80) { + if (g->transparent >= 0 && (g->eflags & 0x01)) { + prev_trans = g->pal[g->transparent][3]; + g->pal[g->transparent][3] = 0; + } + g->color_table = (stbi_uc *) g->pal; + } else + return stbi__errpuc("missing color table", "Corrupt GIF"); + + o = stbi__process_gif_raster(s, g); + if (o == NULL) return NULL; + + if (prev_trans != -1) + g->pal[g->transparent][3] = (stbi_uc) prev_trans; + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + if (stbi__get8(s) == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = stbi__get16le(s); + g->transparent = stbi__get8(s); + } else { + stbi__skip(s, len); + break; + } + } + while ((len = stbi__get8(s)) != 0) + stbi__skip(s, len); + break; + } + + case 0x3B: // gif stream termination code + return (stbi_uc *) s; // using '1' causes warning on some compilers + + default: + return stbi__errpuc("unknown code", "Corrupt GIF"); + } + } + + STBI_NOTUSED(req_comp); +} + +static stbi_uc *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *u = 0; + stbi__gif* g = (stbi__gif*) stbi__malloc(sizeof(stbi__gif)); + memset(g, 0, sizeof(*g)); + + u = stbi__gif_load_next(s, g, comp, req_comp); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g->w; + *y = g->h; + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g->w, g->h); + } + else if (g->out) + STBI_FREE(g->out); + STBI_FREE(g); + return u; +} + +static int stbi__gif_info(stbi__context *s, int *x, int *y, int *comp) +{ + return stbi__gif_info_raw(s,x,y,comp); +} +#endif + +// ************************************************************************************************* +// Radiance RGBE HDR loader +// originally by Nicolas Schulz +#ifndef STBI_NO_HDR +static int stbi__hdr_test_core(stbi__context *s) +{ + const char *signature = "#?RADIANCE\n"; + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s); + stbi__rewind(s); + return r; +} + +#define STBI__HDR_BUFLEN 1024 +static char *stbi__hdr_gettoken(stbi__context *z, char *buffer) +{ + int len=0; + char c = '\0'; + + c = (char) stbi__get8(z); + + while (!stbi__at_eof(z) && c != '\n') { + buffer[len++] = c; + if (len == STBI__HDR_BUFLEN-1) { + // flush to end of line + while (!stbi__at_eof(z) && stbi__get8(z) != '\n') + ; + break; + } + c = (char) stbi__get8(z); + } + + buffer[len] = 0; + return buffer; +} + +static void stbi__hdr_convert(float *output, stbi_uc *input, int req_comp) +{ + if ( input[3] != 0 ) { + float f1; + // Exponent + f1 = (float) ldexp(1.0f, input[3] - (int)(128 + 8)); + if (req_comp <= 2) + output[0] = (input[0] + input[1] + input[2]) * f1 / 3; + else { + output[0] = input[0] * f1; + output[1] = input[1] * f1; + output[2] = input[2] * f1; + } + if (req_comp == 2) output[1] = 1; + if (req_comp == 4) output[3] = 1; + } else { + switch (req_comp) { + case 4: output[3] = 1; /* fallthrough */ + case 3: output[0] = output[1] = output[2] = 0; + break; + case 2: output[1] = 1; /* fallthrough */ + case 1: output[0] = 0; + break; + } + } +} + +static float *stbi__hdr_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + int width, height; + stbi_uc *scanline; + float *hdr_data; + int len; + unsigned char count, value; + int i, j, k, c1,c2, z; + + + // Check identifier + if (strcmp(stbi__hdr_gettoken(s,buffer), "#?RADIANCE") != 0) + return stbi__errpf("not HDR", "Corrupt HDR image"); + + // Parse header + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) return stbi__errpf("unsupported format", "Unsupported HDR format"); + + // Parse width and height + // can't use sscanf() if we're not using stdio! + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + height = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) return stbi__errpf("unsupported data layout", "Unsupported HDR format"); + token += 3; + width = (int) strtol(token, NULL, 10); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + // Read data + hdr_data = (float *) stbi__malloc(height * width * req_comp * sizeof(float)); + + // Load image data + // image data is stored as some number of sca + if ( width < 8 || width >= 32768) { + // Read flat data + for (j=0; j < height; ++j) { + for (i=0; i < width; ++i) { + stbi_uc rgbe[4]; + main_decode_loop: + stbi__getn(s, rgbe, 4); + stbi__hdr_convert(hdr_data + j * width * req_comp + i * req_comp, rgbe, req_comp); + } + } + } else { + // Read RLE-encoded data + scanline = NULL; + + for (j = 0; j < height; ++j) { + c1 = stbi__get8(s); + c2 = stbi__get8(s); + len = stbi__get8(s); + if (c1 != 2 || c2 != 2 || (len & 0x80)) { + // not run-length encoded, so we have to actually use THIS data as a decoded + // pixel (note this can't be a valid pixel--one of RGB must be >= 128) + stbi_uc rgbe[4]; + rgbe[0] = (stbi_uc) c1; + rgbe[1] = (stbi_uc) c2; + rgbe[2] = (stbi_uc) len; + rgbe[3] = (stbi_uc) stbi__get8(s); + stbi__hdr_convert(hdr_data, rgbe, req_comp); + i = 1; + j = 0; + STBI_FREE(scanline); + goto main_decode_loop; // yes, this makes no sense + } + len <<= 8; + len |= stbi__get8(s); + if (len != width) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("invalid decoded scanline length", "corrupt HDR"); } + if (scanline == NULL) scanline = (stbi_uc *) stbi__malloc(width * 4); + + for (k = 0; k < 4; ++k) { + i = 0; + while (i < width) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = stbi__get8(s); + } + } + } + for (i=0; i < width; ++i) + stbi__hdr_convert(hdr_data+(j*width + i)*req_comp, scanline + i*4, req_comp); + } + STBI_FREE(scanline); + } + + return hdr_data; +} + +static int stbi__hdr_info(stbi__context *s, int *x, int *y, int *comp) +{ + char buffer[STBI__HDR_BUFLEN]; + char *token; + int valid = 0; + + if (stbi__hdr_test(s) == 0) { + stbi__rewind( s ); + return 0; + } + + for(;;) { + token = stbi__hdr_gettoken(s,buffer); + if (token[0] == 0) break; + if (strcmp(token, "FORMAT=32-bit_rle_rgbe") == 0) valid = 1; + } + + if (!valid) { + stbi__rewind( s ); + return 0; + } + token = stbi__hdr_gettoken(s,buffer); + if (strncmp(token, "-Y ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *y = (int) strtol(token, &token, 10); + while (*token == ' ') ++token; + if (strncmp(token, "+X ", 3)) { + stbi__rewind( s ); + return 0; + } + token += 3; + *x = (int) strtol(token, NULL, 10); + *comp = 3; + return 1; +} +#endif // STBI_NO_HDR + +#ifndef STBI_NO_BMP +static int stbi__bmp_info(stbi__context *s, int *x, int *y, int *comp) +{ + void *p; + stbi__bmp_data info; + + info.all_a = 255; + p = stbi__bmp_parse_header(s, &info); + stbi__rewind( s ); + if (p == NULL) + return 0; + *x = s->img_x; + *y = s->img_y; + *comp = info.ma ? 4 : 3; + return 1; +} +#endif + +#ifndef STBI_NO_PSD +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp) +{ + int channelCount; + if (stbi__get32be(s) != 0x38425053) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 1) { + stbi__rewind( s ); + return 0; + } + stbi__skip(s, 6); + channelCount = stbi__get16be(s); + if (channelCount < 0 || channelCount > 16) { + stbi__rewind( s ); + return 0; + } + *y = stbi__get32be(s); + *x = stbi__get32be(s); + if (stbi__get16be(s) != 8) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} +#endif + +#ifndef STBI_NO_PIC +static int stbi__pic_info(stbi__context *s, int *x, int *y, int *comp) +{ + int act_comp=0,num_packets=0,chained; + stbi__pic_packet packets[10]; + + if (!stbi__pic_is4(s,"\x53\x80\xF6\x34")) { + stbi__rewind(s); + return 0; + } + + stbi__skip(s, 88); + + *x = stbi__get16be(s); + *y = stbi__get16be(s); + if (stbi__at_eof(s)) { + stbi__rewind( s); + return 0; + } + if ( (*x) != 0 && (1 << 28) / (*x) < (*y)) { + stbi__rewind( s ); + return 0; + } + + stbi__skip(s, 8); + + do { + stbi__pic_packet *packet; + + if (num_packets==sizeof(packets)/sizeof(packets[0])) + return 0; + + packet = &packets[num_packets++]; + chained = stbi__get8(s); + packet->size = stbi__get8(s); + packet->type = stbi__get8(s); + packet->channel = stbi__get8(s); + act_comp |= packet->channel; + + if (stbi__at_eof(s)) { + stbi__rewind( s ); + return 0; + } + if (packet->size != 8) { + stbi__rewind( s ); + return 0; + } + } while (chained); + + *comp = (act_comp & 0x10 ? 4 : 3); + + return 1; +} +#endif + +// ************************************************************************************************* +// Portable Gray Map and Portable Pixel Map loader +// by Ken Miller +// +// PGM: http://netpbm.sourceforge.net/doc/pgm.html +// PPM: http://netpbm.sourceforge.net/doc/ppm.html +// +// Known limitations: +// Does not support comments in the header section +// Does not support ASCII image data (formats P2 and P3) +// Does not support 16-bit-per-channel + +#ifndef STBI_NO_PNM + +static int stbi__pnm_test(stbi__context *s) +{ + char p, t; + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + return 1; +} + +static stbi_uc *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi_uc *out; + if (!stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n)) + return 0; + *x = s->img_x; + *y = s->img_y; + *comp = s->img_n; + + out = (stbi_uc *) stbi__malloc(s->img_n * s->img_x * s->img_y); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + stbi__getn(s, out, s->img_n * s->img_x * s->img_y); + + if (req_comp && req_comp != s->img_n) { + out = stbi__convert_format(out, s->img_n, req_comp, s->img_x, s->img_y); + if (out == NULL) return out; // stbi__convert_format frees input on failure + } + return out; +} + +static int stbi__pnm_isspace(char c) +{ + return c == ' ' || c == '\t' || c == '\n' || c == '\v' || c == '\f' || c == '\r'; +} + +static void stbi__pnm_skip_whitespace(stbi__context *s, char *c) +{ + for (;;) { + while (!stbi__at_eof(s) && stbi__pnm_isspace(*c)) + *c = (char) stbi__get8(s); + + if (stbi__at_eof(s) || *c != '#') + break; + + while (!stbi__at_eof(s) && *c != '\n' && *c != '\r' ) + *c = (char) stbi__get8(s); + } +} + +static int stbi__pnm_isdigit(char c) +{ + return c >= '0' && c <= '9'; +} + +static int stbi__pnm_getinteger(stbi__context *s, char *c) +{ + int value = 0; + + while (!stbi__at_eof(s) && stbi__pnm_isdigit(*c)) { + value = value*10 + (*c - '0'); + *c = (char) stbi__get8(s); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv; + char c, p, t; + + stbi__rewind( s ); + + // Get identifier + p = (char) stbi__get8(s); + t = (char) stbi__get8(s); + if (p != 'P' || (t != '5' && t != '6')) { + stbi__rewind( s ); + return 0; + } + + *comp = (t == '6') ? 3 : 1; // '5' is 1-component .pgm; '6' is 3-component .ppm + + c = (char) stbi__get8(s); + stbi__pnm_skip_whitespace(s, &c); + + *x = stbi__pnm_getinteger(s, &c); // read width + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + + if (maxv > 255) + return stbi__err("max value > 255", "PPM image not 8-bit"); + else + return 1; +} +#endif + +static int stbi__info_main(stbi__context *s, int *x, int *y, int *comp) +{ + #ifndef STBI_NO_JPEG + if (stbi__jpeg_info(s, x, y, comp)) return 1; + #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! + #ifndef STBI_NO_TGA + if (stbi__tga_info(s, x, y, comp)) + return 1; + #endif + return stbi__err("unknown image type", "Image not of any known type, or corrupt"); +} + +#ifndef STBI_NO_STDIO +STBIDEF int stbi_info(char const *filename, int *x, int *y, int *comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_info_from_file(f, x, y, comp); + fclose(f); + return result; +} + +STBIDEF int stbi_info_from_file(FILE *f, int *x, int *y, int *comp) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__info_main(&s,x,y,comp); + fseek(f,pos,SEEK_SET); + return r; +} +#endif // !STBI_NO_STDIO + +STBIDEF int stbi_info_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__info_main(&s,x,y,comp); +} + +STBIDEF int stbi_info_from_callbacks(stbi_io_callbacks const *c, void *user, int *x, int *y, int *comp) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__info_main(&s,x,y,comp); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) allocate large structures on the stack + remove white matting for transparent PSD + fix reported channel count for PNG & BMP + re-enable SSE2 in non-gcc 64-bit + support RGB-formatted JPEG + read 16-bit PNGs (only as 8-bit) + 2.10 (2016-01-22) avoid warning introduced in 2.09 by STBI_REALLOC_SIZED + 2.09 (2016-01-16) allow comments in PNM files + 16-bit-per-pixel TGA (not bit-per-component) + info() for TGA could break due to .hdr handling + info() for BMP to shares code instead of sloppy parse + can use STBI_REALLOC_SIZED if allocator doesn't support realloc + code cleanup + 2.08 (2015-09-13) fix to 2.07 cleanup, reading RGB PSD as RGBA + 2.07 (2015-09-13) fix compiler warnings + partial animated GIF support + limited 16-bpc PSD support + #ifdef unused functions + bug with < 92 byte PIC,PNM,HDR,TGA + 2.06 (2015-04-19) fix bug where PSD returns wrong '*comp' value + 2.05 (2015-04-19) fix bug in progressive JPEG handling, fix warning + 2.04 (2015-04-15) try to re-enable SIMD on MinGW 64-bit + 2.03 (2015-04-12) extra corruption checking (mmozeiko) + stbi_set_flip_vertically_on_load (nguillemot) + fix NEON support; fix mingw support + 2.02 (2015-01-19) fix incorrect assert, fix warning + 2.01 (2015-01-17) fix various warnings; suppress SIMD on gcc 32-bit without -msse2 + 2.00b (2014-12-25) fix STBI_MALLOC in progressive JPEG + 2.00 (2014-12-25) optimize JPG, including x86 SSE2 & NEON SIMD (ryg) + progressive JPEG (stb) + PGM/PPM support (Ken Miller) + STBI_MALLOC,STBI_REALLOC,STBI_FREE + GIF bugfix -- seemingly never worked + STBI_NO_*, STBI_ONLY_* + 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) + optimize PNG (ryg) + fix bug in interlaced PNG with user-specified channel count (stb) + 1.46 (2014-08-26) + fix broken tRNS chunk (colorkey-style transparency) in non-paletted PNG + 1.45 (2014-08-16) + fix MSVC-ARM internal compiler error by wrapping malloc + 1.44 (2014-08-07) + various warning fixes from Ronny Chevalier + 1.43 (2014-07-15) + fix MSVC-only compiler problem in code changed in 1.42 + 1.42 (2014-07-09) + don't define _CRT_SECURE_NO_WARNINGS (affects user code) + fixes to stbi__cleanup_jpeg path + added STBI_ASSERT to avoid requiring assert.h + 1.41 (2014-06-25) + fix search&replace from 1.36 that messed up comments/error messages + 1.40 (2014-06-22) + fix gcc struct-initialization warning + 1.39 (2014-06-15) + fix to TGA optimization when req_comp != number of components in TGA; + fix to GIF loading because BMP wasn't rewinding (whoops, no GIFs in my test suite) + add support for BMP version 5 (more ignored fields) + 1.38 (2014-06-06) + suppress MSVC warnings on integer casts truncating values + fix accidental rename of 'skip' field of I/O + 1.37 (2014-06-04) + remove duplicate typedef + 1.36 (2014-06-03) + convert to header file single-file library + if de-iphone isn't set, load iphone images color-swapped instead of returning NULL + 1.35 (2014-05-27) + various warnings + fix broken STBI_SIMD path + fix bug where stbi_load_from_file no longer left file pointer in correct place + fix broken non-easy path for 32-bit BMP (possibly never used) + TGA optimization by Arseny Kapoulkine + 1.34 (unknown) + use STBI_NOTUSED in stbi__resample_row_generic(), fix one more leak in tga failure case + 1.33 (2011-07-14) + make stbi_is_hdr work in STBI_NO_HDR (as specified), minor compiler-friendly improvements + 1.32 (2011-07-13) + support for "info" function for all supported filetypes (SpartanJ) + 1.31 (2011-06-20) + a few more leak fixes, bug in PNG handling (SpartanJ) + 1.30 (2011-06-11) + added ability to load files via callbacks to accomidate custom input streams (Ben Wenger) + removed deprecated format-specific test/load functions + removed support for installable file formats (stbi_loader) -- would have been broken for IO callbacks anyway + error cases in bmp and tga give messages and don't leak (Raymond Barbiero, grisha) + fix inefficiency in decoding 32-bit BMP (David Woo) + 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-stbi_uc to fix warnings + 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 on platforms with lock-heavy fgetc() + minor perf improvements for jpeg + deprecated type-specific functions so we'll get feedback if they're needed + attempt to fix trans_data warning (Won Chun) + 1.23 fixed bug in iPhone support + 1.22 (2010-07-10) + removed image *writing* support + 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 (i.stbi__err. Janez (U+017D)emva) + 1.21 fix use of 'stbi_uc' in header (reported by jon blow) + 1.20 added support for Softimage PIC, by Tom Seddon + 1.19 bug in interlaced PNG corruption check (found by ryg) + 1.18 (2008-08-02) + fix a threading bug (local mutable static) + 1.17 support interlaced PNG + 1.16 major bugfix - stbi__convert_format converted one too many pixels + 1.15 initialize some fields for thread safety + 1.14 fix threadsafe conversion bug + header-file-only version (#define STBI_HEADER_FILE_ONLY before including) + 1.13 threadsafe + 1.12 const qualifiers in the API + 1.11 Support installable IDCT, colorspace conversion routines + 1.10 Fixes for 64-bit (don't use "unsigned long") + optimized upsampling by Fabian "ryg" Giesen + 1.09 Fix format-conversion for PSD code (bad global variables!) + 1.08 Thatcher Ulrich's PSD code integrated by Nicolas Schulz + 1.07 attempt to fix C++ warning/errors again + 1.06 attempt to fix C++ warning/errors again + 1.05 fix TGA loading to return correct *comp and use good luminance calc + 1.04 default float alpha is 1, not 255; use 'void *' for stbi_image_free + 1.03 bugfixes to STBI_NO_STDIO, STBI_NO_HDR + 1.02 support for (subset of) HDR files, float interface for preferred access to them + 1.01 fix bug: possible bug in handling right-side up bmps... not sure + fix bug: the stbi__bmp_load() and stbi__tga_load() functions didn't work at all + 1.00 interface to zlib that skips zlib header + 0.99 correct handling of alpha in palette + 0.98 TGA loader by lonesock; dynamically add loaders (untested) + 0.97 jpeg errors on too large a file; also catch another malloc failure + 0.96 fix detection of invalid v value - particleman@mollyrocket forum + 0.95 during header scan, seek to markers in case of padding + 0.94 STBI_NO_STDIO to disable stdio usage; rename all #defines the same + 0.93 handle jpegtran output; verbose errors + 0.92 read 4,8,16,24,32-bit BMP files of several formats + 0.91 output 24-bit Windows 3.0 BMP files + 0.90 fix a few more warnings; bump version number to approach 1.0 + 0.61 bugfixes due to Marc LeBlanc, Christopher Lloyd + 0.60 fix compiling as c++ + 0.59 fix warnings: merge Dave Moore's -Wall fixes + 0.58 fix bug: zlib uncompressed mode len/nlen was wrong endian + 0.57 fix bug: jpg last huffman symbol before marker was >9 bits but less than 16 available + 0.56 fix bug: zlib uncompressed mode len vs. nlen + 0.55 fix bug: restart_interval not initialized to 0 + 0.54 allow NULL for 'int *comp' + 0.53 fix bug in png 3->4; speedup png decoding + 0.52 png handles req_comp=3,4 directly; minor cleanup; jpeg comments + 0.51 obey req_comp requests, 1-component jpegs return as 1-component, + on 'test' only check type, not whether we support this variant + 0.50 (2006-11-19) + first released version +*/ diff --git a/OpenGL2/terrain.png b/OpenGL2/terrain.png new file mode 100644 index 0000000000000000000000000000000000000000..9b88eecc3c6e621ccf80b91470746c57d535bd82 GIT binary patch literal 88395 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

|>e@ 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 jT`w=>KUiS1c35(5ey@~WoUc#;_OQ5YeW}*O