From 3c6254ece30b866b8e7cc4ed923d2b8925b8d26c Mon Sep 17 00:00:00 2001 From: hippoz <10706925-hippoz@users.noreply.gitlab.com> Date: Wed, 30 Aug 2023 05:59:37 +0300 Subject: [PATCH] model loading, cubemap, skybox --- assets/container2.qoi | Bin 463061 -> 0 bytes assets/container2_specular.qoi | Bin 109414 -> 0 bytes assets/fish-map.qoi | Bin 288 -> 0 bytes assets/fish.png | Bin 7406 -> 0 bytes assets/fish.qoi | Bin 1863 -> 0 bytes meson.build | 7 +- shaders/lighting_fragment.glsl | 24 +- shaders/lighting_vertex.glsl | 2 +- shaders/skybox_fragment.glsl | 12 + shaders/skybox_vertex.glsl | 15 + src/common.cpp | 4 +- src/common.hpp | 2 +- src/defer.hpp | 7 + src/main.cpp | 303 +- src/mesh.cpp | 165 + src/mesh.hpp | 32 + src/primitives.cpp | 45 + src/primitives.hpp | 5 + src/shader.cpp | 43 +- src/shader.hpp | 1 + src/stb_image_impl.cpp | 11 + src/texture.cpp | 71 + src/texture.hpp | 8 + src/vendor/glad/glad.c | 417 +- src/vendor/glad/glad.h | 1081 ++++- src/vendor/qoi.h | 649 --- src/vendor/scope_guard.hpp | 190 + src/vendor/stb_image.h | 7987 ++++++++++++++++++++++++++++++++ 28 files changed, 10202 insertions(+), 879 deletions(-) delete mode 100644 assets/container2.qoi delete mode 100644 assets/container2_specular.qoi delete mode 100644 assets/fish-map.qoi delete mode 100644 assets/fish.png delete mode 100644 assets/fish.qoi create mode 100644 shaders/skybox_fragment.glsl create mode 100644 shaders/skybox_vertex.glsl create mode 100644 src/defer.hpp create mode 100644 src/mesh.cpp create mode 100644 src/mesh.hpp create mode 100644 src/primitives.cpp create mode 100644 src/primitives.hpp create mode 100644 src/stb_image_impl.cpp create mode 100644 src/texture.cpp create mode 100644 src/texture.hpp delete mode 100644 src/vendor/qoi.h create mode 100644 src/vendor/scope_guard.hpp create mode 100644 src/vendor/stb_image.h diff --git a/assets/container2.qoi b/assets/container2.qoi deleted file mode 100644 index 5ec93ed1171c4eb8d0ea35c149d6e7347a09d3a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 463061 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.ttUvk;!tWZVsGISI4(VaPQiyEgjRYGdT} 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

