From b0036a24260fb213c60de55105ba936d14b20bd1 Mon Sep 17 00:00:00 2001 From: bdrtr Date: Sun, 1 Sep 2024 19:24:32 +0200 Subject: [PATCH] 1.0 --- Makefile | 7 + awesomeface.png | Bin 0 -> 59277 bytes main | Bin 0 -> 695952 bytes main.cpp | 188 ++ shader.h | 142 + shaders/shader.fs | 12 + shaders/shader.vs | 15 + stb_image.h | 7988 +++++++++++++++++++++++++++++++++++++++++++++ 8 files changed, 8352 insertions(+) create mode 100644 Makefile create mode 100644 awesomeface.png create mode 100755 main create mode 100644 main.cpp create mode 100644 shader.h create mode 100644 shaders/shader.fs create mode 100644 shaders/shader.vs create mode 100644 stb_image.h diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..f3636d6 --- /dev/null +++ b/Makefile @@ -0,0 +1,7 @@ + + +main: main.cpp + g++ -o main main.cpp -lGL -lglfw3 -lGL -lX11 -lpthread -lXrandr -lXi -ldl + +clean: main + rm -r main diff --git a/awesomeface.png b/awesomeface.png new file mode 100644 index 0000000000000000000000000000000000000000..9840caf3e7f4914ea1c6c15f688ffaf2cf44bae8 GIT binary patch literal 59277 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 Q0|5VhP*hj=DQ6!3fBcW&%>V!Z literal 0 HcmV?d00001 diff --git a/main b/main new file mode 100755 index 0000000000000000000000000000000000000000..f12c389d94b2b9be19b6eb6a98b8e4dfa5abf723 GIT binary patch literal 695952 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 -nn8|50BVg#L;pm^duO`wjHi$DTn5gJuHYWo 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 literal 0 HcmV?d00001 diff --git a/main.cpp b/main.cpp new file mode 100644 index 0000000..2fe8a4a --- /dev/null +++ b/main.cpp @@ -0,0 +1,188 @@ +#include +#include +#include + +#include +#include +#include + +#define STB_IMAGE_IMPLEMENTATION +#include "stb_image.h" + +#include "shader.h" +#include + +float vertices[] = { //cube + -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 +}; + + +void framebuffer_size_callback(GLFWwindow* window, int width, int height); +void processInput(GLFWwindow *window); + +const unsigned int SCR_WIDTH = 800; +const unsigned int SCR_HEIGHT = 600; + + +int main() { + + glfwInit(); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); + glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); + + + GLFWwindow * window = glfwCreateWindow(SCR_WIDTH, SCR_HEIGHT, "3B", NULL, NULL); + + if (window == NULL) { + std::cout << "error window" << std::endl; + glfwTerminate(); + return -1; + } + + glfwMakeContextCurrent(window); + glfwSetFramebufferSizeCallback(window, framebuffer_size_callback); + + glEnable(GL_DEPTH_TEST); + + + + //VAO, VBO, EBO + unsigned int VAO, VBO; + + glGenVertexArrays(1, &VAO); + glGenBuffers(1, &VBO); + glBindVertexArray(VAO); + + glBindBuffer(GL_ARRAY_BUFFER, VBO); + glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); + + //glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, EBO); + //glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(indices)) + + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*)0); + glEnableVertexAttribArray(0); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 5 * sizeof(float), (void*) (3 * sizeof(float))); + glEnableVertexAttribArray(1); + + + //texture + unsigned int texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + + int width, height, nrChannels; + + unsigned char * data = stbi_load("awesomeface.png", &width, &height, &nrChannels, 0); + if (data) { + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + glGenerateMipmap(GL_TEXTURE_2D); + } else { + std::cout << "error picture load" << std::endl; + } + + stbi_image_free(data); + + // + + //shader read + Shader myShader("shaders/shader.vs","shaders/shader.fs"); + + //matrix - donme ve 3 boyut + + + + while( !glfwWindowShouldClose(window)) { + + processInput(window); + glClearColor(1.0f, 1.0f, 0.0f, 1.0f); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + 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)); + + glm::mat4 view = glm::mat4(1.0f); + view = glm::translate(view, glm::vec3(0.0f, 0.0f, -3.0f)); + + glm::mat4 projection; + projection = glm::perspective(glm::radians(45.0f), 800.0f / 600.0f, 0.1f, 100.0f); + + myShader.use(); + glBindVertexArray(VAO); + int modelLoc = glGetUniformLocation(myShader.ID, "model"); + glUniformMatrix4fv(modelLoc, 1, GL_FALSE, glm::value_ptr(model)); + int viewLoc = glGetUniformLocation(myShader.ID, "view"); + glUniformMatrix4fv(viewLoc, 1, GL_FALSE, glm::value_ptr(view)); + int projectionLoc = glGetUniformLocation(myShader.ID, "projection"); + glUniformMatrix4fv(projectionLoc, 1, GL_FALSE, glm::value_ptr(projection)); + + glDrawArrays(GL_TRIANGLES, 0, 36); + + glfwSwapBuffers(window); + glfwPollEvents(); + + } + + glfwTerminate(); + return 0; + +} + + +void processInput(GLFWwindow *window) +{ + if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS) + glfwSetWindowShouldClose(window, true); +} + +// glfw: whenever the window size changed (by OS or user resize) this callback function executes +// --------------------------------------------------------------------------------------------- +void framebuffer_size_callback(GLFWwindow* window, int width, int height) +{ + // make sure the viewport matches the new window dimensions; note that width and + // height will be significantly larger than specified on retina displays. + glViewport(0, 0, width, height); +} \ No newline at end of file diff --git a/shader.h b/shader.h new file mode 100644 index 0000000..2ad4803 --- /dev/null +++ b/shader.h @@ -0,0 +1,142 @@ +#ifndef SHADER_H +#define SHADER_H + + +#include +#include + +#include +#include +#include +#include +#include + + +class Shader { + + public: + unsigned int ID; + + Shader(const GLchar* vertexPath, const GLchar* fragmentPath); + void use(); + void setBool(const std::string &name, bool value) const; + void setInt(const std::string &name, int value) const; + void setFloat(const std::string &name, float value) const; + + void checkCompileErrors(unsigned int shader, std::string type); + + +}; + + +Shader::Shader(const GLchar* vertexPath, const GLchar* fragmentPath) { + + std::string vertexCode; + std::string fragmentCode; + std::ifstream vShaderFile; + std::ifstream fShaderFile; + + vShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); + fShaderFile.exceptions(std::ifstream::failbit | std::ifstream::badbit); + + try { + + vShaderFile.open(vertexPath); + fShaderFile.open(fragmentPath); + + std::stringstream vShaderStream, fShaderStream; + + vShaderStream << vShaderFile.rdbuf(); + fShaderStream << fShaderFile.rdbuf(); + + vShaderFile.close(); + fShaderFile.close(); + + vertexCode = vShaderStream.str(); + fragmentCode = fShaderStream.str(); + + } catch (std::ifstream::failure e) { + + std::cout << "ERROR" << std::endl; + + } + + + const char* vShaderCode = vertexCode.c_str(); + const char* fShaderCode = fragmentCode.c_str(); + + + unsigned int vertex, fragment; + int success; + char infoLog[512]; + + vertex = glCreateShader(GL_VERTEX_SHADER); + glShaderSource(vertex, 1, &vShaderCode, NULL); + glCompileShader(vertex); + checkCompileErrors(vertex, "VERTEX"); + + fragment = glCreateShader(GL_FRAGMENT_SHADER); + glShaderSource(fragment, 1, &fShaderCode, NULL); + glCompileShader(fragment); + checkCompileErrors(fragment, "FRAGMENT"); + + ID = glCreateProgram(); + glAttachShader(ID, vertex); + glAttachShader(ID, fragment); + glLinkProgram(ID); + + checkCompileErrors(ID, "PROGRAM"); + + glDeleteShader(vertex); + glDeleteShader(fragment); + +}; + +void Shader:: use() { + + glUseProgram(ID); +}; + +void Shader::setBool(const std::string &name, bool value) const +{ + glUniform1i(glGetUniformLocation(ID, name.c_str()), (int)value); +}; + +void Shader::setInt(const std::string &name, int value) const +{ + glUniform1i(glGetUniformLocation(ID, name.c_str()), value); +}; + +void Shader::setFloat(const std::string &name, float value) const +{ + glUniform1f(glGetUniformLocation(ID, name.c_str()), value); +}; + +void Shader::checkCompileErrors(unsigned int shader, std::string type) + { + int success; + char infoLog[1024]; + if (type != "PROGRAM") + { + glGetShaderiv(shader, GL_COMPILE_STATUS, &success); + if (!success) + { + glGetShaderInfoLog(shader, 1024, NULL, infoLog); + std::cout << "ERROR::SHADER_COMPILATION_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl; + } + } + else + { + glGetProgramiv(shader, GL_LINK_STATUS, &success); + if (!success) + { + glGetProgramInfoLog(shader, 1024, NULL, infoLog); + std::cout << "ERROR::PROGRAM_LINKING_ERROR of type: " << type << "\n" << infoLog << "\n -- --------------------------------------------------- -- " << std::endl; + } + } + } + + + + +#endif \ No newline at end of file diff --git a/shaders/shader.fs b/shaders/shader.fs new file mode 100644 index 0000000..3c10ae2 --- /dev/null +++ b/shaders/shader.fs @@ -0,0 +1,12 @@ +#version 330 core + + out vec4 Texture; + + in vec2 texCoord; + uniform sampler2D atexture; + + void main() { + + Texture = texture(atexture, texCoord); + + } \ No newline at end of file diff --git a/shaders/shader.vs b/shaders/shader.vs new file mode 100644 index 0000000..207683f --- /dev/null +++ b/shaders/shader.vs @@ -0,0 +1,15 @@ +#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.0f); + texCoord = atexCoord; + } \ No newline at end of file diff --git a/stb_image.h b/stb_image.h new file mode 100644 index 0000000..9eedabe --- /dev/null +++ b/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. +------------------------------------------------------------------------------ +*/