From 11d4aac4ce9b499d1e6a428740b4fc4a66c98b86 Mon Sep 17 00:00:00 2001 From: Djalim Simaila Date: Wed, 15 Oct 2025 08:17:32 +0200 Subject: [PATCH] added the other files --- CMakeLists.txt | 18 + assets/shaders/fragment.glsl | 11 + assets/shaders/vertex.glsl | 13 + assets/textures/prof.png | Bin 0 -> 361581 bytes include/ShaderProgram.h | 35 + include/Texture2D.h | 20 + include/engine.h | 60 + include/loops.h | 15 + include/stb_image/stb_image.h | 7988 +++++++++++++++++++++++++++++++++ src/core/ShaderProgram.cpp | 95 + src/core/Texture2D.cpp | 52 + src/core/callbacks.cpp | 29 + src/core/engine.cpp | 106 + src/core/hints.cpp | 9 + src/loops/cube.cpp | 68 + src/loops/rainbowWindow.cpp | 32 + src/loops/rbgTriangle.cpp | 12 + src/main.cpp | 7 + src/onCreate.cpp | 76 + src/onDestroy.cpp | 5 + src/onUpdate.cpp | 10 + src/utils/showFps.cpp | 26 + 22 files changed, 8687 insertions(+) create mode 100644 CMakeLists.txt create mode 100644 assets/shaders/fragment.glsl create mode 100644 assets/shaders/vertex.glsl create mode 100644 assets/textures/prof.png create mode 100644 include/ShaderProgram.h create mode 100644 include/Texture2D.h create mode 100644 include/engine.h create mode 100644 include/loops.h create mode 100644 include/stb_image/stb_image.h create mode 100644 src/core/ShaderProgram.cpp create mode 100644 src/core/Texture2D.cpp create mode 100644 src/core/callbacks.cpp create mode 100644 src/core/engine.cpp create mode 100644 src/core/hints.cpp create mode 100644 src/loops/cube.cpp create mode 100644 src/loops/rainbowWindow.cpp create mode 100644 src/loops/rbgTriangle.cpp create mode 100644 src/main.cpp create mode 100644 src/onCreate.cpp create mode 100644 src/onDestroy.cpp create mode 100644 src/onUpdate.cpp create mode 100644 src/utils/showFps.cpp diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..e502e17 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,18 @@ +cmake_minimum_required(VERSION 3.5) +project(CoursOpenGl) + +file(GLOB_RECURSE SRC src/*) +file(GLOB_RECURSE HEADERS include/*) + +find_package(GLEW REQUIRED) +include_directories(${GLEW_INCLUDE_DIRS}) +add_executable(CoursOpenGl ${LIB_HEADERS} ${HEADERS} ${SRC}) + +find_package(OpenGL REQUIRED) +find_package(glfw3 3.4 REQUIRED) + + +target_include_directories(CoursOpenGl PUBLIC ${CMAKE_SOURCE_DIR}/include) +target_link_libraries(CoursOpenGl glfw OpenGL::GL -lGLU ${GLEW_LIBRARIES}) +target_link_directories(CoursOpenGl PUBLIC .) + diff --git a/assets/shaders/fragment.glsl b/assets/shaders/fragment.glsl new file mode 100644 index 0000000..5c910e4 --- /dev/null +++ b/assets/shaders/fragment.glsl @@ -0,0 +1,11 @@ +#version 330 core +out vec4 FragColor; +in vec2 TexCoord; + +uniform sampler2D ourTexture; + +void main() +{ + //FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f); + FragColor = texture(ourTexture, TexCoord); +} diff --git a/assets/shaders/vertex.glsl b/assets/shaders/vertex.glsl new file mode 100644 index 0000000..ee3b497 --- /dev/null +++ b/assets/shaders/vertex.glsl @@ -0,0 +1,13 @@ +#version 330 core +layout (location = 0) in vec3 aPos; +layout (location = 1) in vec2 aTexCoord; +out vec2 TexCoord; +uniform mat4 model; +uniform mat4 view; +uniform mat4 projection; + +void main() +{ + gl_Position = projection * view * model * vec4(aPos, 1.0); + TexCoord = aTexCoord; +} diff --git a/assets/textures/prof.png b/assets/textures/prof.png new file mode 100644 index 0000000000000000000000000000000000000000..1aac6cc4130f6cb795c23410f742c1511426fb1d GIT binary patch literal 361581 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

VNw2_TqG&*z%W)*7c2fWYY< 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

eA%cM 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%0D)Ice>{o`H1p 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

T{r*n^ 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

}>!)W`IR#!& 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 +#include +#include +#include + +namespace djalim { + class ShaderProgram { + public: + ShaderProgram(); + ~ShaderProgram(); + + bool loadShaders(const char* vertexShaderFile, const char* fragmentShaderFile); + void use(); + + void setUniform(const std::string& name, float value); + void setUniform(const std::string& name, int value); + void setUniform(const std::string& name, const glm::vec2& value); + void setUniform(const std::string& name, const glm::vec3& value); + void setUniform(const std::string& name, const glm::vec4& value); + void setUniform(const std::string& name, const glm::mat4& value); + + GLuint getProgram() const { return mHandle; } + + private: + std::string fileToString(const std::string& filename); + void checkCompileErrors(GLuint shader, std::string type); + + GLuint mHandle; + }; +} + +#endif // SHADERPROGRAM_H diff --git a/include/Texture2D.h b/include/Texture2D.h new file mode 100644 index 0000000..94c885e --- /dev/null +++ b/include/Texture2D.h @@ -0,0 +1,20 @@ +#ifndef TEXTURE2D_H +#define TEXTURE2D_H +#include + +#include +#include + +class Texture2D { +public: + Texture2D(); + ~Texture2D(); + + bool loadTexture(const std::string& filename, bool generateMipmaps = true); + void bind(GLuint texUnit = 0); + +private: + GLuint mTexture; +}; + +#endif // TEXTURE2D_H diff --git a/include/engine.h b/include/engine.h new file mode 100644 index 0000000..2c2f6f6 --- /dev/null +++ b/include/engine.h @@ -0,0 +1,60 @@ +#ifndef ENGINE_H +#define ENGINE_H + +#include +#include +#include "ShaderProgram.h" +#include "Texture2D.h" +#include +#include +#include + +#define NBCALLBACKS 1 + +typedef void (*KeyCallback)(GLFWwindow* window, int key, int scancode, int action, int mods); + +struct Object3D { + Texture2D texture; + GLuint VBO; + GLuint VAO; +}; + +typedef std::map Objects3D; + +static bool gWireframe = false; + +namespace djalim { + + class OpenGlEngine{ + + public: + + void start(); + OpenGlEngine( const char* title, int width, int height); + ~OpenGlEngine(); + + GLFWwindow* window; + double previousSeconds = 0.0; + double elapsedSeconds; + int frameCount = 0; + std::map textures; + ShaderProgram shaderProgram; + + Objects3D objects; + + unsigned int VBO; + unsigned int VAO; + + bool gWireframe = false; + + void onUpdate(); + void loadHints(); + void createObject(std::string name, std::string textures, std::vector& vertices); + void loadCallbacks(); + void showFps(); + void onCreate(); + void onDestroy(); + }; +} + +#endif // ENGINE_H diff --git a/include/loops.h b/include/loops.h new file mode 100644 index 0000000..c2cb4e2 --- /dev/null +++ b/include/loops.h @@ -0,0 +1,15 @@ +#ifndef LOOPS_H +#define LOOPS_H +#include "ShaderProgram.h" +#include "Texture2D.h" +#include "engine.h" +#include + +namespace djalim { + void rainbowWindow(double elapsedSeconds); + void rgbTriangle(djalim::ShaderProgram shaderProgram, unsigned int VAO); + //void cube(GLFWwindow* window, djalim::ShaderProgram shader, GLuint VAO, std::map& textures); + void cube(GLFWwindow* window, djalim::ShaderProgram shader, Objects3D& objects); +} + +#endif // LOOPS_H diff --git a/include/stb_image/stb_image.h b/include/stb_image/stb_image.h new file mode 100644 index 0000000..9eedabe --- /dev/null +++ b/include/stb_image/stb_image.h @@ -0,0 +1,7988 @@ +/* stb_image - v2.30 - public domain image loader - http://nothings.org/stb + no warranty implied; use at your own risk + + Do this: + #define STB_IMAGE_IMPLEMENTATION + before you include this file in *one* C or C++ file to create the implementation. + + // i.e. it should look like this: + #include ... + #include ... + #include ... + #define STB_IMAGE_IMPLEMENTATION + #include "stb_image.h" + + You can #define STBI_ASSERT(x) before the #include to avoid using assert.h. + And #define STBI_MALLOC, STBI_REALLOC, and STBI_FREE to avoid using malloc,realloc,free + + + QUICK NOTES: + Primarily of interest to game developers and other people who can + avoid problematic images and only need the trivial interface + + JPEG baseline & progressive (12 bpc/arithmetic not supported, same as stock IJG lib) + PNG 1/2/4/8/16-bit-per-channel + + TGA (not sure what subset, if a subset) + BMP non-1bpp, non-RLE + PSD (composited view only, no extra channels, 8/16 bit-per-channel) + + GIF (*comp always reports as 4-channel) + HDR (radiance rgbE format) + PIC (Softimage PIC) + PNM (PPM and PGM binary only) + + Animated GIF still needs a proper API, but here's one way to do it: + http://gist.github.com/urraka/685d9a6340b26b830d49 + + - decode from memory or through FILE (define STBI_NO_STDIO to remove code) + - decode from arbitrary I/O callbacks + - SIMD acceleration on x86/x64 (SSE2) and ARM (NEON) + + Full documentation under "DOCUMENTATION" below. + + +LICENSE + + See end of file for license information. + +RECENT REVISION HISTORY: + + 2.30 (2024-05-31) avoid erroneous gcc warning + 2.29 (2023-05-xx) optimizations + 2.28 (2023-01-29) many error fixes, security errors, just tons of stuff + 2.27 (2021-07-11) document stbi_info better, 16-bit PNM support, bug fixes + 2.26 (2020-07-13) many minor fixes + 2.25 (2020-02-02) fix warnings + 2.24 (2020-02-02) fix warnings; thread-local failure_reason and flip_vertically + 2.23 (2019-08-11) fix clang static analysis warning + 2.22 (2019-03-04) gif fixes, fix warnings + 2.21 (2019-02-25) fix typo in comment + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) bugfix, 1-bit BMP, 16-bitness query, fix warnings + 2.16 (2017-07-23) all functions have 16-bit variants; optimizations; bugfixes + 2.15 (2017-03-18) fix png-1,2,4; all Imagenet JPGs; no runtime SSE detection on GCC + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-12-04) experimental 16-bit API, only for PNG so far; fixes + 2.12 (2016-04-02) fix typo in 2.11 PSD fix that caused crashes + 2.11 (2016-04-02) 16-bit PNGS; enable SSE2 in non-gcc x64 + RGB-format JPEG; remove white matting in PSD; + allocate large structures on the stack; + correct channel count for PNG & BMP + 2.10 (2016-01-22) avoid warning introduced in 2.09 + 2.09 (2016-01-16) 16-bit TGA; comments in PNM files; STBI_REALLOC_SIZED + + See end of file for full revision history. + + + ============================ Contributors ========================= + + Image formats Extensions, features + Sean Barrett (jpeg, png, bmp) Jetro Lauha (stbi_info) + Nicolas Schulz (hdr, psd) Martin "SpartanJ" Golini (stbi_info) + Jonathan Dummer (tga) James "moose2000" Brown (iPhone PNG) + Jean-Marc Lienher (gif) Ben "Disch" Wenger (io callbacks) + Tom Seddon (pic) Omar Cornut (1/2/4-bit PNG) + Thatcher Ulrich (psd) Nicolas Guillemot (vertical flip) + Ken Miller (pgm, ppm) Richard Mitton (16-bit PSD) + github:urraka (animated gif) Junggon Kim (PNM comments) + Christopher Forseth (animated gif) Daniel Gibson (16-bit TGA) + socks-the-fox (16-bit PNG) + Jeremy Sawicki (handle all ImageNet JPGs) + Optimizations & bugfixes Mikhail Morozov (1-bit BMP) + Fabian "ryg" Giesen Anael Seghezzi (is-16-bit query) + Arseny Kapoulkine Simon Breuss (16-bit PNM) + John-Mark Allen + Carmelo J Fdez-Aguera + + Bug & warning fixes + Marc LeBlanc David Woo Guillaume George Martins Mozeiko + Christpher Lloyd Jerry Jansson Joseph Thomson Blazej Dariusz Roszkowski + Phil Jordan Dave Moore Roy Eltham + Hayaki Saito Nathan Reed Won Chun + Luke Graham Johan Duparc Nick Verigakis the Horde3D community + Thomas Ruf Ronny Chevalier github:rlyeh + Janez Zemva John Bartholomew Michal Cichon github:romigrou + Jonathan Blow Ken Hamada Tero Hanninen github:svdijk + Eugene Golushkov Laurent Gomila Cort Stratton github:snagar + Aruelien Pocheville Sergio Gonzalez Thibault Reuille github:Zelex + Cass Everitt Ryamond Barbiero github:grim210 + Paul Du Bois Engin Manap Aldo Culquicondor github:sammyhw + Philipp Wiesemann Dale Weiler Oriol Ferrer Mesia github:phprus + Josh Tobin Neil Bickford Matthew Gregan github:poppolopoppo + Julian Raschke Gregory Mullen Christian Floisand github:darealshinji + Baldur Karlsson Kevin Schmidt JR Smith github:Michaelangel007 + Brad Weinberger Matvey Cherevko github:mosra + Luca Sas Alexander Veselov Zack Middleton [reserved] + Ryan C. Gordon [reserved] [reserved] + DO NOT ADD YOUR NAME HERE + + Jacko Dirks + + To add your name to the credits, pick a random blank space in the middle and fill it. + 80% of merge conflicts on stb PRs are due to people adding their name at the end + of the credits. +*/ + +#ifndef STBI_INCLUDE_STB_IMAGE_H +#define STBI_INCLUDE_STB_IMAGE_H + +// DOCUMENTATION +// +// Limitations: +// - no 12-bit-per-channel JPEG +// - no JPEGs with arithmetic coding +// - GIF always returns *comp=4 +// +// Basic usage (see HDR discussion below for HDR usage): +// int x,y,n; +// unsigned char *data = stbi_load(filename, &x, &y, &n, 0); +// // ... process data if not NULL ... +// // ... x = width, y = height, n = # 8-bit components per pixel ... +// // ... replace '0' with '1'..'4' to force that many components per pixel +// // ... but 'n' will always be the number that it would have been if you said 0 +// stbi_image_free(data); +// +// Standard parameters: +// int *x -- outputs image width in pixels +// int *y -- outputs image height in pixels +// int *channels_in_file -- outputs # of image components in image file +// int desired_channels -- if non-zero, # of image components requested in result +// +// The return value from an image loader is an 'unsigned char *' which points +// to the pixel data, or NULL on an allocation failure or if the image is +// corrupt or invalid. The pixel data consists of *y scanlines of *x pixels, +// with each pixel consisting of N interleaved 8-bit components; the first +// pixel pointed to is top-left-most in the image. There is no padding between +// image scanlines or between pixels, regardless of format. The number of +// components N is 'desired_channels' if desired_channels is non-zero, or +// *channels_in_file otherwise. If desired_channels is non-zero, +// *channels_in_file has the number of components that _would_ have been +// output otherwise. E.g. if you set desired_channels to 4, you will always +// get RGBA output, but you can check *channels_in_file to see if it's trivially +// opaque because e.g. there were only 3 channels in the source image. +// +// An output image with N components has the following components interleaved +// in this order in each pixel: +// +// N=#comp components +// 1 grey +// 2 grey, alpha +// 3 red, green, blue +// 4 red, green, blue, alpha +// +// If image loading fails for any reason, the return value will be NULL, +// and *x, *y, *channels_in_file will be unchanged. The function +// stbi_failure_reason() can be queried for an extremely brief, end-user +// unfriendly explanation of why the load failed. Define STBI_NO_FAILURE_STRINGS +// to avoid compiling these strings at all, and STBI_FAILURE_USERMSG to get slightly +// more user-friendly ones. +// +// Paletted PNG, BMP, GIF, and PIC images are automatically depalettized. +// +// To query the width, height and component count of an image without having to +// decode the full file, you can use the stbi_info family of functions: +// +// int x,y,n,ok; +// ok = stbi_info(filename, &x, &y, &n); +// // returns ok=1 and sets x, y, n if image is a supported format, +// // 0 otherwise. +// +// Note that stb_image pervasively uses ints in its public API for sizes, +// including sizes of memory buffers. This is now part of the API and thus +// hard to change without causing breakage. As a result, the various image +// loaders all have certain limits on image size; these differ somewhat +// by format but generally boil down to either just under 2GB or just under +// 1GB. When the decoded image would be larger than this, stb_image decoding +// will fail. +// +// Additionally, stb_image will reject image files that have any of their +// dimensions set to a larger value than the configurable STBI_MAX_DIMENSIONS, +// which defaults to 2**24 = 16777216 pixels. Due to the above memory limit, +// the only way to have an image with such dimensions load correctly +// is for it to have a rather extreme aspect ratio. Either way, the +// assumption here is that such larger images are likely to be malformed +// or malicious. If you do need to load an image with individual dimensions +// larger than that, and it still fits in the overall size limit, you can +// #define STBI_MAX_DIMENSIONS on your own to be something larger. +// +// =========================================================================== +// +// UNICODE: +// +// If compiling for Windows and you wish to use Unicode filenames, compile +// with +// #define STBI_WINDOWS_UTF8 +// and pass utf8-encoded filenames. Call stbi_convert_wchar_to_utf8 to convert +// Windows wchar_t filenames to utf8. +// +// =========================================================================== +// +// Philosophy +// +// stb libraries are designed with the following priorities: +// +// 1. easy to use +// 2. easy to maintain +// 3. good performance +// +// Sometimes I let "good performance" creep up in priority over "easy to maintain", +// and for best performance I may provide less-easy-to-use APIs that give higher +// performance, in addition to the easy-to-use ones. Nevertheless, it's important +// to keep in mind that from the standpoint of you, a client of this library, +// all you care about is #1 and #3, and stb libraries DO NOT emphasize #3 above all. +// +// Some secondary priorities arise directly from the first two, some of which +// provide more explicit reasons why performance can't be emphasized. +// +// - Portable ("ease of use") +// - Small source code footprint ("easy to maintain") +// - No dependencies ("ease of use") +// +// =========================================================================== +// +// I/O callbacks +// +// I/O callbacks allow you to read from arbitrary sources, like packaged +// files or some other source. Data read from callbacks are processed +// through a small internal buffer (currently 128 bytes) to try to reduce +// overhead. +// +// The three functions you must define are "read" (reads some bytes of data), +// "skip" (skips some bytes of data), "eof" (reports if the stream is at the end). +// +// =========================================================================== +// +// SIMD support +// +// The JPEG decoder will try to automatically use SIMD kernels on x86 when +// supported by the compiler. For ARM Neon support, you must explicitly +// request it. +// +// (The old do-it-yourself SIMD API is no longer supported in the current +// code.) +// +// On x86, SSE2 will automatically be used when available based on a run-time +// test; if not, the generic C versions are used as a fall-back. On ARM targets, +// the typical path is to have separate builds for NEON and non-NEON devices +// (at least this is true for iOS and Android). Therefore, the NEON support is +// toggled by a build flag: define STBI_NEON to get NEON loops. +// +// If for some reason you do not want to use any of SIMD code, or if +// you have issues compiling it, you can disable it entirely by +// defining STBI_NO_SIMD. +// +// =========================================================================== +// +// HDR image support (disable by defining STBI_NO_HDR) +// +// stb_image supports loading HDR images in general, and currently the Radiance +// .HDR file format specifically. You can still load any file through the existing +// interface; if you attempt to load an HDR file, it will be automatically remapped +// to LDR, assuming gamma 2.2 and an arbitrary scale factor defaulting to 1; +// both of these constants can be reconfigured through this interface: +// +// stbi_hdr_to_ldr_gamma(2.2f); +// stbi_hdr_to_ldr_scale(1.0f); +// +// (note, do not use _inverse_ constants; stbi_image will invert them +// appropriately). +// +// Additionally, there is a new, parallel interface for loading files as +// (linear) floats to preserve the full dynamic range: +// +// float *data = stbi_loadf(filename, &x, &y, &n, 0); +// +// If you load LDR images through this interface, those images will +// be promoted to floating point values, run through the inverse of +// constants corresponding to the above: +// +// stbi_ldr_to_hdr_scale(1.0f); +// stbi_ldr_to_hdr_gamma(2.2f); +// +// Finally, given a filename (or an open file or memory block--see header +// file for details) containing image data, you can query for the "most +// appropriate" interface to use (that is, whether the image is HDR or +// not), using: +// +// stbi_is_hdr(char *filename); +// +// =========================================================================== +// +// iPhone PNG support: +// +// We optionally support converting iPhone-formatted PNGs (which store +// premultiplied BGRA) back to RGB, even though they're internally encoded +// differently. To enable this conversion, call +// stbi_convert_iphone_png_to_rgb(1). +// +// Call stbi_set_unpremultiply_on_load(1) as well to force a divide per +// pixel to remove any premultiplied alpha *only* if the image file explicitly +// says there's premultiplied data (currently only happens in iPhone images, +// and only if iPhone convert-to-rgb processing is on). +// +// =========================================================================== +// +// ADDITIONAL CONFIGURATION +// +// - You can suppress implementation of any of the decoders to reduce +// your code footprint by #defining one or more of the following +// symbols before creating the implementation. +// +// STBI_NO_JPEG +// STBI_NO_PNG +// STBI_NO_BMP +// STBI_NO_PSD +// STBI_NO_TGA +// STBI_NO_GIF +// STBI_NO_HDR +// STBI_NO_PIC +// STBI_NO_PNM (.ppm and .pgm) +// +// - You can request *only* certain decoders and suppress all other ones +// (this will be more forward-compatible, as addition of new decoders +// doesn't require you to disable them explicitly): +// +// STBI_ONLY_JPEG +// STBI_ONLY_PNG +// STBI_ONLY_BMP +// STBI_ONLY_PSD +// STBI_ONLY_TGA +// STBI_ONLY_GIF +// STBI_ONLY_HDR +// STBI_ONLY_PIC +// STBI_ONLY_PNM (.ppm and .pgm) +// +// - If you use STBI_NO_PNG (or _ONLY_ without PNG), and you still +// want the zlib decoder to be available, #define STBI_SUPPORT_ZLIB +// +// - If you define STBI_MAX_DIMENSIONS, stb_image will reject images greater +// than that size (in either width or height) without further processing. +// This is to let programs in the wild set an upper bound to prevent +// denial-of-service attacks on untrusted data, as one could generate a +// valid image of gigantic dimensions and force stb_image to allocate a +// huge block of memory and spend disproportionate time decoding it. By +// default this is set to (1 << 24), which is 16777216, but that's still +// very big. + +#ifndef STBI_NO_STDIO +#include +#endif // STBI_NO_STDIO + +#define STBI_VERSION 1 + +enum +{ + STBI_default = 0, // only used for desired_channels + + STBI_grey = 1, + STBI_grey_alpha = 2, + STBI_rgb = 3, + STBI_rgb_alpha = 4 +}; + +#include +typedef unsigned char stbi_uc; +typedef unsigned short stbi_us; + +#ifdef __cplusplus +extern "C" { +#endif + +#ifndef STBIDEF +#ifdef STB_IMAGE_STATIC +#define STBIDEF static +#else +#define STBIDEF extern +#endif +#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; + +//////////////////////////////////// +// +// 8-bits-per-channel interface +// + +STBIDEF stbi_uc *stbi_load_from_memory (stbi_uc const *buffer, int len , int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_callbacks(stbi_io_callbacks const *clbk , void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_uc *stbi_load (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_uc *stbi_load_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +// for stbi_load_from_file, file pointer is left pointing immediately after image +#endif + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp); +#endif + +#ifdef STBI_WINDOWS_UTF8 +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input); +#endif + +//////////////////////////////////// +// +// 16-bits-per-channel interface +// + +STBIDEF stbi_us *stbi_load_16_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + +#ifndef STBI_NO_STDIO +STBIDEF stbi_us *stbi_load_16 (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); +STBIDEF stbi_us *stbi_load_from_file_16(FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); +#endif + +//////////////////////////////////// +// +// float-per-channel interface +// +#ifndef STBI_NO_LINEAR + STBIDEF float *stbi_loadf_from_memory (stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_callbacks (stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels); + + #ifndef STBI_NO_STDIO + STBIDEF float *stbi_loadf (char const *filename, int *x, int *y, int *channels_in_file, int desired_channels); + STBIDEF float *stbi_loadf_from_file (FILE *f, int *x, int *y, int *channels_in_file, int desired_channels); + #endif +#endif + +#ifndef STBI_NO_HDR + STBIDEF void stbi_hdr_to_ldr_gamma(float gamma); + STBIDEF void stbi_hdr_to_ldr_scale(float scale); +#endif // 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 +// on most compilers (and ALL modern mainstream compilers) this is 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); +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len); +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *clbk, void *user); + +#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); +STBIDEF int stbi_is_16_bit (char const *filename); +STBIDEF int stbi_is_16_bit_from_file(FILE *f); +#endif + + + +// for image formats that explicitly notate that they have premultiplied alpha, +// we just return the colors as stored in the file. set this flag to force +// unpremultiplication. results are undefined if the unpremultiply overflow. +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); + +// as above, but only applies to images loaded on the thread that calls the function +// this function is only available if your compiler supports thread-local variables; +// calling it will fail to link if your compiler doesn't +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply); +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert); +STBIDEF void stbi_set_flip_vertically_on_load_thread(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 +#include + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) +#include // ldexp, pow +#endif + +#ifndef STBI_NO_STDIO +#include +#endif + +#ifndef STBI_ASSERT +#include +#define STBI_ASSERT(x) assert(x) +#endif + +#ifdef __cplusplus +#define STBI_EXTERN extern "C" +#else +#define STBI_EXTERN extern +#endif + + +#ifndef _MSC_VER + #ifdef __cplusplus + #define stbi_inline inline + #else + #define stbi_inline + #endif +#else + #define stbi_inline __forceinline +#endif + +#ifndef STBI_NO_THREAD_LOCALS + #if defined(__cplusplus) && __cplusplus >= 201103L + #define STBI_THREAD_LOCAL thread_local + #elif defined(__GNUC__) && __GNUC__ < 5 + #define STBI_THREAD_LOCAL __thread + #elif defined(_MSC_VER) + #define STBI_THREAD_LOCAL __declspec(thread) + #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 201112L && !defined(__STDC_NO_THREADS__) + #define STBI_THREAD_LOCAL _Thread_local + #endif + + #ifndef STBI_THREAD_LOCAL + #if defined(__GNUC__) + #define STBI_THREAD_LOCAL __thread + #endif + #endif +#endif + +#if defined(_MSC_VER) || defined(__SYMBIAN32__) +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) >> (-(y) & 31))) +#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(__SSE2__) && !defined(STBI_NO_SIMD) +// gcc doesn't support sse2 intrinsics unless you compile with -msse2, +// which in turn means it gets to use SSE2 everywhere. This is unfortunate, +// but previous attempts to provide the SSE2 functions with runtime +// detection caused numerous issues. The way architecture extensions are +// exposed in GCC/Clang is, sadly, not really suited for one-file libs. +// New behavior: if compiled with -msse2, we use SSE2 without any +// detection; if not, we don't use it at all. +#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 + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + int info3 = stbi__cpuid3(); + return ((info3 >> 26) & 1) != 0; +} +#endif + +#else // assume GCC-style if not VC++ +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) + +#if !defined(STBI_NO_JPEG) && defined(STBI_SSE2) +static int stbi__sse2_available(void) +{ + // If we're even attempting to compile this on GCC/Clang, that means + // -msse2 is on, which means the compiler is allowed to use SSE2 + // instructions at will, and so are we. + return 1; +} +#endif + +#endif +#endif + +// ARM NEON +#if defined(STBI_NO_SIMD) && defined(STBI_NEON) +#undef STBI_NEON +#endif + +#ifdef STBI_NEON +#include +#ifdef _MSC_VER +#define STBI_SIMD_ALIGN(type, name) __declspec(align(16)) type name +#else +#define STBI_SIMD_ALIGN(type, name) type name __attribute__((aligned(16))) +#endif +#endif + +#ifndef STBI_SIMD_ALIGN +#define STBI_SIMD_ALIGN(type, name) type name +#endif + +#ifndef STBI_MAX_DIMENSIONS +#define STBI_MAX_DIMENSIONS (1 << 24) +#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]; + int callback_already_read; + + 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->callback_already_read = 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->callback_already_read = 0; + s->img_buffer = 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) +{ + int ch; + fseek((FILE*) user, n, SEEK_CUR); + ch = fgetc((FILE*) user); /* have to read a byte to reset feof()'s flag */ + if (ch != EOF) { + ungetc(ch, (FILE *) user); /* push byte back onto stream if valid. */ + } +} + +static int stbi__stdio_eof(void *user) +{ + return feof((FILE*) user) || ferror((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; +} + +enum +{ + STBI_ORDER_RGB, + STBI_ORDER_BGR +}; + +typedef struct +{ + int bits_per_channel; + int num_channels; + int channel_order; +} stbi__result_info; + +#ifndef STBI_NO_JPEG +static int stbi__jpeg_test(stbi__context *s); +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +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 void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__png_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__png_is16(stbi__context *s); +#endif + +#ifndef STBI_NO_BMP +static int stbi__bmp_test(stbi__context *s); +static void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +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 void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +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 void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc); +static int stbi__psd_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__psd_is16(stbi__context *s); +#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, stbi__result_info *ri); +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 void *stbi__pic_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +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 void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, 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 void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri); +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp); +static int stbi__pnm_is16(stbi__context *s); +#endif + +static +#ifdef STBI_THREAD_LOCAL +STBI_THREAD_LOCAL +#endif +const char *stbi__g_failure_reason; + +STBIDEF const char *stbi_failure_reason(void) +{ + return stbi__g_failure_reason; +} + +#ifndef STBI_NO_FAILURE_STRINGS +static int stbi__err(const char *str) +{ + stbi__g_failure_reason = str; + return 0; +} +#endif + +static void *stbi__malloc(size_t size) +{ + return STBI_MALLOC(size); +} + +// stb_image uses ints pervasively, including for offset calculations. +// therefore the largest decoded image size we can support with the +// current code, even on 64-bit targets, is INT_MAX. this is not a +// significant limitation for the intended use case. +// +// we do, however, need to make sure our size calculations don't +// overflow. hence a few helper functions for size calculations that +// multiply integers together, making sure that they're non-negative +// and no overflow occurs. + +// return 1 if the sum is valid, 0 on overflow. +// negative terms are considered invalid. +static int stbi__addsizes_valid(int a, int b) +{ + if (b < 0) return 0; + // now 0 <= b <= INT_MAX, hence also + // 0 <= INT_MAX - b <= INTMAX. + // And "a + b <= INT_MAX" (which might overflow) is the + // same as a <= INT_MAX - b (no overflow) + return a <= INT_MAX - b; +} + +// returns 1 if the product is valid, 0 on overflow. +// negative factors are considered invalid. +static int stbi__mul2sizes_valid(int a, int b) +{ + if (a < 0 || b < 0) return 0; + if (b == 0) return 1; // mul-by-0 is always safe + // portable way to check for no overflows in a*b + return a <= INT_MAX/b; +} + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// returns 1 if "a*b + add" has no negative terms/factors and doesn't overflow +static int stbi__mad2sizes_valid(int a, int b, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__addsizes_valid(a*b, add); +} +#endif + +// returns 1 if "a*b*c + add" has no negative terms/factors and doesn't overflow +static int stbi__mad3sizes_valid(int a, int b, int c, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__addsizes_valid(a*b*c, add); +} + +// returns 1 if "a*b*c*d + add" has no negative terms/factors and doesn't overflow +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static int stbi__mad4sizes_valid(int a, int b, int c, int d, int add) +{ + return stbi__mul2sizes_valid(a, b) && stbi__mul2sizes_valid(a*b, c) && + stbi__mul2sizes_valid(a*b*c, d) && stbi__addsizes_valid(a*b*c*d, add); +} +#endif + +#if !defined(STBI_NO_JPEG) || !defined(STBI_NO_PNG) || !defined(STBI_NO_TGA) || !defined(STBI_NO_HDR) +// mallocs with size overflow checking +static void *stbi__malloc_mad2(int a, int b, int add) +{ + if (!stbi__mad2sizes_valid(a, b, add)) return NULL; + return stbi__malloc(a*b + add); +} +#endif + +static void *stbi__malloc_mad3(int a, int b, int c, int add) +{ + if (!stbi__mad3sizes_valid(a, b, c, add)) return NULL; + return stbi__malloc(a*b*c + add); +} + +#if !defined(STBI_NO_LINEAR) || !defined(STBI_NO_HDR) || !defined(STBI_NO_PNM) +static void *stbi__malloc_mad4(int a, int b, int c, int d, int add) +{ + if (!stbi__mad4sizes_valid(a, b, c, d, add)) return NULL; + return stbi__malloc(a*b*c*d + add); +} +#endif + +// returns 1 if the sum of two signed ints is valid (between -2^31 and 2^31-1 inclusive), 0 on overflow. +static int stbi__addints_valid(int a, int b) +{ + if ((a >= 0) != (b >= 0)) return 1; // a and b have different signs, so no overflow + if (a < 0 && b < 0) return a >= INT_MIN - b; // same as a + b >= INT_MIN; INT_MIN - b cannot overflow since b < 0. + return a <= INT_MAX - b; +} + +// returns 1 if the product of two ints fits in a signed short, 0 on overflow. +static int stbi__mul2shorts_valid(int a, int b) +{ + if (b == 0 || b == -1) return 1; // multiplication by 0 is always 0; check for -1 so SHRT_MIN/b doesn't overflow + if ((a >= 0) == (b >= 0)) return a <= SHRT_MAX/b; // product is positive, so similar to mul2sizes_valid + if (b < 0) return a <= SHRT_MIN / b; // same as a * b >= SHRT_MIN + return a >= SHRT_MIN / b; +} + +// 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_global = 0; + +STBIDEF void stbi_set_flip_vertically_on_load(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_global = flag_true_if_should_flip; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__vertically_flip_on_load stbi__vertically_flip_on_load_global +#else +static STBI_THREAD_LOCAL int stbi__vertically_flip_on_load_local, stbi__vertically_flip_on_load_set; + +STBIDEF void stbi_set_flip_vertically_on_load_thread(int flag_true_if_should_flip) +{ + stbi__vertically_flip_on_load_local = flag_true_if_should_flip; + stbi__vertically_flip_on_load_set = 1; +} + +#define stbi__vertically_flip_on_load (stbi__vertically_flip_on_load_set \ + ? stbi__vertically_flip_on_load_local \ + : stbi__vertically_flip_on_load_global) +#endif // STBI_THREAD_LOCAL + +static void *stbi__load_main(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + memset(ri, 0, sizeof(*ri)); // make sure it's initialized if we add new fields + ri->bits_per_channel = 8; // default is 8 so most paths don't have to be changed + ri->channel_order = STBI_ORDER_RGB; // all current input & output are this, but this is here so we can add BGR order + ri->num_channels = 0; + + // test the formats with a very explicit header first (at least a FOURCC + // or distinctive magic number first) + #ifndef STBI_NO_PNG + if (stbi__png_test(s)) return stbi__png_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_BMP + if (stbi__bmp_test(s)) return stbi__bmp_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_GIF + if (stbi__gif_test(s)) return stbi__gif_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PSD + if (stbi__psd_test(s)) return stbi__psd_load(s,x,y,comp,req_comp, ri, bpc); + #else + STBI_NOTUSED(bpc); + #endif + #ifndef STBI_NO_PIC + if (stbi__pic_test(s)) return stbi__pic_load(s,x,y,comp,req_comp, ri); + #endif + + // then the formats that can end up attempting to load with just 1 or 2 + // bytes matching expectations; these are prone to false positives, so + // try them later + #ifndef STBI_NO_JPEG + if (stbi__jpeg_test(s)) return stbi__jpeg_load(s,x,y,comp,req_comp, ri); + #endif + #ifndef STBI_NO_PNM + if (stbi__pnm_test(s)) return stbi__pnm_load(s,x,y,comp,req_comp, ri); + #endif + + #ifndef STBI_NO_HDR + if (stbi__hdr_test(s)) { + float *hdr = stbi__hdr_load(s, x,y,comp,req_comp, ri); + 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, ri); + #endif + + return stbi__errpuc("unknown image type", "Image not of any known type, or corrupt"); +} + +static stbi_uc *stbi__convert_16_to_8(stbi__uint16 *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi_uc *reduced; + + reduced = (stbi_uc *) stbi__malloc(img_len); + if (reduced == NULL) return stbi__errpuc("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 sufficient approx of 16->8 bit scaling + + STBI_FREE(orig); + return reduced; +} + +static stbi__uint16 *stbi__convert_8_to_16(stbi_uc *orig, int w, int h, int channels) +{ + int i; + int img_len = w * h * channels; + stbi__uint16 *enlarged; + + enlarged = (stbi__uint16 *) stbi__malloc(img_len*2); + if (enlarged == NULL) return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + + for (i = 0; i < img_len; ++i) + enlarged[i] = (stbi__uint16)((orig[i] << 8) + orig[i]); // replicate to high and low byte, maps 0->0, 255->0xffff + + STBI_FREE(orig); + return enlarged; +} + +static void stbi__vertical_flip(void *image, int w, int h, int bytes_per_pixel) +{ + int row; + size_t bytes_per_row = (size_t)w * bytes_per_pixel; + stbi_uc temp[2048]; + stbi_uc *bytes = (stbi_uc *)image; + + for (row = 0; row < (h>>1); row++) { + stbi_uc *row0 = bytes + row*bytes_per_row; + stbi_uc *row1 = bytes + (h - row - 1)*bytes_per_row; + // swap row0 with row1 + size_t bytes_left = bytes_per_row; + while (bytes_left) { + size_t bytes_copy = (bytes_left < sizeof(temp)) ? bytes_left : sizeof(temp); + memcpy(temp, row0, bytes_copy); + memcpy(row0, row1, bytes_copy); + memcpy(row1, temp, bytes_copy); + row0 += bytes_copy; + row1 += bytes_copy; + bytes_left -= bytes_copy; + } + } +} + +#ifndef STBI_NO_GIF +static void stbi__vertical_flip_slices(void *image, int w, int h, int z, int bytes_per_pixel) +{ + int slice; + int slice_size = w * h * bytes_per_pixel; + + stbi_uc *bytes = (stbi_uc *)image; + for (slice = 0; slice < z; ++slice) { + stbi__vertical_flip(bytes, w, h, bytes_per_pixel); + bytes += slice_size; + } +} +#endif + +static unsigned char *stbi__load_and_postprocess_8bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 8); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 8) { + result = stbi__convert_16_to_8((stbi__uint16 *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 8; + } + + // @TODO: move stbi__convert_format to here + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi_uc)); + } + + return (unsigned char *) result; +} + +static stbi__uint16 *stbi__load_and_postprocess_16bit(stbi__context *s, int *x, int *y, int *comp, int req_comp) +{ + stbi__result_info ri; + void *result = stbi__load_main(s, x, y, comp, req_comp, &ri, 16); + + if (result == NULL) + return NULL; + + // it is the responsibility of the loaders to make sure we get either 8 or 16 bit. + STBI_ASSERT(ri.bits_per_channel == 8 || ri.bits_per_channel == 16); + + if (ri.bits_per_channel != 16) { + result = stbi__convert_8_to_16((stbi_uc *) result, *x, *y, req_comp == 0 ? *comp : req_comp); + ri.bits_per_channel = 16; + } + + // @TODO: move stbi__convert_format16 to here + // @TODO: special case RGB-to-Y (and RGBA-to-YA) for 8-bit-to-16-bit case to keep more precision + + if (stbi__vertically_flip_on_load) { + int channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(stbi__uint16)); + } + + return (stbi__uint16 *) result; +} + +#if !defined(STBI_NO_HDR) && !defined(STBI_NO_LINEAR) +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 channels = req_comp ? req_comp : *comp; + stbi__vertical_flip(result, *x, *y, channels * sizeof(float)); + } +} +#endif + +#ifndef STBI_NO_STDIO + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBI_EXTERN __declspec(dllimport) int __stdcall MultiByteToWideChar(unsigned int cp, unsigned long flags, const char *str, int cbmb, wchar_t *widestr, int cchwide); +STBI_EXTERN __declspec(dllimport) int __stdcall WideCharToMultiByte(unsigned int cp, unsigned long flags, const wchar_t *widestr, int cchwide, char *str, int cbmb, const char *defchar, int *used_default); +#endif + +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) +STBIDEF int stbi_convert_wchar_to_utf8(char *buffer, size_t bufferlen, const wchar_t* input) +{ + return WideCharToMultiByte(65001 /* UTF8 */, 0, input, -1, buffer, (int) bufferlen, NULL, NULL); +} +#endif + +static FILE *stbi__fopen(char const *filename, char const *mode) +{ + FILE *f; +#if defined(_WIN32) && defined(STBI_WINDOWS_UTF8) + wchar_t wMode[64]; + wchar_t wFilename[1024]; + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, filename, -1, wFilename, sizeof(wFilename)/sizeof(*wFilename))) + return 0; + + if (0 == MultiByteToWideChar(65001 /* UTF8 */, 0, mode, -1, wMode, sizeof(wMode)/sizeof(*wMode))) + return 0; + +#if defined(_MSC_VER) && _MSC_VER >= 1400 + if (0 != _wfopen_s(&f, wFilename, wMode)) + f = 0; +#else + f = _wfopen(wFilename, wMode); +#endif + +#elif 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_and_postprocess_8bit(&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; +} + +STBIDEF stbi__uint16 *stbi_load_from_file_16(FILE *f, int *x, int *y, int *comp, int req_comp) +{ + stbi__uint16 *result; + stbi__context s; + stbi__start_file(&s,f); + result = stbi__load_and_postprocess_16bit(&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; +} + +STBIDEF stbi_us *stbi_load_16(char const *filename, int *x, int *y, int *comp, int req_comp) +{ + FILE *f = stbi__fopen(filename, "rb"); + stbi__uint16 *result; + if (!f) return (stbi_us *) stbi__errpuc("can't fopen", "Unable to open file"); + result = stbi_load_from_file_16(f,x,y,comp,req_comp); + fclose(f); + return result; +} + + +#endif //!STBI_NO_STDIO + +STBIDEF stbi_us *stbi_load_16_from_memory(stbi_uc const *buffer, int len, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +STBIDEF stbi_us *stbi_load_16_from_callbacks(stbi_io_callbacks const *clbk, void *user, int *x, int *y, int *channels_in_file, int desired_channels) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *)clbk, user); + return stbi__load_and_postprocess_16bit(&s,x,y,channels_in_file,desired_channels); +} + +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_and_postprocess_8bit(&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_and_postprocess_8bit(&s,x,y,comp,req_comp); +} + +#ifndef STBI_NO_GIF +STBIDEF stbi_uc *stbi_load_gif_from_memory(stbi_uc const *buffer, int len, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + unsigned char *result; + stbi__context s; + stbi__start_mem(&s,buffer,len); + + result = (unsigned char*) stbi__load_gif_main(&s, delays, x, y, z, comp, req_comp); + if (stbi__vertically_flip_on_load) { + stbi__vertical_flip_slices( result, *x, *y, *z, *comp ); + } + + return result; +} +#endif + +#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)) { + stbi__result_info ri; + float *hdr_data = stbi__hdr_load(s,x,y,comp,req_comp, &ri); + if (hdr_data) + stbi__float_postprocess(hdr_data,x,y,comp,req_comp); + return hdr_data; + } + #endif + data = stbi__load_and_postprocess_8bit(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 + long pos = ftell(f); + int res; + stbi__context s; + stbi__start_file(&s,f); + res = stbi__hdr_test(&s); + fseek(f, pos, SEEK_SET); + return res; + #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); + s->callback_already_read += (int) (s->img_buffer - s->img_buffer_original); + 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; +} + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_HDR) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +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; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) +// nothing +#else +static void stbi__skip(stbi__context *s, int n) +{ + if (n == 0) return; // already there! + 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; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_TGA) && defined(STBI_NO_HDR) && defined(STBI_NO_PNM) +// nothing +#else +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; +} +#endif + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static int stbi__get16be(stbi__context *s) +{ + int z = stbi__get8(s); + return (z << 8) + stbi__get8(s); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) && defined(STBI_NO_PIC) +// nothing +#else +static stbi__uint32 stbi__get32be(stbi__context *s) +{ + stbi__uint32 z = stbi__get16be(s); + return (z << 16) + stbi__get16be(s); +} +#endif + +#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); + z += (stbi__uint32)stbi__get16le(s) << 16; + return z; +} +#endif + +#define STBI__BYTECAST(x) ((stbi_uc) ((x) & 255)) // truncate int to byte without warnings + +#if defined(STBI_NO_JPEG) && defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +////////////////////////////////////////////////////////////////////////////// +// +// 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); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_BMP) && defined(STBI_NO_PSD) && defined(STBI_NO_TGA) && defined(STBI_NO_GIF) && defined(STBI_NO_PIC) && defined(STBI_NO_PNM) +// nothing +#else +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_mad3(req_comp, x, y, 0); + 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 STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__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 (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=255; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=255; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=255; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = 255; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 stbi__compute_y_16(int r, int g, int b) +{ + return (stbi__uint16) (((r*77) + (g*150) + (29*b)) >> 8); +} +#endif + +#if defined(STBI_NO_PNG) && defined(STBI_NO_PSD) +// nothing +#else +static stbi__uint16 *stbi__convert_format16(stbi__uint16 *data, int img_n, int req_comp, unsigned int x, unsigned int y) +{ + int i,j; + stbi__uint16 *good; + + if (req_comp == img_n) return data; + STBI_ASSERT(req_comp >= 1 && req_comp <= 4); + + good = (stbi__uint16 *) stbi__malloc(req_comp * x * y * 2); + if (good == NULL) { + STBI_FREE(data); + return (stbi__uint16 *) stbi__errpuc("outofmem", "Out of memory"); + } + + for (j=0; j < (int) y; ++j) { + stbi__uint16 *src = data + j * x * img_n ; + stbi__uint16 *dest = good + j * x * req_comp; + + #define STBI__COMBO(a,b) ((a)*8+(b)) + #define STBI__CASE(a,b) case STBI__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 (STBI__COMBO(img_n, req_comp)) { + STBI__CASE(1,2) { dest[0]=src[0]; dest[1]=0xffff; } break; + STBI__CASE(1,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(1,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=0xffff; } break; + STBI__CASE(2,1) { dest[0]=src[0]; } break; + STBI__CASE(2,3) { dest[0]=dest[1]=dest[2]=src[0]; } break; + STBI__CASE(2,4) { dest[0]=dest[1]=dest[2]=src[0]; dest[3]=src[1]; } break; + STBI__CASE(3,4) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2];dest[3]=0xffff; } break; + STBI__CASE(3,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(3,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = 0xffff; } break; + STBI__CASE(4,1) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); } break; + STBI__CASE(4,2) { dest[0]=stbi__compute_y_16(src[0],src[1],src[2]); dest[1] = src[3]; } break; + STBI__CASE(4,3) { dest[0]=src[0];dest[1]=src[1];dest[2]=src[2]; } break; + default: STBI_ASSERT(0); STBI_FREE(data); STBI_FREE(good); return (stbi__uint16*) stbi__errpuc("unsupported", "Unsupported format conversion"); + } + #undef STBI__CASE + } + + STBI_FREE(data); + return good; +} +#endif + +#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; + if (!data) return NULL; + output = (float *) stbi__malloc_mad4(x, y, comp, sizeof(float), 0); + 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 (n < comp) { + for (i=0; i < x*y; ++i) { + output[i*comp + n] = data[i*comp + n]/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; + if (!data) return NULL; + output = (stbi_uc *) stbi__malloc_mad3(x, y, comp, 0); + 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__uint16 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 jfif; + int app14_color_transform; // Adobe APP14 tag + 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; + unsigned int 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); + if(k >= 257) return stbi__err("bad size list","Corrupt JPEG"); + } + } + 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 >= (1u << 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 += (~0U << 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 * 256) + (run * 16) + (len + magbits)); + } + } + } +} + +static void stbi__grow_buffer_unsafe(stbi__jpeg *j) +{ + do { + unsigned int b = j->nomore ? 0 : stbi__get8(j->s); + if (b == 0xff) { + int c = stbi__get8(j->s); + while (c == 0xff) c = stbi__get8(j->s); // consume fill bytes + 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 const 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]; + if(c < 0 || c >= 256) // symbol id out of bounds! + return -1; + 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); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + + sgn = j->code_buffer >> 31; // sign bit always in MSB; 0 if MSB clear (positive), 1 if MSB set (negative) + 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__jbias[n] & (sgn - 1)); +} + +// 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); + if (j->code_bits < n) return 0; // ran out of bits from stream, return 0s intead of continuing + 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); + if (j->code_bits < 1) return 0; // ran out of bits from stream, return 0s intead of continuing + 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 const 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__uint16 *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 || t > 15) 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; + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta","Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, dequant[0])) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + 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 + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + 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); + if (t < 0 || t > 15) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + diff = t ? stbi__extend_receive(j, t) : 0; + + if (!stbi__addints_valid(j->img_comp[b].dc_pred, diff)) return stbi__err("bad delta", "Corrupt JPEG"); + dc = j->img_comp[b].dc_pred + diff; + j->img_comp[b].dc_pred = dc; + if (!stbi__mul2shorts_valid(dc, 1 << j->succ_low)) return stbi__err("can't merge dc and ac", "Corrupt JPEG"); + data[0] = (short) (dc * (1 << 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 + if (s > j->code_bits) return stbi__err("bad huffman code", "Combined length longer than code bits available"); + j->code_buffer <<= s; + j->code_bits -= s; + zig = stbi__jpeg_dezigzag[k++]; + data[zig] = (short) ((r >> 8) * (1 << 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) * (1 << 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) * 4096) + +// 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]*4; + 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); // consume repeated 0xff fill bytes + 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 = j->img_comp[3].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__uint16 *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, sixteen = (p != 0); + int t = q & 15,i; + if (p != 0 && p != 1) 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__uint16)(sixteen ? stbi__get16be(z->s) : stbi__get8(z->s)); + L -= (sixteen ? 129 : 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]; + } + if(n > 256) return stbi__err("bad DHT header","Corrupt JPEG"); // Loop over i < n would write past end of values! + 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) { + L = stbi__get16be(z->s); + if (L < 2) { + if (m == 0xFE) + return stbi__err("bad COM len","Corrupt JPEG"); + else + return stbi__err("bad APP len","Corrupt JPEG"); + } + L -= 2; + + if (m == 0xE0 && L >= 5) { // JFIF APP0 segment + static const unsigned char tag[5] = {'J','F','I','F','\0'}; + int ok = 1; + int i; + for (i=0; i < 5; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 5; + if (ok) + z->jfif = 1; + } else if (m == 0xEE && L >= 12) { // Adobe APP14 segment + static const unsigned char tag[6] = {'A','d','o','b','e','\0'}; + int ok = 1; + int i; + for (i=0; i < 6; ++i) + if (stbi__get8(z->s) != tag[i]) + ok = 0; + L -= 6; + if (ok) { + stbi__get8(z->s); // version + stbi__get16be(z->s); // flags0 + stbi__get16be(z->s); // flags1 + z->app14_color_transform = stbi__get8(z->s); // color transform + L -= 6; + } + } + + stbi__skip(z->s, L); + return 1; + } + + return stbi__err("unknown marker","Corrupt JPEG"); +} + +// 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__free_jpeg_components(stbi__jpeg *z, int ncomp, int why) +{ + int i; + for (i=0; i < ncomp; ++i) { + if (z->img_comp[i].raw_data) { + STBI_FREE(z->img_comp[i].raw_data); + z->img_comp[i].raw_data = NULL; + z->img_comp[i].data = NULL; + } + if (z->img_comp[i].raw_coeff) { + STBI_FREE(z->img_comp[i].raw_coeff); + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].coeff = 0; + } + if (z->img_comp[i].linebuf) { + STBI_FREE(z->img_comp[i].linebuf); + z->img_comp[i].linebuf = NULL; + } + } + return why; +} + +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 + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + c = stbi__get8(s); + if (c != 3 && c != 1 && c != 4) return stbi__err("bad component count","Corrupt JPEG"); + 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 const unsigned char rgb[3] = { 'R', 'G', 'B' }; + z->img_comp[i].id = stbi__get8(s); + if (s->img_n == 3 && z->img_comp[i].id == rgb[i]) + ++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 (!stbi__mad3sizes_valid(s->img_x, s->img_y, s->img_n, 0)) 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; + } + + // check that plane subsampling factors are integer ratios; our resamplers can't deal with fractional ratios + // and I've never seen a non-corrupted JPEG file actually use them + for (i=0; i < s->img_n; ++i) { + if (h_max % z->img_comp[i].h != 0) return stbi__err("bad H","Corrupt JPEG"); + if (v_max % z->img_comp[i].v != 0) return stbi__err("bad V","Corrupt JPEG"); + } + + // 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; + // these sizes can't be more than 17 bits + 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 + // + // img_mcu_x, img_mcu_y: <=17 bits; comp[i].h and .v are <=4 (checked earlier) + // so these muls can't overflow with 32-bit ints (which we require) + 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].coeff = 0; + z->img_comp[i].raw_coeff = 0; + z->img_comp[i].linebuf = NULL; + z->img_comp[i].raw_data = stbi__malloc_mad2(z->img_comp[i].w2, z->img_comp[i].h2, 15); + if (z->img_comp[i].raw_data == NULL) + return stbi__free_jpeg_components(z, i+1, 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); + if (z->progressive) { + // w2, h2 are multiples of 8 (see above) + z->img_comp[i].coeff_w = z->img_comp[i].w2 / 8; + z->img_comp[i].coeff_h = z->img_comp[i].h2 / 8; + z->img_comp[i].raw_coeff = stbi__malloc_mad3(z->img_comp[i].w2, z->img_comp[i].h2, sizeof(short), 15); + if (z->img_comp[i].raw_coeff == NULL) + return stbi__free_jpeg_components(z, i+1, stbi__err("outofmem", "Out of memory")); + z->img_comp[i].coeff = (short*) (((size_t) z->img_comp[i].raw_coeff + 15) & ~15); + } + } + + 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->jfif = 0; + z->app14_color_transform = -1; // valid values are 0,1,2 + 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; +} + +static stbi_uc stbi__skip_jpeg_junk_at_end(stbi__jpeg *j) +{ + // some JPEGs have junk at end, skip over it but if we find what looks + // like a valid marker, resume there + while (!stbi__at_eof(j->s)) { + stbi_uc x = stbi__get8(j->s); + while (x == 0xff) { // might be a marker + if (stbi__at_eof(j->s)) return STBI__MARKER_none; + x = stbi__get8(j->s); + if (x != 0x00 && x != 0xff) { + // not a stuffed zero or lead-in to another marker, looks + // like an actual marker, return it + return x; + } + // stuffed zero has x=0 now which ends the loop, meaning we go + // back to regular scan loop. + // repeated 0xff keeps trying to read the next byte of the marker. + } + } + return STBI__MARKER_none; +} + +// 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 ) { + j->marker = stbi__skip_jpeg_junk_at_end(j); + // if we reach eof without hitting a marker, stbi__get_marker() below will fail and we'll eventually return 0 + } + m = stbi__get_marker(j); + if (STBI__RESTART(m)) + m = stbi__get_marker(j); + } else if (stbi__DNL(m)) { + int Ld = stbi__get16be(j->s); + stbi__uint32 NL = stbi__get16be(j->s); + if (Ld != 4) return stbi__err("bad DNL len", "Corrupt JPEG"); + if (NL != j->s->img_y) return stbi__err("bad DNL height", "Corrupt JPEG"); + m = stbi__get_marker(j); + } else { + if (!stbi__process_marker(j, m)) return 1; + 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; +} + +// 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 stbi__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* stbi__float2fixed(1.40200f); + g = y_fixed + (cr*-stbi__float2fixed(0.71414f)) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__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; + } +} + +#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* stbi__float2fixed(1.40200f); + g = y_fixed + cr*-stbi__float2fixed(0.71414f) + ((cb*-stbi__float2fixed(0.34414f)) & 0xffff0000); + b = y_fixed + cb* stbi__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; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + j->resample_row_hv_2_kernel = stbi__resample_row_hv_2_simd; + } +#endif + +#ifdef STBI_NEON + j->idct_block_kernel = stbi__idct_simd; + j->YCbCr_to_RGB_kernel = stbi__YCbCr_to_RGB_simd; + 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) +{ + stbi__free_jpeg_components(j, j->s->img_n, 0); +} + +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; + +// fast 0..255 * 0..255 => 0..255 rounded multiplication +static stbi_uc stbi__blinn_8x8(stbi_uc x, stbi_uc y) +{ + unsigned int t = x*y + 128; + return (stbi_uc) ((t + (t >>8)) >> 8); +} + +static stbi_uc *load_jpeg_image(stbi__jpeg *z, int *out_x, int *out_y, int *comp, int req_comp) +{ + int n, decode_n, is_rgb; + 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 >= 3 ? 3 : 1; + + is_rgb = z->s->img_n == 3 && (z->rgb == 3 || (z->app14_color_transform == 0 && !z->jfif)); + + if (z->s->img_n == 3 && n < 3 && !is_rgb) + decode_n = 1; + else + decode_n = z->s->img_n; + + // nothing to do if no components requested; check this now to avoid + // accessing uninitialized coutput[0] later + if (decode_n <= 0) { stbi__cleanup_jpeg(z); return NULL; } + + // resample and color-convert + { + int k; + unsigned int i,j; + stbi_uc *output; + stbi_uc *coutput[4] = { NULL, NULL, NULL, NULL }; + + 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_mad3(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 (is_rgb) { + 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 if (z->s->img_n == 4) { + if (z->app14_color_transform == 0) { // CMYK + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(coutput[0][i], m); + out[1] = stbi__blinn_8x8(coutput[1][i], m); + out[2] = stbi__blinn_8x8(coutput[2][i], m); + out[3] = 255; + out += n; + } + } else if (z->app14_color_transform == 2) { // YCCK + z->YCbCr_to_RGB_kernel(out, y, coutput[1], coutput[2], z->s->img_x, n); + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + out[0] = stbi__blinn_8x8(255 - out[0], m); + out[1] = stbi__blinn_8x8(255 - out[1], m); + out[2] = stbi__blinn_8x8(255 - out[2], m); + out += n; + } + } else { // YCbCr + alpha? Ignore the fourth channel for now + 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 { + if (is_rgb) { + if (n == 1) + for (i=0; i < z->s->img_x; ++i) + *out++ = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + else { + for (i=0; i < z->s->img_x; ++i, out += 2) { + out[0] = stbi__compute_y(coutput[0][i], coutput[1][i], coutput[2][i]); + out[1] = 255; + } + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 0) { + for (i=0; i < z->s->img_x; ++i) { + stbi_uc m = coutput[3][i]; + stbi_uc r = stbi__blinn_8x8(coutput[0][i], m); + stbi_uc g = stbi__blinn_8x8(coutput[1][i], m); + stbi_uc b = stbi__blinn_8x8(coutput[2][i], m); + out[0] = stbi__compute_y(r, g, b); + out[1] = 255; + out += n; + } + } else if (z->s->img_n == 4 && z->app14_color_transform == 2) { + for (i=0; i < z->s->img_x; ++i) { + out[0] = stbi__blinn_8x8(255 - coutput[0][i], coutput[3][i]); + out[1] = 255; + 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 >= 3 ? 3 : 1; // report original components, not output + return output; + } +} + +static void *stbi__jpeg_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + unsigned char* result; + stbi__jpeg* j = (stbi__jpeg*) stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__errpuc("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + STBI_NOTUSED(ri); + 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 = (stbi__jpeg*)stbi__malloc(sizeof(stbi__jpeg)); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, sizeof(stbi__jpeg)); + j->s = s; + stbi__setup_jpeg(j); + r = stbi__decode_jpeg_header(j, STBI__SCAN_type); + stbi__rewind(s); + STBI_FREE(j); + 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 >= 3 ? 3 : 1; + 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))); + if (!j) return stbi__err("outofmem", "Out of memory"); + memset(j, 0, 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) +#define STBI__ZNSYMS 288 // number of symbols in literal/length alphabet + +// 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[STBI__ZNSYMS]; + stbi__uint16 value[STBI__ZNSYMS]; +} 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, const 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; + int hit_zeof_once; + 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 int stbi__zeof(stbi__zbuf *z) +{ + return (z->zbuffer >= z->zbuffer_end); +} + +stbi_inline static stbi_uc stbi__zget8(stbi__zbuf *z) +{ + return stbi__zeof(z) ? 0 : *z->zbuffer++; +} + +static void stbi__fill_bits(stbi__zbuf *z) +{ + do { + if (z->code_buffer >= (1U << z->num_bits)) { + z->zbuffer = z->zbuffer_end; /* treat this as EOF so we fail. */ + return; + } + 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]; + if (b >= STBI__ZNSYMS) return -1; // some data was corrupt somewhere! + if (z->size[b] != s) return -1; // was originally an assert, but report failure instead. + 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) { + if (stbi__zeof(a)) { + if (!a->hit_zeof_once) { + // This is the first time we hit eof, insert 16 extra padding btis + // to allow us to keep going; if we actually consume any of them + // though, that is invalid data. This is caught later. + a->hit_zeof_once = 1; + a->num_bits += 16; // add 16 implicit zero bits + } else { + // We already inserted our extra 16 padding bits and are again + // out, this stream is actually prematurely terminated. + return -1; + } + } else { + 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; + unsigned int cur, limit, old_limit; + z->zout = zout; + if (!z->z_expandable) return stbi__err("output buffer limit","Corrupt PNG"); + cur = (unsigned int) (z->zout - z->zout_start); + limit = old_limit = (unsigned) (z->zout_end - z->zout_start); + if (UINT_MAX - cur < (unsigned) n) return stbi__err("outofmem", "Out of memory"); + while (cur + n > limit) { + if(limit > UINT_MAX / 2) return stbi__err("outofmem", "Out of memory"); + 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 const 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 const 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 const 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 const 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; + if (a->hit_zeof_once && a->num_bits < 16) { + // The first time we hit zeof, we inserted 16 extra zero bits into our bit + // buffer so the decoder can just do its speculative decoding. But if we + // actually consumed any of those bits (which is the case when num_bits < 16), + // the stream actually read past the end so it is malformed. + return stbi__err("unexpected end","Corrupt PNG"); + } + return 1; + } + if (z >= 286) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, length codes 286 and 287 must not appear in compressed data + 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 || z >= 30) return stbi__err("bad huffman code","Corrupt PNG"); // per DEFLATE, distance codes 30 and 31 must not appear in compressed data + 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 (len > a->zout_end - zout) { + 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 const stbi_uc length_dezigzag[19] = { 16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15 }; + 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; + int ntot = hlit + hdist; + + 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 < ntot) { + 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 { + stbi_uc fill = 0; + if (c == 16) { + c = stbi__zreceive(a,2)+3; + if (n == 0) return stbi__err("bad codelengths", "Corrupt PNG"); + fill = lencodes[n-1]; + } else if (c == 17) { + c = stbi__zreceive(a,3)+3; + } else if (c == 18) { + c = stbi__zreceive(a,7)+11; + } else { + return stbi__err("bad codelengths", "Corrupt PNG"); + } + if (ntot - n < c) return stbi__err("bad codelengths", "Corrupt PNG"); + memset(lencodes+n, fill, c); + n += c; + } + } + if (n != ntot) 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; + } + if (a->num_bits < 0) return stbi__err("zlib corrupt","Corrupt PNG"); + // 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 (stbi__zeof(a)) return stbi__err("bad zlib header","Corrupt PNG"); // zlib spec + 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; +} + +static const stbi_uc stbi__zdefault_length[STBI__ZNSYMS] = +{ + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, + 8,8,8,8,8,8,8,8,8,8,8,8,8,8,8,8, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, 9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, + 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, 7,7,7,7,7,7,7,7,8,8,8,8,8,8,8,8 +}; +static const stbi_uc stbi__zdefault_distance[32] = +{ + 5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5,5 +}; +/* +Init algorithm: +{ + 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; + a->hit_zeof_once = 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__zbuild_huffman(&a->z_length , stbi__zdefault_length , STBI__ZNSYMS)) 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 const 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 filter used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_sub // Paeth with b=c=0 turns out to be equivalent to sub +}; + +static int stbi__paeth(int a, int b, int c) +{ + // This formulation looks very different from the reference in the PNG spec, but is + // actually equivalent and has favorable data dependencies and admits straightforward + // generation of branch-free code, which helps performance significantly. + int thresh = c*3 - (a + b); + int lo = a < b ? a : b; + int hi = a < b ? b : a; + int t0 = (hi <= thresh) ? lo : c; + int t1 = (thresh <= lo) ? hi : t0; + return t1; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// adds an extra all-255 alpha channel +// dest == src is legal +// img_n must be 1 or 3 +static void stbi__create_png_alpha_expand8(stbi_uc *dest, stbi_uc *src, stbi__uint32 x, int img_n) +{ + int i; + // must process data backwards since we allow dest==src + if (img_n == 1) { + for (i=x-1; i >= 0; --i) { + dest[i*2+1] = 255; + dest[i*2+0] = src[i]; + } + } else { + STBI_ASSERT(img_n == 3); + for (i=x-1; i >= 0; --i) { + dest[i*4+3] = 255; + dest[i*4+2] = src[i*3+2]; + dest[i*4+1] = src[i*3+1]; + dest[i*4+0] = src[i*3+0]; + } + } +} + +// 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; + stbi_uc *filter_buf; + int all_ok = 1; + 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_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + // note: error exits here don't need to clean up a->out individually, + // stbi__do_png always does on error. + if (!stbi__mad3sizes_valid(img_n, x, depth, 7)) return stbi__err("too large", "Corrupt PNG"); + img_width_bytes = (((img_n * x * depth) + 7) >> 3); + if (!stbi__mad2sizes_valid(img_width_bytes, y, img_width_bytes)) return stbi__err("too large", "Corrupt PNG"); + img_len = (img_width_bytes + 1) * y; + + // we used to check for exact match between raw_len and img_len on non-interlaced PNGs, + // but issue #276 reported a PNG in the wild that had extra data at the end (all zeros), + // so just check for raw_len < img_len always. + if (raw_len < img_len) return stbi__err("not enough pixels","Corrupt PNG"); + + // Allocate two scan lines worth of filter workspace buffer. + filter_buf = (stbi_uc *) stbi__malloc_mad2(img_width_bytes, 2, 0); + if (!filter_buf) return stbi__err("outofmem", "Out of memory"); + + // Filtering for low-bit-depth images + if (depth < 8) { + filter_bytes = 1; + width = img_width_bytes; + } + + for (j=0; j < y; ++j) { + // cur/prior filter buffers alternate + stbi_uc *cur = filter_buf + (j & 1)*img_width_bytes; + stbi_uc *prior = filter_buf + (~j & 1)*img_width_bytes; + stbi_uc *dest = a->out + stride*j; + int nk = width * filter_bytes; + int filter = *raw++; + + // check filter type + if (filter > 4) { + all_ok = stbi__err("invalid filter","Corrupt PNG"); + break; + } + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // perform actual filtering + switch (filter) { + case STBI__F_none: + memcpy(cur, raw, nk); + break; + case STBI__F_sub: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); + break; + case STBI__F_up: + for (k = 0; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); + break; + case STBI__F_avg: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); + break; + case STBI__F_paeth: + for (k = 0; k < filter_bytes; ++k) + cur[k] = STBI__BYTECAST(raw[k] + prior[k]); // prior[k] == stbi__paeth(0,prior[k],0) + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes], prior[k], prior[k-filter_bytes])); + break; + case STBI__F_avg_first: + memcpy(cur, raw, filter_bytes); + for (k = filter_bytes; k < nk; ++k) + cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); + break; + } + + raw += nk; + + // expand decoded bits in cur to dest, also adding an extra alpha channel if desired + if (depth < 8) { + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + stbi_uc *in = cur; + stbi_uc *out = dest; + stbi_uc inb = 0; + stbi__uint32 nsmp = x*img_n; + + // expand bits to bytes first + if (depth == 4) { + for (i=0; i < nsmp; ++i) { + if ((i & 1) == 0) inb = *in++; + *out++ = scale * (inb >> 4); + inb <<= 4; + } + } else if (depth == 2) { + for (i=0; i < nsmp; ++i) { + if ((i & 3) == 0) inb = *in++; + *out++ = scale * (inb >> 6); + inb <<= 2; + } + } else { + STBI_ASSERT(depth == 1); + for (i=0; i < nsmp; ++i) { + if ((i & 7) == 0) inb = *in++; + *out++ = scale * (inb >> 7); + inb <<= 1; + } + } + + // insert alpha=255 values if desired + if (img_n != out_n) + stbi__create_png_alpha_expand8(dest, dest, x, img_n); + } else if (depth == 8) { + if (img_n == out_n) + memcpy(dest, cur, x*img_n); + else + stbi__create_png_alpha_expand8(dest, cur, x, img_n); + } else if (depth == 16) { + // convert the image data from big-endian to platform-native + stbi__uint16 *dest16 = (stbi__uint16*)dest; + stbi__uint32 nsmp = x*img_n; + + if (img_n == out_n) { + for (i = 0; i < nsmp; ++i, ++dest16, cur += 2) + *dest16 = (cur[0] << 8) | cur[1]; + } else { + STBI_ASSERT(img_n+1 == out_n); + if (img_n == 1) { + for (i = 0; i < x; ++i, dest16 += 2, cur += 2) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = 0xffff; + } + } else { + STBI_ASSERT(img_n == 3); + for (i = 0; i < x; ++i, dest16 += 4, cur += 6) { + dest16[0] = (cur[0] << 8) | cur[1]; + dest16[1] = (cur[2] << 8) | cur[3]; + dest16[2] = (cur[4] << 8) | cur[5]; + dest16[3] = 0xffff; + } + } + } + } + } + + STBI_FREE(filter_buf); + if (!all_ok) return 0; + + 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) +{ + int bytes = (depth == 16 ? 2 : 1); + int out_bytes = out_n * bytes; + 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_mad3(a->s->img_x, a->s->img_y, out_bytes, 0); + if (!final) return stbi__err("outofmem", "Out of memory"); + 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_bytes + out_x*out_bytes, + a->out + (j*x+i)*out_bytes, out_bytes); + } + } + 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_mad2(pixel_count, pal_img_n, 0); + 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__unpremultiply_on_load_global = 0; +static int stbi__de_iphone_flag_global = 0; + +STBIDEF void stbi_set_unpremultiply_on_load(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_global = flag_true_if_should_unpremultiply; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_global = flag_true_if_should_convert; +} + +#ifndef STBI_THREAD_LOCAL +#define stbi__unpremultiply_on_load stbi__unpremultiply_on_load_global +#define stbi__de_iphone_flag stbi__de_iphone_flag_global +#else +static STBI_THREAD_LOCAL int stbi__unpremultiply_on_load_local, stbi__unpremultiply_on_load_set; +static STBI_THREAD_LOCAL int stbi__de_iphone_flag_local, stbi__de_iphone_flag_set; + +STBIDEF void stbi_set_unpremultiply_on_load_thread(int flag_true_if_should_unpremultiply) +{ + stbi__unpremultiply_on_load_local = flag_true_if_should_unpremultiply; + stbi__unpremultiply_on_load_set = 1; +} + +STBIDEF void stbi_convert_iphone_png_to_rgb_thread(int flag_true_if_should_convert) +{ + stbi__de_iphone_flag_local = flag_true_if_should_convert; + stbi__de_iphone_flag_set = 1; +} + +#define stbi__unpremultiply_on_load (stbi__unpremultiply_on_load_set \ + ? stbi__unpremultiply_on_load_local \ + : stbi__unpremultiply_on_load_global) +#define stbi__de_iphone_flag (stbi__de_iphone_flag_set \ + ? stbi__de_iphone_flag_local \ + : stbi__de_iphone_flag_global) +#endif // STBI_THREAD_LOCAL + +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) { + stbi_uc half = a / 2; + p[0] = (p[2] * 255 + half) / a; + p[1] = (p[1] * 255 + half) / a; + p[2] = ( t * 255 + half) / 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) (((unsigned) (a) << 24) + ((unsigned) (b) << 16) + ((unsigned) (c) << 8) + (unsigned) (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]={0}; + 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); + s->img_y = stbi__get32be(s); + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) 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"); + } 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"); + } + // even with 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; + // non-paletted with tRNS = constant alpha. if header-scanning, we can stop now. + if (scan == STBI__SCAN_header) { ++s->img_n; return 1; } + if (z->depth == 16) { + for (k = 0; k < s->img_n && k < 3; ++k) // extra loop test to suppress false GCC warning + tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n && k < 3; ++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) { + // header scan definitely stops at first IDAT + if (pal_img_n) + s->img_n = pal_img_n; + return 1; + } + if (c.length > (1u << 30)) return stbi__err("IDAT size limit", "IDAT section larger than 2^30 bytes"); + 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; + } else if (has_trans) { + // non-paletted image with tRNS -> source image has (constant) alpha + ++s->img_n; + } + STBI_FREE(z->expanded); z->expanded = NULL; + // end of PNG chunk, read and skip CRC + stbi__get32be(s); + 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 void *stbi__do_png(stbi__png *p, int *x, int *y, int *n, int req_comp, stbi__result_info *ri) +{ + void *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 <= 8) + ri->bits_per_channel = 8; + else if (p->depth == 16) + ri->bits_per_channel = 16; + else + return stbi__errpuc("bad bits_per_channel", "PNG not supported: unsupported color depth"); + result = p->out; + p->out = NULL; + if (req_comp && req_comp != p->s->img_out_n) { + if (ri->bits_per_channel == 8) + result = stbi__convert_format((unsigned char *) result, p->s->img_out_n, req_comp, p->s->img_x, p->s->img_y); + else + result = stbi__convert_format16((stbi__uint16 *) 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 void *stbi__png_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi__png p; + p.s = s; + return stbi__do_png(&p, x,y,comp,req_comp, ri); +} + +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); +} + +static int stbi__png_is16(stbi__context *s) +{ + stbi__png p; + p.s = s; + if (!stbi__png_info_raw(&p, NULL, NULL, NULL)) + return 0; + if (p.depth != 16) { + stbi__rewind(p.s); + return 0; + } + return 1; +} +#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;/* >>= 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; +} + +// extract an arbitrarily-aligned N-bit value (N=bits) +// from v, and then make it 8-bits long and fractionally +// extend it to full full range. +static int stbi__shiftsigned(unsigned int v, int shift, int bits) +{ + static unsigned int mul_table[9] = { + 0, + 0xff/*0b11111111*/, 0x55/*0b01010101*/, 0x49/*0b01001001*/, 0x11/*0b00010001*/, + 0x21/*0b00100001*/, 0x41/*0b01000001*/, 0x81/*0b10000001*/, 0x01/*0b00000001*/, + }; + static unsigned int shift_table[9] = { + 0, 0,0,1,0,2,4,6,0, + }; + if (shift < 0) + v <<= -shift; + else + v >>= shift; + STBI_ASSERT(v < 256); + v >>= (8-bits); + STBI_ASSERT(bits >= 0 && bits <= 8); + return (int) ((unsigned) v * mul_table[bits]) >> shift_table[bits]; +} + +typedef struct +{ + int bpp, offset, hsz; + unsigned int mr,mg,mb,ma, all_a; + int extra_read; +} stbi__bmp_data; + +static int stbi__bmp_set_mask_defaults(stbi__bmp_data *info, int compress) +{ + // BI_BITFIELDS specifies masks explicitly, don't override + if (compress == 3) + return 1; + + if (compress == 0) { + if (info->bpp == 16) { + info->mr = 31u << 10; + info->mg = 31u << 5; + info->mb = 31u << 0; + } else 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 { + // otherwise, use defaults, which is all-0 + info->mr = info->mg = info->mb = info->ma = 0; + } + return 1; + } + return 0; // error +} + +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; + info->extra_read = 14; + + if (info->offset < 0) return stbi__errpuc("bad BMP", "bad BMP"); + + 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 (hsz != 12) { + int compress = stbi__get32le(s); + if (compress == 1 || compress == 2) return stbi__errpuc("BMP RLE", "BMP type not supported: RLE"); + if (compress >= 4) return stbi__errpuc("BMP JPEG/PNG", "BMP type not supported: unsupported compression"); // this includes PNG/JPEG modes + if (compress == 3 && info->bpp != 16 && info->bpp != 32) return stbi__errpuc("bad BMP", "bad BMP"); // bitfields requires 16 or 32 bits/pixel + 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) { + stbi__bmp_set_mask_defaults(info, compress); + } else if (compress == 3) { + info->mr = stbi__get32le(s); + info->mg = stbi__get32le(s); + info->mb = stbi__get32le(s); + info->extra_read += 12; + // 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 { + // V4/V5 header + 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); + if (compress != 3) // override mr/mg/mb unless in BI_BITFIELDS mode, as per docs + stbi__bmp_set_mask_defaults(info, compress); + 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 void *stbi__bmp_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + 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; + STBI_NOTUSED(ri); + + 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); + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + 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 - info.extra_read - 24) / 3; + } else { + if (info.bpp < 16) + psize = (info.offset - info.extra_read - info.hsz) >> 2; + } + if (psize == 0) { + // accept some number of extra bytes after the header, but if the offset points either to before + // the header ends or implies a large amount of extra data, reject the file as malformed + int bytes_read_so_far = s->callback_already_read + (int)(s->img_buffer - s->img_buffer_original); + int header_limit = 1024; // max we actually read is below 256 bytes currently. + int extra_data_limit = 256*4; // what ordinarily goes here is a palette; 256 entries*4 bytes is its max size. + if (bytes_read_so_far <= 0 || bytes_read_so_far > header_limit) { + return stbi__errpuc("bad header", "Corrupt BMP"); + } + // we established that bytes_read_so_far is positive and sensible. + // the first half of this test rejects offsets that are either too small positives, or + // negative, and guarantees that info.offset >= bytes_read_so_far > 0. this in turn + // ensures the number computed in the second half of the test can't overflow. + if (info.offset < bytes_read_so_far || info.offset - bytes_read_so_far > extra_data_limit) { + return stbi__errpuc("bad offset", "Corrupt BMP"); + } else { + stbi__skip(s, info.offset - bytes_read_so_far); + } + } + + if (info.bpp == 24 && ma == 0xff000000) + s->img_n = 3; + else + 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 + + // sanity-check size + if (!stbi__mad3sizes_valid(target, s->img_x, s->img_y, 0)) + return stbi__errpuc("too large", "Corrupt BMP"); + + out = (stbi_uc *) stbi__malloc_mad3(target, s->img_x, s->img_y, 0); + 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 - info.extra_read - info.hsz - psize * (info.hsz == 12 ? 3 : 4)); + if (info.bpp == 1) width = (s->img_x + 7) >> 3; + else 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; + if (info.bpp == 1) { + for (j=0; j < (int) s->img_y; ++j) { + int bit_offset = 7, v = stbi__get8(s); + for (i=0; i < (int) s->img_x; ++i) { + int color = (v>>bit_offset)&0x1; + out[z++] = pal[color][0]; + out[z++] = pal[color][1]; + out[z++] = pal[color][2]; + if (target == 4) out[z++] = 255; + if (i+1 == (int) s->img_x) break; + if((--bit_offset) < 0) { + bit_offset = 7; + v = stbi__get8(s); + } + } + stbi__skip(s, pad); + } + } else { + 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 - info.extra_read - 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); + if (rcount > 8 || gcount > 8 || bcount > 8 || acount > 8) { STBI_FREE(out); return stbi__errpuc("bad masks", "Corrupt BMP"); } + } + 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)); + unsigned 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; + // fallthrough + case 15: if(is_rgb16) *is_rgb16 = 1; + return STBI_rgb; + case 24: // fallthrough + 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 +static void stbi__tga_read_rgb16(stbi__context *s, stbi_uc* out) +{ + stbi__uint16 px = (stbi__uint16)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] = (stbi_uc)((r * 255)/31); + out[1] = (stbi_uc)((g * 255)/31); + out[2] = (stbi_uc)((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 void *stbi__tga_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + // 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] = {0}; + int RLE_count = 0; + int RLE_repeating = 0; + int read_next_pixel = 1; + STBI_NOTUSED(ri); + STBI_NOTUSED(tga_x_origin); // @TODO + STBI_NOTUSED(tga_y_origin); // @TODO + + if (tga_height > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (tga_width > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // 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; + + if (!stbi__mad3sizes_valid(tga_width, tga_height, tga_comp, 0)) + return stbi__errpuc("too large", "Corrupt TGA"); + + tga_data = (unsigned char*)stbi__malloc_mad3(tga_width, tga_height, tga_comp, 0); + 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) + { + if (tga_palette_len == 0) { /* you have to have at least one entry! */ + STBI_FREE(tga_data); + return stbi__errpuc("bad palette", "Corrupt TGA"); + } + + // any data to skip? (offset usually = 0) + stbi__skip(s, tga_palette_start ); + // load the palette + tga_palette = (unsigned char*)stbi__malloc_mad2(tga_palette_len, tga_comp, 0); + 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; + STBI_NOTUSED(tga_palette_start); + // 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 int stbi__psd_decode_rle(stbi__context *s, stbi_uc *p, int pixelCount) +{ + int count, nleft, len; + + count = 0; + while ((nleft = pixelCount - count) > 0) { + len = stbi__get8(s); + if (len == 128) { + // No-op. + } else if (len < 128) { + // Copy next len+1 bytes literally. + len++; + if (len > nleft) return 0; // corrupt data + 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 = 257 - len; + if (len > nleft) return 0; // corrupt data + val = stbi__get8(s); + count += len; + while (len) { + *p = val; + p += 4; + len--; + } + } + } + + return 1; +} + +static void *stbi__psd_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri, int bpc) +{ + int pixelCount; + int channelCount, compression; + int channel, i; + int bitdepth; + int w,h; + stbi_uc *out; + STBI_NOTUSED(ri); + + // 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); + + if (h > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (w > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + // 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"); + + // Check size + if (!stbi__mad3sizes_valid(4, w, h, 0)) + return stbi__errpuc("too large", "Corrupt PSD"); + + // Create the destination image. + + if (!compression && bitdepth == 16 && bpc == 16) { + out = (stbi_uc *) stbi__malloc_mad3(8, w, h, 0); + ri->bits_per_channel = 16; + } else + 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 preceded 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. + if (!stbi__psd_decode_rle(s, p, pixelCount)) { + STBI_FREE(out); + return stbi__errpuc("corrupt", "bad RLE data"); + } + } + } + + } 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 (or 16-bit) value for each pixel in the image. + + // Read the data by channel. + for (channel = 0; channel < 4; channel++) { + if (channel >= channelCount) { + // Fill this channel with default data. + if (bitdepth == 16 && bpc == 16) { + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + stbi__uint16 val = channel == 3 ? 65535 : 0; + for (i = 0; i < pixelCount; i++, q += 4) + *q = val; + } else { + stbi_uc *p = out+channel; + stbi_uc val = channel == 3 ? 255 : 0; + for (i = 0; i < pixelCount; i++, p += 4) + *p = val; + } + } else { + if (ri->bits_per_channel == 16) { // output bpc + stbi__uint16 *q = ((stbi__uint16 *) out) + channel; + for (i = 0; i < pixelCount; i++, q += 4) + *q = (stbi__uint16) stbi__get16be(s); + } else { + stbi_uc *p = out+channel; + if (bitdepth == 16) { // input bpc + 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); + } + } + } + } + } + + // remove weird white matte from PSD + if (channelCount >= 4) { + if (ri->bits_per_channel == 16) { + for (i=0; i < w*h; ++i) { + stbi__uint16 *pixel = (stbi__uint16 *) out + 4*i; + if (pixel[3] != 0 && pixel[3] != 65535) { + float a = pixel[3] / 65535.0f; + float ra = 1.0f / a; + float inv_a = 65535.0f * (1 - ra); + pixel[0] = (stbi__uint16) (pixel[0]*ra + inv_a); + pixel[1] = (stbi__uint16) (pixel[1]*ra + inv_a); + pixel[2] = (stbi__uint16) (pixel[2]*ra + inv_a); + } + } + } else { + for (i=0; i < w*h; ++i) { + unsigned char *pixel = out + 4*i; + if (pixel[3] != 0 && pixel[3] != 255) { + 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); + } + } + } + } + + // convert to desired output format + if (req_comp && req_comp != 4) { + if (ri->bits_per_channel == 16) + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, 4, req_comp, w, h); + else + 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 void *stbi__pic_load(stbi__context *s,int *px,int *py,int *comp,int req_comp, stbi__result_info *ri) +{ + stbi_uc *result; + int i, x,y, internal_comp; + STBI_NOTUSED(ri); + + if (!comp) comp = &internal_comp; + + for (i=0; i<92; ++i) + stbi__get8(s); + + x = stbi__get16be(s); + y = stbi__get16be(s); + + if (y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + if (stbi__at_eof(s)) return stbi__errpuc("bad file","file too short (pic header)"); + if (!stbi__mad3sizes_valid(x, y, 4, 0)) return stbi__errpuc("too large", "PIC 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_mad3(x, y, 4, 0); + if (!result) return stbi__errpuc("outofmem", "Out of memory"); + 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; // output buffer (always 4 components) + stbi_uc *background; // The current "background" as far as a gif is concerned + stbi_uc *history; + int flags, bgindex, ratio, transparent, eflags; + stbi_uc pal[256][4]; + stbi_uc lpal[256][4]; + stbi__gif_lzw codes[8192]; + 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; + int delay; +} 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 (g->w > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + if (g->h > STBI_MAX_DIMENSIONS) return stbi__err("too large","Very large image (corrupt?)"); + + 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 (!g) return stbi__err("outofmem", "Out of memory"); + 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; + int idx; + + // 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; + + idx = g->cur_x + g->cur_y; + p = &g->out[idx]; + g->history[idx / 4] = 1; + + c = &g->color_table[g->codes[code].suffix * 4]; + if (c[3] > 128) { // don't render transparent pixels; + 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 > 8192) { + 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"); + } + } + } +} + +// this function is designed to support animated gifs, although stb_image doesn't support it +// two back is the image from two frames ago, used for a very specific disposal format +static stbi_uc *stbi__gif_load_next(stbi__context *s, stbi__gif *g, int *comp, int req_comp, stbi_uc *two_back) +{ + int dispose; + int first_frame; + int pi; + int pcount; + STBI_NOTUSED(req_comp); + + // on first frame, any non-written pixels get the background colour (non-transparent) + first_frame = 0; + if (g->out == 0) { + if (!stbi__gif_header(s, g, comp,0)) return 0; // stbi__g_failure_reason set by stbi__gif_header + if (!stbi__mad3sizes_valid(4, g->w, g->h, 0)) + return stbi__errpuc("too large", "GIF image is too large"); + pcount = g->w * g->h; + g->out = (stbi_uc *) stbi__malloc(4 * pcount); + g->background = (stbi_uc *) stbi__malloc(4 * pcount); + g->history = (stbi_uc *) stbi__malloc(pcount); + if (!g->out || !g->background || !g->history) + return stbi__errpuc("outofmem", "Out of memory"); + + // image is treated as "transparent" at the start - ie, nothing overwrites the current background; + // background colour is only used for pixels that are not rendered first frame, after that "background" + // color refers to the color that was there the previous frame. + memset(g->out, 0x00, 4 * pcount); + memset(g->background, 0x00, 4 * pcount); // state of the background (starts transparent) + memset(g->history, 0x00, pcount); // pixels that were affected previous frame + first_frame = 1; + } else { + // second frame - how do we dispose of the previous one? + dispose = (g->eflags & 0x1C) >> 2; + pcount = g->w * g->h; + + if ((dispose == 3) && (two_back == 0)) { + dispose = 2; // if I don't have an image to revert back to, default to the old background + } + + if (dispose == 3) { // use previous graphic + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &two_back[pi * 4], 4 ); + } + } + } else if (dispose == 2) { + // restore what was changed last frame to background before that frame; + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi]) { + memcpy( &g->out[pi * 4], &g->background[pi * 4], 4 ); + } + } + } else { + // This is a non-disposal case eithe way, so just + // leave the pixels as is, and they will become the new background + // 1: do not dispose + // 0: not specified. + } + + // background is what out is after the undoing of the previou frame; + memcpy( g->background, g->out, 4 * g->w * g->h ); + } + + // clear my history; + memset( g->history, 0x00, g->w * g->h ); // pixels that were affected previous frame + + for (;;) { + int tag = stbi__get8(s); + switch (tag) { + case 0x2C: /* Image Descriptor */ + { + 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; + + // if the width of the specified rectangle is 0, that means + // we may not see *any* pixels or the image is malformed; + // to make sure this is caught, move the current y down to + // max_y (which is what out_gif_code checks). + if (w == 0) + g->cur_y = g->max_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) { + 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) return NULL; + + // if this was the first frame, + pcount = g->w * g->h; + if (first_frame && (g->bgindex > 0)) { + // if first frame, any pixel not drawn to gets the background color + for (pi = 0; pi < pcount; ++pi) { + if (g->history[pi] == 0) { + g->pal[g->bgindex][3] = 255; // just in case it was made transparent, undo that; It will be reset next frame if need be; + memcpy( &g->out[pi * 4], &g->pal[g->bgindex], 4 ); + } + } + } + + return o; + } + + case 0x21: // Comment Extension. + { + int len; + int ext = stbi__get8(s); + if (ext == 0xF9) { // Graphic Control Extension. + len = stbi__get8(s); + if (len == 4) { + g->eflags = stbi__get8(s); + g->delay = 10 * stbi__get16le(s); // delay - 1/100th of a second, saving as 1/1000ths. + + // unset old transparent + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 255; + } + if (g->eflags & 0x01) { + g->transparent = stbi__get8(s); + if (g->transparent >= 0) { + g->pal[g->transparent][3] = 0; + } + } else { + // don't need transparent + stbi__skip(s, 1); + g->transparent = -1; + } + } 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"); + } + } +} + +static void *stbi__load_gif_main_outofmem(stbi__gif *g, stbi_uc *out, int **delays) +{ + STBI_FREE(g->out); + STBI_FREE(g->history); + STBI_FREE(g->background); + + if (out) STBI_FREE(out); + if (delays && *delays) STBI_FREE(*delays); + return stbi__errpuc("outofmem", "Out of memory"); +} + +static void *stbi__load_gif_main(stbi__context *s, int **delays, int *x, int *y, int *z, int *comp, int req_comp) +{ + if (stbi__gif_test(s)) { + int layers = 0; + stbi_uc *u = 0; + stbi_uc *out = 0; + stbi_uc *two_back = 0; + stbi__gif g; + int stride; + int out_size = 0; + int delays_size = 0; + + STBI_NOTUSED(out_size); + STBI_NOTUSED(delays_size); + + memset(&g, 0, sizeof(g)); + if (delays) { + *delays = 0; + } + + do { + u = stbi__gif_load_next(s, &g, comp, req_comp, two_back); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + + if (u) { + *x = g.w; + *y = g.h; + ++layers; + stride = g.w * g.h * 4; + + if (out) { + void *tmp = (stbi_uc*) STBI_REALLOC_SIZED( out, out_size, layers * stride ); + if (!tmp) + return stbi__load_gif_main_outofmem(&g, out, delays); + else { + out = (stbi_uc*) tmp; + out_size = layers * stride; + } + + if (delays) { + int *new_delays = (int*) STBI_REALLOC_SIZED( *delays, delays_size, sizeof(int) * layers ); + if (!new_delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + *delays = new_delays; + delays_size = layers * sizeof(int); + } + } else { + out = (stbi_uc*)stbi__malloc( layers * stride ); + if (!out) + return stbi__load_gif_main_outofmem(&g, out, delays); + out_size = layers * stride; + if (delays) { + *delays = (int*) stbi__malloc( layers * sizeof(int) ); + if (!*delays) + return stbi__load_gif_main_outofmem(&g, out, delays); + delays_size = layers * sizeof(int); + } + } + memcpy( out + ((layers - 1) * stride), u, stride ); + if (layers >= 2) { + two_back = out - 2 * stride; + } + + if (delays) { + (*delays)[layers - 1U] = g.delay; + } + } + } while (u != 0); + + // free temp buffer; + STBI_FREE(g.out); + STBI_FREE(g.history); + STBI_FREE(g.background); + + // do the final conversion after loading everything; + if (req_comp && req_comp != 4) + out = stbi__convert_format(out, 4, req_comp, layers * g.w, g.h); + + *z = layers; + return out; + } else { + return stbi__errpuc("not GIF", "Image was not as a gif type."); + } +} + +static void *stbi__gif_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *u = 0; + stbi__gif g; + memset(&g, 0, sizeof(g)); + STBI_NOTUSED(ri); + + u = stbi__gif_load_next(s, &g, comp, req_comp, 0); + if (u == (stbi_uc *) s) u = 0; // end of animated gif marker + if (u) { + *x = g.w; + *y = g.h; + + // moved conversion to after successful load so that the same + // can be done for multiple frames. + if (req_comp && req_comp != 4) + u = stbi__convert_format(u, 4, req_comp, g.w, g.h); + } else if (g.out) { + // if there was an error and we allocated an image buffer, free it! + STBI_FREE(g.out); + } + + // free buffers needed for multiple frame loading; + STBI_FREE(g.history); + STBI_FREE(g.background); + + 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) +{ + int i; + for (i=0; signature[i]; ++i) + if (stbi__get8(s) != signature[i]) + return 0; + stbi__rewind(s); + return 1; +} + +static int stbi__hdr_test(stbi__context* s) +{ + int r = stbi__hdr_test_core(s, "#?RADIANCE\n"); + stbi__rewind(s); + if(!r) { + r = stbi__hdr_test_core(s, "#?RGBE\n"); + 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, stbi__result_info *ri) +{ + 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; + const char *headerToken; + STBI_NOTUSED(ri); + + // Check identifier + headerToken = stbi__hdr_gettoken(s,buffer); + if (strcmp(headerToken, "#?RADIANCE") != 0 && strcmp(headerToken, "#?RGBE") != 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); + + if (height > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + if (width > STBI_MAX_DIMENSIONS) return stbi__errpf("too large","Very large image (corrupt?)"); + + *x = width; + *y = height; + + if (comp) *comp = 3; + if (req_comp == 0) req_comp = 3; + + if (!stbi__mad4sizes_valid(width, height, req_comp, sizeof(float), 0)) + return stbi__errpf("too large", "HDR image is too large"); + + // Read data + hdr_data = (float *) stbi__malloc_mad4(width, height, req_comp, sizeof(float), 0); + if (!hdr_data) + return stbi__errpf("outofmem", "Out of memory"); + + // 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_mad2(width, 4, 0); + if (!scanline) { + STBI_FREE(hdr_data); + return stbi__errpf("outofmem", "Out of memory"); + } + } + + for (k = 0; k < 4; ++k) { + int nleft; + i = 0; + while ((nleft = width - i) > 0) { + count = stbi__get8(s); + if (count > 128) { + // Run + value = stbi__get8(s); + count -= 128; + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + for (z = 0; z < count; ++z) + scanline[i++ * 4 + k] = value; + } else { + // Dump + if ((count == 0) || (count > nleft)) { STBI_FREE(hdr_data); STBI_FREE(scanline); return stbi__errpf("corrupt", "bad RLE data in HDR"); } + 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); + } + if (scanline) + 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; + int dummy; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + 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); + if (p == NULL) { + stbi__rewind( s ); + return 0; + } + if (x) *x = s->img_x; + if (y) *y = s->img_y; + if (comp) { + if (info.bpp == 24 && info.ma == 0xff000000) + *comp = 3; + else + *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, dummy, depth; + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + 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); + depth = stbi__get16be(s); + if (depth != 8 && depth != 16) { + stbi__rewind( s ); + return 0; + } + if (stbi__get16be(s) != 3) { + stbi__rewind( s ); + return 0; + } + *comp = 4; + return 1; +} + +static int stbi__psd_is16(stbi__context *s) +{ + int channelCount, depth; + 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; + } + STBI_NOTUSED(stbi__get32be(s)); + STBI_NOTUSED(stbi__get32be(s)); + depth = stbi__get16be(s); + if (depth != 16) { + stbi__rewind( s ); + return 0; + } + 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,dummy; + stbi__pic_packet packets[10]; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + 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) + +#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 void *stbi__pnm_load(stbi__context *s, int *x, int *y, int *comp, int req_comp, stbi__result_info *ri) +{ + stbi_uc *out; + STBI_NOTUSED(ri); + + ri->bits_per_channel = stbi__pnm_info(s, (int *)&s->img_x, (int *)&s->img_y, (int *)&s->img_n); + if (ri->bits_per_channel == 0) + return 0; + + if (s->img_y > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + if (s->img_x > STBI_MAX_DIMENSIONS) return stbi__errpuc("too large","Very large image (corrupt?)"); + + *x = s->img_x; + *y = s->img_y; + if (comp) *comp = s->img_n; + + if (!stbi__mad4sizes_valid(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0)) + return stbi__errpuc("too large", "PNM too large"); + + out = (stbi_uc *) stbi__malloc_mad4(s->img_n, s->img_x, s->img_y, ri->bits_per_channel / 8, 0); + if (!out) return stbi__errpuc("outofmem", "Out of memory"); + if (!stbi__getn(s, out, s->img_n * s->img_x * s->img_y * (ri->bits_per_channel / 8))) { + STBI_FREE(out); + return stbi__errpuc("bad PNM", "PNM file truncated"); + } + + if (req_comp && req_comp != s->img_n) { + if (ri->bits_per_channel == 16) { + out = (stbi_uc *) stbi__convert_format16((stbi__uint16 *) out, s->img_n, req_comp, s->img_x, s->img_y); + } else { + 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); + if((value > 214748364) || (value == 214748364 && *c > '7')) + return stbi__err("integer parse overflow", "Parsing an integer in the PPM header overflowed a 32-bit int"); + } + + return value; +} + +static int stbi__pnm_info(stbi__context *s, int *x, int *y, int *comp) +{ + int maxv, dummy; + char c, p, t; + + if (!x) x = &dummy; + if (!y) y = &dummy; + if (!comp) comp = &dummy; + + 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 + if(*x == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + *y = stbi__pnm_getinteger(s, &c); // read height + if (*y == 0) + return stbi__err("invalid width", "PPM image header had zero or overflowing width"); + stbi__pnm_skip_whitespace(s, &c); + + maxv = stbi__pnm_getinteger(s, &c); // read max value + if (maxv > 65535) + return stbi__err("max value > 65535", "PPM image supports only 8-bit and 16-bit images"); + else if (maxv > 255) + return 16; + else + return 8; +} + +static int stbi__pnm_is16(stbi__context *s) +{ + if (stbi__pnm_info(s, NULL, NULL, NULL) == 16) + return 1; + return 0; +} +#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"); +} + +static int stbi__is_16_main(stbi__context *s) +{ + #ifndef STBI_NO_PNG + if (stbi__png_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PSD + if (stbi__psd_is16(s)) return 1; + #endif + + #ifndef STBI_NO_PNM + if (stbi__pnm_is16(s)) return 1; + #endif + return 0; +} + +#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; +} + +STBIDEF int stbi_is_16_bit(char const *filename) +{ + FILE *f = stbi__fopen(filename, "rb"); + int result; + if (!f) return stbi__err("can't fopen", "Unable to open file"); + result = stbi_is_16_bit_from_file(f); + fclose(f); + return result; +} + +STBIDEF int stbi_is_16_bit_from_file(FILE *f) +{ + int r; + stbi__context s; + long pos = ftell(f); + stbi__start_file(&s, f); + r = stbi__is_16_main(&s); + 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); +} + +STBIDEF int stbi_is_16_bit_from_memory(stbi_uc const *buffer, int len) +{ + stbi__context s; + stbi__start_mem(&s,buffer,len); + return stbi__is_16_main(&s); +} + +STBIDEF int stbi_is_16_bit_from_callbacks(stbi_io_callbacks const *c, void *user) +{ + stbi__context s; + stbi__start_callbacks(&s, (stbi_io_callbacks *) c, user); + return stbi__is_16_main(&s); +} + +#endif // STB_IMAGE_IMPLEMENTATION + +/* + revision history: + 2.20 (2019-02-07) support utf8 filenames in Windows; fix warnings and platform ifdefs + 2.19 (2018-02-11) fix warning + 2.18 (2018-01-30) fix warnings + 2.17 (2018-01-29) change sbti__shiftsigned to avoid clang -O2 bug + 1-bit BMP + *_is_16_bit api + avoid warnings + 2.16 (2017-07-23) all functions have 16-bit variants; + STBI_NO_STDIO works again; + compilation fixes; + fix rounding in unpremultiply; + optimize vertical flip; + disable raw_len validation; + documentation fixes + 2.15 (2017-03-18) fix png-1,2,4 bug; now all Imagenet JPGs decode; + warning fixes; disable run-time SSE detection on gcc; + uniform handling of optional "return" values; + thread-safe initialization of zlib tables + 2.14 (2017-03-03) remove deprecated STBI_JPEG_OLD; fixes for Imagenet JPGs + 2.13 (2016-11-29) add 16-bit API, only supported for PNG right now + 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 +*/ + + +/* +------------------------------------------------------------------------------ +This software is available under 2 licenses -- choose whichever you prefer. +------------------------------------------------------------------------------ +ALTERNATIVE A - MIT License +Copyright (c) 2017 Sean Barrett +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. +------------------------------------------------------------------------------ +ALTERNATIVE B - Public Domain (www.unlicense.org) +This is free and unencumbered software released into the public domain. +Anyone is free to copy, modify, publish, use, compile, sell, or distribute this +software, either in source code form or as a compiled binary, for any purpose, +commercial or non-commercial, and by any means. +In jurisdictions that recognize copyright laws, the author or authors of this +software dedicate any and all copyright interest in the software to the public +domain. We make this dedication for the benefit of the public at large and to +the detriment of our heirs and successors. We intend this dedication to be an +overt act of relinquishment in perpetuity of all present and future rights to +this software under copyright law. +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN +ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION +WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +------------------------------------------------------------------------------ +*/ diff --git a/src/core/ShaderProgram.cpp b/src/core/ShaderProgram.cpp new file mode 100644 index 0000000..a0e61dd --- /dev/null +++ b/src/core/ShaderProgram.cpp @@ -0,0 +1,95 @@ +#include "engine.h" +#include +#include +#include + +djalim::ShaderProgram::ShaderProgram() : mHandle(0) {} + +djalim::ShaderProgram::~ShaderProgram() { + if (mHandle > 0) { + glDeleteProgram(mHandle); + } +} + +void djalim::ShaderProgram::use() { + if (mHandle > 0) { + glUseProgram(mHandle); + } +} + +bool djalim::ShaderProgram::loadShaders(const char* vertexShaderFile, const char* fragmentShaderFile) { + std::string vertSourceStr = fileToString(vertexShaderFile); + std::string fragSourceStr = fileToString(fragmentShaderFile); + const char* vertSource = vertSourceStr.c_str(); + const char* fragSource = fragSourceStr.c_str(); + + GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertexShader, 1, &vertSource, NULL); + glCompileShader(vertexShader); + checkCompileErrors(vertexShader, "VERTEX"); + + GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragmentShader, 1, &fragSource, NULL); + glCompileShader(fragmentShader); + checkCompileErrors(fragmentShader, "FRAGMENT"); + + mHandle = glCreateProgram(); + glAttachShader(mHandle, vertexShader); + glAttachShader(mHandle, fragmentShader); + glLinkProgram(mHandle); + checkCompileErrors(mHandle, "PROGRAM"); + + glDeleteShader(vertexShader); + glDeleteShader(fragmentShader); + + return true; +} + +std::string djalim::ShaderProgram::fileToString(const std::string& filename) { + std::ifstream fileStream(filename); + if (!fileStream.is_open()) { + std::cerr << "Erreur : Impossible d'ouvrir le fichier shader : " << filename << std::endl; + return ""; + } + std::stringstream buffer; + buffer << fileStream.rdbuf(); + return buffer.str(); +} + +void djalim::ShaderProgram::checkCompileErrors(GLuint shader, std::string type) { + GLint success; + GLchar infoLog[1024]; + if (type != "PROGRAM") { + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + if (!success) { + glGetShaderInfoLog(shader, 1024, NULL, infoLog); + std::cerr << "ERREUR::SHADER_COMPILATION_ERROR de type: " << type << "\n" << infoLog << std::endl; + } + } else { + glGetProgramiv(shader, GL_LINK_STATUS, &success); + if (!success) { + glGetProgramInfoLog(shader, 1024, NULL, infoLog); + std::cerr << "ERREUR::PROGRAM_LINKING_ERROR de type: " << type << "\n" << infoLog << std::endl; + } + } +} + +void djalim::ShaderProgram::setUniform(const std::string& name, const glm::vec4& value) { + glUniform4f(glGetUniformLocation(mHandle, name.c_str()), value.x, value.y, value.z, value.w); +} + +void djalim::ShaderProgram::setUniform(const std::string& name, const glm::mat4& value) { + glUniformMatrix4fv(glGetUniformLocation(mHandle, name.c_str()), 1, GL_FALSE, &value[0][0]); +} + +void djalim::ShaderProgram::setUniform(const std::string& name, int value) { + glUniform1i(glGetUniformLocation(mHandle, name.c_str()), value); +} + +void djalim::ShaderProgram::setUniform(const std::string& name, float value) { + glUniform1f(glGetUniformLocation(mHandle, name.c_str()), value); +} + +void djalim::ShaderProgram::setUniform(const std::string& name, const glm::vec3& value) { + glUniform3f(glGetUniformLocation(mHandle, name.c_str()), value.x, value.y, value.z); +} diff --git a/src/core/Texture2D.cpp b/src/core/Texture2D.cpp new file mode 100644 index 0000000..d6e8ac9 --- /dev/null +++ b/src/core/Texture2D.cpp @@ -0,0 +1,52 @@ +#include "Texture2D.h" +#include + +#define STB_IMAGE_IMPLEMENTATION +#include + +Texture2D::Texture2D() : mTexture(0) {} + +Texture2D::~Texture2D() { + if (mTexture > 0) { + glDeleteTextures(1, &mTexture); + } +} + +bool Texture2D::loadTexture(const std::string& filename, bool generateMipmaps) { + int width, height, components; + unsigned char* data = stbi_load(filename.c_str(), &width, &height, &components, STBI_rgb); + if (data == NULL) { + std::cerr << "Erreur: Impossible de charger la texture : " << filename << std::endl; + std::cerr << "STBI Reason: " << stbi_failure_reason() << std::endl; + return false; + } + + std::cout << "Texture loaded successfully: " << filename << std::endl; + std::cout << "Width: " << width << ", Height: " << height << ", Components: " << components << std::endl; + + glGenTextures(1, &mTexture); + glBindTexture(GL_TEXTURE_2D, mTexture); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); + + if (generateMipmaps) { + glGenerateMipmap(GL_TEXTURE_2D); + } + std::cout << "Mipmaps generated" << std::endl; + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + + stbi_image_free(data); + + glBindTexture(GL_TEXTURE_2D, 0); + + return true; +} + +void Texture2D::bind(GLuint texUnit) { + glActiveTexture(GL_TEXTURE0 + texUnit); + glBindTexture(GL_TEXTURE_2D, mTexture); +} diff --git a/src/core/callbacks.cpp b/src/core/callbacks.cpp new file mode 100644 index 0000000..a83c5b2 --- /dev/null +++ b/src/core/callbacks.cpp @@ -0,0 +1,29 @@ +#include "engine.h" + +extern bool gWireframe; + +// TODO Try to make callbacks more flexible +// there should not be a single function with 100+ if elses 💀 +void mainCallback(GLFWwindow* window, int key, int scancode, int action, int mods) +{ + //TODO Extract this in a exitCallBack Function + if ((key == GLFW_KEY_ESCAPE || key == GLFW_KEY_Q) && action == GLFW_PRESS) { + glfwSetWindowShouldClose(window, GL_TRUE); + } + // end todo + + //TODO Extract this in a wireframeCallBack Function + if (key == GLFW_KEY_W && action == GLFW_PRESS) + gWireframe = !gWireframe; + if (gWireframe) + + glPolygonMode (GL_FRONT_AND_BACK, GL_LINE); + else + glPolygonMode (GL_FRONT_AND_BACK, GL_FILL); + // end todo + +} + +void djalim::OpenGlEngine::loadCallbacks(){ + glfwSetKeyCallback(window, mainCallback); +} diff --git a/src/core/engine.cpp b/src/core/engine.cpp new file mode 100644 index 0000000..75674c7 --- /dev/null +++ b/src/core/engine.cpp @@ -0,0 +1,106 @@ +#include "engine.h" +#include +#include +#include +#include + +djalim::OpenGlEngine::OpenGlEngine(const char* title, int width, int height) { + // initialize GLFW + if (!glfwInit()) { + std::cerr << "Failed to initialize GLFW" << std::endl; + exit(1); + } + + loadHints(); + + this->window = glfwCreateWindow(width, height, title, NULL, NULL); + if (!this->window) { + std::cerr << "Failed to create GLFW window" << std::endl; + glfwTerminate(); + exit(1); + } + + glfwMakeContextCurrent(this->window); + + // initialize GLEW + glewExperimental = GL_TRUE; + if (glewInit() != GLEW_OK) { + std::cerr << "Failed to initialize GLEW" << std::endl; + exit(1); + } + + loadCallbacks(); + + bool loaded = shaderProgram.loadShaders("../assets/shaders/vertex.glsl", "../assets/shaders/fragment.glsl"); + if (!loaded) { + std::cerr << "Failed to load shaders correctly" << std::endl; + exit(1); + } + + onCreate(); + +} + + +void djalim::OpenGlEngine::createObject(std::string name, std::string textures, std::vector& vertices){ + + objects[name]; + + bool textureLoaded = objects[name].texture.loadTexture(textures); + + if (!textureLoaded) { + std::cerr << "Failed to load " << name << " texture!" << std::endl; + exit(1); + } + + //glGenVertexArrays(1, &VAO); + glGenVertexArrays(1, &(objects[name].VAO)); + + //glGenBuffers(1, &VBO); + glGenBuffers(1, &(objects[name].VBO)); + + //glBindVertexArray(VAO); + glBindVertexArray(objects[name].VAO); + + + //glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBindBuffer(GL_ARRAY_BUFFER, objects[name].VBO); + + + std::cout << "Loading 3D objects with "<< vertices.size() << " vertices"<< std::endl; + glBufferData(GL_ARRAY_BUFFER, sizeof(float)*vertices.size(), vertices.data(), GL_STATIC_DRAW); + + // Attribut de position + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + // Attribut de coordonnée de texture + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); + glEnableVertexAttribArray(1); +} + +djalim::OpenGlEngine::~OpenGlEngine() { + onDestroy(); + glfwDestroyWindow(window); + glfwTerminate(); +} + +void djalim::OpenGlEngine::start(){ + // Main loop + + double currentSeconds; + while (!glfwWindowShouldClose(this->window)) { + + currentSeconds = glfwGetTime(); + elapsedSeconds = currentSeconds-previousSeconds; + previousSeconds = currentSeconds; + + glfwPollEvents(); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + //glClearColor(0, 0.5, 0.5, 1.0f); + + onUpdate(); + + glfwSwapBuffers(this->window); + + } +} diff --git a/src/core/hints.cpp b/src/core/hints.cpp new file mode 100644 index 0000000..35abe3d --- /dev/null +++ b/src/core/hints.cpp @@ -0,0 +1,9 @@ +#include "engine.h" + +void djalim::OpenGlEngine::loadHints(){ + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); + glfwWindowHint(GLFW_RESIZABLE, GL_FALSE); +} diff --git a/src/loops/cube.cpp b/src/loops/cube.cpp new file mode 100644 index 0000000..c6c0572 --- /dev/null +++ b/src/loops/cube.cpp @@ -0,0 +1,68 @@ +#include "ShaderProgram.h" +#include "Texture2D.h" +#include "engine.h" +#include "loops.h" +#include +#include +#include +#include +#include +#include + +// void djalim::cube(GLFWwindow* window, djalim::ShaderProgram shader, GLuint VAO, std::map& textures){ +// +// shader.use(); +// shader.setUniform("ourTexture", 0); +// textures["cube"].bind(); +// +// // Matrice de Projection +// glm::mat4 projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f); +// shader.setUniform("projection", projection); // Assurez-vous que setUniform pour mat4 est implémenté +// +// // Matrice de Vue +// glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), // Position caméra +// glm::vec3(0.0f, 0.0f, 0.0f), // Cible +// glm::vec3(0.0f, 1.0f, 0.0f)); // Axe Haut +// shader.setUniform("view", view); +// +// // Matrice Modèle +// glm::mat4 model = glm::mat4(1.0f); +// model = glm::rotate(model, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f)); +// shader.setUniform("model", model); +// +// // Dessiner le cube +// glBindVertexArray(VAO); +// glDrawArrays(GL_TRIANGLES, 0, 36); +// +// } + +void djalim::cube(GLFWwindow* window, djalim::ShaderProgram shader, Objects3D& objects){ + + shader.use(); + shader.setUniform("ourTexture", 0); + + objects["cube"].texture.bind(); + //textures["cube"].bind(); + + // Matrice de Projection + glm::mat4 projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f); + shader.setUniform("projection", projection); // Assurez-vous que setUniform pour mat4 est implémenté + + // Matrice de Vue + glm::mat4 view = glm::lookAt(glm::vec3(0.0f, 0.0f, 3.0f), // Position caméra + glm::vec3(0.0f, 0.0f, 0.0f), // Cible + glm::vec3(0.0f, 1.0f, 0.0f)); // Axe Haut + shader.setUniform("view", view); + + // Matrice Modèle + glm::mat4 model = glm::mat4(1.0f); + model = glm::rotate(model, (float)glfwGetTime() * glm::radians(50.0f), glm::vec3(0.5f, 1.0f, 0.0f)); + shader.setUniform("model", model); + + // Dessiner le cube + glBindVertexArray(objects["cube"].VAO); + glDrawArrays(GL_TRIANGLES, 0, 36); + + //std::cout << objects["cube"].VAO << std::endl; + +} diff --git a/src/loops/rainbowWindow.cpp b/src/loops/rainbowWindow.cpp new file mode 100644 index 0000000..02e3e44 --- /dev/null +++ b/src/loops/rainbowWindow.cpp @@ -0,0 +1,32 @@ +#include "engine.h" +#include "loops.h" +#include "iostream" +#include + + +void djalim::rainbowWindow(double elapsedSeconds){ + static double red = 0.0; + static double green= 0.0; + static double blue = 0.0; + static double thresh = 0.0; + + thresh += elapsedSeconds; + + if (thresh >0.1){ + thresh = 0.0; + red += 0.1; + if( red > 1.0 ) { + red = 0.0; + green += 0.1; + if( green > 1.0 ) { + green = 0.0; + blue += 0.1; + if( blue > 1.0 ) { + blue = 0.0; + } + } + } + } + std::cout << "red: " << red << ", green: " << green << ", blue: " << blue << " \r"; + glClearColor(red, green, blue, 1.0f); +} diff --git a/src/loops/rbgTriangle.cpp b/src/loops/rbgTriangle.cpp new file mode 100644 index 0000000..9c8a686 --- /dev/null +++ b/src/loops/rbgTriangle.cpp @@ -0,0 +1,12 @@ +#include "engine.h" +#include "loops.h" + +void djalim::rgbTriangle(djalim::ShaderProgram shaderProgram, unsigned int VAO){ + // Dessiner le triangle + shaderProgram.use(); + glBindVertexArray(VAO); + glDrawArrays(GL_TRIANGLES, 0, 3); + + glClearColor(0, 0.5, 0.5, 1.0f); + +} diff --git a/src/main.cpp b/src/main.cpp new file mode 100644 index 0000000..a1ec38f --- /dev/null +++ b/src/main.cpp @@ -0,0 +1,7 @@ +#include "engine.h" + +int main() { + djalim::OpenGlEngine engine = djalim::OpenGlEngine("Mon app", 800, 600); + engine.start(); + return 0; +} diff --git a/src/onCreate.cpp b/src/onCreate.cpp new file mode 100644 index 0000000..579f27d --- /dev/null +++ b/src/onCreate.cpp @@ -0,0 +1,76 @@ +#include "engine.h" +#include "Texture2D.h" +#include +#include + +void djalim::OpenGlEngine::onCreate(){ + glEnable(GL_DEPTH_TEST); + std::vector vertices { + -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, + 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, + 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, + 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, + -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, + + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 1.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, + + -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, + -0.5f, 0.5f, -0.5f, 1.0f, 1.0f, + -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, + -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, + -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, + + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, + 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, + 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, + 0.5f, -0.5f, -0.5f, 0.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, + + -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, + 0.5f, -0.5f, -0.5f, 1.0f, 1.0f, + 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, + 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, + -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, + -0.5f, -0.5f, -0.5f, 0.0f, 1.0f, + + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, + 0.5f, 0.5f, -0.5f, 1.0f, 1.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, + 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, + -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, + -0.5f, 0.5f, -0.5f, 0.0f, 1.0f + }; + + stbi_set_flip_vertically_on_load(true); + createObject("cube", "../assets/textures/prof.png", vertices); + + // textures["cube"] = Texture2D(); + // bool textureLoaded = textures["cube"].loadTexture("../assets/textures/prof.png"); + // if (!textureLoaded) { + // std::cerr << "Failed to load cube texture!" << std::endl; + // return; + // } + // + // glGenVertexArrays(1, &VAO); + // glGenBuffers(1, &VBO); + // glBindVertexArray(VAO); + // glBindBuffer(GL_ARRAY_BUFFER, VBO); + // glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + // // Attribut de position + // glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); + // glEnableVertexAttribArray(0); + // // Attribut de coordonnée de texture + // glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)(3 * sizeof(float))); + // glEnableVertexAttribArray(1); + + // juste pour voir le cube + glClearColor(0.2f, 0.3f, 0.3f, 1.0f); +} diff --git a/src/onDestroy.cpp b/src/onDestroy.cpp new file mode 100644 index 0000000..200f89e --- /dev/null +++ b/src/onDestroy.cpp @@ -0,0 +1,5 @@ +#include "engine.h" + +void djalim::OpenGlEngine::onDestroy(){ + +} diff --git a/src/onUpdate.cpp b/src/onUpdate.cpp new file mode 100644 index 0000000..c0418da --- /dev/null +++ b/src/onUpdate.cpp @@ -0,0 +1,10 @@ +#include "engine.h" +#include +#include "loops.h" + +void djalim::OpenGlEngine::onUpdate(){ + showFps(); + + cube(window,shaderProgram,objects); + +} diff --git a/src/utils/showFps.cpp b/src/utils/showFps.cpp new file mode 100644 index 0000000..2b5ed73 --- /dev/null +++ b/src/utils/showFps.cpp @@ -0,0 +1,26 @@ +#include "engine.h" + +void djalim::OpenGlEngine::showFps() +{ + static double thresh = 0.0; + + thresh += elapsedSeconds; + + if (thresh > 0.25) + { + double fps = (double)frameCount / thresh; + double msPerFrame = 1000.0 / fps; + + std::ostringstream outs; + outs.precision(3); + outs << std::fixed + << "FPS: " << fps << " " + << "Frame Time: " << msPerFrame << "(ms)"; + glfwSetWindowTitle(window, outs.str().c_str()); + + + frameCount = 0; + thresh = 0.0; + } + frameCount++; +}