ev6ax@LNC0Q!KA~r+TQn&&)YEKR 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 F{|`4g&zS%K diff --git a/assets/fish-map.qoi b/assets/fish-map.qoi deleted file mode 100644 index b440f5941a1049cb50fdcbc3a0d881de9f391461..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 288 ecmXTS&rD-rU}ykg7KYHjqW~NN=YZh>0*nBk?+DKT diff --git a/assets/fish.png b/assets/fish.png deleted file mode 100644 index 173aa45c947ad0232abb8541a8064cd9640312a5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7406 zcmeHMdvp}l8NZv?ZeEat@D66P0YWgdJMWzxvp~p$ERu*2LMZmg>^zc{>?6CI>;?f7 zKm?1N5{K|v3B~b5_`ZJzI~Blmp}%~uEcj(fA8`1q^pk8QQ_=Nogl2+4^HkN1>1Ge?#$OW=#$2KHZMS`D2ROo<+dgdj6eUeAvK7INRAJ$#?Ig-a zx|kSkOtem`)yBr^;u2C56XN3&hNcYYpE_b#`aL6trKRad8ng6_<4;qwa$izXG@CQmP$Q9iR`)(=EU zRw}C;kNEtxb%9|0yv0i%U;4zdhi*LWoZuZXCq$SAGKOA`@Li6=)zXAm(dc@JuZngIr~QI|S#)rRf+V>78~7Y5qB z@5BunNq;u#qDn2q?7t(n=sPj%B-X|21WJh1z~DtDqw(nSwJ{qT;`&OT27Nj3f0+a0 z+m53jo^5S~MR|!MKYyw%KVR?hx)n#Yj8O2o1*@#Z2PdSpJUn}I;n?VN`cpsNz#lIx zJoHle2Hn7kuN>X7`0(b3k8aAa)zqXu6yI-QPWgz3o~y0(42;^}KWXORtir+B7ay~2 zC|sd!y%7wYuesdsg8Ahs%%dp{TV@rFUYqK@IwRxClSu{?gWpR`Uq7IQ&TTzroj?C~ zKl&=?yzjA<3pdXpo3oO#*10MU4L|hWPoMr{{d(@mk*10BOLJXEqnD@eHtxOt#_rSG z)>jriRjvGto1C*|PsNw^a<=SL_NjFnA6aw$?cG~FAD`M<{`aj59=LhHlQ(7~{8+!R_(P4|zU8NDJc{>8kFo&x-Y_Tvbm*p((20% zZ;hC9*7i)o;Z+gzjTXa&g+-sN(Z;wNUuSmhx-_mdy&{ou1JDq1^F7k08#K{d&7x z>2O&M=lAY2=pB;PFq0|4OFa2gI;&ki zK4>+BaCxxRYLh`9a`Df#8Ys91}LN3TWKOJ7K;fdO(cnd2j;7H`Gp|n@@1+JVT=OVCwd(ozr*d)tC)h_ zUF)|R4A8Fch|lRMDd~iF`Px+gJxoEtVW$>}t8@8R|yapV=Kk5WF$-%k zV=OK)l0tDZD{|c+9`HIKD~0OrQK?W8K#2+ookTkZAP^13h!|%9OBT&`&cfJPMW91a zlE@diy-op!)8P~JOQ$&|jx$N~pCaRdB-9)HG9TpzQfUts^rvMPD2QGYQ%i#8wx!u)P zL+3uEv$+JOlO*_s0@%R-Xy?wPtYc?#FBo_@d=;+5Ejg6>Z}V0sk3JXtVaSUeKEK;r zAF2w^sOfS|_$qu^?FdaJy*@N4ctH$P@CkLY6p9nD!cAh8;Hs2i^=MDmj(W#8qyoXQ z1dcNlW`^{^Ab%j6SUZhTW||T>f>C5kSfoyLpIh+<1h1S|2|9vSke;DEn|@4apt5_$ z5~z|v=XP~Wcb*T+asnj*6^%yScxG;`)#0z;f$KlcVWn6Q4k4|Fk^NJ zB&7)$ExW{-F`TkcILinG$FR3?$hb0s=4p7Fz}>weV>yLoL|MT^JBMR5O-hiTG>+jU zBbpgSl4vHp;C`=JrY=jc4r92bjDXiB98a=$kD>z8PN75sGcz!Nv`AVoP7xW*PKb&~ z*eOb2&9`L~fg*mc=#f(Cujj)}(M9JO#l+m8tWos(rD7 zA-R)B`=Wj)Z=u)s-K1Cg_Q};JSFaT4m2+Qq^~u#M1$yP&mtD6_uDGuEGO`P{QvrDE z(m#E|m+;Oe#(w{#g77zltND8$11r{3Jj;iWF;gv?;O6mlP^tCXN(!}Sbp6qQ;ROlP zpdAhM7gqT5-A;9Tk8b%;HM6nbU~oETE66Jgo;dfe20pLp4&u%G&WMYblpokp+H~rb vRn2G!ikyQI8ZDOroCFShz1q-~O7OG}IKMT(-;rwhIc zf=_BqN`3QHeBZmf*}tTl#7M2QQo*!ak~Ev9t!XUmS$^ zgfih4?7TB9Sp=*JF2pKG1kl|K`*VOAf3b#Ynn@hG#qMj)Lae8SDlhVag2qdFn#IZ@ zw3Nnb54NUq%HXPiz7+OZ3h~D%A?I=K9(j&*_;Do^o((-3PN1T?#0U4aV$xCV3{|2 zsETgRabF!x(9xY<3X8rwHA@E1_aF-fuchehP?SSX;tVa0B+aQ9tJu+z_9uOI+u&mPzr{eNj?OD_xND5Yt(u-NiS~$QW2ov4<@j_*Vcr_ zpYv#g!xTq(F|q?J+cB$fR+fC7voe2tJw|;V(2I`%Egeo`?aZK%e3Xe~QNj}jSYeNI zl9)fN`CV*IzE3rl{SX@;+3C^RktAntgbqFJ(W#6_R}LkpeZrTs)qqv5@|-mk>w7*n z(^P&dMoG5*jO%^tXc9~5kWM}mq1}%HeX}PTL(%EdwQA=boX^;&1R`x4V6%@te%_;0 z6zEG65fz1WoIcD%Xy4;NpA1B3ow>Q0tff7Cb0SGN=3RiSW@3!K*d38f9^?SlIhfS9 zyO_eG&tHgadjbo5n7blowSgkX(@fI$uS5;~@M?4imG;Nz(?O5Mc6fC6xSw>D%ev-q zr^6j9Za2x@!aH$8`vTz6^N?(wkAD5sBWU$GWxx_lr`!)cFxdL#BEPW9xb z<>ol8e2KBf`0FVw^8sJ$Zq=P{VQk78wz?U)$><6FI!N|0R@H@WD&S3-l|Zy4Y^ z0V|e8ikXLb<>OMn(Aq)v%Q+twe5+jN;I>`v@J*A03rY$R;9}SR9m5T$;i6O}Fl=!} z`%dm(2D@D+w3oH>ffsZLB^65XV8h(kS0X9kB11tHpd_rY$%4av?evO|DpMGyC^$fS ztGnHS5O;sNtG=Vk474kOEc2yabKeMAgr+V-dsYNX2J`%J$ywyezh4=FKbQ|&d!9Yn GpZ5 -Errno read_entire_file(FILE *f, char **out_data) +Errno read_entire_file(FILE *f, char **out_data, bool null_terminate) { long saved = ftell(f); if (saved < 0) return errno; @@ -24,7 +24,7 @@ Errno read_entire_file(FILE *f, char **out_data) return errno; } - data[size] = 0; + if (null_terminate) data[size] = 0; *out_data = data; return 0; diff --git a/src/common.hpp b/src/common.hpp index 0e744b8..efdb48d 100644 --- a/src/common.hpp +++ b/src/common.hpp @@ -5,4 +5,4 @@ typedef int Errno; -Errno read_entire_file(FILE *f, char **out_data); +Errno read_entire_file(FILE *f, char **out_data, bool null_terminate); diff --git a/src/defer.hpp b/src/defer.hpp new file mode 100644 index 0000000..d23d726 --- /dev/null +++ b/src/defer.hpp @@ -0,0 +1,7 @@ +#include "scope_guard.hpp" + +#define __$CONCAT(a,b) a ## b +#define _$CONCAT(a, b) __$CONCAT(a, b) + +#define guard(M_fn) auto _$CONCAT(__defer__, __LINE__) = (sg::make_scope_guard((M_fn))); +#define defer(M_stmt) auto _$CONCAT(__defer__, __LINE__) = (sg::make_scope_guard([&](void) -> void { M_stmt ; })); diff --git a/src/main.cpp b/src/main.cpp index 93b8ed0..b2b3731 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,14 +1,19 @@ #include #include #include +#include +#include #include "camera.hpp" +#include "glm/glm/ext/matrix_float4x4.hpp" +#include "mesh.hpp" +#include "primitives.hpp" #include "shader.hpp" +#include "texture.hpp" +#include "vendor/stb_image.h" #include "vendor/glad/glad.h" #include "vendor/glm/glm/ext/matrix_transform.hpp" #define GLFW_INCLUDE_NONE #include -#define QOI_IMPLEMENTATION -#include "vendor/qoi.h" #include "vendor/glm/glm/vec3.hpp" #include "vendor/glm/glm/vec4.hpp" @@ -21,20 +26,23 @@ std::function framebuffer_size_callback = nullptr; std::function cursor_position_callback = nullptr; + +void GLAPIENTRY gl_message_callback(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar* message, const void* userParam) +{ + fprintf(stderr, "OPENGL MESSAGE: %s\n", message); + if (type == GL_DEBUG_TYPE_ERROR) { + fprintf(stderr, "exiting due to gl error above...\n"); + exit(1); + } +} + int main() { - qoi_desc fish_desc; - void *fish_rgba = qoi_read("assets/container2.qoi", &fish_desc, 4); - - qoi_desc fish_map_desc; - void *fish_map_rgba = qoi_read("assets/container2_specular.qoi", &fish_map_desc, 4); - - if (!glfwInit()) { return 1; } - glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); + glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 4); glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 3); glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); @@ -45,7 +53,7 @@ int main() glfwMakeContextCurrent(window); gladLoadGL(); - glfwSwapInterval(1); + glfwSwapInterval(0); glfwSetFramebufferSizeCallback(window, [](GLFWwindow *_, int width, int height) { if (framebuffer_size_callback) { @@ -61,66 +69,10 @@ int main() }); glEnable(GL_DEPTH_TEST); + glEnable(GL_CULL_FACE); + glEnable(GL_DEBUG_OUTPUT); + glDebugMessageCallback(gl_message_callback, NULL); - float cube_verts[] = { - // positions // normals // texture coords - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 0.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 1.0f, 1.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 1.0f, - -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, -1.0f, 0.0f, 0.0f, - - -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 1.0f, 1.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 1.0f, - -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, - - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, - -0.5f, 0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 1.0f, - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, - -0.5f, -0.5f, -0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 1.0f, - -0.5f, -0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 0.0f, 0.0f, - -0.5f, 0.5f, 0.5f, -1.0f, 0.0f, 0.0f, 1.0f, 0.0f, - - 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 1.0f, - 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f, 1.0f, 0.0f, - - -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, - 0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 1.0f, - 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, - 0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, - -0.5f, -0.5f, 0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 0.0f, - -0.5f, -0.5f, -0.5f, 0.0f, -1.0f, 0.0f, 0.0f, 1.0f, - - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f, - 0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 1.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, - 0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, - -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, - -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f, 0.0f, 1.0f - }; - - // positions all containers - glm::vec3 cube_positions[] = { - glm::vec3( 0.0f, 0.0f, 0.0f), - glm::vec3( 2.0f, 5.0f, -15.0f), - glm::vec3(-1.5f, -2.2f, -2.5f), - glm::vec3(-3.8f, -2.0f, -12.3f), - glm::vec3( 2.4f, -0.4f, -3.5f), - glm::vec3(-1.7f, 3.0f, -7.5f), - glm::vec3( 1.3f, -2.0f, -2.5f), - glm::vec3( 1.5f, 2.0f, -2.5f), - glm::vec3( 1.5f, 0.2f, -1.5f), - glm::vec3(-1.3f, 1.0f, -1.5f) - }; - // positions of the point lights glm::vec3 point_light_positions[] = { glm::vec3( 0.7f, 0.2f, 2.0f), glm::vec3( 2.3f, -3.3f, -4.0f), @@ -128,52 +80,8 @@ int main() glm::vec3( 0.0f, 0.0f, -3.0f) }; - unsigned int fish_texture; - glGenTextures(1, &fish_texture); - glBindTexture(GL_TEXTURE_2D, fish_texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fish_desc.width, fish_desc.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, fish_rgba); - glGenerateMipmap(GL_TEXTURE_2D); - - unsigned int fish_map_texture; - glGenTextures(1, &fish_map_texture); - glBindTexture(GL_TEXTURE_2D, fish_map_texture); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, fish_map_desc.width, fish_map_desc.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, fish_map_rgba); - glGenerateMipmap(GL_TEXTURE_2D); - - unsigned int lighting_program = create_program("shaders/lighting_vertex.glsl", "shaders/lighting_fragment.glsl"); - unsigned int light_cube_program = create_program("shaders/light_cube_vertex.glsl", "shaders/light_cube_fragment.glsl"); - - unsigned int cube_buffer = 0; - glGenBuffers(1, &cube_buffer); - glBindBuffer(GL_ARRAY_BUFFER, cube_buffer); - glBufferData(GL_ARRAY_BUFFER, sizeof(cube_verts), &cube_verts, GL_STATIC_DRAW); - - unsigned int object_vao; - glGenVertexArrays(1, &object_vao); - glBindVertexArray(object_vao); - - glBindBuffer(GL_ARRAY_BUFFER, cube_buffer); - - // position - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const void*)0); - glEnableVertexAttribArray(0); - // normal - glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const void*)(3 * sizeof(float))); - glEnableVertexAttribArray(1); - // texture coord - glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const void*)(6 * sizeof(float))); - glEnableVertexAttribArray(2); - - unsigned int light_source_vao; - glGenVertexArrays(1, &light_source_vao); - glBindVertexArray(light_source_vao); - - glBindBuffer(GL_ARRAY_BUFFER, cube_buffer); - - // position - glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 8 * sizeof(float), (const void*)0); - glEnableVertexAttribArray(0); - + unsigned int lit_program = create_program("shaders/lighting_vertex.glsl", "shaders/lighting_fragment.glsl"); + unsigned int skybox_program = create_program("shaders/skybox_vertex.glsl", "shaders/skybox_fragment.glsl"); glm::mat4 projection = glm::mat4(1.0f); Camera camera; @@ -187,6 +95,41 @@ int main() camera.process_mouse(x, y); }; + + std::vector meshes; + load_model_from_file(meshes, "./assets/model/backpack.obj"); + for (auto &mesh : meshes) { + mesh.init(); + } + + unsigned int skybox_vao, skybox_cubemap_texture; + { + unsigned int skybox_vbo; + + std::vector files = { + "./assets/cubemap/px.png", + "./assets/cubemap/nx.png", + "./assets/cubemap/py.png", + "./assets/cubemap/ny.png", + "./assets/cubemap/pz.png", + "./assets/cubemap/nz.png" + }; + skybox_cubemap_texture = cubemap_from_files(files); + + glGenVertexArrays(1, &skybox_vao); + glGenBuffers(1, &skybox_vbo); + + glBindVertexArray(skybox_vao); + + glBindBuffer(GL_ARRAY_BUFFER, skybox_vbo); + glBufferData(GL_ARRAY_BUFFER, skybox_verts.size() * sizeof(float), &skybox_verts[0], GL_STATIC_DRAW); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); + + glBindVertexArray(0); + } + float delta_time = 0.0f; float last_frame_time = 0.0f; @@ -220,87 +163,81 @@ int main() { /* lit objects */ { - glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, fish_texture); - glActiveTexture (GL_TEXTURE1); - glBindTexture(GL_TEXTURE_2D, fish_map_texture); + glUseProgram(lit_program); + program_set(lit_program, "model", glm::scale(glm::translate(glm::mat4(1.0), glm::vec3(0.0, 0.0, 0.0)), glm::vec3(1.0, 1.0, 1.0))); + program_set(lit_program, "projection", projection); + program_set(lit_program, "view", camera.view); + program_set(lit_program, "viewPos", camera.position); - glUseProgram(lighting_program); - glBindVertexArray(object_vao); + program_set(lit_program, "material.shininess", 32.0f); - program_set(lighting_program, "projection", projection); - program_set(lighting_program, "view", camera.view); - program_set(lighting_program, "viewPos", camera.position); - - program_set(lighting_program, "material.shininess", 32.0f); - - program_set(lighting_program, "directionalLight.direction", -0.2f, -1.0f, -0.3f); - program_set(lighting_program, "directionalLight.ambient", 0.05f, 0.05f, 0.05f); - program_set(lighting_program, "directionalLight.diffuse", 0.4f, 0.4f, 0.4f); - program_set(lighting_program, "directionalLight.specular", 0.5f, 0.5f, 0.5f); + program_set(lit_program, "directionalLight.direction", -0.2f, -1.0f, -0.3f); + program_set(lit_program, "directionalLight.ambient", 0.05f, 0.05f, 0.05f); + program_set(lit_program, "directionalLight.diffuse", 0.4f, 0.4f, 0.4f); + program_set(lit_program, "directionalLight.specular", 0.5f, 0.5f, 0.5f); // point light 1 - program_set(lighting_program, "pointLights[0].position", point_light_positions[0]); - program_set(lighting_program, "pointLights[0].ambient", 0.05f, 0.05f, 0.05f); - program_set(lighting_program, "pointLights[0].diffuse", 0.8f, 0.8f, 0.8f); - program_set(lighting_program, "pointLights[0].specular", 1.0f, 1.0f, 1.0f); - program_set(lighting_program, "pointLights[0].constant", 1.0f); - program_set(lighting_program, "pointLights[0].linear", 0.09f); - program_set(lighting_program, "pointLights[0].quadratic", 0.032f); + program_set(lit_program, "pointLights[0].position", point_light_positions[0]); + program_set(lit_program, "pointLights[0].ambient", 0.05f, 0.05f, 0.05f); + program_set(lit_program, "pointLights[0].diffuse", 0.8f, 0.8f, 0.8f); + program_set(lit_program, "pointLights[0].specular", 1.0f, 1.0f, 1.0f); + program_set(lit_program, "pointLights[0].constant", 1.0f); + program_set(lit_program, "pointLights[0].linear", 0.09f); + program_set(lit_program, "pointLights[0].quadratic", 0.032f); // point light 2 - program_set(lighting_program, "pointLights[1].position", point_light_positions[1]); - program_set(lighting_program, "pointLights[1].ambient", 0.05f, 0.05f, 0.05f); - program_set(lighting_program, "pointLights[1].diffuse", 0.8f, 0.8f, 0.8f); - program_set(lighting_program, "pointLights[1].specular", 1.0f, 1.0f, 1.0f); - program_set(lighting_program, "pointLights[1].constant", 1.0f); - program_set(lighting_program, "pointLights[1].linear", 0.09f); - program_set(lighting_program, "pointLights[1].quadratic", 0.032f); + program_set(lit_program, "pointLights[1].position", point_light_positions[1]); + program_set(lit_program, "pointLights[1].ambient", 0.05f, 0.05f, 0.05f); + program_set(lit_program, "pointLights[1].diffuse", 0.8f, 0.8f, 0.8f); + program_set(lit_program, "pointLights[1].specular", 1.0f, 1.0f, 1.0f); + program_set(lit_program, "pointLights[1].constant", 1.0f); + program_set(lit_program, "pointLights[1].linear", 0.09f); + program_set(lit_program, "pointLights[1].quadratic", 0.032f); // point light 3 - program_set(lighting_program, "pointLights[2].position", point_light_positions[2]); - program_set(lighting_program, "pointLights[2].ambient", 0.05f, 0.05f, 0.05f); - program_set(lighting_program, "pointLights[2].diffuse", 0.8f, 0.8f, 0.8f); - program_set(lighting_program, "pointLights[2].specular", 1.0f, 1.0f, 1.0f); - program_set(lighting_program, "pointLights[2].constant", 1.0f); - program_set(lighting_program, "pointLights[2].linear", 0.09f); - program_set(lighting_program, "pointLights[2].quadratic", 0.032f); + program_set(lit_program, "pointLights[2].position", point_light_positions[2]); + program_set(lit_program, "pointLights[2].ambient", 0.05f, 0.05f, 0.05f); + program_set(lit_program, "pointLights[2].diffuse", 0.8f, 0.8f, 0.8f); + program_set(lit_program, "pointLights[2].specular", 1.0f, 1.0f, 1.0f); + program_set(lit_program, "pointLights[2].constant", 1.0f); + program_set(lit_program, "pointLights[2].linear", 0.09f); + program_set(lit_program, "pointLights[2].quadratic", 0.032f); // point light 4 - program_set(lighting_program, "pointLights[3].position", point_light_positions[3]); - program_set(lighting_program, "pointLights[3].ambient", 0.05f, 0.05f, 0.05f); - program_set(lighting_program, "pointLights[3].diffuse", 0.8f, 0.8f, 0.8f); - program_set(lighting_program, "pointLights[3].specular", 1.0f, 1.0f, 1.0f); - program_set(lighting_program, "pointLights[3].constant", 1.0f); - program_set(lighting_program, "pointLights[3].linear", 0.09f); - program_set(lighting_program, "pointLights[3].quadratic", 0.032f); + program_set(lit_program, "pointLights[3].position", point_light_positions[3]); + program_set(lit_program, "pointLights[3].ambient", 0.05f, 0.05f, 0.05f); + program_set(lit_program, "pointLights[3].diffuse", 0.8f, 0.8f, 0.8f); + program_set(lit_program, "pointLights[3].specular", 1.0f, 1.0f, 1.0f); + program_set(lit_program, "pointLights[3].constant", 1.0f); + program_set(lit_program, "pointLights[3].linear", 0.09f); + program_set(lit_program, "pointLights[3].quadratic", 0.032f); // spot light - program_set(lighting_program, "spotLight.position", camera.position); - program_set(lighting_program, "spotLight.direction", camera.front); - program_set(lighting_program, "spotLight.ambient", 0.0f, 0.0f, 0.0f); - program_set(lighting_program, "spotLight.diffuse", 1.0f, 1.0f, 1.0f); - program_set(lighting_program, "spotLight.specular", 1.0f, 1.0f, 1.0f); - program_set(lighting_program, "spotLight.constant", 1.0f); - program_set(lighting_program, "spotLight.linear", 0.09f); - program_set(lighting_program, "spotLight.quadratic", 0.032f); - program_set(lighting_program, "spotLight.cutOff", glm::cos(glm::radians(12.5f))); - program_set(lighting_program, "spotLight.outerCutOff", glm::cos(glm::radians(15.0f))); + program_set(lit_program, "spotLight.position", camera.position); + program_set(lit_program, "spotLight.direction", camera.front); + program_set(lit_program, "spotLight.ambient", 0.0f, 0.0f, 0.0f); + program_set(lit_program, "spotLight.diffuse", 1.0f, 1.0f, 1.0f); + program_set(lit_program, "spotLight.specular", 1.0f, 1.0f, 1.0f); + program_set(lit_program, "spotLight.constant", 1.0f); + program_set(lit_program, "spotLight.linear", 0.09f); + program_set(lit_program, "spotLight.quadratic", 0.032f); + program_set(lit_program, "spotLight.cutOff", glm::cos(glm::radians(12.5f))); + program_set(lit_program, "spotLight.outerCutOff", glm::cos(glm::radians(15.0f))); - - for (int i = 0; i < 10; i++) { - program_set(lighting_program, "model", glm::rotate(glm::translate(glm::mat4(1.0f), cube_positions[i]), glm::radians(20.0f * i), glm::vec3(1.0f, 0.3f, 0.5f))); - glDrawArrays(GL_TRIANGLES, 0, 36); + for (const auto &mesh : meshes) { + mesh.draw(lit_program); } } - /* lamp object */ + /* skybox */ { - glUseProgram(light_cube_program); - glBindVertexArray(light_source_vao); + glDepthFunc(GL_LEQUAL); - program_set(light_cube_program, "view", camera.view); - program_set(light_cube_program, "projection", projection); + glUseProgram(skybox_program); + glBindVertexArray(skybox_vao); + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_CUBE_MAP, skybox_cubemap_texture); + program_set(skybox_program, "projection", projection); + program_set(skybox_program, "view", glm::mat4(glm::mat3(camera.view))); + program_set(skybox_program, "texture_cubemap1", 0); + glDrawArrays(GL_TRIANGLES, 0, 36); - for (int i = 0; i < 4; i++) { - program_set(light_cube_program, "model", glm::scale(glm::translate(glm::mat4(1.0f), point_light_positions[i]), glm::vec3(0.2f))); - glDrawArrays(GL_TRIANGLES, 0, 36); - } + glDepthFunc(GL_LESS); } } diff --git a/src/mesh.cpp b/src/mesh.cpp new file mode 100644 index 0000000..8b746b6 --- /dev/null +++ b/src/mesh.cpp @@ -0,0 +1,165 @@ +#include "texture.hpp" +#include "vendor/glad/glad.h" +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "mesh.hpp" +#include "shader.hpp" + + +void Mesh::init() +{ + glGenVertexArrays(1, &vao); + glGenBuffers(1, &vertices_vbo); + + glBindVertexArray(vao); + + + glBindBuffer(GL_ARRAY_BUFFER, vertices_vbo); + glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), &vertices[0], GL_STATIC_DRAW); + + glGenBuffers(1, &indicies_ebo); + glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicies_ebo); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, indicies.size() * sizeof(unsigned int), &indicies[0], GL_STATIC_DRAW); + + glEnableVertexAttribArray(0); + glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position)); + + glEnableVertexAttribArray(1); + glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, normal)); + + glEnableVertexAttribArray(2); + glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, textureCoords)); + + + glBindVertexArray(0); +} + +void Mesh::draw(unsigned int program_id) const +{ + unsigned int diffuse_number = 1; + unsigned int specular_number = 1; + + for (unsigned int i = 0; i < textures.size(); i++) { + const Texture &texture = textures[i]; + + glActiveTexture(GL_TEXTURE0 + i); + + if (texture.type == "texture_diffuse") { + program_set(program_id, ("material.texture_diffuse" + std::to_string(diffuse_number++)).c_str(), static_cast(i)); + } else if (texture.type == "texture_specular") { + program_set(program_id, ("material.texture_specular" + std::to_string(specular_number++)).c_str(), static_cast(i)); + } + + glBindTexture(GL_TEXTURE_2D, texture.id); + } + + glBindVertexArray(vao); + glDrawElements(GL_TRIANGLES, indicies.size(), GL_UNSIGNED_INT, 0); + glBindVertexArray(0); + + glActiveTexture(GL_TEXTURE0); +} + + +static std::unordered_map file_path_to_loaded_texture_cache; +static void load_material_textures(std::vector &out_textures, const aiMaterial *material, const aiTextureType texture_type, const char *type_name, const std::string &texture_root_directory) +{ + unsigned int texture_count = aiGetMaterialTextureCount(material, texture_type); + + out_textures.reserve(texture_count); + + for (unsigned int i = 0; i < texture_count; i++) { + aiString filename; + material->GetTexture(texture_type, i, &filename); + std::string path = texture_root_directory + "/" + filename.C_Str(); + + auto it = file_path_to_loaded_texture_cache.find(path); + if (it != file_path_to_loaded_texture_cache.end()) { + Texture texture = it->second; + out_textures.push_back(texture); + continue; + } + + unsigned int texture_id = texture_from_file(path.c_str()); + + Texture texture = out_textures.emplace_back(texture_id, type_name); + + file_path_to_loaded_texture_cache[path] = texture; + } +} + +static void visit_node_process_mesh(const aiScene *scene, const aiMesh *mesh, const std::string *texture_root_directory, std::vector &out_meshes) +{ + auto &out_mesh = out_meshes.emplace_back(); + + std::vector &vertices = out_mesh.vertices; + std::vector &textures = out_mesh.textures; + std::vector &indicies = out_mesh.indicies; + + vertices.reserve(mesh->mNumVertices); + for (unsigned int i = 0; i < mesh->mNumVertices; i++) { + const aiVector3D vertex = mesh->mVertices[i]; + const aiVector3D normal = mesh->mNormals[i]; + const aiVector3D *textureCoords = mesh->mTextureCoords[0]; + vertices.emplace_back( + glm::vec3(vertex.x, vertex.y, vertex.z), + glm::vec3(normal.x, normal.y, normal.z), + textureCoords ? glm::vec2(textureCoords[i].x, textureCoords[i].y) : glm::vec2(0.0, 0.0) + ); + } + + for (unsigned int i = 0; i < mesh->mNumFaces; i++) { + aiFace face = mesh->mFaces[i]; + for (unsigned int j = 0; j < face.mNumIndices; j++) { + indicies.push_back(face.mIndices[j]); + } + } + + if (mesh->mMaterialIndex >= 0) { + aiMaterial *material = scene->mMaterials[mesh->mMaterialIndex]; + load_material_textures(textures, material, aiTextureType_DIFFUSE, "texture_diffuse", *texture_root_directory); + load_material_textures(textures, material, aiTextureType_SPECULAR, "texture_specular", *texture_root_directory); + } +} + +static void visit_node(aiNode *node, const aiScene *scene, std::string *texture_root_directory, std::vector &out_meshes) +{ + for (unsigned int i = 0; i < node->mNumMeshes; i++) { + const aiMesh *mesh = scene->mMeshes[node->mMeshes[i]]; + visit_node_process_mesh(scene, mesh, texture_root_directory, out_meshes); + } + + for (unsigned int i = 0; i < node->mNumChildren; i++) { + visit_node(node->mChildren[i], scene, texture_root_directory, out_meshes); + } +} + +void load_model_from_file(std::vector &out_meshes, const std::string &path) +{ + auto t1 = std::chrono::high_resolution_clock::now(); + + Assimp::Importer importer; + const aiScene *scene = importer.ReadFile(path, aiProcess_Triangulate | aiProcess_GenSmoothNormals | aiProcess_ValidateDataStructure | aiProcess_OptimizeMeshes | aiProcess_OptimizeGraph); + if (!scene || scene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !scene->mRootNode) { + std::cerr << "load_model_from_file: assimp importer failed to read model: " << importer.GetErrorString() << std::endl; + return; + } + + std::string texture_root_directory = path.substr(0, path.find_last_of('/')); + visit_node(scene->mRootNode, scene, &texture_root_directory, out_meshes); + + auto t2 = std::chrono::high_resolution_clock::now(); + std::chrono::duration delta = t2 - t1; + + printf("processed %ld meshes in %fms\n", out_meshes.size(), delta.count()); +} diff --git a/src/mesh.hpp b/src/mesh.hpp new file mode 100644 index 0000000..94b71ca --- /dev/null +++ b/src/mesh.hpp @@ -0,0 +1,32 @@ +#pragma once + +#include +#include +#include "vendor/glm/glm/vec2.hpp" +#include "vendor/glm/glm/vec3.hpp" + +struct Vertex { + glm::vec3 position; + glm::vec3 normal; + glm::vec2 textureCoords; +}; + +struct Texture { + unsigned int id; + std::string type; +}; + +struct Mesh { + std::vector vertices; + std::vector textures; + std::vector indicies; + bool use_indicies = true; + + unsigned int vao, vertices_vbo, indicies_ebo; + + void init(); + void draw(unsigned int program_id) const; +}; + + +void load_model_from_file(std::vector &out_meshes, const std::string &path); diff --git a/src/primitives.cpp b/src/primitives.cpp new file mode 100644 index 0000000..9977f90 --- /dev/null +++ b/src/primitives.cpp @@ -0,0 +1,45 @@ +#include "primitives.hpp" + +const std::vector skybox_verts = { + -1.0f, 1.0f, -1.0f, + -1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + + -1.0f, -1.0f, 1.0f, + -1.0f, -1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, -1.0f, + -1.0f, 1.0f, 1.0f, + -1.0f, -1.0f, 1.0f, + + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + + -1.0f, -1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, -1.0f, 1.0f, + -1.0f, -1.0f, 1.0f, + + -1.0f, 1.0f, -1.0f, + 1.0f, 1.0f, -1.0f, + 1.0f, 1.0f, 1.0f, + 1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, 1.0f, + -1.0f, 1.0f, -1.0f, + + -1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, 1.0f, + 1.0f, -1.0f, -1.0f, + 1.0f, -1.0f, -1.0f, + -1.0f, -1.0f, 1.0f, + 1.0f, -1.0f, 1.0f +}; diff --git a/src/primitives.hpp b/src/primitives.hpp new file mode 100644 index 0000000..a84b0ac --- /dev/null +++ b/src/primitives.hpp @@ -0,0 +1,5 @@ +#pragma once + +#include + +extern const std::vector skybox_verts; diff --git a/src/shader.cpp b/src/shader.cpp index c890d2a..b4a35ff 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -1,6 +1,7 @@ #include "shader.hpp" #include "common.hpp" #include "vendor/glad/glad.h" +#include "defer.hpp" #include #include #include @@ -66,42 +67,39 @@ unsigned int create_program_source(const char *vertex_shader_source, const char unsigned int create_program(const char *vertex_shader_path, const char *fragment_shader_path) { - FILE *vertex_shader_file, *fragment_shader_file = NULL; - char *vertex_shader_source = NULL; - char *fragment_shader_source = NULL; Errno err = 0; - unsigned int ret = 0; - vertex_shader_file = fopen(vertex_shader_path, "r"); + FILE *vertex_shader_file = fopen(vertex_shader_path, "r"); + defer(if (vertex_shader_file) fclose(vertex_shader_file)); if (!vertex_shader_file) { fprintf(stderr, "create_program: failed to open vertex shader file (%s): %s\n", vertex_shader_path, strerror(errno)); - goto done; + return 0; } - err = read_entire_file(vertex_shader_file, &vertex_shader_source); + + char *vertex_shader_source = NULL; + defer(free(vertex_shader_source)); + err = read_entire_file(vertex_shader_file, &vertex_shader_source, true); if (err) { fprintf(stderr, "create_program: failed to read vertex shader file (%s): %s\n", vertex_shader_path, strerror(err)); - goto done; + return 0; } - fragment_shader_file = fopen(fragment_shader_path, "r"); + FILE *fragment_shader_file = fopen(fragment_shader_path, "r"); + defer(if (fragment_shader_file) fclose(fragment_shader_file)); if (!fragment_shader_file) { fprintf(stderr, "create_program: failed to open fragment shader file (%s): %s\n", fragment_shader_path, strerror(errno)); - goto done; + return 0; } - err = read_entire_file(fragment_shader_file, &fragment_shader_source); + + char *fragment_shader_source = NULL; + defer(free(fragment_shader_source)); + err = read_entire_file(fragment_shader_file, &fragment_shader_source, true); if (err) { fprintf(stderr, "create_program: failed to read fragment shader file (%s): %s\n", fragment_shader_path, strerror(err)); - goto done; + return 0; } - ret = create_program_source(vertex_shader_source, fragment_shader_source); - -done: - if (vertex_shader_file) fclose(vertex_shader_file); - if (fragment_shader_file) fclose(fragment_shader_file); - if (vertex_shader_source) free(vertex_shader_source); - if (fragment_shader_source) free(fragment_shader_source); - return ret; + return create_program_source(vertex_shader_source, fragment_shader_source); } void program_set(unsigned int program, const char *uniform, int value) @@ -109,6 +107,11 @@ void program_set(unsigned int program, const char *uniform, int value) glUniform1i(glGetUniformLocation(program, uniform), value); } +void program_set(unsigned int program, const char *uniform, unsigned int value) +{ + glUniform1ui(glGetUniformLocation(program, uniform), value); +} + void program_set(unsigned int program, const char *uniform, float value) { glUniform1f(glGetUniformLocation(program, uniform), value); diff --git a/src/shader.hpp b/src/shader.hpp index ea92530..7684c57 100644 --- a/src/shader.hpp +++ b/src/shader.hpp @@ -5,6 +5,7 @@ unsigned int create_program(const char *vertex_shader_path, const char *fragment_shader_path); void program_set(unsigned int program, const char *uniform, int value); +void program_set(unsigned int program, const char *uniform, unsigned int value); void program_set(unsigned int program, const char *uniform, float value); void program_set(unsigned int program, const char *uniform, glm::vec3 vec); void program_set(unsigned int program, const char *uniform, float x, float y, float z); diff --git a/src/stb_image_impl.cpp b/src/stb_image_impl.cpp new file mode 100644 index 0000000..fd2ce74 --- /dev/null +++ b/src/stb_image_impl.cpp @@ -0,0 +1,11 @@ +#define STB_IMAGE_IMPLEMENTATION +// #define STBI_NO_JPEG +// #define STBI_NO_PNG +#define STBI_NO_BMP +#define STBI_NO_PSD +#define STBI_NO_TGA +#define STBI_NO_GIF +// #define STBI_NO_HDR +#define STBI_NO_PIC +#define STBI_NO_PNM +#include "vendor/stb_image.h" diff --git a/src/texture.cpp b/src/texture.cpp new file mode 100644 index 0000000..883cba5 --- /dev/null +++ b/src/texture.cpp @@ -0,0 +1,71 @@ +#include "texture.hpp" +#include "defer.hpp" +#include "common.hpp" +#include "vendor/glad/glad.h" +#include "vendor/stb_image.h" +#include +#include +#include +#include +#include + + +unsigned int texture_from_file(const char *path) +{ + printf("texture_from_file: load %s\n", path); + + int x, y; + unsigned char *data = stbi_load(path, &x, &y, NULL, 4); + defer(stbi_image_free(data)); + if (!data) { + fprintf(stderr, "texture_from_file: failed to load %s\n", path); + return 0; + } + + unsigned int texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_2D, texture); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); + + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, x, y, 0, GL_RGBA, GL_UNSIGNED_BYTE, data); + glGenerateMipmap(GL_TEXTURE_2D); + + glBindTexture(GL_TEXTURE_2D, 0); + + return texture; +} + +unsigned int cubemap_from_files(std::vector &faces) +{ + unsigned int texture; + glGenTextures(1, &texture); + glBindTexture(GL_TEXTURE_CUBE_MAP, texture); + + int width, height = 0; + unsigned char *data = NULL; + for (unsigned int i = 0; i < faces.size(); i++) { + printf("cubemap_from_files: load %s\n", faces[i]); + + data = stbi_load(faces[i], &width, &height, NULL, 3); + defer(stbi_image_free(data)); + + if (data) { + glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + i, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, data); + } else { + fprintf(stderr, "cubemap_from_files: failed to load file %s\n", faces[i]); + } + } + + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE); + + return texture; +} diff --git a/src/texture.hpp b/src/texture.hpp new file mode 100644 index 0000000..7c7ed00 --- /dev/null +++ b/src/texture.hpp @@ -0,0 +1,8 @@ +#pragma once + +#include +#include + + +unsigned int texture_from_file(const char *path); +unsigned int cubemap_from_files(std::vector &faces); diff --git a/src/vendor/glad/glad.c b/src/vendor/glad/glad.c index c83c6ad..ed09a3a 100644 --- a/src/vendor/glad/glad.c +++ b/src/vendor/glad/glad.c @@ -1,10 +1,10 @@ /* - OpenGL loader generated by glad 0.1.34 on Thu Jun 29 15:12:42 2023. + OpenGL loader generated by glad 0.1.34 on Mon Aug 28 15:56:17 2023. Language/Generator: C/C++ Specification: gl - APIs: gl=3.3 + APIs: gl=4.3 Profile: core Extensions: @@ -14,9 +14,9 @@ Reproducible: False Commandline: - --profile="core" --api="gl=3.3" --generator="c" --spec="gl" --extensions="" + --profile="core" --api="gl=4.3" --generator="c" --spec="gl" --extensions="" Online: - https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D3.3 + https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D4.3 */ #include @@ -267,10 +267,16 @@ int GLAD_GL_VERSION_3_0 = 0; int GLAD_GL_VERSION_3_1 = 0; int GLAD_GL_VERSION_3_2 = 0; int GLAD_GL_VERSION_3_3 = 0; +int GLAD_GL_VERSION_4_0 = 0; +int GLAD_GL_VERSION_4_1 = 0; +int GLAD_GL_VERSION_4_2 = 0; +int GLAD_GL_VERSION_4_3 = 0; +PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram = NULL; PFNGLACTIVETEXTUREPROC glad_glActiveTexture = NULL; PFNGLATTACHSHADERPROC glad_glAttachShader = NULL; PFNGLBEGINCONDITIONALRENDERPROC glad_glBeginConditionalRender = NULL; PFNGLBEGINQUERYPROC glad_glBeginQuery = NULL; +PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed = NULL; PFNGLBEGINTRANSFORMFEEDBACKPROC glad_glBeginTransformFeedback = NULL; PFNGLBINDATTRIBLOCATIONPROC glad_glBindAttribLocation = NULL; PFNGLBINDBUFFERPROC glad_glBindBuffer = NULL; @@ -279,27 +285,38 @@ PFNGLBINDBUFFERRANGEPROC glad_glBindBufferRange = NULL; PFNGLBINDFRAGDATALOCATIONPROC glad_glBindFragDataLocation = NULL; PFNGLBINDFRAGDATALOCATIONINDEXEDPROC glad_glBindFragDataLocationIndexed = NULL; PFNGLBINDFRAMEBUFFERPROC glad_glBindFramebuffer = NULL; +PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture = NULL; +PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline = NULL; PFNGLBINDRENDERBUFFERPROC glad_glBindRenderbuffer = NULL; PFNGLBINDSAMPLERPROC glad_glBindSampler = NULL; PFNGLBINDTEXTUREPROC glad_glBindTexture = NULL; +PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback = NULL; PFNGLBINDVERTEXARRAYPROC glad_glBindVertexArray = NULL; +PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer = NULL; PFNGLBLENDCOLORPROC glad_glBlendColor = NULL; PFNGLBLENDEQUATIONPROC glad_glBlendEquation = NULL; PFNGLBLENDEQUATIONSEPARATEPROC glad_glBlendEquationSeparate = NULL; +PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei = NULL; +PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi = NULL; PFNGLBLENDFUNCPROC glad_glBlendFunc = NULL; PFNGLBLENDFUNCSEPARATEPROC glad_glBlendFuncSeparate = NULL; +PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei = NULL; +PFNGLBLENDFUNCIPROC glad_glBlendFunci = NULL; PFNGLBLITFRAMEBUFFERPROC glad_glBlitFramebuffer = NULL; PFNGLBUFFERDATAPROC glad_glBufferData = NULL; PFNGLBUFFERSUBDATAPROC glad_glBufferSubData = NULL; PFNGLCHECKFRAMEBUFFERSTATUSPROC glad_glCheckFramebufferStatus = NULL; PFNGLCLAMPCOLORPROC glad_glClampColor = NULL; PFNGLCLEARPROC glad_glClear = NULL; +PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData = NULL; +PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData = NULL; PFNGLCLEARBUFFERFIPROC glad_glClearBufferfi = NULL; PFNGLCLEARBUFFERFVPROC glad_glClearBufferfv = NULL; PFNGLCLEARBUFFERIVPROC glad_glClearBufferiv = NULL; PFNGLCLEARBUFFERUIVPROC glad_glClearBufferuiv = NULL; PFNGLCLEARCOLORPROC glad_glClearColor = NULL; PFNGLCLEARDEPTHPROC glad_glClearDepth = NULL; +PFNGLCLEARDEPTHFPROC glad_glClearDepthf = NULL; PFNGLCLEARSTENCILPROC glad_glClearStencil = NULL; PFNGLCLIENTWAITSYNCPROC glad_glClientWaitSync = NULL; PFNGLCOLORMASKPROC glad_glColorMask = NULL; @@ -316,6 +333,7 @@ PFNGLCOMPRESSEDTEXSUBIMAGE1DPROC glad_glCompressedTexSubImage1D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE2DPROC glad_glCompressedTexSubImage2D = NULL; PFNGLCOMPRESSEDTEXSUBIMAGE3DPROC glad_glCompressedTexSubImage3D = NULL; PFNGLCOPYBUFFERSUBDATAPROC glad_glCopyBufferSubData = NULL; +PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData = NULL; PFNGLCOPYTEXIMAGE1DPROC glad_glCopyTexImage1D = NULL; PFNGLCOPYTEXIMAGE2DPROC glad_glCopyTexImage2D = NULL; PFNGLCOPYTEXSUBIMAGE1DPROC glad_glCopyTexSubImage1D = NULL; @@ -323,44 +341,66 @@ PFNGLCOPYTEXSUBIMAGE2DPROC glad_glCopyTexSubImage2D = NULL; PFNGLCOPYTEXSUBIMAGE3DPROC glad_glCopyTexSubImage3D = NULL; PFNGLCREATEPROGRAMPROC glad_glCreateProgram = NULL; PFNGLCREATESHADERPROC glad_glCreateShader = NULL; +PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv = NULL; PFNGLCULLFACEPROC glad_glCullFace = NULL; +PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback = NULL; +PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl = NULL; +PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert = NULL; PFNGLDELETEBUFFERSPROC glad_glDeleteBuffers = NULL; PFNGLDELETEFRAMEBUFFERSPROC glad_glDeleteFramebuffers = NULL; PFNGLDELETEPROGRAMPROC glad_glDeleteProgram = NULL; +PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines = NULL; PFNGLDELETEQUERIESPROC glad_glDeleteQueries = NULL; PFNGLDELETERENDERBUFFERSPROC glad_glDeleteRenderbuffers = NULL; PFNGLDELETESAMPLERSPROC glad_glDeleteSamplers = NULL; PFNGLDELETESHADERPROC glad_glDeleteShader = NULL; PFNGLDELETESYNCPROC glad_glDeleteSync = NULL; PFNGLDELETETEXTURESPROC glad_glDeleteTextures = NULL; +PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks = NULL; PFNGLDELETEVERTEXARRAYSPROC glad_glDeleteVertexArrays = NULL; PFNGLDEPTHFUNCPROC glad_glDepthFunc = NULL; PFNGLDEPTHMASKPROC glad_glDepthMask = NULL; PFNGLDEPTHRANGEPROC glad_glDepthRange = NULL; +PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv = NULL; +PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed = NULL; +PFNGLDEPTHRANGEFPROC glad_glDepthRangef = NULL; PFNGLDETACHSHADERPROC glad_glDetachShader = NULL; PFNGLDISABLEPROC glad_glDisable = NULL; PFNGLDISABLEVERTEXATTRIBARRAYPROC glad_glDisableVertexAttribArray = NULL; PFNGLDISABLEIPROC glad_glDisablei = NULL; +PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute = NULL; +PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect = NULL; PFNGLDRAWARRAYSPROC glad_glDrawArrays = NULL; +PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect = NULL; PFNGLDRAWARRAYSINSTANCEDPROC glad_glDrawArraysInstanced = NULL; +PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance = NULL; PFNGLDRAWBUFFERPROC glad_glDrawBuffer = NULL; PFNGLDRAWBUFFERSPROC glad_glDrawBuffers = NULL; PFNGLDRAWELEMENTSPROC glad_glDrawElements = NULL; PFNGLDRAWELEMENTSBASEVERTEXPROC glad_glDrawElementsBaseVertex = NULL; +PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect = NULL; PFNGLDRAWELEMENTSINSTANCEDPROC glad_glDrawElementsInstanced = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance = NULL; PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXPROC glad_glDrawElementsInstancedBaseVertex = NULL; +PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance = NULL; PFNGLDRAWRANGEELEMENTSPROC glad_glDrawRangeElements = NULL; PFNGLDRAWRANGEELEMENTSBASEVERTEXPROC glad_glDrawRangeElementsBaseVertex = NULL; +PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback = NULL; +PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream = NULL; +PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced = NULL; PFNGLENABLEPROC glad_glEnable = NULL; PFNGLENABLEVERTEXATTRIBARRAYPROC glad_glEnableVertexAttribArray = NULL; PFNGLENABLEIPROC glad_glEnablei = NULL; PFNGLENDCONDITIONALRENDERPROC glad_glEndConditionalRender = NULL; PFNGLENDQUERYPROC glad_glEndQuery = NULL; +PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed = NULL; PFNGLENDTRANSFORMFEEDBACKPROC glad_glEndTransformFeedback = NULL; PFNGLFENCESYNCPROC glad_glFenceSync = NULL; PFNGLFINISHPROC glad_glFinish = NULL; PFNGLFLUSHPROC glad_glFlush = NULL; PFNGLFLUSHMAPPEDBUFFERRANGEPROC glad_glFlushMappedBufferRange = NULL; +PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri = NULL; PFNGLFRAMEBUFFERRENDERBUFFERPROC glad_glFramebufferRenderbuffer = NULL; PFNGLFRAMEBUFFERTEXTUREPROC glad_glFramebufferTexture = NULL; PFNGLFRAMEBUFFERTEXTURE1DPROC glad_glFramebufferTexture1D = NULL; @@ -370,13 +410,19 @@ PFNGLFRAMEBUFFERTEXTURELAYERPROC glad_glFramebufferTextureLayer = NULL; PFNGLFRONTFACEPROC glad_glFrontFace = NULL; PFNGLGENBUFFERSPROC glad_glGenBuffers = NULL; PFNGLGENFRAMEBUFFERSPROC glad_glGenFramebuffers = NULL; +PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines = NULL; PFNGLGENQUERIESPROC glad_glGenQueries = NULL; PFNGLGENRENDERBUFFERSPROC glad_glGenRenderbuffers = NULL; PFNGLGENSAMPLERSPROC glad_glGenSamplers = NULL; PFNGLGENTEXTURESPROC glad_glGenTextures = NULL; +PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks = NULL; PFNGLGENVERTEXARRAYSPROC glad_glGenVertexArrays = NULL; PFNGLGENERATEMIPMAPPROC glad_glGenerateMipmap = NULL; +PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv = NULL; PFNGLGETACTIVEATTRIBPROC glad_glGetActiveAttrib = NULL; +PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName = NULL; +PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv = NULL; PFNGLGETACTIVEUNIFORMPROC glad_glGetActiveUniform = NULL; PFNGLGETACTIVEUNIFORMBLOCKNAMEPROC glad_glGetActiveUniformBlockName = NULL; PFNGLGETACTIVEUNIFORMBLOCKIVPROC glad_glGetActiveUniformBlockiv = NULL; @@ -391,19 +437,39 @@ PFNGLGETBUFFERPARAMETERIVPROC glad_glGetBufferParameteriv = NULL; PFNGLGETBUFFERPOINTERVPROC glad_glGetBufferPointerv = NULL; PFNGLGETBUFFERSUBDATAPROC glad_glGetBufferSubData = NULL; PFNGLGETCOMPRESSEDTEXIMAGEPROC glad_glGetCompressedTexImage = NULL; +PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog = NULL; +PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v = NULL; PFNGLGETDOUBLEVPROC glad_glGetDoublev = NULL; PFNGLGETERRORPROC glad_glGetError = NULL; +PFNGLGETFLOATI_VPROC glad_glGetFloati_v = NULL; PFNGLGETFLOATVPROC glad_glGetFloatv = NULL; PFNGLGETFRAGDATAINDEXPROC glad_glGetFragDataIndex = NULL; PFNGLGETFRAGDATALOCATIONPROC glad_glGetFragDataLocation = NULL; PFNGLGETFRAMEBUFFERATTACHMENTPARAMETERIVPROC glad_glGetFramebufferAttachmentParameteriv = NULL; +PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv = NULL; PFNGLGETINTEGER64I_VPROC glad_glGetInteger64i_v = NULL; PFNGLGETINTEGER64VPROC glad_glGetInteger64v = NULL; PFNGLGETINTEGERI_VPROC glad_glGetIntegeri_v = NULL; PFNGLGETINTEGERVPROC glad_glGetIntegerv = NULL; +PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v = NULL; +PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ = NULL; PFNGLGETMULTISAMPLEFVPROC glad_glGetMultisamplefv = NULL; +PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel = NULL; +PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel = NULL; +PFNGLGETPOINTERVPROC glad_glGetPointerv = NULL; +PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary = NULL; PFNGLGETPROGRAMINFOLOGPROC glad_glGetProgramInfoLog = NULL; +PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv = NULL; +PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog = NULL; +PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv = NULL; +PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation = NULL; +PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex = NULL; +PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName = NULL; +PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv = NULL; +PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv = NULL; PFNGLGETPROGRAMIVPROC glad_glGetProgramiv = NULL; +PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv = NULL; PFNGLGETQUERYOBJECTI64VPROC glad_glGetQueryObjecti64v = NULL; PFNGLGETQUERYOBJECTIVPROC glad_glGetQueryObjectiv = NULL; PFNGLGETQUERYOBJECTUI64VPROC glad_glGetQueryObjectui64v = NULL; @@ -415,10 +481,13 @@ PFNGLGETSAMPLERPARAMETERIUIVPROC glad_glGetSamplerParameterIuiv = NULL; PFNGLGETSAMPLERPARAMETERFVPROC glad_glGetSamplerParameterfv = NULL; PFNGLGETSAMPLERPARAMETERIVPROC glad_glGetSamplerParameteriv = NULL; PFNGLGETSHADERINFOLOGPROC glad_glGetShaderInfoLog = NULL; +PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat = NULL; PFNGLGETSHADERSOURCEPROC glad_glGetShaderSource = NULL; PFNGLGETSHADERIVPROC glad_glGetShaderiv = NULL; PFNGLGETSTRINGPROC glad_glGetString = NULL; PFNGLGETSTRINGIPROC glad_glGetStringi = NULL; +PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex = NULL; +PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation = NULL; PFNGLGETSYNCIVPROC glad_glGetSynciv = NULL; PFNGLGETTEXIMAGEPROC glad_glGetTexImage = NULL; PFNGLGETTEXLEVELPARAMETERFVPROC glad_glGetTexLevelParameterfv = NULL; @@ -431,36 +500,51 @@ PFNGLGETTRANSFORMFEEDBACKVARYINGPROC glad_glGetTransformFeedbackVarying = NULL; PFNGLGETUNIFORMBLOCKINDEXPROC glad_glGetUniformBlockIndex = NULL; PFNGLGETUNIFORMINDICESPROC glad_glGetUniformIndices = NULL; PFNGLGETUNIFORMLOCATIONPROC glad_glGetUniformLocation = NULL; +PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv = NULL; +PFNGLGETUNIFORMDVPROC glad_glGetUniformdv = NULL; PFNGLGETUNIFORMFVPROC glad_glGetUniformfv = NULL; PFNGLGETUNIFORMIVPROC glad_glGetUniformiv = NULL; PFNGLGETUNIFORMUIVPROC glad_glGetUniformuiv = NULL; PFNGLGETVERTEXATTRIBIIVPROC glad_glGetVertexAttribIiv = NULL; PFNGLGETVERTEXATTRIBIUIVPROC glad_glGetVertexAttribIuiv = NULL; +PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv = NULL; PFNGLGETVERTEXATTRIBPOINTERVPROC glad_glGetVertexAttribPointerv = NULL; PFNGLGETVERTEXATTRIBDVPROC glad_glGetVertexAttribdv = NULL; PFNGLGETVERTEXATTRIBFVPROC glad_glGetVertexAttribfv = NULL; PFNGLGETVERTEXATTRIBIVPROC glad_glGetVertexAttribiv = NULL; PFNGLHINTPROC glad_glHint = NULL; +PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData = NULL; +PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData = NULL; +PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer = NULL; +PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer = NULL; +PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage = NULL; +PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage = NULL; PFNGLISBUFFERPROC glad_glIsBuffer = NULL; PFNGLISENABLEDPROC glad_glIsEnabled = NULL; PFNGLISENABLEDIPROC glad_glIsEnabledi = NULL; PFNGLISFRAMEBUFFERPROC glad_glIsFramebuffer = NULL; PFNGLISPROGRAMPROC glad_glIsProgram = NULL; +PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline = NULL; PFNGLISQUERYPROC glad_glIsQuery = NULL; PFNGLISRENDERBUFFERPROC glad_glIsRenderbuffer = NULL; PFNGLISSAMPLERPROC glad_glIsSampler = NULL; PFNGLISSHADERPROC glad_glIsShader = NULL; PFNGLISSYNCPROC glad_glIsSync = NULL; PFNGLISTEXTUREPROC glad_glIsTexture = NULL; +PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback = NULL; PFNGLISVERTEXARRAYPROC glad_glIsVertexArray = NULL; PFNGLLINEWIDTHPROC glad_glLineWidth = NULL; PFNGLLINKPROGRAMPROC glad_glLinkProgram = NULL; PFNGLLOGICOPPROC glad_glLogicOp = NULL; PFNGLMAPBUFFERPROC glad_glMapBuffer = NULL; PFNGLMAPBUFFERRANGEPROC glad_glMapBufferRange = NULL; +PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier = NULL; +PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading = NULL; PFNGLMULTIDRAWARRAYSPROC glad_glMultiDrawArrays = NULL; +PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect = NULL; PFNGLMULTIDRAWELEMENTSPROC glad_glMultiDrawElements = NULL; PFNGLMULTIDRAWELEMENTSBASEVERTEXPROC glad_glMultiDrawElementsBaseVertex = NULL; +PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect = NULL; PFNGLMULTITEXCOORDP1UIPROC glad_glMultiTexCoordP1ui = NULL; PFNGLMULTITEXCOORDP1UIVPROC glad_glMultiTexCoordP1uiv = NULL; PFNGLMULTITEXCOORDP2UIPROC glad_glMultiTexCoordP2ui = NULL; @@ -471,6 +555,11 @@ PFNGLMULTITEXCOORDP4UIPROC glad_glMultiTexCoordP4ui = NULL; PFNGLMULTITEXCOORDP4UIVPROC glad_glMultiTexCoordP4uiv = NULL; PFNGLNORMALP3UIPROC glad_glNormalP3ui = NULL; PFNGLNORMALP3UIVPROC glad_glNormalP3uiv = NULL; +PFNGLOBJECTLABELPROC glad_glObjectLabel = NULL; +PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel = NULL; +PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv = NULL; +PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri = NULL; +PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback = NULL; PFNGLPIXELSTOREFPROC glad_glPixelStoref = NULL; PFNGLPIXELSTOREIPROC glad_glPixelStorei = NULL; PFNGLPOINTPARAMETERFPROC glad_glPointParameterf = NULL; @@ -480,13 +569,69 @@ PFNGLPOINTPARAMETERIVPROC glad_glPointParameteriv = NULL; PFNGLPOINTSIZEPROC glad_glPointSize = NULL; PFNGLPOLYGONMODEPROC glad_glPolygonMode = NULL; PFNGLPOLYGONOFFSETPROC glad_glPolygonOffset = NULL; +PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup = NULL; PFNGLPRIMITIVERESTARTINDEXPROC glad_glPrimitiveRestartIndex = NULL; +PFNGLPROGRAMBINARYPROC glad_glProgramBinary = NULL; +PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri = NULL; +PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d = NULL; +PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv = NULL; +PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f = NULL; +PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv = NULL; +PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i = NULL; +PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv = NULL; +PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui = NULL; +PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv = NULL; +PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d = NULL; +PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv = NULL; +PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f = NULL; +PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv = NULL; +PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i = NULL; +PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv = NULL; +PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui = NULL; +PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv = NULL; +PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d = NULL; +PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv = NULL; +PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f = NULL; +PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv = NULL; +PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i = NULL; +PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv = NULL; +PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui = NULL; +PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv = NULL; +PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d = NULL; +PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv = NULL; +PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f = NULL; +PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv = NULL; +PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i = NULL; +PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv = NULL; +PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui = NULL; +PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv = NULL; +PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv = NULL; PFNGLPROVOKINGVERTEXPROC glad_glProvokingVertex = NULL; +PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup = NULL; PFNGLQUERYCOUNTERPROC glad_glQueryCounter = NULL; PFNGLREADBUFFERPROC glad_glReadBuffer = NULL; PFNGLREADPIXELSPROC glad_glReadPixels = NULL; +PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler = NULL; PFNGLRENDERBUFFERSTORAGEPROC glad_glRenderbufferStorage = NULL; PFNGLRENDERBUFFERSTORAGEMULTISAMPLEPROC glad_glRenderbufferStorageMultisample = NULL; +PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback = NULL; PFNGLSAMPLECOVERAGEPROC glad_glSampleCoverage = NULL; PFNGLSAMPLEMASKIPROC glad_glSampleMaski = NULL; PFNGLSAMPLERPARAMETERIIVPROC glad_glSamplerParameterIiv = NULL; @@ -496,9 +641,14 @@ PFNGLSAMPLERPARAMETERFVPROC glad_glSamplerParameterfv = NULL; PFNGLSAMPLERPARAMETERIPROC glad_glSamplerParameteri = NULL; PFNGLSAMPLERPARAMETERIVPROC glad_glSamplerParameteriv = NULL; PFNGLSCISSORPROC glad_glScissor = NULL; +PFNGLSCISSORARRAYVPROC glad_glScissorArrayv = NULL; +PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed = NULL; +PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv = NULL; PFNGLSECONDARYCOLORP3UIPROC glad_glSecondaryColorP3ui = NULL; PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv = NULL; +PFNGLSHADERBINARYPROC glad_glShaderBinary = NULL; PFNGLSHADERSOURCEPROC glad_glShaderSource = NULL; +PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding = NULL; PFNGLSTENCILFUNCPROC glad_glStencilFunc = NULL; PFNGLSTENCILFUNCSEPARATEPROC glad_glStencilFuncSeparate = NULL; PFNGLSTENCILMASKPROC glad_glStencilMask = NULL; @@ -506,6 +656,7 @@ PFNGLSTENCILMASKSEPARATEPROC glad_glStencilMaskSeparate = NULL; PFNGLSTENCILOPPROC glad_glStencilOp = NULL; PFNGLSTENCILOPSEPARATEPROC glad_glStencilOpSeparate = NULL; PFNGLTEXBUFFERPROC glad_glTexBuffer = NULL; +PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange = NULL; PFNGLTEXCOORDP1UIPROC glad_glTexCoordP1ui = NULL; PFNGLTEXCOORDP1UIVPROC glad_glTexCoordP1uiv = NULL; PFNGLTEXCOORDP2UIPROC glad_glTexCoordP2ui = NULL; @@ -525,28 +676,42 @@ PFNGLTEXPARAMETERFPROC glad_glTexParameterf = NULL; PFNGLTEXPARAMETERFVPROC glad_glTexParameterfv = NULL; PFNGLTEXPARAMETERIPROC glad_glTexParameteri = NULL; PFNGLTEXPARAMETERIVPROC glad_glTexParameteriv = NULL; +PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D = NULL; +PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D = NULL; +PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample = NULL; +PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D = NULL; +PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample = NULL; PFNGLTEXSUBIMAGE1DPROC glad_glTexSubImage1D = NULL; PFNGLTEXSUBIMAGE2DPROC glad_glTexSubImage2D = NULL; PFNGLTEXSUBIMAGE3DPROC glad_glTexSubImage3D = NULL; +PFNGLTEXTUREVIEWPROC glad_glTextureView = NULL; PFNGLTRANSFORMFEEDBACKVARYINGSPROC glad_glTransformFeedbackVaryings = NULL; +PFNGLUNIFORM1DPROC glad_glUniform1d = NULL; +PFNGLUNIFORM1DVPROC glad_glUniform1dv = NULL; PFNGLUNIFORM1FPROC glad_glUniform1f = NULL; PFNGLUNIFORM1FVPROC glad_glUniform1fv = NULL; PFNGLUNIFORM1IPROC glad_glUniform1i = NULL; PFNGLUNIFORM1IVPROC glad_glUniform1iv = NULL; PFNGLUNIFORM1UIPROC glad_glUniform1ui = NULL; PFNGLUNIFORM1UIVPROC glad_glUniform1uiv = NULL; +PFNGLUNIFORM2DPROC glad_glUniform2d = NULL; +PFNGLUNIFORM2DVPROC glad_glUniform2dv = NULL; PFNGLUNIFORM2FPROC glad_glUniform2f = NULL; PFNGLUNIFORM2FVPROC glad_glUniform2fv = NULL; PFNGLUNIFORM2IPROC glad_glUniform2i = NULL; PFNGLUNIFORM2IVPROC glad_glUniform2iv = NULL; PFNGLUNIFORM2UIPROC glad_glUniform2ui = NULL; PFNGLUNIFORM2UIVPROC glad_glUniform2uiv = NULL; +PFNGLUNIFORM3DPROC glad_glUniform3d = NULL; +PFNGLUNIFORM3DVPROC glad_glUniform3dv = NULL; PFNGLUNIFORM3FPROC glad_glUniform3f = NULL; PFNGLUNIFORM3FVPROC glad_glUniform3fv = NULL; PFNGLUNIFORM3IPROC glad_glUniform3i = NULL; PFNGLUNIFORM3IVPROC glad_glUniform3iv = NULL; PFNGLUNIFORM3UIPROC glad_glUniform3ui = NULL; PFNGLUNIFORM3UIVPROC glad_glUniform3uiv = NULL; +PFNGLUNIFORM4DPROC glad_glUniform4d = NULL; +PFNGLUNIFORM4DVPROC glad_glUniform4dv = NULL; PFNGLUNIFORM4FPROC glad_glUniform4f = NULL; PFNGLUNIFORM4FVPROC glad_glUniform4fv = NULL; PFNGLUNIFORM4IPROC glad_glUniform4i = NULL; @@ -554,18 +719,30 @@ PFNGLUNIFORM4IVPROC glad_glUniform4iv = NULL; PFNGLUNIFORM4UIPROC glad_glUniform4ui = NULL; PFNGLUNIFORM4UIVPROC glad_glUniform4uiv = NULL; PFNGLUNIFORMBLOCKBINDINGPROC glad_glUniformBlockBinding = NULL; +PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv = NULL; PFNGLUNIFORMMATRIX2FVPROC glad_glUniformMatrix2fv = NULL; +PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv = NULL; PFNGLUNIFORMMATRIX2X3FVPROC glad_glUniformMatrix2x3fv = NULL; +PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv = NULL; PFNGLUNIFORMMATRIX2X4FVPROC glad_glUniformMatrix2x4fv = NULL; +PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv = NULL; PFNGLUNIFORMMATRIX3FVPROC glad_glUniformMatrix3fv = NULL; +PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv = NULL; PFNGLUNIFORMMATRIX3X2FVPROC glad_glUniformMatrix3x2fv = NULL; +PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv = NULL; PFNGLUNIFORMMATRIX3X4FVPROC glad_glUniformMatrix3x4fv = NULL; +PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv = NULL; PFNGLUNIFORMMATRIX4FVPROC glad_glUniformMatrix4fv = NULL; +PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv = NULL; PFNGLUNIFORMMATRIX4X2FVPROC glad_glUniformMatrix4x2fv = NULL; +PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv = NULL; PFNGLUNIFORMMATRIX4X3FVPROC glad_glUniformMatrix4x3fv = NULL; +PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv = NULL; PFNGLUNMAPBUFFERPROC glad_glUnmapBuffer = NULL; PFNGLUSEPROGRAMPROC glad_glUseProgram = NULL; +PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages = NULL; PFNGLVALIDATEPROGRAMPROC glad_glValidateProgram = NULL; +PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline = NULL; PFNGLVERTEXATTRIB1DPROC glad_glVertexAttrib1d = NULL; PFNGLVERTEXATTRIB1DVPROC glad_glVertexAttrib1dv = NULL; PFNGLVERTEXATTRIB1FPROC glad_glVertexAttrib1f = NULL; @@ -602,7 +779,9 @@ PFNGLVERTEXATTRIB4SVPROC glad_glVertexAttrib4sv = NULL; PFNGLVERTEXATTRIB4UBVPROC glad_glVertexAttrib4ubv = NULL; PFNGLVERTEXATTRIB4UIVPROC glad_glVertexAttrib4uiv = NULL; PFNGLVERTEXATTRIB4USVPROC glad_glVertexAttrib4usv = NULL; +PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding = NULL; PFNGLVERTEXATTRIBDIVISORPROC glad_glVertexAttribDivisor = NULL; +PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat = NULL; PFNGLVERTEXATTRIBI1IPROC glad_glVertexAttribI1i = NULL; PFNGLVERTEXATTRIBI1IVPROC glad_glVertexAttribI1iv = NULL; PFNGLVERTEXATTRIBI1UIPROC glad_glVertexAttribI1ui = NULL; @@ -623,7 +802,18 @@ PFNGLVERTEXATTRIBI4UBVPROC glad_glVertexAttribI4ubv = NULL; PFNGLVERTEXATTRIBI4UIPROC glad_glVertexAttribI4ui = NULL; PFNGLVERTEXATTRIBI4UIVPROC glad_glVertexAttribI4uiv = NULL; PFNGLVERTEXATTRIBI4USVPROC glad_glVertexAttribI4usv = NULL; +PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat = NULL; PFNGLVERTEXATTRIBIPOINTERPROC glad_glVertexAttribIPointer = NULL; +PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d = NULL; +PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv = NULL; +PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d = NULL; +PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv = NULL; +PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d = NULL; +PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv = NULL; +PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d = NULL; +PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv = NULL; +PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat = NULL; +PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer = NULL; PFNGLVERTEXATTRIBP1UIPROC glad_glVertexAttribP1ui = NULL; PFNGLVERTEXATTRIBP1UIVPROC glad_glVertexAttribP1uiv = NULL; PFNGLVERTEXATTRIBP2UIPROC glad_glVertexAttribP2ui = NULL; @@ -633,6 +823,7 @@ PFNGLVERTEXATTRIBP3UIVPROC glad_glVertexAttribP3uiv = NULL; PFNGLVERTEXATTRIBP4UIPROC glad_glVertexAttribP4ui = NULL; PFNGLVERTEXATTRIBP4UIVPROC glad_glVertexAttribP4uiv = NULL; PFNGLVERTEXATTRIBPOINTERPROC glad_glVertexAttribPointer = NULL; +PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor = NULL; PFNGLVERTEXP2UIPROC glad_glVertexP2ui = NULL; PFNGLVERTEXP2UIVPROC glad_glVertexP2uiv = NULL; PFNGLVERTEXP3UIPROC glad_glVertexP3ui = NULL; @@ -640,6 +831,9 @@ PFNGLVERTEXP3UIVPROC glad_glVertexP3uiv = NULL; PFNGLVERTEXP4UIPROC glad_glVertexP4ui = NULL; PFNGLVERTEXP4UIVPROC glad_glVertexP4uiv = NULL; PFNGLVIEWPORTPROC glad_glViewport = NULL; +PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv = NULL; +PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf = NULL; +PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv = NULL; PFNGLWAITSYNCPROC glad_glWaitSync = NULL; static void load_GL_VERSION_1_0(GLADloadproc load) { if(!GLAD_GL_VERSION_1_0) return; @@ -1054,6 +1248,209 @@ static void load_GL_VERSION_3_3(GLADloadproc load) { glad_glSecondaryColorP3ui = (PFNGLSECONDARYCOLORP3UIPROC)load("glSecondaryColorP3ui"); glad_glSecondaryColorP3uiv = (PFNGLSECONDARYCOLORP3UIVPROC)load("glSecondaryColorP3uiv"); } +static void load_GL_VERSION_4_0(GLADloadproc load) { + if(!GLAD_GL_VERSION_4_0) return; + glad_glMinSampleShading = (PFNGLMINSAMPLESHADINGPROC)load("glMinSampleShading"); + glad_glBlendEquationi = (PFNGLBLENDEQUATIONIPROC)load("glBlendEquationi"); + glad_glBlendEquationSeparatei = (PFNGLBLENDEQUATIONSEPARATEIPROC)load("glBlendEquationSeparatei"); + glad_glBlendFunci = (PFNGLBLENDFUNCIPROC)load("glBlendFunci"); + glad_glBlendFuncSeparatei = (PFNGLBLENDFUNCSEPARATEIPROC)load("glBlendFuncSeparatei"); + glad_glDrawArraysIndirect = (PFNGLDRAWARRAYSINDIRECTPROC)load("glDrawArraysIndirect"); + glad_glDrawElementsIndirect = (PFNGLDRAWELEMENTSINDIRECTPROC)load("glDrawElementsIndirect"); + glad_glUniform1d = (PFNGLUNIFORM1DPROC)load("glUniform1d"); + glad_glUniform2d = (PFNGLUNIFORM2DPROC)load("glUniform2d"); + glad_glUniform3d = (PFNGLUNIFORM3DPROC)load("glUniform3d"); + glad_glUniform4d = (PFNGLUNIFORM4DPROC)load("glUniform4d"); + glad_glUniform1dv = (PFNGLUNIFORM1DVPROC)load("glUniform1dv"); + glad_glUniform2dv = (PFNGLUNIFORM2DVPROC)load("glUniform2dv"); + glad_glUniform3dv = (PFNGLUNIFORM3DVPROC)load("glUniform3dv"); + glad_glUniform4dv = (PFNGLUNIFORM4DVPROC)load("glUniform4dv"); + glad_glUniformMatrix2dv = (PFNGLUNIFORMMATRIX2DVPROC)load("glUniformMatrix2dv"); + glad_glUniformMatrix3dv = (PFNGLUNIFORMMATRIX3DVPROC)load("glUniformMatrix3dv"); + glad_glUniformMatrix4dv = (PFNGLUNIFORMMATRIX4DVPROC)load("glUniformMatrix4dv"); + glad_glUniformMatrix2x3dv = (PFNGLUNIFORMMATRIX2X3DVPROC)load("glUniformMatrix2x3dv"); + glad_glUniformMatrix2x4dv = (PFNGLUNIFORMMATRIX2X4DVPROC)load("glUniformMatrix2x4dv"); + glad_glUniformMatrix3x2dv = (PFNGLUNIFORMMATRIX3X2DVPROC)load("glUniformMatrix3x2dv"); + glad_glUniformMatrix3x4dv = (PFNGLUNIFORMMATRIX3X4DVPROC)load("glUniformMatrix3x4dv"); + glad_glUniformMatrix4x2dv = (PFNGLUNIFORMMATRIX4X2DVPROC)load("glUniformMatrix4x2dv"); + glad_glUniformMatrix4x3dv = (PFNGLUNIFORMMATRIX4X3DVPROC)load("glUniformMatrix4x3dv"); + glad_glGetUniformdv = (PFNGLGETUNIFORMDVPROC)load("glGetUniformdv"); + glad_glGetSubroutineUniformLocation = (PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)load("glGetSubroutineUniformLocation"); + glad_glGetSubroutineIndex = (PFNGLGETSUBROUTINEINDEXPROC)load("glGetSubroutineIndex"); + glad_glGetActiveSubroutineUniformiv = (PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)load("glGetActiveSubroutineUniformiv"); + glad_glGetActiveSubroutineUniformName = (PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)load("glGetActiveSubroutineUniformName"); + glad_glGetActiveSubroutineName = (PFNGLGETACTIVESUBROUTINENAMEPROC)load("glGetActiveSubroutineName"); + glad_glUniformSubroutinesuiv = (PFNGLUNIFORMSUBROUTINESUIVPROC)load("glUniformSubroutinesuiv"); + glad_glGetUniformSubroutineuiv = (PFNGLGETUNIFORMSUBROUTINEUIVPROC)load("glGetUniformSubroutineuiv"); + glad_glGetProgramStageiv = (PFNGLGETPROGRAMSTAGEIVPROC)load("glGetProgramStageiv"); + glad_glPatchParameteri = (PFNGLPATCHPARAMETERIPROC)load("glPatchParameteri"); + glad_glPatchParameterfv = (PFNGLPATCHPARAMETERFVPROC)load("glPatchParameterfv"); + glad_glBindTransformFeedback = (PFNGLBINDTRANSFORMFEEDBACKPROC)load("glBindTransformFeedback"); + glad_glDeleteTransformFeedbacks = (PFNGLDELETETRANSFORMFEEDBACKSPROC)load("glDeleteTransformFeedbacks"); + glad_glGenTransformFeedbacks = (PFNGLGENTRANSFORMFEEDBACKSPROC)load("glGenTransformFeedbacks"); + glad_glIsTransformFeedback = (PFNGLISTRANSFORMFEEDBACKPROC)load("glIsTransformFeedback"); + glad_glPauseTransformFeedback = (PFNGLPAUSETRANSFORMFEEDBACKPROC)load("glPauseTransformFeedback"); + glad_glResumeTransformFeedback = (PFNGLRESUMETRANSFORMFEEDBACKPROC)load("glResumeTransformFeedback"); + glad_glDrawTransformFeedback = (PFNGLDRAWTRANSFORMFEEDBACKPROC)load("glDrawTransformFeedback"); + glad_glDrawTransformFeedbackStream = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)load("glDrawTransformFeedbackStream"); + glad_glBeginQueryIndexed = (PFNGLBEGINQUERYINDEXEDPROC)load("glBeginQueryIndexed"); + glad_glEndQueryIndexed = (PFNGLENDQUERYINDEXEDPROC)load("glEndQueryIndexed"); + glad_glGetQueryIndexediv = (PFNGLGETQUERYINDEXEDIVPROC)load("glGetQueryIndexediv"); +} +static void load_GL_VERSION_4_1(GLADloadproc load) { + if(!GLAD_GL_VERSION_4_1) return; + glad_glReleaseShaderCompiler = (PFNGLRELEASESHADERCOMPILERPROC)load("glReleaseShaderCompiler"); + glad_glShaderBinary = (PFNGLSHADERBINARYPROC)load("glShaderBinary"); + glad_glGetShaderPrecisionFormat = (PFNGLGETSHADERPRECISIONFORMATPROC)load("glGetShaderPrecisionFormat"); + glad_glDepthRangef = (PFNGLDEPTHRANGEFPROC)load("glDepthRangef"); + glad_glClearDepthf = (PFNGLCLEARDEPTHFPROC)load("glClearDepthf"); + glad_glGetProgramBinary = (PFNGLGETPROGRAMBINARYPROC)load("glGetProgramBinary"); + glad_glProgramBinary = (PFNGLPROGRAMBINARYPROC)load("glProgramBinary"); + glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)load("glProgramParameteri"); + glad_glUseProgramStages = (PFNGLUSEPROGRAMSTAGESPROC)load("glUseProgramStages"); + glad_glActiveShaderProgram = (PFNGLACTIVESHADERPROGRAMPROC)load("glActiveShaderProgram"); + glad_glCreateShaderProgramv = (PFNGLCREATESHADERPROGRAMVPROC)load("glCreateShaderProgramv"); + glad_glBindProgramPipeline = (PFNGLBINDPROGRAMPIPELINEPROC)load("glBindProgramPipeline"); + glad_glDeleteProgramPipelines = (PFNGLDELETEPROGRAMPIPELINESPROC)load("glDeleteProgramPipelines"); + glad_glGenProgramPipelines = (PFNGLGENPROGRAMPIPELINESPROC)load("glGenProgramPipelines"); + glad_glIsProgramPipeline = (PFNGLISPROGRAMPIPELINEPROC)load("glIsProgramPipeline"); + glad_glGetProgramPipelineiv = (PFNGLGETPROGRAMPIPELINEIVPROC)load("glGetProgramPipelineiv"); + glad_glProgramParameteri = (PFNGLPROGRAMPARAMETERIPROC)load("glProgramParameteri"); + glad_glProgramUniform1i = (PFNGLPROGRAMUNIFORM1IPROC)load("glProgramUniform1i"); + glad_glProgramUniform1iv = (PFNGLPROGRAMUNIFORM1IVPROC)load("glProgramUniform1iv"); + glad_glProgramUniform1f = (PFNGLPROGRAMUNIFORM1FPROC)load("glProgramUniform1f"); + glad_glProgramUniform1fv = (PFNGLPROGRAMUNIFORM1FVPROC)load("glProgramUniform1fv"); + glad_glProgramUniform1d = (PFNGLPROGRAMUNIFORM1DPROC)load("glProgramUniform1d"); + glad_glProgramUniform1dv = (PFNGLPROGRAMUNIFORM1DVPROC)load("glProgramUniform1dv"); + glad_glProgramUniform1ui = (PFNGLPROGRAMUNIFORM1UIPROC)load("glProgramUniform1ui"); + glad_glProgramUniform1uiv = (PFNGLPROGRAMUNIFORM1UIVPROC)load("glProgramUniform1uiv"); + glad_glProgramUniform2i = (PFNGLPROGRAMUNIFORM2IPROC)load("glProgramUniform2i"); + glad_glProgramUniform2iv = (PFNGLPROGRAMUNIFORM2IVPROC)load("glProgramUniform2iv"); + glad_glProgramUniform2f = (PFNGLPROGRAMUNIFORM2FPROC)load("glProgramUniform2f"); + glad_glProgramUniform2fv = (PFNGLPROGRAMUNIFORM2FVPROC)load("glProgramUniform2fv"); + glad_glProgramUniform2d = (PFNGLPROGRAMUNIFORM2DPROC)load("glProgramUniform2d"); + glad_glProgramUniform2dv = (PFNGLPROGRAMUNIFORM2DVPROC)load("glProgramUniform2dv"); + glad_glProgramUniform2ui = (PFNGLPROGRAMUNIFORM2UIPROC)load("glProgramUniform2ui"); + glad_glProgramUniform2uiv = (PFNGLPROGRAMUNIFORM2UIVPROC)load("glProgramUniform2uiv"); + glad_glProgramUniform3i = (PFNGLPROGRAMUNIFORM3IPROC)load("glProgramUniform3i"); + glad_glProgramUniform3iv = (PFNGLPROGRAMUNIFORM3IVPROC)load("glProgramUniform3iv"); + glad_glProgramUniform3f = (PFNGLPROGRAMUNIFORM3FPROC)load("glProgramUniform3f"); + glad_glProgramUniform3fv = (PFNGLPROGRAMUNIFORM3FVPROC)load("glProgramUniform3fv"); + glad_glProgramUniform3d = (PFNGLPROGRAMUNIFORM3DPROC)load("glProgramUniform3d"); + glad_glProgramUniform3dv = (PFNGLPROGRAMUNIFORM3DVPROC)load("glProgramUniform3dv"); + glad_glProgramUniform3ui = (PFNGLPROGRAMUNIFORM3UIPROC)load("glProgramUniform3ui"); + glad_glProgramUniform3uiv = (PFNGLPROGRAMUNIFORM3UIVPROC)load("glProgramUniform3uiv"); + glad_glProgramUniform4i = (PFNGLPROGRAMUNIFORM4IPROC)load("glProgramUniform4i"); + glad_glProgramUniform4iv = (PFNGLPROGRAMUNIFORM4IVPROC)load("glProgramUniform4iv"); + glad_glProgramUniform4f = (PFNGLPROGRAMUNIFORM4FPROC)load("glProgramUniform4f"); + glad_glProgramUniform4fv = (PFNGLPROGRAMUNIFORM4FVPROC)load("glProgramUniform4fv"); + glad_glProgramUniform4d = (PFNGLPROGRAMUNIFORM4DPROC)load("glProgramUniform4d"); + glad_glProgramUniform4dv = (PFNGLPROGRAMUNIFORM4DVPROC)load("glProgramUniform4dv"); + glad_glProgramUniform4ui = (PFNGLPROGRAMUNIFORM4UIPROC)load("glProgramUniform4ui"); + glad_glProgramUniform4uiv = (PFNGLPROGRAMUNIFORM4UIVPROC)load("glProgramUniform4uiv"); + glad_glProgramUniformMatrix2fv = (PFNGLPROGRAMUNIFORMMATRIX2FVPROC)load("glProgramUniformMatrix2fv"); + glad_glProgramUniformMatrix3fv = (PFNGLPROGRAMUNIFORMMATRIX3FVPROC)load("glProgramUniformMatrix3fv"); + glad_glProgramUniformMatrix4fv = (PFNGLPROGRAMUNIFORMMATRIX4FVPROC)load("glProgramUniformMatrix4fv"); + glad_glProgramUniformMatrix2dv = (PFNGLPROGRAMUNIFORMMATRIX2DVPROC)load("glProgramUniformMatrix2dv"); + glad_glProgramUniformMatrix3dv = (PFNGLPROGRAMUNIFORMMATRIX3DVPROC)load("glProgramUniformMatrix3dv"); + glad_glProgramUniformMatrix4dv = (PFNGLPROGRAMUNIFORMMATRIX4DVPROC)load("glProgramUniformMatrix4dv"); + glad_glProgramUniformMatrix2x3fv = (PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)load("glProgramUniformMatrix2x3fv"); + glad_glProgramUniformMatrix3x2fv = (PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)load("glProgramUniformMatrix3x2fv"); + glad_glProgramUniformMatrix2x4fv = (PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)load("glProgramUniformMatrix2x4fv"); + glad_glProgramUniformMatrix4x2fv = (PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)load("glProgramUniformMatrix4x2fv"); + glad_glProgramUniformMatrix3x4fv = (PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)load("glProgramUniformMatrix3x4fv"); + glad_glProgramUniformMatrix4x3fv = (PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)load("glProgramUniformMatrix4x3fv"); + glad_glProgramUniformMatrix2x3dv = (PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)load("glProgramUniformMatrix2x3dv"); + glad_glProgramUniformMatrix3x2dv = (PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)load("glProgramUniformMatrix3x2dv"); + glad_glProgramUniformMatrix2x4dv = (PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)load("glProgramUniformMatrix2x4dv"); + glad_glProgramUniformMatrix4x2dv = (PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)load("glProgramUniformMatrix4x2dv"); + glad_glProgramUniformMatrix3x4dv = (PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)load("glProgramUniformMatrix3x4dv"); + glad_glProgramUniformMatrix4x3dv = (PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)load("glProgramUniformMatrix4x3dv"); + glad_glValidateProgramPipeline = (PFNGLVALIDATEPROGRAMPIPELINEPROC)load("glValidateProgramPipeline"); + glad_glGetProgramPipelineInfoLog = (PFNGLGETPROGRAMPIPELINEINFOLOGPROC)load("glGetProgramPipelineInfoLog"); + glad_glVertexAttribL1d = (PFNGLVERTEXATTRIBL1DPROC)load("glVertexAttribL1d"); + glad_glVertexAttribL2d = (PFNGLVERTEXATTRIBL2DPROC)load("glVertexAttribL2d"); + glad_glVertexAttribL3d = (PFNGLVERTEXATTRIBL3DPROC)load("glVertexAttribL3d"); + glad_glVertexAttribL4d = (PFNGLVERTEXATTRIBL4DPROC)load("glVertexAttribL4d"); + glad_glVertexAttribL1dv = (PFNGLVERTEXATTRIBL1DVPROC)load("glVertexAttribL1dv"); + glad_glVertexAttribL2dv = (PFNGLVERTEXATTRIBL2DVPROC)load("glVertexAttribL2dv"); + glad_glVertexAttribL3dv = (PFNGLVERTEXATTRIBL3DVPROC)load("glVertexAttribL3dv"); + glad_glVertexAttribL4dv = (PFNGLVERTEXATTRIBL4DVPROC)load("glVertexAttribL4dv"); + glad_glVertexAttribLPointer = (PFNGLVERTEXATTRIBLPOINTERPROC)load("glVertexAttribLPointer"); + glad_glGetVertexAttribLdv = (PFNGLGETVERTEXATTRIBLDVPROC)load("glGetVertexAttribLdv"); + glad_glViewportArrayv = (PFNGLVIEWPORTARRAYVPROC)load("glViewportArrayv"); + glad_glViewportIndexedf = (PFNGLVIEWPORTINDEXEDFPROC)load("glViewportIndexedf"); + glad_glViewportIndexedfv = (PFNGLVIEWPORTINDEXEDFVPROC)load("glViewportIndexedfv"); + glad_glScissorArrayv = (PFNGLSCISSORARRAYVPROC)load("glScissorArrayv"); + glad_glScissorIndexed = (PFNGLSCISSORINDEXEDPROC)load("glScissorIndexed"); + glad_glScissorIndexedv = (PFNGLSCISSORINDEXEDVPROC)load("glScissorIndexedv"); + glad_glDepthRangeArrayv = (PFNGLDEPTHRANGEARRAYVPROC)load("glDepthRangeArrayv"); + glad_glDepthRangeIndexed = (PFNGLDEPTHRANGEINDEXEDPROC)load("glDepthRangeIndexed"); + glad_glGetFloati_v = (PFNGLGETFLOATI_VPROC)load("glGetFloati_v"); + glad_glGetDoublei_v = (PFNGLGETDOUBLEI_VPROC)load("glGetDoublei_v"); +} +static void load_GL_VERSION_4_2(GLADloadproc load) { + if(!GLAD_GL_VERSION_4_2) return; + glad_glDrawArraysInstancedBaseInstance = (PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)load("glDrawArraysInstancedBaseInstance"); + glad_glDrawElementsInstancedBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)load("glDrawElementsInstancedBaseInstance"); + glad_glDrawElementsInstancedBaseVertexBaseInstance = (PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)load("glDrawElementsInstancedBaseVertexBaseInstance"); + glad_glGetInternalformativ = (PFNGLGETINTERNALFORMATIVPROC)load("glGetInternalformativ"); + glad_glGetActiveAtomicCounterBufferiv = (PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)load("glGetActiveAtomicCounterBufferiv"); + glad_glBindImageTexture = (PFNGLBINDIMAGETEXTUREPROC)load("glBindImageTexture"); + glad_glMemoryBarrier = (PFNGLMEMORYBARRIERPROC)load("glMemoryBarrier"); + glad_glTexStorage1D = (PFNGLTEXSTORAGE1DPROC)load("glTexStorage1D"); + glad_glTexStorage2D = (PFNGLTEXSTORAGE2DPROC)load("glTexStorage2D"); + glad_glTexStorage3D = (PFNGLTEXSTORAGE3DPROC)load("glTexStorage3D"); + glad_glDrawTransformFeedbackInstanced = (PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)load("glDrawTransformFeedbackInstanced"); + glad_glDrawTransformFeedbackStreamInstanced = (PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)load("glDrawTransformFeedbackStreamInstanced"); +} +static void load_GL_VERSION_4_3(GLADloadproc load) { + if(!GLAD_GL_VERSION_4_3) return; + glad_glClearBufferData = (PFNGLCLEARBUFFERDATAPROC)load("glClearBufferData"); + glad_glClearBufferSubData = (PFNGLCLEARBUFFERSUBDATAPROC)load("glClearBufferSubData"); + glad_glDispatchCompute = (PFNGLDISPATCHCOMPUTEPROC)load("glDispatchCompute"); + glad_glDispatchComputeIndirect = (PFNGLDISPATCHCOMPUTEINDIRECTPROC)load("glDispatchComputeIndirect"); + glad_glCopyImageSubData = (PFNGLCOPYIMAGESUBDATAPROC)load("glCopyImageSubData"); + glad_glFramebufferParameteri = (PFNGLFRAMEBUFFERPARAMETERIPROC)load("glFramebufferParameteri"); + glad_glGetFramebufferParameteriv = (PFNGLGETFRAMEBUFFERPARAMETERIVPROC)load("glGetFramebufferParameteriv"); + glad_glGetInternalformati64v = (PFNGLGETINTERNALFORMATI64VPROC)load("glGetInternalformati64v"); + glad_glInvalidateTexSubImage = (PFNGLINVALIDATETEXSUBIMAGEPROC)load("glInvalidateTexSubImage"); + glad_glInvalidateTexImage = (PFNGLINVALIDATETEXIMAGEPROC)load("glInvalidateTexImage"); + glad_glInvalidateBufferSubData = (PFNGLINVALIDATEBUFFERSUBDATAPROC)load("glInvalidateBufferSubData"); + glad_glInvalidateBufferData = (PFNGLINVALIDATEBUFFERDATAPROC)load("glInvalidateBufferData"); + glad_glInvalidateFramebuffer = (PFNGLINVALIDATEFRAMEBUFFERPROC)load("glInvalidateFramebuffer"); + glad_glInvalidateSubFramebuffer = (PFNGLINVALIDATESUBFRAMEBUFFERPROC)load("glInvalidateSubFramebuffer"); + glad_glMultiDrawArraysIndirect = (PFNGLMULTIDRAWARRAYSINDIRECTPROC)load("glMultiDrawArraysIndirect"); + glad_glMultiDrawElementsIndirect = (PFNGLMULTIDRAWELEMENTSINDIRECTPROC)load("glMultiDrawElementsIndirect"); + glad_glGetProgramInterfaceiv = (PFNGLGETPROGRAMINTERFACEIVPROC)load("glGetProgramInterfaceiv"); + glad_glGetProgramResourceIndex = (PFNGLGETPROGRAMRESOURCEINDEXPROC)load("glGetProgramResourceIndex"); + glad_glGetProgramResourceName = (PFNGLGETPROGRAMRESOURCENAMEPROC)load("glGetProgramResourceName"); + glad_glGetProgramResourceiv = (PFNGLGETPROGRAMRESOURCEIVPROC)load("glGetProgramResourceiv"); + glad_glGetProgramResourceLocation = (PFNGLGETPROGRAMRESOURCELOCATIONPROC)load("glGetProgramResourceLocation"); + glad_glGetProgramResourceLocationIndex = (PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)load("glGetProgramResourceLocationIndex"); + glad_glShaderStorageBlockBinding = (PFNGLSHADERSTORAGEBLOCKBINDINGPROC)load("glShaderStorageBlockBinding"); + glad_glTexBufferRange = (PFNGLTEXBUFFERRANGEPROC)load("glTexBufferRange"); + glad_glTexStorage2DMultisample = (PFNGLTEXSTORAGE2DMULTISAMPLEPROC)load("glTexStorage2DMultisample"); + glad_glTexStorage3DMultisample = (PFNGLTEXSTORAGE3DMULTISAMPLEPROC)load("glTexStorage3DMultisample"); + glad_glTextureView = (PFNGLTEXTUREVIEWPROC)load("glTextureView"); + glad_glBindVertexBuffer = (PFNGLBINDVERTEXBUFFERPROC)load("glBindVertexBuffer"); + glad_glVertexAttribFormat = (PFNGLVERTEXATTRIBFORMATPROC)load("glVertexAttribFormat"); + glad_glVertexAttribIFormat = (PFNGLVERTEXATTRIBIFORMATPROC)load("glVertexAttribIFormat"); + glad_glVertexAttribLFormat = (PFNGLVERTEXATTRIBLFORMATPROC)load("glVertexAttribLFormat"); + glad_glVertexAttribBinding = (PFNGLVERTEXATTRIBBINDINGPROC)load("glVertexAttribBinding"); + glad_glVertexBindingDivisor = (PFNGLVERTEXBINDINGDIVISORPROC)load("glVertexBindingDivisor"); + glad_glDebugMessageControl = (PFNGLDEBUGMESSAGECONTROLPROC)load("glDebugMessageControl"); + glad_glDebugMessageInsert = (PFNGLDEBUGMESSAGEINSERTPROC)load("glDebugMessageInsert"); + glad_glDebugMessageCallback = (PFNGLDEBUGMESSAGECALLBACKPROC)load("glDebugMessageCallback"); + glad_glGetDebugMessageLog = (PFNGLGETDEBUGMESSAGELOGPROC)load("glGetDebugMessageLog"); + glad_glPushDebugGroup = (PFNGLPUSHDEBUGGROUPPROC)load("glPushDebugGroup"); + glad_glPopDebugGroup = (PFNGLPOPDEBUGGROUPPROC)load("glPopDebugGroup"); + glad_glObjectLabel = (PFNGLOBJECTLABELPROC)load("glObjectLabel"); + glad_glGetObjectLabel = (PFNGLGETOBJECTLABELPROC)load("glGetObjectLabel"); + glad_glObjectPtrLabel = (PFNGLOBJECTPTRLABELPROC)load("glObjectPtrLabel"); + glad_glGetObjectPtrLabel = (PFNGLGETOBJECTPTRLABELPROC)load("glGetObjectPtrLabel"); + glad_glGetPointerv = (PFNGLGETPOINTERVPROC)load("glGetPointerv"); +} static int find_extensionsGL(void) { if (!get_exts()) return 0; (void)&has_ext; @@ -1109,8 +1506,12 @@ static void find_coreGL(void) { GLAD_GL_VERSION_3_1 = (major == 3 && minor >= 1) || major > 3; GLAD_GL_VERSION_3_2 = (major == 3 && minor >= 2) || major > 3; GLAD_GL_VERSION_3_3 = (major == 3 && minor >= 3) || major > 3; - if (GLVersion.major > 3 || (GLVersion.major >= 3 && GLVersion.minor >= 3)) { - max_loaded_major = 3; + GLAD_GL_VERSION_4_0 = (major == 4 && minor >= 0) || major > 4; + GLAD_GL_VERSION_4_1 = (major == 4 && minor >= 1) || major > 4; + GLAD_GL_VERSION_4_2 = (major == 4 && minor >= 2) || major > 4; + GLAD_GL_VERSION_4_3 = (major == 4 && minor >= 3) || major > 4; + if (GLVersion.major > 4 || (GLVersion.major >= 4 && GLVersion.minor >= 3)) { + max_loaded_major = 4; max_loaded_minor = 3; } } @@ -1133,6 +1534,10 @@ int gladLoadGLLoader(GLADloadproc load) { load_GL_VERSION_3_1(load); load_GL_VERSION_3_2(load); load_GL_VERSION_3_3(load); + load_GL_VERSION_4_0(load); + load_GL_VERSION_4_1(load); + load_GL_VERSION_4_2(load); + load_GL_VERSION_4_3(load); if (!find_extensionsGL()) return 0; return GLVersion.major != 0 || GLVersion.minor != 0; diff --git a/src/vendor/glad/glad.h b/src/vendor/glad/glad.h index f8c4872..7b4a70f 100644 --- a/src/vendor/glad/glad.h +++ b/src/vendor/glad/glad.h @@ -1,10 +1,10 @@ /* - OpenGL loader generated by glad 0.1.34 on Thu Jun 29 15:12:42 2023. + OpenGL loader generated by glad 0.1.34 on Mon Aug 28 15:56:17 2023. Language/Generator: C/C++ Specification: gl - APIs: gl=3.3 + APIs: gl=4.3 Profile: core Extensions: @@ -14,9 +14,9 @@ Reproducible: False Commandline: - --profile="core" --api="gl=3.3" --generator="c" --spec="gl" --extensions="" + --profile="core" --api="gl=4.3" --generator="c" --spec="gl" --extensions="" Online: - https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D3.3 + https://glad.dav1d.de/#profile=core&language=c&specification=gl&loader=on&api=gl%3D4.3 */ @@ -951,6 +951,493 @@ typedef void (APIENTRY *GLVULKANPROCNV)(void); #define GL_TIME_ELAPSED 0x88BF #define GL_TIMESTAMP 0x8E28 #define GL_INT_2_10_10_10_REV 0x8D9F +#define GL_SAMPLE_SHADING 0x8C36 +#define GL_MIN_SAMPLE_SHADING_VALUE 0x8C37 +#define GL_MIN_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5E +#define GL_MAX_PROGRAM_TEXTURE_GATHER_OFFSET 0x8E5F +#define GL_TEXTURE_CUBE_MAP_ARRAY 0x9009 +#define GL_TEXTURE_BINDING_CUBE_MAP_ARRAY 0x900A +#define GL_PROXY_TEXTURE_CUBE_MAP_ARRAY 0x900B +#define GL_SAMPLER_CUBE_MAP_ARRAY 0x900C +#define GL_SAMPLER_CUBE_MAP_ARRAY_SHADOW 0x900D +#define GL_INT_SAMPLER_CUBE_MAP_ARRAY 0x900E +#define GL_UNSIGNED_INT_SAMPLER_CUBE_MAP_ARRAY 0x900F +#define GL_DRAW_INDIRECT_BUFFER 0x8F3F +#define GL_DRAW_INDIRECT_BUFFER_BINDING 0x8F43 +#define GL_GEOMETRY_SHADER_INVOCATIONS 0x887F +#define GL_MAX_GEOMETRY_SHADER_INVOCATIONS 0x8E5A +#define GL_MIN_FRAGMENT_INTERPOLATION_OFFSET 0x8E5B +#define GL_MAX_FRAGMENT_INTERPOLATION_OFFSET 0x8E5C +#define GL_FRAGMENT_INTERPOLATION_OFFSET_BITS 0x8E5D +#define GL_MAX_VERTEX_STREAMS 0x8E71 +#define GL_DOUBLE_VEC2 0x8FFC +#define GL_DOUBLE_VEC3 0x8FFD +#define GL_DOUBLE_VEC4 0x8FFE +#define GL_DOUBLE_MAT2 0x8F46 +#define GL_DOUBLE_MAT3 0x8F47 +#define GL_DOUBLE_MAT4 0x8F48 +#define GL_DOUBLE_MAT2x3 0x8F49 +#define GL_DOUBLE_MAT2x4 0x8F4A +#define GL_DOUBLE_MAT3x2 0x8F4B +#define GL_DOUBLE_MAT3x4 0x8F4C +#define GL_DOUBLE_MAT4x2 0x8F4D +#define GL_DOUBLE_MAT4x3 0x8F4E +#define GL_ACTIVE_SUBROUTINES 0x8DE5 +#define GL_ACTIVE_SUBROUTINE_UNIFORMS 0x8DE6 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS 0x8E47 +#define GL_ACTIVE_SUBROUTINE_MAX_LENGTH 0x8E48 +#define GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH 0x8E49 +#define GL_MAX_SUBROUTINES 0x8DE7 +#define GL_MAX_SUBROUTINE_UNIFORM_LOCATIONS 0x8DE8 +#define GL_NUM_COMPATIBLE_SUBROUTINES 0x8E4A +#define GL_COMPATIBLE_SUBROUTINES 0x8E4B +#define GL_PATCHES 0x000E +#define GL_PATCH_VERTICES 0x8E72 +#define GL_PATCH_DEFAULT_INNER_LEVEL 0x8E73 +#define GL_PATCH_DEFAULT_OUTER_LEVEL 0x8E74 +#define GL_TESS_CONTROL_OUTPUT_VERTICES 0x8E75 +#define GL_TESS_GEN_MODE 0x8E76 +#define GL_TESS_GEN_SPACING 0x8E77 +#define GL_TESS_GEN_VERTEX_ORDER 0x8E78 +#define GL_TESS_GEN_POINT_MODE 0x8E79 +#define GL_ISOLINES 0x8E7A +#define GL_QUADS 0x0007 +#define GL_FRACTIONAL_ODD 0x8E7B +#define GL_FRACTIONAL_EVEN 0x8E7C +#define GL_MAX_PATCH_VERTICES 0x8E7D +#define GL_MAX_TESS_GEN_LEVEL 0x8E7E +#define GL_MAX_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E7F +#define GL_MAX_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E80 +#define GL_MAX_TESS_CONTROL_TEXTURE_IMAGE_UNITS 0x8E81 +#define GL_MAX_TESS_EVALUATION_TEXTURE_IMAGE_UNITS 0x8E82 +#define GL_MAX_TESS_CONTROL_OUTPUT_COMPONENTS 0x8E83 +#define GL_MAX_TESS_PATCH_COMPONENTS 0x8E84 +#define GL_MAX_TESS_CONTROL_TOTAL_OUTPUT_COMPONENTS 0x8E85 +#define GL_MAX_TESS_EVALUATION_OUTPUT_COMPONENTS 0x8E86 +#define GL_MAX_TESS_CONTROL_UNIFORM_BLOCKS 0x8E89 +#define GL_MAX_TESS_EVALUATION_UNIFORM_BLOCKS 0x8E8A +#define GL_MAX_TESS_CONTROL_INPUT_COMPONENTS 0x886C +#define GL_MAX_TESS_EVALUATION_INPUT_COMPONENTS 0x886D +#define GL_MAX_COMBINED_TESS_CONTROL_UNIFORM_COMPONENTS 0x8E1E +#define GL_MAX_COMBINED_TESS_EVALUATION_UNIFORM_COMPONENTS 0x8E1F +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_CONTROL_SHADER 0x84F0 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_TESS_EVALUATION_SHADER 0x84F1 +#define GL_TESS_EVALUATION_SHADER 0x8E87 +#define GL_TESS_CONTROL_SHADER 0x8E88 +#define GL_TRANSFORM_FEEDBACK 0x8E22 +#define GL_TRANSFORM_FEEDBACK_BUFFER_PAUSED 0x8E23 +#define GL_TRANSFORM_FEEDBACK_BUFFER_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_BINDING 0x8E25 +#define GL_MAX_TRANSFORM_FEEDBACK_BUFFERS 0x8E70 +#define GL_FIXED 0x140C +#define GL_IMPLEMENTATION_COLOR_READ_TYPE 0x8B9A +#define GL_IMPLEMENTATION_COLOR_READ_FORMAT 0x8B9B +#define GL_LOW_FLOAT 0x8DF0 +#define GL_MEDIUM_FLOAT 0x8DF1 +#define GL_HIGH_FLOAT 0x8DF2 +#define GL_LOW_INT 0x8DF3 +#define GL_MEDIUM_INT 0x8DF4 +#define GL_HIGH_INT 0x8DF5 +#define GL_SHADER_COMPILER 0x8DFA +#define GL_SHADER_BINARY_FORMATS 0x8DF8 +#define GL_NUM_SHADER_BINARY_FORMATS 0x8DF9 +#define GL_MAX_VERTEX_UNIFORM_VECTORS 0x8DFB +#define GL_MAX_VARYING_VECTORS 0x8DFC +#define GL_MAX_FRAGMENT_UNIFORM_VECTORS 0x8DFD +#define GL_RGB565 0x8D62 +#define GL_PROGRAM_BINARY_RETRIEVABLE_HINT 0x8257 +#define GL_PROGRAM_BINARY_LENGTH 0x8741 +#define GL_NUM_PROGRAM_BINARY_FORMATS 0x87FE +#define GL_PROGRAM_BINARY_FORMATS 0x87FF +#define GL_VERTEX_SHADER_BIT 0x00000001 +#define GL_FRAGMENT_SHADER_BIT 0x00000002 +#define GL_GEOMETRY_SHADER_BIT 0x00000004 +#define GL_TESS_CONTROL_SHADER_BIT 0x00000008 +#define GL_TESS_EVALUATION_SHADER_BIT 0x00000010 +#define GL_ALL_SHADER_BITS 0xFFFFFFFF +#define GL_PROGRAM_SEPARABLE 0x8258 +#define GL_ACTIVE_PROGRAM 0x8259 +#define GL_PROGRAM_PIPELINE_BINDING 0x825A +#define GL_MAX_VIEWPORTS 0x825B +#define GL_VIEWPORT_SUBPIXEL_BITS 0x825C +#define GL_VIEWPORT_BOUNDS_RANGE 0x825D +#define GL_LAYER_PROVOKING_VERTEX 0x825E +#define GL_VIEWPORT_INDEX_PROVOKING_VERTEX 0x825F +#define GL_UNDEFINED_VERTEX 0x8260 +#define GL_COPY_READ_BUFFER_BINDING 0x8F36 +#define GL_COPY_WRITE_BUFFER_BINDING 0x8F37 +#define GL_TRANSFORM_FEEDBACK_ACTIVE 0x8E24 +#define GL_TRANSFORM_FEEDBACK_PAUSED 0x8E23 +#define GL_UNPACK_COMPRESSED_BLOCK_WIDTH 0x9127 +#define GL_UNPACK_COMPRESSED_BLOCK_HEIGHT 0x9128 +#define GL_UNPACK_COMPRESSED_BLOCK_DEPTH 0x9129 +#define GL_UNPACK_COMPRESSED_BLOCK_SIZE 0x912A +#define GL_PACK_COMPRESSED_BLOCK_WIDTH 0x912B +#define GL_PACK_COMPRESSED_BLOCK_HEIGHT 0x912C +#define GL_PACK_COMPRESSED_BLOCK_DEPTH 0x912D +#define GL_PACK_COMPRESSED_BLOCK_SIZE 0x912E +#define GL_NUM_SAMPLE_COUNTS 0x9380 +#define GL_MIN_MAP_BUFFER_ALIGNMENT 0x90BC +#define GL_ATOMIC_COUNTER_BUFFER 0x92C0 +#define GL_ATOMIC_COUNTER_BUFFER_BINDING 0x92C1 +#define GL_ATOMIC_COUNTER_BUFFER_START 0x92C2 +#define GL_ATOMIC_COUNTER_BUFFER_SIZE 0x92C3 +#define GL_ATOMIC_COUNTER_BUFFER_DATA_SIZE 0x92C4 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTERS 0x92C5 +#define GL_ATOMIC_COUNTER_BUFFER_ACTIVE_ATOMIC_COUNTER_INDICES 0x92C6 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_VERTEX_SHADER 0x92C7 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_CONTROL_SHADER 0x92C8 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_TESS_EVALUATION_SHADER 0x92C9 +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_GEOMETRY_SHADER 0x92CA +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_FRAGMENT_SHADER 0x92CB +#define GL_MAX_VERTEX_ATOMIC_COUNTER_BUFFERS 0x92CC +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTER_BUFFERS 0x92CD +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTER_BUFFERS 0x92CE +#define GL_MAX_GEOMETRY_ATOMIC_COUNTER_BUFFERS 0x92CF +#define GL_MAX_FRAGMENT_ATOMIC_COUNTER_BUFFERS 0x92D0 +#define GL_MAX_COMBINED_ATOMIC_COUNTER_BUFFERS 0x92D1 +#define GL_MAX_VERTEX_ATOMIC_COUNTERS 0x92D2 +#define GL_MAX_TESS_CONTROL_ATOMIC_COUNTERS 0x92D3 +#define GL_MAX_TESS_EVALUATION_ATOMIC_COUNTERS 0x92D4 +#define GL_MAX_GEOMETRY_ATOMIC_COUNTERS 0x92D5 +#define GL_MAX_FRAGMENT_ATOMIC_COUNTERS 0x92D6 +#define GL_MAX_COMBINED_ATOMIC_COUNTERS 0x92D7 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_SIZE 0x92D8 +#define GL_MAX_ATOMIC_COUNTER_BUFFER_BINDINGS 0x92DC +#define GL_ACTIVE_ATOMIC_COUNTER_BUFFERS 0x92D9 +#define GL_UNIFORM_ATOMIC_COUNTER_BUFFER_INDEX 0x92DA +#define GL_UNSIGNED_INT_ATOMIC_COUNTER 0x92DB +#define GL_VERTEX_ATTRIB_ARRAY_BARRIER_BIT 0x00000001 +#define GL_ELEMENT_ARRAY_BARRIER_BIT 0x00000002 +#define GL_UNIFORM_BARRIER_BIT 0x00000004 +#define GL_TEXTURE_FETCH_BARRIER_BIT 0x00000008 +#define GL_SHADER_IMAGE_ACCESS_BARRIER_BIT 0x00000020 +#define GL_COMMAND_BARRIER_BIT 0x00000040 +#define GL_PIXEL_BUFFER_BARRIER_BIT 0x00000080 +#define GL_TEXTURE_UPDATE_BARRIER_BIT 0x00000100 +#define GL_BUFFER_UPDATE_BARRIER_BIT 0x00000200 +#define GL_FRAMEBUFFER_BARRIER_BIT 0x00000400 +#define GL_TRANSFORM_FEEDBACK_BARRIER_BIT 0x00000800 +#define GL_ATOMIC_COUNTER_BARRIER_BIT 0x00001000 +#define GL_ALL_BARRIER_BITS 0xFFFFFFFF +#define GL_MAX_IMAGE_UNITS 0x8F38 +#define GL_MAX_COMBINED_IMAGE_UNITS_AND_FRAGMENT_OUTPUTS 0x8F39 +#define GL_IMAGE_BINDING_NAME 0x8F3A +#define GL_IMAGE_BINDING_LEVEL 0x8F3B +#define GL_IMAGE_BINDING_LAYERED 0x8F3C +#define GL_IMAGE_BINDING_LAYER 0x8F3D +#define GL_IMAGE_BINDING_ACCESS 0x8F3E +#define GL_IMAGE_1D 0x904C +#define GL_IMAGE_2D 0x904D +#define GL_IMAGE_3D 0x904E +#define GL_IMAGE_2D_RECT 0x904F +#define GL_IMAGE_CUBE 0x9050 +#define GL_IMAGE_BUFFER 0x9051 +#define GL_IMAGE_1D_ARRAY 0x9052 +#define GL_IMAGE_2D_ARRAY 0x9053 +#define GL_IMAGE_CUBE_MAP_ARRAY 0x9054 +#define GL_IMAGE_2D_MULTISAMPLE 0x9055 +#define GL_IMAGE_2D_MULTISAMPLE_ARRAY 0x9056 +#define GL_INT_IMAGE_1D 0x9057 +#define GL_INT_IMAGE_2D 0x9058 +#define GL_INT_IMAGE_3D 0x9059 +#define GL_INT_IMAGE_2D_RECT 0x905A +#define GL_INT_IMAGE_CUBE 0x905B +#define GL_INT_IMAGE_BUFFER 0x905C +#define GL_INT_IMAGE_1D_ARRAY 0x905D +#define GL_INT_IMAGE_2D_ARRAY 0x905E +#define GL_INT_IMAGE_CUBE_MAP_ARRAY 0x905F +#define GL_INT_IMAGE_2D_MULTISAMPLE 0x9060 +#define GL_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x9061 +#define GL_UNSIGNED_INT_IMAGE_1D 0x9062 +#define GL_UNSIGNED_INT_IMAGE_2D 0x9063 +#define GL_UNSIGNED_INT_IMAGE_3D 0x9064 +#define GL_UNSIGNED_INT_IMAGE_2D_RECT 0x9065 +#define GL_UNSIGNED_INT_IMAGE_CUBE 0x9066 +#define GL_UNSIGNED_INT_IMAGE_BUFFER 0x9067 +#define GL_UNSIGNED_INT_IMAGE_1D_ARRAY 0x9068 +#define GL_UNSIGNED_INT_IMAGE_2D_ARRAY 0x9069 +#define GL_UNSIGNED_INT_IMAGE_CUBE_MAP_ARRAY 0x906A +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE 0x906B +#define GL_UNSIGNED_INT_IMAGE_2D_MULTISAMPLE_ARRAY 0x906C +#define GL_MAX_IMAGE_SAMPLES 0x906D +#define GL_IMAGE_BINDING_FORMAT 0x906E +#define GL_IMAGE_FORMAT_COMPATIBILITY_TYPE 0x90C7 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_SIZE 0x90C8 +#define GL_IMAGE_FORMAT_COMPATIBILITY_BY_CLASS 0x90C9 +#define GL_MAX_VERTEX_IMAGE_UNIFORMS 0x90CA +#define GL_MAX_TESS_CONTROL_IMAGE_UNIFORMS 0x90CB +#define GL_MAX_TESS_EVALUATION_IMAGE_UNIFORMS 0x90CC +#define GL_MAX_GEOMETRY_IMAGE_UNIFORMS 0x90CD +#define GL_MAX_FRAGMENT_IMAGE_UNIFORMS 0x90CE +#define GL_MAX_COMBINED_IMAGE_UNIFORMS 0x90CF +#define GL_COMPRESSED_RGBA_BPTC_UNORM 0x8E8C +#define GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM 0x8E8D +#define GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT 0x8E8E +#define GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT 0x8E8F +#define GL_TEXTURE_IMMUTABLE_FORMAT 0x912F +#define GL_NUM_SHADING_LANGUAGE_VERSIONS 0x82E9 +#define GL_VERTEX_ATTRIB_ARRAY_LONG 0x874E +#define GL_COMPRESSED_RGB8_ETC2 0x9274 +#define GL_COMPRESSED_SRGB8_ETC2 0x9275 +#define GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9276 +#define GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2 0x9277 +#define GL_COMPRESSED_RGBA8_ETC2_EAC 0x9278 +#define GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC 0x9279 +#define GL_COMPRESSED_R11_EAC 0x9270 +#define GL_COMPRESSED_SIGNED_R11_EAC 0x9271 +#define GL_COMPRESSED_RG11_EAC 0x9272 +#define GL_COMPRESSED_SIGNED_RG11_EAC 0x9273 +#define GL_PRIMITIVE_RESTART_FIXED_INDEX 0x8D69 +#define GL_ANY_SAMPLES_PASSED_CONSERVATIVE 0x8D6A +#define GL_MAX_ELEMENT_INDEX 0x8D6B +#define GL_COMPUTE_SHADER 0x91B9 +#define GL_MAX_COMPUTE_UNIFORM_BLOCKS 0x91BB +#define GL_MAX_COMPUTE_TEXTURE_IMAGE_UNITS 0x91BC +#define GL_MAX_COMPUTE_IMAGE_UNIFORMS 0x91BD +#define GL_MAX_COMPUTE_SHARED_MEMORY_SIZE 0x8262 +#define GL_MAX_COMPUTE_UNIFORM_COMPONENTS 0x8263 +#define GL_MAX_COMPUTE_ATOMIC_COUNTER_BUFFERS 0x8264 +#define GL_MAX_COMPUTE_ATOMIC_COUNTERS 0x8265 +#define GL_MAX_COMBINED_COMPUTE_UNIFORM_COMPONENTS 0x8266 +#define GL_MAX_COMPUTE_WORK_GROUP_INVOCATIONS 0x90EB +#define GL_MAX_COMPUTE_WORK_GROUP_COUNT 0x91BE +#define GL_MAX_COMPUTE_WORK_GROUP_SIZE 0x91BF +#define GL_COMPUTE_WORK_GROUP_SIZE 0x8267 +#define GL_UNIFORM_BLOCK_REFERENCED_BY_COMPUTE_SHADER 0x90EC +#define GL_ATOMIC_COUNTER_BUFFER_REFERENCED_BY_COMPUTE_SHADER 0x90ED +#define GL_DISPATCH_INDIRECT_BUFFER 0x90EE +#define GL_DISPATCH_INDIRECT_BUFFER_BINDING 0x90EF +#define GL_COMPUTE_SHADER_BIT 0x00000020 +#define GL_DEBUG_OUTPUT_SYNCHRONOUS 0x8242 +#define GL_DEBUG_NEXT_LOGGED_MESSAGE_LENGTH 0x8243 +#define GL_DEBUG_CALLBACK_FUNCTION 0x8244 +#define GL_DEBUG_CALLBACK_USER_PARAM 0x8245 +#define GL_DEBUG_SOURCE_API 0x8246 +#define GL_DEBUG_SOURCE_WINDOW_SYSTEM 0x8247 +#define GL_DEBUG_SOURCE_SHADER_COMPILER 0x8248 +#define GL_DEBUG_SOURCE_THIRD_PARTY 0x8249 +#define GL_DEBUG_SOURCE_APPLICATION 0x824A +#define GL_DEBUG_SOURCE_OTHER 0x824B +#define GL_DEBUG_TYPE_ERROR 0x824C +#define GL_DEBUG_TYPE_DEPRECATED_BEHAVIOR 0x824D +#define GL_DEBUG_TYPE_UNDEFINED_BEHAVIOR 0x824E +#define GL_DEBUG_TYPE_PORTABILITY 0x824F +#define GL_DEBUG_TYPE_PERFORMANCE 0x8250 +#define GL_DEBUG_TYPE_OTHER 0x8251 +#define GL_MAX_DEBUG_MESSAGE_LENGTH 0x9143 +#define GL_MAX_DEBUG_LOGGED_MESSAGES 0x9144 +#define GL_DEBUG_LOGGED_MESSAGES 0x9145 +#define GL_DEBUG_SEVERITY_HIGH 0x9146 +#define GL_DEBUG_SEVERITY_MEDIUM 0x9147 +#define GL_DEBUG_SEVERITY_LOW 0x9148 +#define GL_DEBUG_TYPE_MARKER 0x8268 +#define GL_DEBUG_TYPE_PUSH_GROUP 0x8269 +#define GL_DEBUG_TYPE_POP_GROUP 0x826A +#define GL_DEBUG_SEVERITY_NOTIFICATION 0x826B +#define GL_MAX_DEBUG_GROUP_STACK_DEPTH 0x826C +#define GL_DEBUG_GROUP_STACK_DEPTH 0x826D +#define GL_BUFFER 0x82E0 +#define GL_SHADER 0x82E1 +#define GL_PROGRAM 0x82E2 +#define GL_VERTEX_ARRAY 0x8074 +#define GL_QUERY 0x82E3 +#define GL_PROGRAM_PIPELINE 0x82E4 +#define GL_SAMPLER 0x82E6 +#define GL_MAX_LABEL_LENGTH 0x82E8 +#define GL_DEBUG_OUTPUT 0x92E0 +#define GL_CONTEXT_FLAG_DEBUG_BIT 0x00000002 +#define GL_MAX_UNIFORM_LOCATIONS 0x826E +#define GL_FRAMEBUFFER_DEFAULT_WIDTH 0x9310 +#define GL_FRAMEBUFFER_DEFAULT_HEIGHT 0x9311 +#define GL_FRAMEBUFFER_DEFAULT_LAYERS 0x9312 +#define GL_FRAMEBUFFER_DEFAULT_SAMPLES 0x9313 +#define GL_FRAMEBUFFER_DEFAULT_FIXED_SAMPLE_LOCATIONS 0x9314 +#define GL_MAX_FRAMEBUFFER_WIDTH 0x9315 +#define GL_MAX_FRAMEBUFFER_HEIGHT 0x9316 +#define GL_MAX_FRAMEBUFFER_LAYERS 0x9317 +#define GL_MAX_FRAMEBUFFER_SAMPLES 0x9318 +#define GL_INTERNALFORMAT_SUPPORTED 0x826F +#define GL_INTERNALFORMAT_PREFERRED 0x8270 +#define GL_INTERNALFORMAT_RED_SIZE 0x8271 +#define GL_INTERNALFORMAT_GREEN_SIZE 0x8272 +#define GL_INTERNALFORMAT_BLUE_SIZE 0x8273 +#define GL_INTERNALFORMAT_ALPHA_SIZE 0x8274 +#define GL_INTERNALFORMAT_DEPTH_SIZE 0x8275 +#define GL_INTERNALFORMAT_STENCIL_SIZE 0x8276 +#define GL_INTERNALFORMAT_SHARED_SIZE 0x8277 +#define GL_INTERNALFORMAT_RED_TYPE 0x8278 +#define GL_INTERNALFORMAT_GREEN_TYPE 0x8279 +#define GL_INTERNALFORMAT_BLUE_TYPE 0x827A +#define GL_INTERNALFORMAT_ALPHA_TYPE 0x827B +#define GL_INTERNALFORMAT_DEPTH_TYPE 0x827C +#define GL_INTERNALFORMAT_STENCIL_TYPE 0x827D +#define GL_MAX_WIDTH 0x827E +#define GL_MAX_HEIGHT 0x827F +#define GL_MAX_DEPTH 0x8280 +#define GL_MAX_LAYERS 0x8281 +#define GL_MAX_COMBINED_DIMENSIONS 0x8282 +#define GL_COLOR_COMPONENTS 0x8283 +#define GL_DEPTH_COMPONENTS 0x8284 +#define GL_STENCIL_COMPONENTS 0x8285 +#define GL_COLOR_RENDERABLE 0x8286 +#define GL_DEPTH_RENDERABLE 0x8287 +#define GL_STENCIL_RENDERABLE 0x8288 +#define GL_FRAMEBUFFER_RENDERABLE 0x8289 +#define GL_FRAMEBUFFER_RENDERABLE_LAYERED 0x828A +#define GL_FRAMEBUFFER_BLEND 0x828B +#define GL_READ_PIXELS 0x828C +#define GL_READ_PIXELS_FORMAT 0x828D +#define GL_READ_PIXELS_TYPE 0x828E +#define GL_TEXTURE_IMAGE_FORMAT 0x828F +#define GL_TEXTURE_IMAGE_TYPE 0x8290 +#define GL_GET_TEXTURE_IMAGE_FORMAT 0x8291 +#define GL_GET_TEXTURE_IMAGE_TYPE 0x8292 +#define GL_MIPMAP 0x8293 +#define GL_MANUAL_GENERATE_MIPMAP 0x8294 +#define GL_AUTO_GENERATE_MIPMAP 0x8295 +#define GL_COLOR_ENCODING 0x8296 +#define GL_SRGB_READ 0x8297 +#define GL_SRGB_WRITE 0x8298 +#define GL_FILTER 0x829A +#define GL_VERTEX_TEXTURE 0x829B +#define GL_TESS_CONTROL_TEXTURE 0x829C +#define GL_TESS_EVALUATION_TEXTURE 0x829D +#define GL_GEOMETRY_TEXTURE 0x829E +#define GL_FRAGMENT_TEXTURE 0x829F +#define GL_COMPUTE_TEXTURE 0x82A0 +#define GL_TEXTURE_SHADOW 0x82A1 +#define GL_TEXTURE_GATHER 0x82A2 +#define GL_TEXTURE_GATHER_SHADOW 0x82A3 +#define GL_SHADER_IMAGE_LOAD 0x82A4 +#define GL_SHADER_IMAGE_STORE 0x82A5 +#define GL_SHADER_IMAGE_ATOMIC 0x82A6 +#define GL_IMAGE_TEXEL_SIZE 0x82A7 +#define GL_IMAGE_COMPATIBILITY_CLASS 0x82A8 +#define GL_IMAGE_PIXEL_FORMAT 0x82A9 +#define GL_IMAGE_PIXEL_TYPE 0x82AA +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_TEST 0x82AC +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_TEST 0x82AD +#define GL_SIMULTANEOUS_TEXTURE_AND_DEPTH_WRITE 0x82AE +#define GL_SIMULTANEOUS_TEXTURE_AND_STENCIL_WRITE 0x82AF +#define GL_TEXTURE_COMPRESSED_BLOCK_WIDTH 0x82B1 +#define GL_TEXTURE_COMPRESSED_BLOCK_HEIGHT 0x82B2 +#define GL_TEXTURE_COMPRESSED_BLOCK_SIZE 0x82B3 +#define GL_CLEAR_BUFFER 0x82B4 +#define GL_TEXTURE_VIEW 0x82B5 +#define GL_VIEW_COMPATIBILITY_CLASS 0x82B6 +#define GL_FULL_SUPPORT 0x82B7 +#define GL_CAVEAT_SUPPORT 0x82B8 +#define GL_IMAGE_CLASS_4_X_32 0x82B9 +#define GL_IMAGE_CLASS_2_X_32 0x82BA +#define GL_IMAGE_CLASS_1_X_32 0x82BB +#define GL_IMAGE_CLASS_4_X_16 0x82BC +#define GL_IMAGE_CLASS_2_X_16 0x82BD +#define GL_IMAGE_CLASS_1_X_16 0x82BE +#define GL_IMAGE_CLASS_4_X_8 0x82BF +#define GL_IMAGE_CLASS_2_X_8 0x82C0 +#define GL_IMAGE_CLASS_1_X_8 0x82C1 +#define GL_IMAGE_CLASS_11_11_10 0x82C2 +#define GL_IMAGE_CLASS_10_10_10_2 0x82C3 +#define GL_VIEW_CLASS_128_BITS 0x82C4 +#define GL_VIEW_CLASS_96_BITS 0x82C5 +#define GL_VIEW_CLASS_64_BITS 0x82C6 +#define GL_VIEW_CLASS_48_BITS 0x82C7 +#define GL_VIEW_CLASS_32_BITS 0x82C8 +#define GL_VIEW_CLASS_24_BITS 0x82C9 +#define GL_VIEW_CLASS_16_BITS 0x82CA +#define GL_VIEW_CLASS_8_BITS 0x82CB +#define GL_VIEW_CLASS_S3TC_DXT1_RGB 0x82CC +#define GL_VIEW_CLASS_S3TC_DXT1_RGBA 0x82CD +#define GL_VIEW_CLASS_S3TC_DXT3_RGBA 0x82CE +#define GL_VIEW_CLASS_S3TC_DXT5_RGBA 0x82CF +#define GL_VIEW_CLASS_RGTC1_RED 0x82D0 +#define GL_VIEW_CLASS_RGTC2_RG 0x82D1 +#define GL_VIEW_CLASS_BPTC_UNORM 0x82D2 +#define GL_VIEW_CLASS_BPTC_FLOAT 0x82D3 +#define GL_UNIFORM 0x92E1 +#define GL_UNIFORM_BLOCK 0x92E2 +#define GL_PROGRAM_INPUT 0x92E3 +#define GL_PROGRAM_OUTPUT 0x92E4 +#define GL_BUFFER_VARIABLE 0x92E5 +#define GL_SHADER_STORAGE_BLOCK 0x92E6 +#define GL_VERTEX_SUBROUTINE 0x92E8 +#define GL_TESS_CONTROL_SUBROUTINE 0x92E9 +#define GL_TESS_EVALUATION_SUBROUTINE 0x92EA +#define GL_GEOMETRY_SUBROUTINE 0x92EB +#define GL_FRAGMENT_SUBROUTINE 0x92EC +#define GL_COMPUTE_SUBROUTINE 0x92ED +#define GL_VERTEX_SUBROUTINE_UNIFORM 0x92EE +#define GL_TESS_CONTROL_SUBROUTINE_UNIFORM 0x92EF +#define GL_TESS_EVALUATION_SUBROUTINE_UNIFORM 0x92F0 +#define GL_GEOMETRY_SUBROUTINE_UNIFORM 0x92F1 +#define GL_FRAGMENT_SUBROUTINE_UNIFORM 0x92F2 +#define GL_COMPUTE_SUBROUTINE_UNIFORM 0x92F3 +#define GL_TRANSFORM_FEEDBACK_VARYING 0x92F4 +#define GL_ACTIVE_RESOURCES 0x92F5 +#define GL_MAX_NAME_LENGTH 0x92F6 +#define GL_MAX_NUM_ACTIVE_VARIABLES 0x92F7 +#define GL_MAX_NUM_COMPATIBLE_SUBROUTINES 0x92F8 +#define GL_NAME_LENGTH 0x92F9 +#define GL_TYPE 0x92FA +#define GL_ARRAY_SIZE 0x92FB +#define GL_OFFSET 0x92FC +#define GL_BLOCK_INDEX 0x92FD +#define GL_ARRAY_STRIDE 0x92FE +#define GL_MATRIX_STRIDE 0x92FF +#define GL_IS_ROW_MAJOR 0x9300 +#define GL_ATOMIC_COUNTER_BUFFER_INDEX 0x9301 +#define GL_BUFFER_BINDING 0x9302 +#define GL_BUFFER_DATA_SIZE 0x9303 +#define GL_NUM_ACTIVE_VARIABLES 0x9304 +#define GL_ACTIVE_VARIABLES 0x9305 +#define GL_REFERENCED_BY_VERTEX_SHADER 0x9306 +#define GL_REFERENCED_BY_TESS_CONTROL_SHADER 0x9307 +#define GL_REFERENCED_BY_TESS_EVALUATION_SHADER 0x9308 +#define GL_REFERENCED_BY_GEOMETRY_SHADER 0x9309 +#define GL_REFERENCED_BY_FRAGMENT_SHADER 0x930A +#define GL_REFERENCED_BY_COMPUTE_SHADER 0x930B +#define GL_TOP_LEVEL_ARRAY_SIZE 0x930C +#define GL_TOP_LEVEL_ARRAY_STRIDE 0x930D +#define GL_LOCATION 0x930E +#define GL_LOCATION_INDEX 0x930F +#define GL_IS_PER_PATCH 0x92E7 +#define GL_SHADER_STORAGE_BUFFER 0x90D2 +#define GL_SHADER_STORAGE_BUFFER_BINDING 0x90D3 +#define GL_SHADER_STORAGE_BUFFER_START 0x90D4 +#define GL_SHADER_STORAGE_BUFFER_SIZE 0x90D5 +#define GL_MAX_VERTEX_SHADER_STORAGE_BLOCKS 0x90D6 +#define GL_MAX_GEOMETRY_SHADER_STORAGE_BLOCKS 0x90D7 +#define GL_MAX_TESS_CONTROL_SHADER_STORAGE_BLOCKS 0x90D8 +#define GL_MAX_TESS_EVALUATION_SHADER_STORAGE_BLOCKS 0x90D9 +#define GL_MAX_FRAGMENT_SHADER_STORAGE_BLOCKS 0x90DA +#define GL_MAX_COMPUTE_SHADER_STORAGE_BLOCKS 0x90DB +#define GL_MAX_COMBINED_SHADER_STORAGE_BLOCKS 0x90DC +#define GL_MAX_SHADER_STORAGE_BUFFER_BINDINGS 0x90DD +#define GL_MAX_SHADER_STORAGE_BLOCK_SIZE 0x90DE +#define GL_SHADER_STORAGE_BUFFER_OFFSET_ALIGNMENT 0x90DF +#define GL_SHADER_STORAGE_BARRIER_BIT 0x00002000 +#define GL_MAX_COMBINED_SHADER_OUTPUT_RESOURCES 0x8F39 +#define GL_DEPTH_STENCIL_TEXTURE_MODE 0x90EA +#define GL_TEXTURE_BUFFER_OFFSET 0x919D +#define GL_TEXTURE_BUFFER_SIZE 0x919E +#define GL_TEXTURE_BUFFER_OFFSET_ALIGNMENT 0x919F +#define GL_TEXTURE_VIEW_MIN_LEVEL 0x82DB +#define GL_TEXTURE_VIEW_NUM_LEVELS 0x82DC +#define GL_TEXTURE_VIEW_MIN_LAYER 0x82DD +#define GL_TEXTURE_VIEW_NUM_LAYERS 0x82DE +#define GL_TEXTURE_IMMUTABLE_LEVELS 0x82DF +#define GL_VERTEX_ATTRIB_BINDING 0x82D4 +#define GL_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D5 +#define GL_VERTEX_BINDING_DIVISOR 0x82D6 +#define GL_VERTEX_BINDING_OFFSET 0x82D7 +#define GL_VERTEX_BINDING_STRIDE 0x82D8 +#define GL_MAX_VERTEX_ATTRIB_RELATIVE_OFFSET 0x82D9 +#define GL_MAX_VERTEX_ATTRIB_BINDINGS 0x82DA +#define GL_VERTEX_BINDING_BUFFER 0x8F4F +#define GL_DISPLAY_LIST 0x82E7 +#define GL_STACK_UNDERFLOW 0x0504 +#define GL_STACK_OVERFLOW 0x0503 #ifndef GL_VERSION_1_0 #define GL_VERSION_1_0 1 GLAPI int GLAD_GL_VERSION_1_0; @@ -2121,6 +2608,592 @@ typedef void (APIENTRYP PFNGLSECONDARYCOLORP3UIVPROC)(GLenum type, const GLuint GLAPI PFNGLSECONDARYCOLORP3UIVPROC glad_glSecondaryColorP3uiv; #define glSecondaryColorP3uiv glad_glSecondaryColorP3uiv #endif +#ifndef GL_VERSION_4_0 +#define GL_VERSION_4_0 1 +GLAPI int GLAD_GL_VERSION_4_0; +typedef void (APIENTRYP PFNGLMINSAMPLESHADINGPROC)(GLfloat value); +GLAPI PFNGLMINSAMPLESHADINGPROC glad_glMinSampleShading; +#define glMinSampleShading glad_glMinSampleShading +typedef void (APIENTRYP PFNGLBLENDEQUATIONIPROC)(GLuint buf, GLenum mode); +GLAPI PFNGLBLENDEQUATIONIPROC glad_glBlendEquationi; +#define glBlendEquationi glad_glBlendEquationi +typedef void (APIENTRYP PFNGLBLENDEQUATIONSEPARATEIPROC)(GLuint buf, GLenum modeRGB, GLenum modeAlpha); +GLAPI PFNGLBLENDEQUATIONSEPARATEIPROC glad_glBlendEquationSeparatei; +#define glBlendEquationSeparatei glad_glBlendEquationSeparatei +typedef void (APIENTRYP PFNGLBLENDFUNCIPROC)(GLuint buf, GLenum src, GLenum dst); +GLAPI PFNGLBLENDFUNCIPROC glad_glBlendFunci; +#define glBlendFunci glad_glBlendFunci +typedef void (APIENTRYP PFNGLBLENDFUNCSEPARATEIPROC)(GLuint buf, GLenum srcRGB, GLenum dstRGB, GLenum srcAlpha, GLenum dstAlpha); +GLAPI PFNGLBLENDFUNCSEPARATEIPROC glad_glBlendFuncSeparatei; +#define glBlendFuncSeparatei glad_glBlendFuncSeparatei +typedef void (APIENTRYP PFNGLDRAWARRAYSINDIRECTPROC)(GLenum mode, const void *indirect); +GLAPI PFNGLDRAWARRAYSINDIRECTPROC glad_glDrawArraysIndirect; +#define glDrawArraysIndirect glad_glDrawArraysIndirect +typedef void (APIENTRYP PFNGLDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void *indirect); +GLAPI PFNGLDRAWELEMENTSINDIRECTPROC glad_glDrawElementsIndirect; +#define glDrawElementsIndirect glad_glDrawElementsIndirect +typedef void (APIENTRYP PFNGLUNIFORM1DPROC)(GLint location, GLdouble x); +GLAPI PFNGLUNIFORM1DPROC glad_glUniform1d; +#define glUniform1d glad_glUniform1d +typedef void (APIENTRYP PFNGLUNIFORM2DPROC)(GLint location, GLdouble x, GLdouble y); +GLAPI PFNGLUNIFORM2DPROC glad_glUniform2d; +#define glUniform2d glad_glUniform2d +typedef void (APIENTRYP PFNGLUNIFORM3DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLUNIFORM3DPROC glad_glUniform3d; +#define glUniform3d glad_glUniform3d +typedef void (APIENTRYP PFNGLUNIFORM4DPROC)(GLint location, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI PFNGLUNIFORM4DPROC glad_glUniform4d; +#define glUniform4d glad_glUniform4d +typedef void (APIENTRYP PFNGLUNIFORM1DVPROC)(GLint location, GLsizei count, const GLdouble *value); +GLAPI PFNGLUNIFORM1DVPROC glad_glUniform1dv; +#define glUniform1dv glad_glUniform1dv +typedef void (APIENTRYP PFNGLUNIFORM2DVPROC)(GLint location, GLsizei count, const GLdouble *value); +GLAPI PFNGLUNIFORM2DVPROC glad_glUniform2dv; +#define glUniform2dv glad_glUniform2dv +typedef void (APIENTRYP PFNGLUNIFORM3DVPROC)(GLint location, GLsizei count, const GLdouble *value); +GLAPI PFNGLUNIFORM3DVPROC glad_glUniform3dv; +#define glUniform3dv glad_glUniform3dv +typedef void (APIENTRYP PFNGLUNIFORM4DVPROC)(GLint location, GLsizei count, const GLdouble *value); +GLAPI PFNGLUNIFORM4DVPROC glad_glUniform4dv; +#define glUniform4dv glad_glUniform4dv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLUNIFORMMATRIX2DVPROC glad_glUniformMatrix2dv; +#define glUniformMatrix2dv glad_glUniformMatrix2dv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLUNIFORMMATRIX3DVPROC glad_glUniformMatrix3dv; +#define glUniformMatrix3dv glad_glUniformMatrix3dv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLUNIFORMMATRIX4DVPROC glad_glUniformMatrix4dv; +#define glUniformMatrix4dv glad_glUniformMatrix4dv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLUNIFORMMATRIX2X3DVPROC glad_glUniformMatrix2x3dv; +#define glUniformMatrix2x3dv glad_glUniformMatrix2x3dv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX2X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLUNIFORMMATRIX2X4DVPROC glad_glUniformMatrix2x4dv; +#define glUniformMatrix2x4dv glad_glUniformMatrix2x4dv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLUNIFORMMATRIX3X2DVPROC glad_glUniformMatrix3x2dv; +#define glUniformMatrix3x2dv glad_glUniformMatrix3x2dv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX3X4DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLUNIFORMMATRIX3X4DVPROC glad_glUniformMatrix3x4dv; +#define glUniformMatrix3x4dv glad_glUniformMatrix3x4dv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X2DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLUNIFORMMATRIX4X2DVPROC glad_glUniformMatrix4x2dv; +#define glUniformMatrix4x2dv glad_glUniformMatrix4x2dv +typedef void (APIENTRYP PFNGLUNIFORMMATRIX4X3DVPROC)(GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLUNIFORMMATRIX4X3DVPROC glad_glUniformMatrix4x3dv; +#define glUniformMatrix4x3dv glad_glUniformMatrix4x3dv +typedef void (APIENTRYP PFNGLGETUNIFORMDVPROC)(GLuint program, GLint location, GLdouble *params); +GLAPI PFNGLGETUNIFORMDVPROC glad_glGetUniformdv; +#define glGetUniformdv glad_glGetUniformdv +typedef GLint (APIENTRYP PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC)(GLuint program, GLenum shadertype, const GLchar *name); +GLAPI PFNGLGETSUBROUTINEUNIFORMLOCATIONPROC glad_glGetSubroutineUniformLocation; +#define glGetSubroutineUniformLocation glad_glGetSubroutineUniformLocation +typedef GLuint (APIENTRYP PFNGLGETSUBROUTINEINDEXPROC)(GLuint program, GLenum shadertype, const GLchar *name); +GLAPI PFNGLGETSUBROUTINEINDEXPROC glad_glGetSubroutineIndex; +#define glGetSubroutineIndex glad_glGetSubroutineIndex +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC)(GLuint program, GLenum shadertype, GLuint index, GLenum pname, GLint *values); +GLAPI PFNGLGETACTIVESUBROUTINEUNIFORMIVPROC glad_glGetActiveSubroutineUniformiv; +#define glGetActiveSubroutineUniformiv glad_glGetActiveSubroutineUniformiv +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI PFNGLGETACTIVESUBROUTINEUNIFORMNAMEPROC glad_glGetActiveSubroutineUniformName; +#define glGetActiveSubroutineUniformName glad_glGetActiveSubroutineUniformName +typedef void (APIENTRYP PFNGLGETACTIVESUBROUTINENAMEPROC)(GLuint program, GLenum shadertype, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI PFNGLGETACTIVESUBROUTINENAMEPROC glad_glGetActiveSubroutineName; +#define glGetActiveSubroutineName glad_glGetActiveSubroutineName +typedef void (APIENTRYP PFNGLUNIFORMSUBROUTINESUIVPROC)(GLenum shadertype, GLsizei count, const GLuint *indices); +GLAPI PFNGLUNIFORMSUBROUTINESUIVPROC glad_glUniformSubroutinesuiv; +#define glUniformSubroutinesuiv glad_glUniformSubroutinesuiv +typedef void (APIENTRYP PFNGLGETUNIFORMSUBROUTINEUIVPROC)(GLenum shadertype, GLint location, GLuint *params); +GLAPI PFNGLGETUNIFORMSUBROUTINEUIVPROC glad_glGetUniformSubroutineuiv; +#define glGetUniformSubroutineuiv glad_glGetUniformSubroutineuiv +typedef void (APIENTRYP PFNGLGETPROGRAMSTAGEIVPROC)(GLuint program, GLenum shadertype, GLenum pname, GLint *values); +GLAPI PFNGLGETPROGRAMSTAGEIVPROC glad_glGetProgramStageiv; +#define glGetProgramStageiv glad_glGetProgramStageiv +typedef void (APIENTRYP PFNGLPATCHPARAMETERIPROC)(GLenum pname, GLint value); +GLAPI PFNGLPATCHPARAMETERIPROC glad_glPatchParameteri; +#define glPatchParameteri glad_glPatchParameteri +typedef void (APIENTRYP PFNGLPATCHPARAMETERFVPROC)(GLenum pname, const GLfloat *values); +GLAPI PFNGLPATCHPARAMETERFVPROC glad_glPatchParameterfv; +#define glPatchParameterfv glad_glPatchParameterfv +typedef void (APIENTRYP PFNGLBINDTRANSFORMFEEDBACKPROC)(GLenum target, GLuint id); +GLAPI PFNGLBINDTRANSFORMFEEDBACKPROC glad_glBindTransformFeedback; +#define glBindTransformFeedback glad_glBindTransformFeedback +typedef void (APIENTRYP PFNGLDELETETRANSFORMFEEDBACKSPROC)(GLsizei n, const GLuint *ids); +GLAPI PFNGLDELETETRANSFORMFEEDBACKSPROC glad_glDeleteTransformFeedbacks; +#define glDeleteTransformFeedbacks glad_glDeleteTransformFeedbacks +typedef void (APIENTRYP PFNGLGENTRANSFORMFEEDBACKSPROC)(GLsizei n, GLuint *ids); +GLAPI PFNGLGENTRANSFORMFEEDBACKSPROC glad_glGenTransformFeedbacks; +#define glGenTransformFeedbacks glad_glGenTransformFeedbacks +typedef GLboolean (APIENTRYP PFNGLISTRANSFORMFEEDBACKPROC)(GLuint id); +GLAPI PFNGLISTRANSFORMFEEDBACKPROC glad_glIsTransformFeedback; +#define glIsTransformFeedback glad_glIsTransformFeedback +typedef void (APIENTRYP PFNGLPAUSETRANSFORMFEEDBACKPROC)(void); +GLAPI PFNGLPAUSETRANSFORMFEEDBACKPROC glad_glPauseTransformFeedback; +#define glPauseTransformFeedback glad_glPauseTransformFeedback +typedef void (APIENTRYP PFNGLRESUMETRANSFORMFEEDBACKPROC)(void); +GLAPI PFNGLRESUMETRANSFORMFEEDBACKPROC glad_glResumeTransformFeedback; +#define glResumeTransformFeedback glad_glResumeTransformFeedback +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKPROC)(GLenum mode, GLuint id); +GLAPI PFNGLDRAWTRANSFORMFEEDBACKPROC glad_glDrawTransformFeedback; +#define glDrawTransformFeedback glad_glDrawTransformFeedback +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC)(GLenum mode, GLuint id, GLuint stream); +GLAPI PFNGLDRAWTRANSFORMFEEDBACKSTREAMPROC glad_glDrawTransformFeedbackStream; +#define glDrawTransformFeedbackStream glad_glDrawTransformFeedbackStream +typedef void (APIENTRYP PFNGLBEGINQUERYINDEXEDPROC)(GLenum target, GLuint index, GLuint id); +GLAPI PFNGLBEGINQUERYINDEXEDPROC glad_glBeginQueryIndexed; +#define glBeginQueryIndexed glad_glBeginQueryIndexed +typedef void (APIENTRYP PFNGLENDQUERYINDEXEDPROC)(GLenum target, GLuint index); +GLAPI PFNGLENDQUERYINDEXEDPROC glad_glEndQueryIndexed; +#define glEndQueryIndexed glad_glEndQueryIndexed +typedef void (APIENTRYP PFNGLGETQUERYINDEXEDIVPROC)(GLenum target, GLuint index, GLenum pname, GLint *params); +GLAPI PFNGLGETQUERYINDEXEDIVPROC glad_glGetQueryIndexediv; +#define glGetQueryIndexediv glad_glGetQueryIndexediv +#endif +#ifndef GL_VERSION_4_1 +#define GL_VERSION_4_1 1 +GLAPI int GLAD_GL_VERSION_4_1; +typedef void (APIENTRYP PFNGLRELEASESHADERCOMPILERPROC)(void); +GLAPI PFNGLRELEASESHADERCOMPILERPROC glad_glReleaseShaderCompiler; +#define glReleaseShaderCompiler glad_glReleaseShaderCompiler +typedef void (APIENTRYP PFNGLSHADERBINARYPROC)(GLsizei count, const GLuint *shaders, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI PFNGLSHADERBINARYPROC glad_glShaderBinary; +#define glShaderBinary glad_glShaderBinary +typedef void (APIENTRYP PFNGLGETSHADERPRECISIONFORMATPROC)(GLenum shadertype, GLenum precisiontype, GLint *range, GLint *precision); +GLAPI PFNGLGETSHADERPRECISIONFORMATPROC glad_glGetShaderPrecisionFormat; +#define glGetShaderPrecisionFormat glad_glGetShaderPrecisionFormat +typedef void (APIENTRYP PFNGLDEPTHRANGEFPROC)(GLfloat n, GLfloat f); +GLAPI PFNGLDEPTHRANGEFPROC glad_glDepthRangef; +#define glDepthRangef glad_glDepthRangef +typedef void (APIENTRYP PFNGLCLEARDEPTHFPROC)(GLfloat d); +GLAPI PFNGLCLEARDEPTHFPROC glad_glClearDepthf; +#define glClearDepthf glad_glClearDepthf +typedef void (APIENTRYP PFNGLGETPROGRAMBINARYPROC)(GLuint program, GLsizei bufSize, GLsizei *length, GLenum *binaryFormat, void *binary); +GLAPI PFNGLGETPROGRAMBINARYPROC glad_glGetProgramBinary; +#define glGetProgramBinary glad_glGetProgramBinary +typedef void (APIENTRYP PFNGLPROGRAMBINARYPROC)(GLuint program, GLenum binaryFormat, const void *binary, GLsizei length); +GLAPI PFNGLPROGRAMBINARYPROC glad_glProgramBinary; +#define glProgramBinary glad_glProgramBinary +typedef void (APIENTRYP PFNGLPROGRAMPARAMETERIPROC)(GLuint program, GLenum pname, GLint value); +GLAPI PFNGLPROGRAMPARAMETERIPROC glad_glProgramParameteri; +#define glProgramParameteri glad_glProgramParameteri +typedef void (APIENTRYP PFNGLUSEPROGRAMSTAGESPROC)(GLuint pipeline, GLbitfield stages, GLuint program); +GLAPI PFNGLUSEPROGRAMSTAGESPROC glad_glUseProgramStages; +#define glUseProgramStages glad_glUseProgramStages +typedef void (APIENTRYP PFNGLACTIVESHADERPROGRAMPROC)(GLuint pipeline, GLuint program); +GLAPI PFNGLACTIVESHADERPROGRAMPROC glad_glActiveShaderProgram; +#define glActiveShaderProgram glad_glActiveShaderProgram +typedef GLuint (APIENTRYP PFNGLCREATESHADERPROGRAMVPROC)(GLenum type, GLsizei count, const GLchar *const*strings); +GLAPI PFNGLCREATESHADERPROGRAMVPROC glad_glCreateShaderProgramv; +#define glCreateShaderProgramv glad_glCreateShaderProgramv +typedef void (APIENTRYP PFNGLBINDPROGRAMPIPELINEPROC)(GLuint pipeline); +GLAPI PFNGLBINDPROGRAMPIPELINEPROC glad_glBindProgramPipeline; +#define glBindProgramPipeline glad_glBindProgramPipeline +typedef void (APIENTRYP PFNGLDELETEPROGRAMPIPELINESPROC)(GLsizei n, const GLuint *pipelines); +GLAPI PFNGLDELETEPROGRAMPIPELINESPROC glad_glDeleteProgramPipelines; +#define glDeleteProgramPipelines glad_glDeleteProgramPipelines +typedef void (APIENTRYP PFNGLGENPROGRAMPIPELINESPROC)(GLsizei n, GLuint *pipelines); +GLAPI PFNGLGENPROGRAMPIPELINESPROC glad_glGenProgramPipelines; +#define glGenProgramPipelines glad_glGenProgramPipelines +typedef GLboolean (APIENTRYP PFNGLISPROGRAMPIPELINEPROC)(GLuint pipeline); +GLAPI PFNGLISPROGRAMPIPELINEPROC glad_glIsProgramPipeline; +#define glIsProgramPipeline glad_glIsProgramPipeline +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEIVPROC)(GLuint pipeline, GLenum pname, GLint *params); +GLAPI PFNGLGETPROGRAMPIPELINEIVPROC glad_glGetProgramPipelineiv; +#define glGetProgramPipelineiv glad_glGetProgramPipelineiv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IPROC)(GLuint program, GLint location, GLint v0); +GLAPI PFNGLPROGRAMUNIFORM1IPROC glad_glProgramUniform1i; +#define glProgramUniform1i glad_glProgramUniform1i +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1IVPROC)(GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLPROGRAMUNIFORM1IVPROC glad_glProgramUniform1iv; +#define glProgramUniform1iv glad_glProgramUniform1iv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FPROC)(GLuint program, GLint location, GLfloat v0); +GLAPI PFNGLPROGRAMUNIFORM1FPROC glad_glProgramUniform1f; +#define glProgramUniform1f glad_glProgramUniform1f +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORM1FVPROC glad_glProgramUniform1fv; +#define glProgramUniform1fv glad_glProgramUniform1fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DPROC)(GLuint program, GLint location, GLdouble v0); +GLAPI PFNGLPROGRAMUNIFORM1DPROC glad_glProgramUniform1d; +#define glProgramUniform1d glad_glProgramUniform1d +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORM1DVPROC glad_glProgramUniform1dv; +#define glProgramUniform1dv glad_glProgramUniform1dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIPROC)(GLuint program, GLint location, GLuint v0); +GLAPI PFNGLPROGRAMUNIFORM1UIPROC glad_glProgramUniform1ui; +#define glProgramUniform1ui glad_glProgramUniform1ui +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM1UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLPROGRAMUNIFORM1UIVPROC glad_glProgramUniform1uiv; +#define glProgramUniform1uiv glad_glProgramUniform1uiv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IPROC)(GLuint program, GLint location, GLint v0, GLint v1); +GLAPI PFNGLPROGRAMUNIFORM2IPROC glad_glProgramUniform2i; +#define glProgramUniform2i glad_glProgramUniform2i +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2IVPROC)(GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLPROGRAMUNIFORM2IVPROC glad_glProgramUniform2iv; +#define glProgramUniform2iv glad_glProgramUniform2iv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1); +GLAPI PFNGLPROGRAMUNIFORM2FPROC glad_glProgramUniform2f; +#define glProgramUniform2f glad_glProgramUniform2f +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORM2FVPROC glad_glProgramUniform2fv; +#define glProgramUniform2fv glad_glProgramUniform2fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1); +GLAPI PFNGLPROGRAMUNIFORM2DPROC glad_glProgramUniform2d; +#define glProgramUniform2d glad_glProgramUniform2d +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORM2DVPROC glad_glProgramUniform2dv; +#define glProgramUniform2dv glad_glProgramUniform2dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1); +GLAPI PFNGLPROGRAMUNIFORM2UIPROC glad_glProgramUniform2ui; +#define glProgramUniform2ui glad_glProgramUniform2ui +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM2UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLPROGRAMUNIFORM2UIVPROC glad_glProgramUniform2uiv; +#define glProgramUniform2uiv glad_glProgramUniform2uiv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2); +GLAPI PFNGLPROGRAMUNIFORM3IPROC glad_glProgramUniform3i; +#define glProgramUniform3i glad_glProgramUniform3i +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3IVPROC)(GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLPROGRAMUNIFORM3IVPROC glad_glProgramUniform3iv; +#define glProgramUniform3iv glad_glProgramUniform3iv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2); +GLAPI PFNGLPROGRAMUNIFORM3FPROC glad_glProgramUniform3f; +#define glProgramUniform3f glad_glProgramUniform3f +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORM3FVPROC glad_glProgramUniform3fv; +#define glProgramUniform3fv glad_glProgramUniform3fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2); +GLAPI PFNGLPROGRAMUNIFORM3DPROC glad_glProgramUniform3d; +#define glProgramUniform3d glad_glProgramUniform3d +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORM3DVPROC glad_glProgramUniform3dv; +#define glProgramUniform3dv glad_glProgramUniform3dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2); +GLAPI PFNGLPROGRAMUNIFORM3UIPROC glad_glProgramUniform3ui; +#define glProgramUniform3ui glad_glProgramUniform3ui +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM3UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLPROGRAMUNIFORM3UIVPROC glad_glProgramUniform3uiv; +#define glProgramUniform3uiv glad_glProgramUniform3uiv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IPROC)(GLuint program, GLint location, GLint v0, GLint v1, GLint v2, GLint v3); +GLAPI PFNGLPROGRAMUNIFORM4IPROC glad_glProgramUniform4i; +#define glProgramUniform4i glad_glProgramUniform4i +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4IVPROC)(GLuint program, GLint location, GLsizei count, const GLint *value); +GLAPI PFNGLPROGRAMUNIFORM4IVPROC glad_glProgramUniform4iv; +#define glProgramUniform4iv glad_glProgramUniform4iv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FPROC)(GLuint program, GLint location, GLfloat v0, GLfloat v1, GLfloat v2, GLfloat v3); +GLAPI PFNGLPROGRAMUNIFORM4FPROC glad_glProgramUniform4f; +#define glProgramUniform4f glad_glProgramUniform4f +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4FVPROC)(GLuint program, GLint location, GLsizei count, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORM4FVPROC glad_glProgramUniform4fv; +#define glProgramUniform4fv glad_glProgramUniform4fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DPROC)(GLuint program, GLint location, GLdouble v0, GLdouble v1, GLdouble v2, GLdouble v3); +GLAPI PFNGLPROGRAMUNIFORM4DPROC glad_glProgramUniform4d; +#define glProgramUniform4d glad_glProgramUniform4d +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4DVPROC)(GLuint program, GLint location, GLsizei count, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORM4DVPROC glad_glProgramUniform4dv; +#define glProgramUniform4dv glad_glProgramUniform4dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIPROC)(GLuint program, GLint location, GLuint v0, GLuint v1, GLuint v2, GLuint v3); +GLAPI PFNGLPROGRAMUNIFORM4UIPROC glad_glProgramUniform4ui; +#define glProgramUniform4ui glad_glProgramUniform4ui +typedef void (APIENTRYP PFNGLPROGRAMUNIFORM4UIVPROC)(GLuint program, GLint location, GLsizei count, const GLuint *value); +GLAPI PFNGLPROGRAMUNIFORM4UIVPROC glad_glProgramUniform4uiv; +#define glProgramUniform4uiv glad_glProgramUniform4uiv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX2FVPROC glad_glProgramUniformMatrix2fv; +#define glProgramUniformMatrix2fv glad_glProgramUniformMatrix2fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX3FVPROC glad_glProgramUniformMatrix3fv; +#define glProgramUniformMatrix3fv glad_glProgramUniformMatrix3fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX4FVPROC glad_glProgramUniformMatrix4fv; +#define glProgramUniformMatrix4fv glad_glProgramUniformMatrix4fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX2DVPROC glad_glProgramUniformMatrix2dv; +#define glProgramUniformMatrix2dv glad_glProgramUniformMatrix2dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX3DVPROC glad_glProgramUniformMatrix3dv; +#define glProgramUniformMatrix3dv glad_glProgramUniformMatrix3dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX4DVPROC glad_glProgramUniformMatrix4dv; +#define glProgramUniformMatrix4dv glad_glProgramUniformMatrix4dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX2X3FVPROC glad_glProgramUniformMatrix2x3fv; +#define glProgramUniformMatrix2x3fv glad_glProgramUniformMatrix2x3fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX3X2FVPROC glad_glProgramUniformMatrix3x2fv; +#define glProgramUniformMatrix3x2fv glad_glProgramUniformMatrix3x2fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX2X4FVPROC glad_glProgramUniformMatrix2x4fv; +#define glProgramUniformMatrix2x4fv glad_glProgramUniformMatrix2x4fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX4X2FVPROC glad_glProgramUniformMatrix4x2fv; +#define glProgramUniformMatrix4x2fv glad_glProgramUniformMatrix4x2fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX3X4FVPROC glad_glProgramUniformMatrix3x4fv; +#define glProgramUniformMatrix3x4fv glad_glProgramUniformMatrix3x4fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLfloat *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX4X3FVPROC glad_glProgramUniformMatrix4x3fv; +#define glProgramUniformMatrix4x3fv glad_glProgramUniformMatrix4x3fv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX2X3DVPROC glad_glProgramUniformMatrix2x3dv; +#define glProgramUniformMatrix2x3dv glad_glProgramUniformMatrix2x3dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX3X2DVPROC glad_glProgramUniformMatrix3x2dv; +#define glProgramUniformMatrix3x2dv glad_glProgramUniformMatrix3x2dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX2X4DVPROC glad_glProgramUniformMatrix2x4dv; +#define glProgramUniformMatrix2x4dv glad_glProgramUniformMatrix2x4dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX4X2DVPROC glad_glProgramUniformMatrix4x2dv; +#define glProgramUniformMatrix4x2dv glad_glProgramUniformMatrix4x2dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX3X4DVPROC glad_glProgramUniformMatrix3x4dv; +#define glProgramUniformMatrix3x4dv glad_glProgramUniformMatrix3x4dv +typedef void (APIENTRYP PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC)(GLuint program, GLint location, GLsizei count, GLboolean transpose, const GLdouble *value); +GLAPI PFNGLPROGRAMUNIFORMMATRIX4X3DVPROC glad_glProgramUniformMatrix4x3dv; +#define glProgramUniformMatrix4x3dv glad_glProgramUniformMatrix4x3dv +typedef void (APIENTRYP PFNGLVALIDATEPROGRAMPIPELINEPROC)(GLuint pipeline); +GLAPI PFNGLVALIDATEPROGRAMPIPELINEPROC glad_glValidateProgramPipeline; +#define glValidateProgramPipeline glad_glValidateProgramPipeline +typedef void (APIENTRYP PFNGLGETPROGRAMPIPELINEINFOLOGPROC)(GLuint pipeline, GLsizei bufSize, GLsizei *length, GLchar *infoLog); +GLAPI PFNGLGETPROGRAMPIPELINEINFOLOGPROC glad_glGetProgramPipelineInfoLog; +#define glGetProgramPipelineInfoLog glad_glGetProgramPipelineInfoLog +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DPROC)(GLuint index, GLdouble x); +GLAPI PFNGLVERTEXATTRIBL1DPROC glad_glVertexAttribL1d; +#define glVertexAttribL1d glad_glVertexAttribL1d +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DPROC)(GLuint index, GLdouble x, GLdouble y); +GLAPI PFNGLVERTEXATTRIBL2DPROC glad_glVertexAttribL2d; +#define glVertexAttribL2d glad_glVertexAttribL2d +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z); +GLAPI PFNGLVERTEXATTRIBL3DPROC glad_glVertexAttribL3d; +#define glVertexAttribL3d glad_glVertexAttribL3d +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DPROC)(GLuint index, GLdouble x, GLdouble y, GLdouble z, GLdouble w); +GLAPI PFNGLVERTEXATTRIBL4DPROC glad_glVertexAttribL4d; +#define glVertexAttribL4d glad_glVertexAttribL4d +typedef void (APIENTRYP PFNGLVERTEXATTRIBL1DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIBL1DVPROC glad_glVertexAttribL1dv; +#define glVertexAttribL1dv glad_glVertexAttribL1dv +typedef void (APIENTRYP PFNGLVERTEXATTRIBL2DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIBL2DVPROC glad_glVertexAttribL2dv; +#define glVertexAttribL2dv glad_glVertexAttribL2dv +typedef void (APIENTRYP PFNGLVERTEXATTRIBL3DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIBL3DVPROC glad_glVertexAttribL3dv; +#define glVertexAttribL3dv glad_glVertexAttribL3dv +typedef void (APIENTRYP PFNGLVERTEXATTRIBL4DVPROC)(GLuint index, const GLdouble *v); +GLAPI PFNGLVERTEXATTRIBL4DVPROC glad_glVertexAttribL4dv; +#define glVertexAttribL4dv glad_glVertexAttribL4dv +typedef void (APIENTRYP PFNGLVERTEXATTRIBLPOINTERPROC)(GLuint index, GLint size, GLenum type, GLsizei stride, const void *pointer); +GLAPI PFNGLVERTEXATTRIBLPOINTERPROC glad_glVertexAttribLPointer; +#define glVertexAttribLPointer glad_glVertexAttribLPointer +typedef void (APIENTRYP PFNGLGETVERTEXATTRIBLDVPROC)(GLuint index, GLenum pname, GLdouble *params); +GLAPI PFNGLGETVERTEXATTRIBLDVPROC glad_glGetVertexAttribLdv; +#define glGetVertexAttribLdv glad_glGetVertexAttribLdv +typedef void (APIENTRYP PFNGLVIEWPORTARRAYVPROC)(GLuint first, GLsizei count, const GLfloat *v); +GLAPI PFNGLVIEWPORTARRAYVPROC glad_glViewportArrayv; +#define glViewportArrayv glad_glViewportArrayv +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFPROC)(GLuint index, GLfloat x, GLfloat y, GLfloat w, GLfloat h); +GLAPI PFNGLVIEWPORTINDEXEDFPROC glad_glViewportIndexedf; +#define glViewportIndexedf glad_glViewportIndexedf +typedef void (APIENTRYP PFNGLVIEWPORTINDEXEDFVPROC)(GLuint index, const GLfloat *v); +GLAPI PFNGLVIEWPORTINDEXEDFVPROC glad_glViewportIndexedfv; +#define glViewportIndexedfv glad_glViewportIndexedfv +typedef void (APIENTRYP PFNGLSCISSORARRAYVPROC)(GLuint first, GLsizei count, const GLint *v); +GLAPI PFNGLSCISSORARRAYVPROC glad_glScissorArrayv; +#define glScissorArrayv glad_glScissorArrayv +typedef void (APIENTRYP PFNGLSCISSORINDEXEDPROC)(GLuint index, GLint left, GLint bottom, GLsizei width, GLsizei height); +GLAPI PFNGLSCISSORINDEXEDPROC glad_glScissorIndexed; +#define glScissorIndexed glad_glScissorIndexed +typedef void (APIENTRYP PFNGLSCISSORINDEXEDVPROC)(GLuint index, const GLint *v); +GLAPI PFNGLSCISSORINDEXEDVPROC glad_glScissorIndexedv; +#define glScissorIndexedv glad_glScissorIndexedv +typedef void (APIENTRYP PFNGLDEPTHRANGEARRAYVPROC)(GLuint first, GLsizei count, const GLdouble *v); +GLAPI PFNGLDEPTHRANGEARRAYVPROC glad_glDepthRangeArrayv; +#define glDepthRangeArrayv glad_glDepthRangeArrayv +typedef void (APIENTRYP PFNGLDEPTHRANGEINDEXEDPROC)(GLuint index, GLdouble n, GLdouble f); +GLAPI PFNGLDEPTHRANGEINDEXEDPROC glad_glDepthRangeIndexed; +#define glDepthRangeIndexed glad_glDepthRangeIndexed +typedef void (APIENTRYP PFNGLGETFLOATI_VPROC)(GLenum target, GLuint index, GLfloat *data); +GLAPI PFNGLGETFLOATI_VPROC glad_glGetFloati_v; +#define glGetFloati_v glad_glGetFloati_v +typedef void (APIENTRYP PFNGLGETDOUBLEI_VPROC)(GLenum target, GLuint index, GLdouble *data); +GLAPI PFNGLGETDOUBLEI_VPROC glad_glGetDoublei_v; +#define glGetDoublei_v glad_glGetDoublei_v +#endif +#ifndef GL_VERSION_4_2 +#define GL_VERSION_4_2 1 +GLAPI int GLAD_GL_VERSION_4_2; +typedef void (APIENTRYP PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLint first, GLsizei count, GLsizei instancecount, GLuint baseinstance); +GLAPI PFNGLDRAWARRAYSINSTANCEDBASEINSTANCEPROC glad_glDrawArraysInstancedBaseInstance; +#define glDrawArraysInstancedBaseInstance glad_glDrawArraysInstancedBaseInstance +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLuint baseinstance); +GLAPI PFNGLDRAWELEMENTSINSTANCEDBASEINSTANCEPROC glad_glDrawElementsInstancedBaseInstance; +#define glDrawElementsInstancedBaseInstance glad_glDrawElementsInstancedBaseInstance +typedef void (APIENTRYP PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC)(GLenum mode, GLsizei count, GLenum type, const void *indices, GLsizei instancecount, GLint basevertex, GLuint baseinstance); +GLAPI PFNGLDRAWELEMENTSINSTANCEDBASEVERTEXBASEINSTANCEPROC glad_glDrawElementsInstancedBaseVertexBaseInstance; +#define glDrawElementsInstancedBaseVertexBaseInstance glad_glDrawElementsInstancedBaseVertexBaseInstance +typedef void (APIENTRYP PFNGLGETINTERNALFORMATIVPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint *params); +GLAPI PFNGLGETINTERNALFORMATIVPROC glad_glGetInternalformativ; +#define glGetInternalformativ glad_glGetInternalformativ +typedef void (APIENTRYP PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC)(GLuint program, GLuint bufferIndex, GLenum pname, GLint *params); +GLAPI PFNGLGETACTIVEATOMICCOUNTERBUFFERIVPROC glad_glGetActiveAtomicCounterBufferiv; +#define glGetActiveAtomicCounterBufferiv glad_glGetActiveAtomicCounterBufferiv +typedef void (APIENTRYP PFNGLBINDIMAGETEXTUREPROC)(GLuint unit, GLuint texture, GLint level, GLboolean layered, GLint layer, GLenum access, GLenum format); +GLAPI PFNGLBINDIMAGETEXTUREPROC glad_glBindImageTexture; +#define glBindImageTexture glad_glBindImageTexture +typedef void (APIENTRYP PFNGLMEMORYBARRIERPROC)(GLbitfield barriers); +GLAPI PFNGLMEMORYBARRIERPROC glad_glMemoryBarrier; +#define glMemoryBarrier glad_glMemoryBarrier +typedef void (APIENTRYP PFNGLTEXSTORAGE1DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width); +GLAPI PFNGLTEXSTORAGE1DPROC glad_glTexStorage1D; +#define glTexStorage1D glad_glTexStorage1D +typedef void (APIENTRYP PFNGLTEXSTORAGE2DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height); +GLAPI PFNGLTEXSTORAGE2DPROC glad_glTexStorage2D; +#define glTexStorage2D glad_glTexStorage2D +typedef void (APIENTRYP PFNGLTEXSTORAGE3DPROC)(GLenum target, GLsizei levels, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth); +GLAPI PFNGLTEXSTORAGE3DPROC glad_glTexStorage3D; +#define glTexStorage3D glad_glTexStorage3D +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC)(GLenum mode, GLuint id, GLsizei instancecount); +GLAPI PFNGLDRAWTRANSFORMFEEDBACKINSTANCEDPROC glad_glDrawTransformFeedbackInstanced; +#define glDrawTransformFeedbackInstanced glad_glDrawTransformFeedbackInstanced +typedef void (APIENTRYP PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC)(GLenum mode, GLuint id, GLuint stream, GLsizei instancecount); +GLAPI PFNGLDRAWTRANSFORMFEEDBACKSTREAMINSTANCEDPROC glad_glDrawTransformFeedbackStreamInstanced; +#define glDrawTransformFeedbackStreamInstanced glad_glDrawTransformFeedbackStreamInstanced +#endif +#ifndef GL_VERSION_4_3 +#define GL_VERSION_4_3 1 +GLAPI int GLAD_GL_VERSION_4_3; +typedef void (APIENTRYP PFNGLCLEARBUFFERDATAPROC)(GLenum target, GLenum internalformat, GLenum format, GLenum type, const void *data); +GLAPI PFNGLCLEARBUFFERDATAPROC glad_glClearBufferData; +#define glClearBufferData glad_glClearBufferData +typedef void (APIENTRYP PFNGLCLEARBUFFERSUBDATAPROC)(GLenum target, GLenum internalformat, GLintptr offset, GLsizeiptr size, GLenum format, GLenum type, const void *data); +GLAPI PFNGLCLEARBUFFERSUBDATAPROC glad_glClearBufferSubData; +#define glClearBufferSubData glad_glClearBufferSubData +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEPROC)(GLuint num_groups_x, GLuint num_groups_y, GLuint num_groups_z); +GLAPI PFNGLDISPATCHCOMPUTEPROC glad_glDispatchCompute; +#define glDispatchCompute glad_glDispatchCompute +typedef void (APIENTRYP PFNGLDISPATCHCOMPUTEINDIRECTPROC)(GLintptr indirect); +GLAPI PFNGLDISPATCHCOMPUTEINDIRECTPROC glad_glDispatchComputeIndirect; +#define glDispatchComputeIndirect glad_glDispatchComputeIndirect +typedef void (APIENTRYP PFNGLCOPYIMAGESUBDATAPROC)(GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei srcWidth, GLsizei srcHeight, GLsizei srcDepth); +GLAPI PFNGLCOPYIMAGESUBDATAPROC glad_glCopyImageSubData; +#define glCopyImageSubData glad_glCopyImageSubData +typedef void (APIENTRYP PFNGLFRAMEBUFFERPARAMETERIPROC)(GLenum target, GLenum pname, GLint param); +GLAPI PFNGLFRAMEBUFFERPARAMETERIPROC glad_glFramebufferParameteri; +#define glFramebufferParameteri glad_glFramebufferParameteri +typedef void (APIENTRYP PFNGLGETFRAMEBUFFERPARAMETERIVPROC)(GLenum target, GLenum pname, GLint *params); +GLAPI PFNGLGETFRAMEBUFFERPARAMETERIVPROC glad_glGetFramebufferParameteriv; +#define glGetFramebufferParameteriv glad_glGetFramebufferParameteriv +typedef void (APIENTRYP PFNGLGETINTERNALFORMATI64VPROC)(GLenum target, GLenum internalformat, GLenum pname, GLsizei count, GLint64 *params); +GLAPI PFNGLGETINTERNALFORMATI64VPROC glad_glGetInternalformati64v; +#define glGetInternalformati64v glad_glGetInternalformati64v +typedef void (APIENTRYP PFNGLINVALIDATETEXSUBIMAGEPROC)(GLuint texture, GLint level, GLint xoffset, GLint yoffset, GLint zoffset, GLsizei width, GLsizei height, GLsizei depth); +GLAPI PFNGLINVALIDATETEXSUBIMAGEPROC glad_glInvalidateTexSubImage; +#define glInvalidateTexSubImage glad_glInvalidateTexSubImage +typedef void (APIENTRYP PFNGLINVALIDATETEXIMAGEPROC)(GLuint texture, GLint level); +GLAPI PFNGLINVALIDATETEXIMAGEPROC glad_glInvalidateTexImage; +#define glInvalidateTexImage glad_glInvalidateTexImage +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERSUBDATAPROC)(GLuint buffer, GLintptr offset, GLsizeiptr length); +GLAPI PFNGLINVALIDATEBUFFERSUBDATAPROC glad_glInvalidateBufferSubData; +#define glInvalidateBufferSubData glad_glInvalidateBufferSubData +typedef void (APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer); +GLAPI PFNGLINVALIDATEBUFFERDATAPROC glad_glInvalidateBufferData; +#define glInvalidateBufferData glad_glInvalidateBufferData +typedef void (APIENTRYP PFNGLINVALIDATEFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum *attachments); +GLAPI PFNGLINVALIDATEFRAMEBUFFERPROC glad_glInvalidateFramebuffer; +#define glInvalidateFramebuffer glad_glInvalidateFramebuffer +typedef void (APIENTRYP PFNGLINVALIDATESUBFRAMEBUFFERPROC)(GLenum target, GLsizei numAttachments, const GLenum *attachments, GLint x, GLint y, GLsizei width, GLsizei height); +GLAPI PFNGLINVALIDATESUBFRAMEBUFFERPROC glad_glInvalidateSubFramebuffer; +#define glInvalidateSubFramebuffer glad_glInvalidateSubFramebuffer +typedef void (APIENTRYP PFNGLMULTIDRAWARRAYSINDIRECTPROC)(GLenum mode, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI PFNGLMULTIDRAWARRAYSINDIRECTPROC glad_glMultiDrawArraysIndirect; +#define glMultiDrawArraysIndirect glad_glMultiDrawArraysIndirect +typedef void (APIENTRYP PFNGLMULTIDRAWELEMENTSINDIRECTPROC)(GLenum mode, GLenum type, const void *indirect, GLsizei drawcount, GLsizei stride); +GLAPI PFNGLMULTIDRAWELEMENTSINDIRECTPROC glad_glMultiDrawElementsIndirect; +#define glMultiDrawElementsIndirect glad_glMultiDrawElementsIndirect +typedef void (APIENTRYP PFNGLGETPROGRAMINTERFACEIVPROC)(GLuint program, GLenum programInterface, GLenum pname, GLint *params); +GLAPI PFNGLGETPROGRAMINTERFACEIVPROC glad_glGetProgramInterfaceiv; +#define glGetProgramInterfaceiv glad_glGetProgramInterfaceiv +typedef GLuint (APIENTRYP PFNGLGETPROGRAMRESOURCEINDEXPROC)(GLuint program, GLenum programInterface, const GLchar *name); +GLAPI PFNGLGETPROGRAMRESOURCEINDEXPROC glad_glGetProgramResourceIndex; +#define glGetProgramResourceIndex glad_glGetProgramResourceIndex +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCENAMEPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei bufSize, GLsizei *length, GLchar *name); +GLAPI PFNGLGETPROGRAMRESOURCENAMEPROC glad_glGetProgramResourceName; +#define glGetProgramResourceName glad_glGetProgramResourceName +typedef void (APIENTRYP PFNGLGETPROGRAMRESOURCEIVPROC)(GLuint program, GLenum programInterface, GLuint index, GLsizei propCount, const GLenum *props, GLsizei count, GLsizei *length, GLint *params); +GLAPI PFNGLGETPROGRAMRESOURCEIVPROC glad_glGetProgramResourceiv; +#define glGetProgramResourceiv glad_glGetProgramResourceiv +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONPROC)(GLuint program, GLenum programInterface, const GLchar *name); +GLAPI PFNGLGETPROGRAMRESOURCELOCATIONPROC glad_glGetProgramResourceLocation; +#define glGetProgramResourceLocation glad_glGetProgramResourceLocation +typedef GLint (APIENTRYP PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC)(GLuint program, GLenum programInterface, const GLchar *name); +GLAPI PFNGLGETPROGRAMRESOURCELOCATIONINDEXPROC glad_glGetProgramResourceLocationIndex; +#define glGetProgramResourceLocationIndex glad_glGetProgramResourceLocationIndex +typedef void (APIENTRYP PFNGLSHADERSTORAGEBLOCKBINDINGPROC)(GLuint program, GLuint storageBlockIndex, GLuint storageBlockBinding); +GLAPI PFNGLSHADERSTORAGEBLOCKBINDINGPROC glad_glShaderStorageBlockBinding; +#define glShaderStorageBlockBinding glad_glShaderStorageBlockBinding +typedef void (APIENTRYP PFNGLTEXBUFFERRANGEPROC)(GLenum target, GLenum internalformat, GLuint buffer, GLintptr offset, GLsizeiptr size); +GLAPI PFNGLTEXBUFFERRANGEPROC glad_glTexBufferRange; +#define glTexBufferRange glad_glTexBufferRange +typedef void (APIENTRYP PFNGLTEXSTORAGE2DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLboolean fixedsamplelocations); +GLAPI PFNGLTEXSTORAGE2DMULTISAMPLEPROC glad_glTexStorage2DMultisample; +#define glTexStorage2DMultisample glad_glTexStorage2DMultisample +typedef void (APIENTRYP PFNGLTEXSTORAGE3DMULTISAMPLEPROC)(GLenum target, GLsizei samples, GLenum internalformat, GLsizei width, GLsizei height, GLsizei depth, GLboolean fixedsamplelocations); +GLAPI PFNGLTEXSTORAGE3DMULTISAMPLEPROC glad_glTexStorage3DMultisample; +#define glTexStorage3DMultisample glad_glTexStorage3DMultisample +typedef void (APIENTRYP PFNGLTEXTUREVIEWPROC)(GLuint texture, GLenum target, GLuint origtexture, GLenum internalformat, GLuint minlevel, GLuint numlevels, GLuint minlayer, GLuint numlayers); +GLAPI PFNGLTEXTUREVIEWPROC glad_glTextureView; +#define glTextureView glad_glTextureView +typedef void (APIENTRYP PFNGLBINDVERTEXBUFFERPROC)(GLuint bindingindex, GLuint buffer, GLintptr offset, GLsizei stride); +GLAPI PFNGLBINDVERTEXBUFFERPROC glad_glBindVertexBuffer; +#define glBindVertexBuffer glad_glBindVertexBuffer +typedef void (APIENTRYP PFNGLVERTEXATTRIBFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLboolean normalized, GLuint relativeoffset); +GLAPI PFNGLVERTEXATTRIBFORMATPROC glad_glVertexAttribFormat; +#define glVertexAttribFormat glad_glVertexAttribFormat +typedef void (APIENTRYP PFNGLVERTEXATTRIBIFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI PFNGLVERTEXATTRIBIFORMATPROC glad_glVertexAttribIFormat; +#define glVertexAttribIFormat glad_glVertexAttribIFormat +typedef void (APIENTRYP PFNGLVERTEXATTRIBLFORMATPROC)(GLuint attribindex, GLint size, GLenum type, GLuint relativeoffset); +GLAPI PFNGLVERTEXATTRIBLFORMATPROC glad_glVertexAttribLFormat; +#define glVertexAttribLFormat glad_glVertexAttribLFormat +typedef void (APIENTRYP PFNGLVERTEXATTRIBBINDINGPROC)(GLuint attribindex, GLuint bindingindex); +GLAPI PFNGLVERTEXATTRIBBINDINGPROC glad_glVertexAttribBinding; +#define glVertexAttribBinding glad_glVertexAttribBinding +typedef void (APIENTRYP PFNGLVERTEXBINDINGDIVISORPROC)(GLuint bindingindex, GLuint divisor); +GLAPI PFNGLVERTEXBINDINGDIVISORPROC glad_glVertexBindingDivisor; +#define glVertexBindingDivisor glad_glVertexBindingDivisor +typedef void (APIENTRYP PFNGLDEBUGMESSAGECONTROLPROC)(GLenum source, GLenum type, GLenum severity, GLsizei count, const GLuint *ids, GLboolean enabled); +GLAPI PFNGLDEBUGMESSAGECONTROLPROC glad_glDebugMessageControl; +#define glDebugMessageControl glad_glDebugMessageControl +typedef void (APIENTRYP PFNGLDEBUGMESSAGEINSERTPROC)(GLenum source, GLenum type, GLuint id, GLenum severity, GLsizei length, const GLchar *buf); +GLAPI PFNGLDEBUGMESSAGEINSERTPROC glad_glDebugMessageInsert; +#define glDebugMessageInsert glad_glDebugMessageInsert +typedef void (APIENTRYP PFNGLDEBUGMESSAGECALLBACKPROC)(GLDEBUGPROC callback, const void *userParam); +GLAPI PFNGLDEBUGMESSAGECALLBACKPROC glad_glDebugMessageCallback; +#define glDebugMessageCallback glad_glDebugMessageCallback +typedef GLuint (APIENTRYP PFNGLGETDEBUGMESSAGELOGPROC)(GLuint count, GLsizei bufSize, GLenum *sources, GLenum *types, GLuint *ids, GLenum *severities, GLsizei *lengths, GLchar *messageLog); +GLAPI PFNGLGETDEBUGMESSAGELOGPROC glad_glGetDebugMessageLog; +#define glGetDebugMessageLog glad_glGetDebugMessageLog +typedef void (APIENTRYP PFNGLPUSHDEBUGGROUPPROC)(GLenum source, GLuint id, GLsizei length, const GLchar *message); +GLAPI PFNGLPUSHDEBUGGROUPPROC glad_glPushDebugGroup; +#define glPushDebugGroup glad_glPushDebugGroup +typedef void (APIENTRYP PFNGLPOPDEBUGGROUPPROC)(void); +GLAPI PFNGLPOPDEBUGGROUPPROC glad_glPopDebugGroup; +#define glPopDebugGroup glad_glPopDebugGroup +typedef void (APIENTRYP PFNGLOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei length, const GLchar *label); +GLAPI PFNGLOBJECTLABELPROC glad_glObjectLabel; +#define glObjectLabel glad_glObjectLabel +typedef void (APIENTRYP PFNGLGETOBJECTLABELPROC)(GLenum identifier, GLuint name, GLsizei bufSize, GLsizei *length, GLchar *label); +GLAPI PFNGLGETOBJECTLABELPROC glad_glGetObjectLabel; +#define glGetObjectLabel glad_glGetObjectLabel +typedef void (APIENTRYP PFNGLOBJECTPTRLABELPROC)(const void *ptr, GLsizei length, const GLchar *label); +GLAPI PFNGLOBJECTPTRLABELPROC glad_glObjectPtrLabel; +#define glObjectPtrLabel glad_glObjectPtrLabel +typedef void (APIENTRYP PFNGLGETOBJECTPTRLABELPROC)(const void *ptr, GLsizei bufSize, GLsizei *length, GLchar *label); +GLAPI PFNGLGETOBJECTPTRLABELPROC glad_glGetObjectPtrLabel; +#define glGetObjectPtrLabel glad_glGetObjectPtrLabel +typedef void (APIENTRYP PFNGLGETPOINTERVPROC)(GLenum pname, void **params); +GLAPI PFNGLGETPOINTERVPROC glad_glGetPointerv; +#define glGetPointerv glad_glGetPointerv +#endif #ifdef __cplusplus } diff --git a/src/vendor/qoi.h b/src/vendor/qoi.h deleted file mode 100644 index f2800b0..0000000 --- a/src/vendor/qoi.h +++ /dev/null @@ -1,649 +0,0 @@ -/* - -Copyright (c) 2021, Dominic Szablewski - https://phoboslab.org -SPDX-License-Identifier: MIT - - -QOI - The "Quite OK Image" format for fast, lossless image compression - --- About - -QOI encodes and decodes images in a lossless format. Compared to stb_image and -stb_image_write QOI offers 20x-50x faster encoding, 3x-4x faster decoding and -20% better compression. - - --- Synopsis - -// Define `QOI_IMPLEMENTATION` in *one* C/C++ file before including this -// library to create the implementation. - -#define QOI_IMPLEMENTATION -#include "qoi.h" - -// Encode and store an RGBA buffer to the file system. The qoi_desc describes -// the input pixel data. -qoi_write("image_new.qoi", rgba_pixels, &(qoi_desc){ - .width = 1920, - .height = 1080, - .channels = 4, - .colorspace = QOI_SRGB -}); - -// Load and decode a QOI image from the file system into a 32bbp RGBA buffer. -// The qoi_desc struct will be filled with the width, height, number of channels -// and colorspace read from the file header. -qoi_desc desc; -void *rgba_pixels = qoi_read("image.qoi", &desc, 4); - - - --- Documentation - -This library provides the following functions; -- qoi_read -- read and decode a QOI file -- qoi_decode -- decode the raw bytes of a QOI image from memory -- qoi_write -- encode and write a QOI file -- qoi_encode -- encode an rgba buffer into a QOI image in memory - -See the function declaration below for the signature and more information. - -If you don't want/need the qoi_read and qoi_write functions, you can define -QOI_NO_STDIO before including this library. - -This library uses malloc() and free(). To supply your own malloc implementation -you can define QOI_MALLOC and QOI_FREE before including this library. - -This library uses memset() to zero-initialize the index. To supply your own -implementation you can define QOI_ZEROARR before including this library. - - --- Data Format - -A QOI file has a 14 byte header, followed by any number of data "chunks" and an -8-byte end marker. - -struct qoi_header_t { - char magic[4]; // magic bytes "qoif" - uint32_t width; // image width in pixels (BE) - uint32_t height; // image height in pixels (BE) - uint8_t channels; // 3 = RGB, 4 = RGBA - uint8_t colorspace; // 0 = sRGB with linear alpha, 1 = all channels linear -}; - -Images are encoded row by row, left to right, top to bottom. The decoder and -encoder start with {r: 0, g: 0, b: 0, a: 255} as the previous pixel value. An -image is complete when all pixels specified by width * height have been covered. - -Pixels are encoded as - - a run of the previous pixel - - an index into an array of previously seen pixels - - a difference to the previous pixel value in r,g,b - - full r,g,b or r,g,b,a values - -The color channels are assumed to not be premultiplied with the alpha channel -("un-premultiplied alpha"). - -A running array[64] (zero-initialized) of previously seen pixel values is -maintained by the encoder and decoder. Each pixel that is seen by the encoder -and decoder is put into this array at the position formed by a hash function of -the color value. In the encoder, if the pixel value at the index matches the -current pixel, this index position is written to the stream as QOI_OP_INDEX. -The hash function for the index is: - - index_position = (r * 3 + g * 5 + b * 7 + a * 11) % 64 - -Each chunk starts with a 2- or 8-bit tag, followed by a number of data bits. The -bit length of chunks is divisible by 8 - i.e. all chunks are byte aligned. All -values encoded in these data bits have the most significant bit on the left. - -The 8-bit tags have precedence over the 2-bit tags. A decoder must check for the -presence of an 8-bit tag first. - -The byte stream's end is marked with 7 0x00 bytes followed a single 0x01 byte. - - -The possible chunks are: - - -.- QOI_OP_INDEX ----------. -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|-------+-----------------| -| 0 0 | index | -`-------------------------` -2-bit tag b00 -6-bit index into the color index array: 0..63 - -A valid encoder must not issue 2 or more consecutive QOI_OP_INDEX chunks to the -same index. QOI_OP_RUN should be used instead. - - -.- QOI_OP_DIFF -----------. -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|-------+-----+-----+-----| -| 0 1 | dr | dg | db | -`-------------------------` -2-bit tag b01 -2-bit red channel difference from the previous pixel between -2..1 -2-bit green channel difference from the previous pixel between -2..1 -2-bit blue channel difference from the previous pixel between -2..1 - -The difference to the current channel values are using a wraparound operation, -so "1 - 2" will result in 255, while "255 + 1" will result in 0. - -Values are stored as unsigned integers with a bias of 2. E.g. -2 is stored as -0 (b00). 1 is stored as 3 (b11). - -The alpha value remains unchanged from the previous pixel. - - -.- QOI_OP_LUMA -------------------------------------. -| Byte[0] | Byte[1] | -| 7 6 5 4 3 2 1 0 | 7 6 5 4 3 2 1 0 | -|-------+-----------------+-------------+-----------| -| 1 0 | green diff | dr - dg | db - dg | -`---------------------------------------------------` -2-bit tag b10 -6-bit green channel difference from the previous pixel -32..31 -4-bit red channel difference minus green channel difference -8..7 -4-bit blue channel difference minus green channel difference -8..7 - -The green channel is used to indicate the general direction of change and is -encoded in 6 bits. The red and blue channels (dr and db) base their diffs off -of the green channel difference and are encoded in 4 bits. I.e.: - dr_dg = (cur_px.r - prev_px.r) - (cur_px.g - prev_px.g) - db_dg = (cur_px.b - prev_px.b) - (cur_px.g - prev_px.g) - -The difference to the current channel values are using a wraparound operation, -so "10 - 13" will result in 253, while "250 + 7" will result in 1. - -Values are stored as unsigned integers with a bias of 32 for the green channel -and a bias of 8 for the red and blue channel. - -The alpha value remains unchanged from the previous pixel. - - -.- QOI_OP_RUN ------------. -| Byte[0] | -| 7 6 5 4 3 2 1 0 | -|-------+-----------------| -| 1 1 | run | -`-------------------------` -2-bit tag b11 -6-bit run-length repeating the previous pixel: 1..62 - -The run-length is stored with a bias of -1. Note that the run-lengths 63 and 64 -(b111110 and b111111) are illegal as they are occupied by the QOI_OP_RGB and -QOI_OP_RGBA tags. - - -.- QOI_OP_RGB ------------------------------------------. -| Byte[0] | Byte[1] | Byte[2] | Byte[3] | -| 7 6 5 4 3 2 1 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 | -|-------------------------+---------+---------+---------| -| 1 1 1 1 1 1 1 0 | red | green | blue | -`-------------------------------------------------------` -8-bit tag b11111110 -8-bit red channel value -8-bit green channel value -8-bit blue channel value - -The alpha value remains unchanged from the previous pixel. - - -.- QOI_OP_RGBA ---------------------------------------------------. -| Byte[0] | Byte[1] | Byte[2] | Byte[3] | Byte[4] | -| 7 6 5 4 3 2 1 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 | 7 .. 0 | -|-------------------------+---------+---------+---------+---------| -| 1 1 1 1 1 1 1 1 | red | green | blue | alpha | -`-----------------------------------------------------------------` -8-bit tag b11111111 -8-bit red channel value -8-bit green channel value -8-bit blue channel value -8-bit alpha channel value - -*/ - - -/* ----------------------------------------------------------------------------- -Header - Public functions */ - -#ifndef QOI_H -#define QOI_H - -#ifdef __cplusplus -extern "C" { -#endif - -/* A pointer to a qoi_desc struct has to be supplied to all of qoi's functions. -It describes either the input format (for qoi_write and qoi_encode), or is -filled with the description read from the file header (for qoi_read and -qoi_decode). - -The colorspace in this qoi_desc is an enum where - 0 = sRGB, i.e. gamma scaled RGB channels and a linear alpha channel - 1 = all channels are linear -You may use the constants QOI_SRGB or QOI_LINEAR. The colorspace is purely -informative. It will be saved to the file header, but does not affect -how chunks are en-/decoded. */ - -#define QOI_SRGB 0 -#define QOI_LINEAR 1 - -typedef struct { - unsigned int width; - unsigned int height; - unsigned char channels; - unsigned char colorspace; -} qoi_desc; - -#ifndef QOI_NO_STDIO - -/* Encode raw RGB or RGBA pixels into a QOI image and write it to the file -system. The qoi_desc struct must be filled with the image width, height, -number of channels (3 = RGB, 4 = RGBA) and the colorspace. - -The function returns 0 on failure (invalid parameters, or fopen or malloc -failed) or the number of bytes written on success. */ - -int qoi_write(const char *filename, const void *data, const qoi_desc *desc); - - -/* Read and decode a QOI image from the file system. If channels is 0, the -number of channels from the file header is used. If channels is 3 or 4 the -output format will be forced into this number of channels. - -The function either returns NULL on failure (invalid data, or malloc or fopen -failed) or a pointer to the decoded pixels. On success, the qoi_desc struct -will be filled with the description from the file header. - -The returned pixel data should be free()d after use. */ - -void *qoi_read(const char *filename, qoi_desc *desc, int channels); - -#endif /* QOI_NO_STDIO */ - - -/* Encode raw RGB or RGBA pixels into a QOI image in memory. - -The function either returns NULL on failure (invalid parameters or malloc -failed) or a pointer to the encoded data on success. On success the out_len -is set to the size in bytes of the encoded data. - -The returned qoi data should be free()d after use. */ - -void *qoi_encode(const void *data, const qoi_desc *desc, int *out_len); - - -/* Decode a QOI image from memory. - -The function either returns NULL on failure (invalid parameters or malloc -failed) or a pointer to the decoded pixels. On success, the qoi_desc struct -is filled with the description from the file header. - -The returned pixel data should be free()d after use. */ - -void *qoi_decode(const void *data, int size, qoi_desc *desc, int channels); - - -#ifdef __cplusplus -} -#endif -#endif /* QOI_H */ - - -/* ----------------------------------------------------------------------------- -Implementation */ - -#ifdef QOI_IMPLEMENTATION -#include -#include - -#ifndef QOI_MALLOC - #define QOI_MALLOC(sz) malloc(sz) - #define QOI_FREE(p) free(p) -#endif -#ifndef QOI_ZEROARR - #define QOI_ZEROARR(a) memset((a),0,sizeof(a)) -#endif - -#define QOI_OP_INDEX 0x00 /* 00xxxxxx */ -#define QOI_OP_DIFF 0x40 /* 01xxxxxx */ -#define QOI_OP_LUMA 0x80 /* 10xxxxxx */ -#define QOI_OP_RUN 0xc0 /* 11xxxxxx */ -#define QOI_OP_RGB 0xfe /* 11111110 */ -#define QOI_OP_RGBA 0xff /* 11111111 */ - -#define QOI_MASK_2 0xc0 /* 11000000 */ - -#define QOI_COLOR_HASH(C) (C.rgba.r*3 + C.rgba.g*5 + C.rgba.b*7 + C.rgba.a*11) -#define QOI_MAGIC \ - (((unsigned int)'q') << 24 | ((unsigned int)'o') << 16 | \ - ((unsigned int)'i') << 8 | ((unsigned int)'f')) -#define QOI_HEADER_SIZE 14 - -/* 2GB is the max file size that this implementation can safely handle. We guard -against anything larger than that, assuming the worst case with 5 bytes per -pixel, rounded down to a nice clean value. 400 million pixels ought to be -enough for anybody. */ -#define QOI_PIXELS_MAX ((unsigned int)400000000) - -typedef union { - struct { unsigned char r, g, b, a; } rgba; - unsigned int v; -} qoi_rgba_t; - -static const unsigned char qoi_padding[8] = {0,0,0,0,0,0,0,1}; - -static void qoi_write_32(unsigned char *bytes, int *p, unsigned int v) { - bytes[(*p)++] = (0xff000000 & v) >> 24; - bytes[(*p)++] = (0x00ff0000 & v) >> 16; - bytes[(*p)++] = (0x0000ff00 & v) >> 8; - bytes[(*p)++] = (0x000000ff & v); -} - -static unsigned int qoi_read_32(const unsigned char *bytes, int *p) { - unsigned int a = bytes[(*p)++]; - unsigned int b = bytes[(*p)++]; - unsigned int c = bytes[(*p)++]; - unsigned int d = bytes[(*p)++]; - return a << 24 | b << 16 | c << 8 | d; -} - -void *qoi_encode(const void *data, const qoi_desc *desc, int *out_len) { - int i, max_size, p, run; - int px_len, px_end, px_pos, channels; - unsigned char *bytes; - const unsigned char *pixels; - qoi_rgba_t index[64]; - qoi_rgba_t px, px_prev; - - if ( - data == NULL || out_len == NULL || desc == NULL || - desc->width == 0 || desc->height == 0 || - desc->channels < 3 || desc->channels > 4 || - desc->colorspace > 1 || - desc->height >= QOI_PIXELS_MAX / desc->width - ) { - return NULL; - } - - max_size = - desc->width * desc->height * (desc->channels + 1) + - QOI_HEADER_SIZE + sizeof(qoi_padding); - - p = 0; - bytes = (unsigned char *) QOI_MALLOC(max_size); - if (!bytes) { - return NULL; - } - - qoi_write_32(bytes, &p, QOI_MAGIC); - qoi_write_32(bytes, &p, desc->width); - qoi_write_32(bytes, &p, desc->height); - bytes[p++] = desc->channels; - bytes[p++] = desc->colorspace; - - - pixels = (const unsigned char *)data; - - QOI_ZEROARR(index); - - run = 0; - px_prev.rgba.r = 0; - px_prev.rgba.g = 0; - px_prev.rgba.b = 0; - px_prev.rgba.a = 255; - px = px_prev; - - px_len = desc->width * desc->height * desc->channels; - px_end = px_len - desc->channels; - channels = desc->channels; - - for (px_pos = 0; px_pos < px_len; px_pos += channels) { - px.rgba.r = pixels[px_pos + 0]; - px.rgba.g = pixels[px_pos + 1]; - px.rgba.b = pixels[px_pos + 2]; - - if (channels == 4) { - px.rgba.a = pixels[px_pos + 3]; - } - - if (px.v == px_prev.v) { - run++; - if (run == 62 || px_pos == px_end) { - bytes[p++] = QOI_OP_RUN | (run - 1); - run = 0; - } - } - else { - int index_pos; - - if (run > 0) { - bytes[p++] = QOI_OP_RUN | (run - 1); - run = 0; - } - - index_pos = QOI_COLOR_HASH(px) % 64; - - if (index[index_pos].v == px.v) { - bytes[p++] = QOI_OP_INDEX | index_pos; - } - else { - index[index_pos] = px; - - if (px.rgba.a == px_prev.rgba.a) { - signed char vr = px.rgba.r - px_prev.rgba.r; - signed char vg = px.rgba.g - px_prev.rgba.g; - signed char vb = px.rgba.b - px_prev.rgba.b; - - signed char vg_r = vr - vg; - signed char vg_b = vb - vg; - - if ( - vr > -3 && vr < 2 && - vg > -3 && vg < 2 && - vb > -3 && vb < 2 - ) { - bytes[p++] = QOI_OP_DIFF | (vr + 2) << 4 | (vg + 2) << 2 | (vb + 2); - } - else if ( - vg_r > -9 && vg_r < 8 && - vg > -33 && vg < 32 && - vg_b > -9 && vg_b < 8 - ) { - bytes[p++] = QOI_OP_LUMA | (vg + 32); - bytes[p++] = (vg_r + 8) << 4 | (vg_b + 8); - } - else { - bytes[p++] = QOI_OP_RGB; - bytes[p++] = px.rgba.r; - bytes[p++] = px.rgba.g; - bytes[p++] = px.rgba.b; - } - } - else { - bytes[p++] = QOI_OP_RGBA; - bytes[p++] = px.rgba.r; - bytes[p++] = px.rgba.g; - bytes[p++] = px.rgba.b; - bytes[p++] = px.rgba.a; - } - } - } - px_prev = px; - } - - for (i = 0; i < (int)sizeof(qoi_padding); i++) { - bytes[p++] = qoi_padding[i]; - } - - *out_len = p; - return bytes; -} - -void *qoi_decode(const void *data, int size, qoi_desc *desc, int channels) { - const unsigned char *bytes; - unsigned int header_magic; - unsigned char *pixels; - qoi_rgba_t index[64]; - qoi_rgba_t px; - int px_len, chunks_len, px_pos; - int p = 0, run = 0; - - if ( - data == NULL || desc == NULL || - (channels != 0 && channels != 3 && channels != 4) || - size < QOI_HEADER_SIZE + (int)sizeof(qoi_padding) - ) { - return NULL; - } - - bytes = (const unsigned char *)data; - - header_magic = qoi_read_32(bytes, &p); - desc->width = qoi_read_32(bytes, &p); - desc->height = qoi_read_32(bytes, &p); - desc->channels = bytes[p++]; - desc->colorspace = bytes[p++]; - - if ( - desc->width == 0 || desc->height == 0 || - desc->channels < 3 || desc->channels > 4 || - desc->colorspace > 1 || - header_magic != QOI_MAGIC || - desc->height >= QOI_PIXELS_MAX / desc->width - ) { - return NULL; - } - - if (channels == 0) { - channels = desc->channels; - } - - px_len = desc->width * desc->height * channels; - pixels = (unsigned char *) QOI_MALLOC(px_len); - if (!pixels) { - return NULL; - } - - QOI_ZEROARR(index); - px.rgba.r = 0; - px.rgba.g = 0; - px.rgba.b = 0; - px.rgba.a = 255; - - chunks_len = size - (int)sizeof(qoi_padding); - for (px_pos = 0; px_pos < px_len; px_pos += channels) { - if (run > 0) { - run--; - } - else if (p < chunks_len) { - int b1 = bytes[p++]; - - if (b1 == QOI_OP_RGB) { - px.rgba.r = bytes[p++]; - px.rgba.g = bytes[p++]; - px.rgba.b = bytes[p++]; - } - else if (b1 == QOI_OP_RGBA) { - px.rgba.r = bytes[p++]; - px.rgba.g = bytes[p++]; - px.rgba.b = bytes[p++]; - px.rgba.a = bytes[p++]; - } - else if ((b1 & QOI_MASK_2) == QOI_OP_INDEX) { - px = index[b1]; - } - else if ((b1 & QOI_MASK_2) == QOI_OP_DIFF) { - px.rgba.r += ((b1 >> 4) & 0x03) - 2; - px.rgba.g += ((b1 >> 2) & 0x03) - 2; - px.rgba.b += ( b1 & 0x03) - 2; - } - else if ((b1 & QOI_MASK_2) == QOI_OP_LUMA) { - int b2 = bytes[p++]; - int vg = (b1 & 0x3f) - 32; - px.rgba.r += vg - 8 + ((b2 >> 4) & 0x0f); - px.rgba.g += vg; - px.rgba.b += vg - 8 + (b2 & 0x0f); - } - else if ((b1 & QOI_MASK_2) == QOI_OP_RUN) { - run = (b1 & 0x3f); - } - - index[QOI_COLOR_HASH(px) % 64] = px; - } - - pixels[px_pos + 0] = px.rgba.r; - pixels[px_pos + 1] = px.rgba.g; - pixels[px_pos + 2] = px.rgba.b; - - if (channels == 4) { - pixels[px_pos + 3] = px.rgba.a; - } - } - - return pixels; -} - -#ifndef QOI_NO_STDIO -#include - -int qoi_write(const char *filename, const void *data, const qoi_desc *desc) { - FILE *f = fopen(filename, "wb"); - int size, err; - void *encoded; - - if (!f) { - return 0; - } - - encoded = qoi_encode(data, desc, &size); - if (!encoded) { - fclose(f); - return 0; - } - - fwrite(encoded, 1, size, f); - fflush(f); - err = ferror(f); - fclose(f); - - QOI_FREE(encoded); - return err ? 0 : size; -} - -void *qoi_read(const char *filename, qoi_desc *desc, int channels) { - FILE *f = fopen(filename, "rb"); - int size, bytes_read; - void *pixels, *data; - - if (!f) { - return NULL; - } - - fseek(f, 0, SEEK_END); - size = ftell(f); - if (size <= 0 || fseek(f, 0, SEEK_SET) != 0) { - fclose(f); - return NULL; - } - - data = QOI_MALLOC(size); - if (!data) { - fclose(f); - return NULL; - } - - bytes_read = fread(data, 1, size, f); - fclose(f); - pixels = (bytes_read != size) ? NULL : qoi_decode(data, bytes_read, desc, channels); - QOI_FREE(data); - return pixels; -} - -#endif /* QOI_NO_STDIO */ -#endif /* QOI_IMPLEMENTATION */ diff --git a/src/vendor/scope_guard.hpp b/src/vendor/scope_guard.hpp new file mode 100644 index 0000000..3d67d79 --- /dev/null +++ b/src/vendor/scope_guard.hpp @@ -0,0 +1,190 @@ +/* + * Created on: 13/02/2018 + * Author: ricab + * + * See README.md for documentation of this header's public interface. + */ + +#ifndef SCOPE_GUARD_HPP_ +#define SCOPE_GUARD_HPP_ + +#include +#include + +#if __cplusplus >= 201703L +#define SG_NODISCARD [[nodiscard]] +#ifdef SG_REQUIRE_NOEXCEPT_IN_CPP17 +#define SG_REQUIRE_NOEXCEPT +#endif +#else +#define SG_NODISCARD +#endif + +namespace sg +{ + namespace detail + { + /* --- Some custom type traits --- */ + + // Type trait determining whether a type is callable with no arguments + template + struct is_noarg_callable_t + : public std::false_type + {}; // in general, false + + template + struct is_noarg_callable_t()())> + : public std::true_type + {}; // only true when call expression valid + + // Type trait determining whether a no-argument callable returns void + template + struct returns_void_t + : public std::is_same()())> + {}; + + /* Type trait determining whether a no-arg callable is nothrow invocable if + required. This is where SG_REQUIRE_NOEXCEPT logic is encapsulated. */ + template + struct is_nothrow_invocable_if_required_t + : public +#ifdef SG_REQUIRE_NOEXCEPT + std::is_nothrow_invocable /* Note: _r variants not enough to + confirm void return: any return can be + discarded so all returns are + compatible with void */ +#else + std::true_type +#endif + {}; + + // logic AND of two or more type traits + template + struct and_t : public and_t> + {}; // for more than two arguments + + template + struct and_t : public std::conditional::type + {}; // for two arguments + + // Type trait determining whether a type is a proper scope_guard callback. + template + struct is_proper_sg_callback_t + : public and_t, + returns_void_t, + is_nothrow_invocable_if_required_t, + std::is_nothrow_destructible> + {}; + + + /* --- The actual scope_guard template --- */ + + template::value>::type> + class scope_guard; + + + /* --- Now the friend maker --- */ + + template + detail::scope_guard make_scope_guard(Callback&& callback) + noexcept(std::is_nothrow_constructible::value); /* + we need this in the inner namespace due to MSVC bugs preventing + sg::detail::scope_guard from befriending a sg::make_scope_guard + template instance in the parent namespace (see https://is.gd/xFfFhE). */ + + + /* --- The template specialization that actually defines the class --- */ + + template + class SG_NODISCARD scope_guard final + { + public: + typedef Callback callback_type; + + scope_guard(scope_guard&& other) + noexcept(std::is_nothrow_constructible::value); + + ~scope_guard() noexcept; // highlight noexcept dtor + + void dismiss() noexcept; + + public: + scope_guard() = delete; + scope_guard(const scope_guard&) = delete; + scope_guard& operator=(const scope_guard&) = delete; + scope_guard& operator=(scope_guard&&) = delete; + + private: + explicit scope_guard(Callback&& callback) + noexcept(std::is_nothrow_constructible::value); /* + meant for friends only */ + + friend scope_guard make_scope_guard(Callback&&) + noexcept(std::is_nothrow_constructible::value); /* + only make_scope_guard can create scope_guards from scratch (i.e. non-move) + */ + + private: + Callback m_callback; + bool m_active; + + }; + + } // namespace detail + + + /* --- Now the single public maker function --- */ + + using detail::make_scope_guard; // see comment on declaration above + +} // namespace sg + +//////////////////////////////////////////////////////////////////////////////// +template +sg::detail::scope_guard::scope_guard(Callback&& callback) +noexcept(std::is_nothrow_constructible::value) + : m_callback(std::forward(callback)) /* use () instead of {} because + of DR 1467 (https://is.gd/WHmWuo), which still impacts older compilers + (e.g. GCC 4.x and clang <=3.6, see https://godbolt.org/g/TE9tPJ and + https://is.gd/Tsmh8G) */ + , m_active{true} +{} + +//////////////////////////////////////////////////////////////////////////////// +template +sg::detail::scope_guard::scope_guard::~scope_guard() noexcept /* +need the extra injected-class-name here to make different compilers happy */ +{ + if(m_active) + m_callback(); +} + +//////////////////////////////////////////////////////////////////////////////// +template +sg::detail::scope_guard::scope_guard(scope_guard&& other) +noexcept(std::is_nothrow_constructible::value) + : m_callback(std::forward(other.m_callback)) // idem + , m_active{std::move(other.m_active)} +{ + other.m_active = false; +} + +//////////////////////////////////////////////////////////////////////////////// +template +inline void sg::detail::scope_guard::dismiss() noexcept +{ + m_active = false; +} + +//////////////////////////////////////////////////////////////////////////////// +template +inline auto sg::detail::make_scope_guard(Callback&& callback) +noexcept(std::is_nothrow_constructible::value) +-> detail::scope_guard +{ + return detail::scope_guard{std::forward(callback)}; +} + +#endif /* SCOPE_GUARD_HPP_ */ diff --git a/src/vendor/stb_image.h b/src/vendor/stb_image.h new file mode 100644 index 0000000..5e807a0 --- /dev/null +++ b/src/vendor/stb_image.h @@ -0,0 +1,7987 @@ +/* stb_image - v2.28 - 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.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 signed shorts is valid, 0 on overflow. +static int stbi__mul2shorts_valid(short a, short 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 int 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)) { + int x = stbi__get8(j->s); + while (x == 255) { // 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; + 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)) { + return -1; /* report error for unexpected end of data. */ + } + 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; + 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 (zout + len > a->zout_end) { + if (!stbi__zexpand(a, zout, len)) return 0; + zout = a->zout; + } + p = (stbi_uc *) (zout - dist); + if (dist == 1) { // run of one byte; common in images. + stbi_uc v = *p; + if (len) { do *zout++ = v; while (--len); } + } else { + if (len) { do *zout++ = *p++; while (--len); } + } + } + } +} + +static int stbi__compute_huffman_codes(stbi__zbuf *a) +{ + static 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; + 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 filters used for first scanline to avoid needing a dummy row of 0s + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static stbi_uc first_row_filter[5] = +{ + STBI__F_none, + STBI__F_sub, + STBI__F_none, + STBI__F_avg_first, + STBI__F_paeth_first +}; + +static int stbi__paeth(int a, int b, int c) +{ + int p = a + b - c; + int pa = abs(p-a); + int pb = abs(p-b); + int pc = abs(p-c); + if (pa <= pb && pa <= pc) return a; + if (pb <= pc) return b; + return c; +} + +static const stbi_uc stbi__depth_scale_table[9] = { 0, 0xff, 0x55, 0, 0x11, 0,0,0, 0x01 }; + +// create the png data from post-deflated data +static int stbi__create_png_image_raw(stbi__png *a, stbi_uc *raw, stbi__uint32 raw_len, int out_n, stbi__uint32 x, stbi__uint32 y, int depth, int color) +{ + int bytes = (depth == 16? 2 : 1); + stbi__context *s = a->s; + stbi__uint32 i,j,stride = x*out_n*bytes; + stbi__uint32 img_len, img_width_bytes; + int k; + int img_n = s->img_n; // copy it into a local for later + + int output_bytes = out_n*bytes; + int filter_bytes = img_n*bytes; + int width = x; + + STBI_ASSERT(out_n == s->img_n || out_n == s->img_n+1); + a->out = (stbi_uc *) stbi__malloc_mad3(x, y, output_bytes, 0); // extra bytes to write off the end into + if (!a->out) return stbi__err("outofmem", "Out of memory"); + + 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); + 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"); + + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *prior; + int filter = *raw++; + + if (filter > 4) + return stbi__err("invalid filter","Corrupt PNG"); + + if (depth < 8) { + if (img_width_bytes > x) return stbi__err("invalid width","Corrupt PNG"); + cur += x*out_n - img_width_bytes; // store output to the rightmost img_len bytes, so we can decode in place + filter_bytes = 1; + width = img_width_bytes; + } + prior = cur - stride; // bugfix: need to compute this after 'cur +=' computation above + + // if first row, use special filter that doesn't sample previous row + if (j == 0) filter = first_row_filter[filter]; + + // handle first byte explicitly + for (k=0; k < filter_bytes; ++k) { + switch (filter) { + case STBI__F_none : cur[k] = raw[k]; break; + case STBI__F_sub : cur[k] = raw[k]; break; + case STBI__F_up : cur[k] = STBI__BYTECAST(raw[k] + prior[k]); break; + case STBI__F_avg : cur[k] = STBI__BYTECAST(raw[k] + (prior[k]>>1)); break; + case STBI__F_paeth : cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(0,prior[k],0)); break; + case STBI__F_avg_first : cur[k] = raw[k]; break; + case STBI__F_paeth_first: cur[k] = raw[k]; break; + } + } + + if (depth == 8) { + if (img_n != out_n) + cur[img_n] = 255; // first pixel + raw += img_n; + cur += out_n; + prior += out_n; + } else if (depth == 16) { + if (img_n != out_n) { + cur[filter_bytes] = 255; // first pixel top byte + cur[filter_bytes+1] = 255; // first pixel bottom byte + } + raw += filter_bytes; + cur += output_bytes; + prior += output_bytes; + } else { + raw += 1; + cur += 1; + prior += 1; + } + + // this is a little gross, so that we don't switch per-pixel or per-component + if (depth < 8 || img_n == out_n) { + int nk = (width - 1)*filter_bytes; + #define STBI__CASE(f) \ + case f: \ + for (k=0; k < nk; ++k) + switch (filter) { + // "none" filter turns into a memcpy here; make that explicit. + case STBI__F_none: memcpy(cur, raw, nk); break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k-filter_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k-filter_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],prior[k],prior[k-filter_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k-filter_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k-filter_bytes],0,0)); } break; + } + #undef STBI__CASE + raw += nk; + } else { + STBI_ASSERT(img_n+1 == out_n); + #define STBI__CASE(f) \ + case f: \ + for (i=x-1; i >= 1; --i, cur[filter_bytes]=255,raw+=filter_bytes,cur+=output_bytes,prior+=output_bytes) \ + for (k=0; k < filter_bytes; ++k) + switch (filter) { + STBI__CASE(STBI__F_none) { cur[k] = raw[k]; } break; + STBI__CASE(STBI__F_sub) { cur[k] = STBI__BYTECAST(raw[k] + cur[k- output_bytes]); } break; + STBI__CASE(STBI__F_up) { cur[k] = STBI__BYTECAST(raw[k] + prior[k]); } break; + STBI__CASE(STBI__F_avg) { cur[k] = STBI__BYTECAST(raw[k] + ((prior[k] + cur[k- output_bytes])>>1)); } break; + STBI__CASE(STBI__F_paeth) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],prior[k],prior[k- output_bytes])); } break; + STBI__CASE(STBI__F_avg_first) { cur[k] = STBI__BYTECAST(raw[k] + (cur[k- output_bytes] >> 1)); } break; + STBI__CASE(STBI__F_paeth_first) { cur[k] = STBI__BYTECAST(raw[k] + stbi__paeth(cur[k- output_bytes],0,0)); } break; + } + #undef STBI__CASE + + // the loop above sets the high byte of the pixels' alpha, but for + // 16 bit png files we also need the low byte set. we'll do that here. + if (depth == 16) { + cur = a->out + stride*j; // start at the beginning of the row again + for (i=0; i < x; ++i,cur+=output_bytes) { + cur[filter_bytes+1] = 255; + } + } + } + } + + // we make a separate pass to expand bits to pixels; for performance, + // this could run two scanlines behind the above code, so it won't + // intefere with filtering but will still be in the cache. + if (depth < 8) { + for (j=0; j < y; ++j) { + stbi_uc *cur = a->out + stride*j; + stbi_uc *in = a->out + stride*j + x*out_n - img_width_bytes; + // unpack 1/2/4-bit into a 8-bit buffer. allows us to keep the common 8-bit path optimal at minimal cost for 1/2/4-bit + // png guarante byte alignment, if width is not multiple of 8/4/2 we'll decode dummy trailing data that will be skipped in the later loop + stbi_uc scale = (color == 0) ? stbi__depth_scale_table[depth] : 1; // scale grayscale values to 0..255 range + + // note that the final byte might overshoot and write more data than desired. + // we can allocate enough data that this never writes out of memory, but it + // could also overwrite the next scanline. can it overwrite non-empty data + // on the next scanline? yes, consider 1-pixel-wide scanlines with 1-bit-per-pixel. + // so we need to explicitly clamp the final ones + + if (depth == 4) { + for (k=x*img_n; k >= 2; k-=2, ++in) { + *cur++ = scale * ((*in >> 4) ); + *cur++ = scale * ((*in ) & 0x0f); + } + if (k > 0) *cur++ = scale * ((*in >> 4) ); + } else if (depth == 2) { + for (k=x*img_n; k >= 4; k-=4, ++in) { + *cur++ = scale * ((*in >> 6) ); + *cur++ = scale * ((*in >> 4) & 0x03); + *cur++ = scale * ((*in >> 2) & 0x03); + *cur++ = scale * ((*in ) & 0x03); + } + if (k > 0) *cur++ = scale * ((*in >> 6) ); + if (k > 1) *cur++ = scale * ((*in >> 4) & 0x03); + if (k > 2) *cur++ = scale * ((*in >> 2) & 0x03); + } else if (depth == 1) { + for (k=x*img_n; k >= 8; k-=8, ++in) { + *cur++ = scale * ((*in >> 7) ); + *cur++ = scale * ((*in >> 6) & 0x01); + *cur++ = scale * ((*in >> 5) & 0x01); + *cur++ = scale * ((*in >> 4) & 0x01); + *cur++ = scale * ((*in >> 3) & 0x01); + *cur++ = scale * ((*in >> 2) & 0x01); + *cur++ = scale * ((*in >> 1) & 0x01); + *cur++ = scale * ((*in ) & 0x01); + } + if (k > 0) *cur++ = scale * ((*in >> 7) ); + if (k > 1) *cur++ = scale * ((*in >> 6) & 0x01); + if (k > 2) *cur++ = scale * ((*in >> 5) & 0x01); + if (k > 3) *cur++ = scale * ((*in >> 4) & 0x01); + if (k > 4) *cur++ = scale * ((*in >> 3) & 0x01); + if (k > 5) *cur++ = scale * ((*in >> 2) & 0x01); + if (k > 6) *cur++ = scale * ((*in >> 1) & 0x01); + } + if (img_n != out_n) { + int q; + // insert alpha = 255 + cur = a->out + stride*j; + if (img_n == 1) { + for (q=x-1; q >= 0; --q) { + cur[q*2+1] = 255; + cur[q*2+0] = cur[q]; + } + } else { + STBI_ASSERT(img_n == 3); + for (q=x-1; q >= 0; --q) { + cur[q*4+3] = 255; + cur[q*4+2] = cur[q*3+2]; + cur[q*4+1] = cur[q*3+1]; + cur[q*4+0] = cur[q*3+0]; + } + } + } + } + } else if (depth == 16) { + // force the image data from big-endian to platform-native. + // this is done in a separate pass due to the decoding relying + // on the data being untouched, but could probably be done + // per-line during decode if care is taken. + stbi_uc *cur = a->out; + stbi__uint16 *cur16 = (stbi__uint16*)cur; + + for(i=0; i < x*y*out_n; ++i,cur16++,cur+=2) { + *cur16 = (cur[0] << 8) | cur[1]; + } + } + + return 1; +} + +static int stbi__create_png_image(stbi__png *a, stbi_uc *image_data, stbi__uint32 image_data_len, int out_n, int depth, int color, int interlaced) +{ + 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) tc16[k] = (stbi__uint16)stbi__get16be(s); // copy the values as-is + } else { + for (k = 0; k < s->img_n; ++k) tc[k] = (stbi_uc)(stbi__get16be(s) & 255) * stbi__depth_scale_table[z->depth]; // non 8-bit images will be larger + } + } + break; + } + + case STBI__PNG_TYPE('I','D','A','T'): { + if (first) return stbi__err("first not IHDR", "Corrupt PNG"); + if (pal_img_n && !pal_len) return stbi__err("no PLTE","Corrupt PNG"); + if (scan == STBI__SCAN_header) { + // 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. +------------------------------------------------------------------------------ +*/